package org.drinkless.tdlib;

import androidx.annotation.IntDef;
import androidx.annotation.Nullable;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

/**
 * This class contains as static nested classes all other TDLib interface
 * type-classes and function-classes.
 * <p>
 * It has no inner classes, functions or public members.
 */
public class TdApi {
    static {
        try {
            System.loadLibrary("tdjni");
        } catch (UnsatisfiedLinkError e) {
            e.printStackTrace();
        }
    }

    private static final String GIT_COMMIT_HASH = "e0943d068ce90b5010f1aea946e6901e25b43bf6";

    private TdApi() {
    }

    /**
     * This class is a base class for all TDLib interface classes.
     */
    public abstract static class Object {
        /**
         * Default Object constructor.
         */
        public Object() {
        }

        /**
         * Returns a string representation of the object.
         *
         * @return a string representation of the object.
         */
        public native String toString();

        /**
         * Returns an identifier uniquely determining type of the object.
         *
         * @return a unique identifier of the object type.
         */
        public abstract int getConstructor();
    }

    /**
     * This class is a base class for all TDLib interface function-classes.
     *
     * @param <R> The object type that is returned by the function
     */
    public abstract static class Function<R extends Object> extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            AcceptCall.CONSTRUCTOR,
            AcceptOauthRequest.CONSTRUCTOR,
            AcceptTermsOfService.CONSTRUCTOR,
            ActivateStoryStealthMode.CONSTRUCTOR,
            AddBotMediaPreview.CONSTRUCTOR,
            AddChatFolderByInviteLink.CONSTRUCTOR,
            AddChatMember.CONSTRUCTOR,
            AddChatMembers.CONSTRUCTOR,
            AddChatToList.CONSTRUCTOR,
            AddChecklistTasks.CONSTRUCTOR,
            AddContact.CONSTRUCTOR,
            AddCustomServerLanguagePack.CONSTRUCTOR,
            AddFavoriteSticker.CONSTRUCTOR,
            AddFileToDownloads.CONSTRUCTOR,
            AddGiftCollectionGifts.CONSTRUCTOR,
            AddLocalMessage.CONSTRUCTOR,
            AddLogMessage.CONSTRUCTOR,
            AddLoginPasskey.CONSTRUCTOR,
            AddMessageReaction.CONSTRUCTOR,
            AddNetworkStatistics.CONSTRUCTOR,
            AddOffer.CONSTRUCTOR,
            AddPendingLiveStoryReaction.CONSTRUCTOR,
            AddPendingPaidMessageReaction.CONSTRUCTOR,
            AddPollOption.CONSTRUCTOR,
            AddProfileAudio.CONSTRUCTOR,
            AddProxy.CONSTRUCTOR,
            AddQuickReplyShortcutInlineQueryResultMessage.CONSTRUCTOR,
            AddQuickReplyShortcutMessage.CONSTRUCTOR,
            AddQuickReplyShortcutMessageAlbum.CONSTRUCTOR,
            AddRecentSticker.CONSTRUCTOR,
            AddRecentlyFoundChat.CONSTRUCTOR,
            AddSavedAnimation.CONSTRUCTOR,
            AddSavedNotificationSound.CONSTRUCTOR,
            AddStickerToSet.CONSTRUCTOR,
            AddStoryAlbumStories.CONSTRUCTOR,
            AddTextCompositionStyle.CONSTRUCTOR,
            AllowBotToSendMessages.CONSTRUCTOR,
            AllowUnpaidMessagesFromUser.CONSTRUCTOR,
            AnswerCallbackQuery.CONSTRUCTOR,
            AnswerCustomQuery.CONSTRUCTOR,
            AnswerGuestQuery.CONSTRUCTOR,
            AnswerInlineQuery.CONSTRUCTOR,
            AnswerPreCheckoutQuery.CONSTRUCTOR,
            AnswerShippingQuery.CONSTRUCTOR,
            AnswerWebAppQuery.CONSTRUCTOR,
            ApplyPremiumGiftCode.CONSTRUCTOR,
            ApproveSuggestedPost.CONSTRUCTOR,
            AssignStoreTransaction.CONSTRUCTOR,
            BanChatMember.CONSTRUCTOR,
            BanGroupCallParticipants.CONSTRUCTOR,
            BlockMessageSenderFromReplies.CONSTRUCTOR,
            BoostChat.CONSTRUCTOR,
            BuyGiftUpgrade.CONSTRUCTOR,
            CanBotSendMessages.CONSTRUCTOR,
            CanPostStory.CONSTRUCTOR,
            CanPurchaseFromStore.CONSTRUCTOR,
            CanSendGift.CONSTRUCTOR,
            CanSendMessageToUser.CONSTRUCTOR,
            CanTransferOwnership.CONSTRUCTOR,
            CancelDownloadFile.CONSTRUCTOR,
            CancelPasswordReset.CONSTRUCTOR,
            CancelPreliminaryUploadFile.CONSTRUCTOR,
            CancelRecoveryEmailAddressVerification.CONSTRUCTOR,
            ChangeImportedContacts.CONSTRUCTOR,
            ChangeStickerSet.CONSTRUCTOR,
            CheckAuthenticationBotToken.CONSTRUCTOR,
            CheckAuthenticationCode.CONSTRUCTOR,
            CheckAuthenticationEmailCode.CONSTRUCTOR,
            CheckAuthenticationPasskey.CONSTRUCTOR,
            CheckAuthenticationPassword.CONSTRUCTOR,
            CheckAuthenticationPasswordRecoveryCode.CONSTRUCTOR,
            CheckAuthenticationPremiumPurchase.CONSTRUCTOR,
            CheckBotUsername.CONSTRUCTOR,
            CheckChatFolderInviteLink.CONSTRUCTOR,
            CheckChatInviteLink.CONSTRUCTOR,
            CheckChatUsername.CONSTRUCTOR,
            CheckCreatedPublicChatsLimit.CONSTRUCTOR,
            CheckEmailAddressVerificationCode.CONSTRUCTOR,
            CheckLoginEmailAddressCode.CONSTRUCTOR,
            CheckOauthRequestMatchCode.CONSTRUCTOR,
            CheckPasswordRecoveryCode.CONSTRUCTOR,
            CheckPhoneNumberCode.CONSTRUCTOR,
            CheckPremiumGiftCode.CONSTRUCTOR,
            CheckQuickReplyShortcutName.CONSTRUCTOR,
            CheckRecoveryEmailAddressCode.CONSTRUCTOR,
            CheckStickerSetName.CONSTRUCTOR,
            CheckWebAppFileDownload.CONSTRUCTOR,
            CleanFileName.CONSTRUCTOR,
            ClearAllDraftMessages.CONSTRUCTOR,
            ClearAutosaveSettingsExceptions.CONSTRUCTOR,
            ClearImportedContacts.CONSTRUCTOR,
            ClearRecentEmojiStatuses.CONSTRUCTOR,
            ClearRecentReactions.CONSTRUCTOR,
            ClearRecentStickers.CONSTRUCTOR,
            ClearRecentlyFoundChats.CONSTRUCTOR,
            ClearSearchedForTags.CONSTRUCTOR,
            ClickAnimatedEmojiMessage.CONSTRUCTOR,
            ClickChatSponsoredMessage.CONSTRUCTOR,
            ClickPremiumSubscriptionButton.CONSTRUCTOR,
            ClickVideoMessageAdvertisement.CONSTRUCTOR,
            Close.CONSTRUCTOR,
            CloseChat.CONSTRUCTOR,
            CloseGiftAuction.CONSTRUCTOR,
            CloseSecretChat.CONSTRUCTOR,
            CloseStory.CONSTRUCTOR,
            CloseWebApp.CONSTRUCTOR,
            CommitPendingLiveStoryReactions.CONSTRUCTOR,
            CommitPendingPaidMessageReactions.CONSTRUCTOR,
            ComposeTextWithAi.CONSTRUCTOR,
            ConfirmQrCodeAuthentication.CONSTRUCTOR,
            ConfirmSession.CONSTRUCTOR,
            ConnectAffiliateProgram.CONSTRUCTOR,
            CraftGift.CONSTRUCTOR,
            CreateBasicGroupChat.CONSTRUCTOR,
            CreateBot.CONSTRUCTOR,
            CreateBusinessChatLink.CONSTRUCTOR,
            CreateCall.CONSTRUCTOR,
            CreateChatFolder.CONSTRUCTOR,
            CreateChatFolderInviteLink.CONSTRUCTOR,
            CreateChatInviteLink.CONSTRUCTOR,
            CreateChatSubscriptionInviteLink.CONSTRUCTOR,
            CreateForumTopic.CONSTRUCTOR,
            CreateGiftCollection.CONSTRUCTOR,
            CreateGroupCall.CONSTRUCTOR,
            CreateInvoiceLink.CONSTRUCTOR,
            CreateNewBasicGroupChat.CONSTRUCTOR,
            CreateNewSecretChat.CONSTRUCTOR,
            CreateNewStickerSet.CONSTRUCTOR,
            CreateNewSupergroupChat.CONSTRUCTOR,
            CreatePrivateChat.CONSTRUCTOR,
            CreateSecretChat.CONSTRUCTOR,
            CreateStoryAlbum.CONSTRUCTOR,
            CreateSupergroupChat.CONSTRUCTOR,
            CreateTemporaryPassword.CONSTRUCTOR,
            CreateTextCompositionStyle.CONSTRUCTOR,
            CreateVideoChat.CONSTRUCTOR,
            DeclineGroupCallInvitation.CONSTRUCTOR,
            DeclineOauthRequest.CONSTRUCTOR,
            DeclineSuggestedPost.CONSTRUCTOR,
            DecryptGroupCallData.CONSTRUCTOR,
            DeleteAccount.CONSTRUCTOR,
            DeleteAllCallMessages.CONSTRUCTOR,
            DeleteAllRecentMessageReactionsFromSender.CONSTRUCTOR,
            DeleteAllRevokedChatInviteLinks.CONSTRUCTOR,
            DeleteBotMediaPreviews.CONSTRUCTOR,
            DeleteBusinessChatLink.CONSTRUCTOR,
            DeleteBusinessConnectedBot.CONSTRUCTOR,
            DeleteBusinessMessages.CONSTRUCTOR,
            DeleteBusinessStory.CONSTRUCTOR,
            DeleteChat.CONSTRUCTOR,
            DeleteChatBackground.CONSTRUCTOR,
            DeleteChatFolder.CONSTRUCTOR,
            DeleteChatFolderInviteLink.CONSTRUCTOR,
            DeleteChatHistory.CONSTRUCTOR,
            DeleteChatMessagesByDate.CONSTRUCTOR,
            DeleteChatMessagesBySender.CONSTRUCTOR,
            DeleteChatReplyMarkup.CONSTRUCTOR,
            DeleteCommands.CONSTRUCTOR,
            DeleteDefaultBackground.CONSTRUCTOR,
            DeleteDirectMessagesChatTopicHistory.CONSTRUCTOR,
            DeleteDirectMessagesChatTopicMessagesByDate.CONSTRUCTOR,
            DeleteFile.CONSTRUCTOR,
            DeleteForumTopic.CONSTRUCTOR,
            DeleteGiftCollection.CONSTRUCTOR,
            DeleteGroupCallMessages.CONSTRUCTOR,
            DeleteGroupCallMessagesBySender.CONSTRUCTOR,
            DeleteLanguagePack.CONSTRUCTOR,
            DeleteMessageReactionsFromSender.CONSTRUCTOR,
            DeleteMessages.CONSTRUCTOR,
            DeletePassportElement.CONSTRUCTOR,
            DeletePollOption.CONSTRUCTOR,
            DeleteProfilePhoto.CONSTRUCTOR,
            DeleteQuickReplyShortcut.CONSTRUCTOR,
            DeleteQuickReplyShortcutMessages.CONSTRUCTOR,
            DeleteRevokedChatInviteLink.CONSTRUCTOR,
            DeleteSavedCredentials.CONSTRUCTOR,
            DeleteSavedMessagesTopicHistory.CONSTRUCTOR,
            DeleteSavedMessagesTopicMessagesByDate.CONSTRUCTOR,
            DeleteSavedOrderInfo.CONSTRUCTOR,
            DeleteStickerSet.CONSTRUCTOR,
            DeleteStory.CONSTRUCTOR,
            DeleteStoryAlbum.CONSTRUCTOR,
            DeleteTextCompositionStyle.CONSTRUCTOR,
            Destroy.CONSTRUCTOR,
            DisableAllSupergroupUsernames.CONSTRUCTOR,
            DisableProxy.CONSTRUCTOR,
            DiscardCall.CONSTRUCTOR,
            DisconnectAffiliateProgram.CONSTRUCTOR,
            DisconnectAllWebsites.CONSTRUCTOR,
            DisconnectWebsite.CONSTRUCTOR,
            DownloadFile.CONSTRUCTOR,
            DropGiftOriginalDetails.CONSTRUCTOR,
            EditBotMediaPreview.CONSTRUCTOR,
            EditBusinessChatLink.CONSTRUCTOR,
            EditBusinessMessageCaption.CONSTRUCTOR,
            EditBusinessMessageChecklist.CONSTRUCTOR,
            EditBusinessMessageLiveLocation.CONSTRUCTOR,
            EditBusinessMessageMedia.CONSTRUCTOR,
            EditBusinessMessageReplyMarkup.CONSTRUCTOR,
            EditBusinessMessageText.CONSTRUCTOR,
            EditBusinessStory.CONSTRUCTOR,
            EditChatFolder.CONSTRUCTOR,
            EditChatFolderInviteLink.CONSTRUCTOR,
            EditChatInviteLink.CONSTRUCTOR,
            EditChatSubscriptionInviteLink.CONSTRUCTOR,
            EditCustomLanguagePackInfo.CONSTRUCTOR,
            EditForumTopic.CONSTRUCTOR,
            EditInlineMessageCaption.CONSTRUCTOR,
            EditInlineMessageLiveLocation.CONSTRUCTOR,
            EditInlineMessageMedia.CONSTRUCTOR,
            EditInlineMessageReplyMarkup.CONSTRUCTOR,
            EditInlineMessageText.CONSTRUCTOR,
            EditMessageCaption.CONSTRUCTOR,
            EditMessageChecklist.CONSTRUCTOR,
            EditMessageLiveLocation.CONSTRUCTOR,
            EditMessageMedia.CONSTRUCTOR,
            EditMessageReplyMarkup.CONSTRUCTOR,
            EditMessageSchedulingState.CONSTRUCTOR,
            EditMessageText.CONSTRUCTOR,
            EditProxy.CONSTRUCTOR,
            EditQuickReplyMessage.CONSTRUCTOR,
            EditStarSubscription.CONSTRUCTOR,
            EditStory.CONSTRUCTOR,
            EditStoryCover.CONSTRUCTOR,
            EditTextCompositionStyle.CONSTRUCTOR,
            EditUserStarSubscription.CONSTRUCTOR,
            EnableProxy.CONSTRUCTOR,
            EncryptGroupCallData.CONSTRUCTOR,
            EndGroupCall.CONSTRUCTOR,
            EndGroupCallRecording.CONSTRUCTOR,
            EndGroupCallScreenSharing.CONSTRUCTOR,
            FinishFileGeneration.CONSTRUCTOR,
            FixTextWithAi.CONSTRUCTOR,
            ForwardMessages.CONSTRUCTOR,
            GetAccountTtl.CONSTRUCTOR,
            GetActiveSessions.CONSTRUCTOR,
            GetAllPassportElements.CONSTRUCTOR,
            GetAllStickerEmojis.CONSTRUCTOR,
            GetAnimatedEmoji.CONSTRUCTOR,
            GetApplicationConfig.CONSTRUCTOR,
            GetApplicationDownloadLink.CONSTRUCTOR,
            GetArchiveChatListSettings.CONSTRUCTOR,
            GetArchivedStickerSets.CONSTRUCTOR,
            GetAttachedStickerSets.CONSTRUCTOR,
            GetAttachmentMenuBot.CONSTRUCTOR,
            GetAuthenticationPasskeyParameters.CONSTRUCTOR,
            GetAuthorizationState.CONSTRUCTOR,
            GetAutoDownloadSettingsPresets.CONSTRUCTOR,
            GetAutosaveSettings.CONSTRUCTOR,
            GetAvailableChatBoostSlots.CONSTRUCTOR,
            GetAvailableGifts.CONSTRUCTOR,
            GetBackgroundUrl.CONSTRUCTOR,
            GetBankCardInfo.CONSTRUCTOR,
            GetBasicGroup.CONSTRUCTOR,
            GetBasicGroupFullInfo.CONSTRUCTOR,
            GetBlockedMessageSenders.CONSTRUCTOR,
            GetBotInfoDescription.CONSTRUCTOR,
            GetBotInfoShortDescription.CONSTRUCTOR,
            GetBotMediaPreviewInfo.CONSTRUCTOR,
            GetBotMediaPreviews.CONSTRUCTOR,
            GetBotName.CONSTRUCTOR,
            GetBotSimilarBotCount.CONSTRUCTOR,
            GetBotSimilarBots.CONSTRUCTOR,
            GetBusinessAccountStarAmount.CONSTRUCTOR,
            GetBusinessChatLinkInfo.CONSTRUCTOR,
            GetBusinessChatLinks.CONSTRUCTOR,
            GetBusinessConnectedBot.CONSTRUCTOR,
            GetBusinessConnection.CONSTRUCTOR,
            GetBusinessFeatures.CONSTRUCTOR,
            GetCallbackQueryAnswer.CONSTRUCTOR,
            GetCallbackQueryMessage.CONSTRUCTOR,
            GetChat.CONSTRUCTOR,
            GetChatActiveStories.CONSTRUCTOR,
            GetChatAdministrators.CONSTRUCTOR,
            GetChatArchivedStories.CONSTRUCTOR,
            GetChatAvailableMessageSenders.CONSTRUCTOR,
            GetChatAvailablePaidMessageReactionSenders.CONSTRUCTOR,
            GetChatBoostFeatures.CONSTRUCTOR,
            GetChatBoostLevelFeatures.CONSTRUCTOR,
            GetChatBoostLink.CONSTRUCTOR,
            GetChatBoostLinkInfo.CONSTRUCTOR,
            GetChatBoostStatus.CONSTRUCTOR,
            GetChatBoosts.CONSTRUCTOR,
            GetChatEventLog.CONSTRUCTOR,
            GetChatFolder.CONSTRUCTOR,
            GetChatFolderChatCount.CONSTRUCTOR,
            GetChatFolderChatsToLeave.CONSTRUCTOR,
            GetChatFolderDefaultIconName.CONSTRUCTOR,
            GetChatFolderInviteLinks.CONSTRUCTOR,
            GetChatFolderNewChats.CONSTRUCTOR,
            GetChatHistory.CONSTRUCTOR,
            GetChatInviteLink.CONSTRUCTOR,
            GetChatInviteLinkCounts.CONSTRUCTOR,
            GetChatInviteLinkMembers.CONSTRUCTOR,
            GetChatInviteLinks.CONSTRUCTOR,
            GetChatJoinRequests.CONSTRUCTOR,
            GetChatListsToAddChat.CONSTRUCTOR,
            GetChatMember.CONSTRUCTOR,
            GetChatMessageByDate.CONSTRUCTOR,
            GetChatMessageCalendar.CONSTRUCTOR,
            GetChatMessageCount.CONSTRUCTOR,
            GetChatMessagePosition.CONSTRUCTOR,
            GetChatNotificationSettingsExceptions.CONSTRUCTOR,
            GetChatOwnerAfterLeaving.CONSTRUCTOR,
            GetChatPinnedMessage.CONSTRUCTOR,
            GetChatPostedToChatPageStories.CONSTRUCTOR,
            GetChatRevenueStatistics.CONSTRUCTOR,
            GetChatRevenueTransactions.CONSTRUCTOR,
            GetChatRevenueWithdrawalUrl.CONSTRUCTOR,
            GetChatScheduledMessages.CONSTRUCTOR,
            GetChatSimilarChatCount.CONSTRUCTOR,
            GetChatSimilarChats.CONSTRUCTOR,
            GetChatSparseMessagePositions.CONSTRUCTOR,
            GetChatSponsoredMessages.CONSTRUCTOR,
            GetChatStatistics.CONSTRUCTOR,
            GetChatStoryAlbums.CONSTRUCTOR,
            GetChatStoryInteractions.CONSTRUCTOR,
            GetChats.CONSTRUCTOR,
            GetChatsForChatFolderInviteLink.CONSTRUCTOR,
            GetChatsToPostStories.CONSTRUCTOR,
            GetCloseFriends.CONSTRUCTOR,
            GetCollectibleItemInfo.CONSTRUCTOR,
            GetCommands.CONSTRUCTOR,
            GetConnectedAffiliateProgram.CONSTRUCTOR,
            GetConnectedAffiliatePrograms.CONSTRUCTOR,
            GetConnectedWebsites.CONSTRUCTOR,
            GetContacts.CONSTRUCTOR,
            GetCountries.CONSTRUCTOR,
            GetCountryCode.CONSTRUCTOR,
            GetCountryFlagEmoji.CONSTRUCTOR,
            GetCreatedPublicChats.CONSTRUCTOR,
            GetCurrentState.CONSTRUCTOR,
            GetCurrentWeather.CONSTRUCTOR,
            GetCustomEmojiReactionAnimations.CONSTRUCTOR,
            GetCustomEmojiStickers.CONSTRUCTOR,
            GetDatabaseStatistics.CONSTRUCTOR,
            GetDeepLinkInfo.CONSTRUCTOR,
            GetDefaultBackgroundCustomEmojiStickers.CONSTRUCTOR,
            GetDefaultChatEmojiStatuses.CONSTRUCTOR,
            GetDefaultChatPhotoCustomEmojiStickers.CONSTRUCTOR,
            GetDefaultEmojiStatuses.CONSTRUCTOR,
            GetDefaultMessageAutoDeleteTime.CONSTRUCTOR,
            GetDefaultProfilePhotoCustomEmojiStickers.CONSTRUCTOR,
            GetDirectMessagesChatTopic.CONSTRUCTOR,
            GetDirectMessagesChatTopicHistory.CONSTRUCTOR,
            GetDirectMessagesChatTopicMessageByDate.CONSTRUCTOR,
            GetDirectMessagesChatTopicRevenue.CONSTRUCTOR,
            GetDisallowedChatEmojiStatuses.CONSTRUCTOR,
            GetEmojiCategories.CONSTRUCTOR,
            GetEmojiReaction.CONSTRUCTOR,
            GetEmojiSuggestionsUrl.CONSTRUCTOR,
            GetExternalLink.CONSTRUCTOR,
            GetExternalLinkInfo.CONSTRUCTOR,
            GetFavoriteStickers.CONSTRUCTOR,
            GetFile.CONSTRUCTOR,
            GetFileDownloadedPrefixSize.CONSTRUCTOR,
            GetFileExtension.CONSTRUCTOR,
            GetFileMimeType.CONSTRUCTOR,
            GetForumTopic.CONSTRUCTOR,
            GetForumTopicDefaultIcons.CONSTRUCTOR,
            GetForumTopicHistory.CONSTRUCTOR,
            GetForumTopicLink.CONSTRUCTOR,
            GetForumTopics.CONSTRUCTOR,
            GetGameHighScores.CONSTRUCTOR,
            GetGiftAuctionAcquiredGifts.CONSTRUCTOR,
            GetGiftAuctionState.CONSTRUCTOR,
            GetGiftChatThemes.CONSTRUCTOR,
            GetGiftCollections.CONSTRUCTOR,
            GetGiftUpgradePreview.CONSTRUCTOR,
            GetGiftsForCrafting.CONSTRUCTOR,
            GetGiveawayInfo.CONSTRUCTOR,
            GetGreetingStickers.CONSTRUCTOR,
            GetGrossingWebAppBots.CONSTRUCTOR,
            GetGroupCall.CONSTRUCTOR,
            GetGroupCallParticipants.CONSTRUCTOR,
            GetGroupCallStreamSegment.CONSTRUCTOR,
            GetGroupCallStreams.CONSTRUCTOR,
            GetGroupsInCommon.CONSTRUCTOR,
            GetImportedContactCount.CONSTRUCTOR,
            GetInactiveSupergroupChats.CONSTRUCTOR,
            GetInlineGameHighScores.CONSTRUCTOR,
            GetInlineQueryResults.CONSTRUCTOR,
            GetInstalledBackgrounds.CONSTRUCTOR,
            GetInstalledStickerSets.CONSTRUCTOR,
            GetInternalLink.CONSTRUCTOR,
            GetInternalLinkType.CONSTRUCTOR,
            GetJsonString.CONSTRUCTOR,
            GetJsonValue.CONSTRUCTOR,
            GetKeywordEmojis.CONSTRUCTOR,
            GetLanguagePackInfo.CONSTRUCTOR,
            GetLanguagePackString.CONSTRUCTOR,
            GetLanguagePackStrings.CONSTRUCTOR,
            GetLinkPreview.CONSTRUCTOR,
            GetLiveStoryAvailableMessageSenders.CONSTRUCTOR,
            GetLiveStoryRtmpUrl.CONSTRUCTOR,
            GetLiveStoryStreamer.CONSTRUCTOR,
            GetLiveStoryTopDonors.CONSTRUCTOR,
            GetLocalizationTargetInfo.CONSTRUCTOR,
            GetLogStream.CONSTRUCTOR,
            GetLogTagVerbosityLevel.CONSTRUCTOR,
            GetLogTags.CONSTRUCTOR,
            GetLogVerbosityLevel.CONSTRUCTOR,
            GetLoginPasskeys.CONSTRUCTOR,
            GetLoginUrl.CONSTRUCTOR,
            GetLoginUrlInfo.CONSTRUCTOR,
            GetMainWebApp.CONSTRUCTOR,
            GetManagedBotAccessSettings.CONSTRUCTOR,
            GetManagedBotToken.CONSTRUCTOR,
            GetMapThumbnailFile.CONSTRUCTOR,
            GetMarkdownText.CONSTRUCTOR,
            GetMe.CONSTRUCTOR,
            GetMenuButton.CONSTRUCTOR,
            GetMessage.CONSTRUCTOR,
            GetMessageAddedReactions.CONSTRUCTOR,
            GetMessageAuthor.CONSTRUCTOR,
            GetMessageAvailableReactions.CONSTRUCTOR,
            GetMessageEffect.CONSTRUCTOR,
            GetMessageEmbeddingCode.CONSTRUCTOR,
            GetMessageFileType.CONSTRUCTOR,
            GetMessageImportConfirmationText.CONSTRUCTOR,
            GetMessageLink.CONSTRUCTOR,
            GetMessageLinkInfo.CONSTRUCTOR,
            GetMessageLocally.CONSTRUCTOR,
            GetMessageProperties.CONSTRUCTOR,
            GetMessagePublicForwards.CONSTRUCTOR,
            GetMessageReadDate.CONSTRUCTOR,
            GetMessageStatistics.CONSTRUCTOR,
            GetMessageThread.CONSTRUCTOR,
            GetMessageThreadHistory.CONSTRUCTOR,
            GetMessageViewers.CONSTRUCTOR,
            GetMessages.CONSTRUCTOR,
            GetNetworkStatistics.CONSTRUCTOR,
            GetNewChatPrivacySettings.CONSTRUCTOR,
            GetOauthLinkInfo.CONSTRUCTOR,
            GetOption.CONSTRUCTOR,
            GetOwnedBots.CONSTRUCTOR,
            GetOwnedStickerSets.CONSTRUCTOR,
            GetPaidMessageRevenue.CONSTRUCTOR,
            GetPasskeyParameters.CONSTRUCTOR,
            GetPassportAuthorizationForm.CONSTRUCTOR,
            GetPassportAuthorizationFormAvailableElements.CONSTRUCTOR,
            GetPassportElement.CONSTRUCTOR,
            GetPasswordState.CONSTRUCTOR,
            GetPaymentForm.CONSTRUCTOR,
            GetPaymentReceipt.CONSTRUCTOR,
            GetPersonalChatHistory.CONSTRUCTOR,
            GetPhoneNumberInfo.CONSTRUCTOR,
            GetPhoneNumberInfoSync.CONSTRUCTOR,
            GetPollOptionProperties.CONSTRUCTOR,
            GetPollVoteStatistics.CONSTRUCTOR,
            GetPollVoters.CONSTRUCTOR,
            GetPreferredCountryLanguage.CONSTRUCTOR,
            GetPremiumFeatures.CONSTRUCTOR,
            GetPremiumGiftPaymentOptions.CONSTRUCTOR,
            GetPremiumGiveawayPaymentOptions.CONSTRUCTOR,
            GetPremiumInfoSticker.CONSTRUCTOR,
            GetPremiumLimit.CONSTRUCTOR,
            GetPremiumState.CONSTRUCTOR,
            GetPremiumStickerExamples.CONSTRUCTOR,
            GetPremiumStickers.CONSTRUCTOR,
            GetPreparedInlineMessage.CONSTRUCTOR,
            GetPreparedKeyboardButton.CONSTRUCTOR,
            GetProxies.CONSTRUCTOR,
            GetPublicPostSearchLimits.CONSTRUCTOR,
            GetPushReceiverId.CONSTRUCTOR,
            GetReadDatePrivacySettings.CONSTRUCTOR,
            GetReceivedGift.CONSTRUCTOR,
            GetReceivedGifts.CONSTRUCTOR,
            GetRecentEmojiStatuses.CONSTRUCTOR,
            GetRecentInlineBots.CONSTRUCTOR,
            GetRecentStickers.CONSTRUCTOR,
            GetRecentlyOpenedChats.CONSTRUCTOR,
            GetRecentlyVisitedTMeUrls.CONSTRUCTOR,
            GetRecommendedChatFolders.CONSTRUCTOR,
            GetRecommendedChats.CONSTRUCTOR,
            GetRecoveryEmailAddress.CONSTRUCTOR,
            GetRemoteFile.CONSTRUCTOR,
            GetRepliedMessage.CONSTRUCTOR,
            GetSavedAnimations.CONSTRUCTOR,
            GetSavedMessagesTags.CONSTRUCTOR,
            GetSavedMessagesTopicHistory.CONSTRUCTOR,
            GetSavedMessagesTopicMessageByDate.CONSTRUCTOR,
            GetSavedNotificationSound.CONSTRUCTOR,
            GetSavedNotificationSounds.CONSTRUCTOR,
            GetSavedOrderInfo.CONSTRUCTOR,
            GetScopeNotificationSettings.CONSTRUCTOR,
            GetSearchSponsoredChats.CONSTRUCTOR,
            GetSearchedForTags.CONSTRUCTOR,
            GetSecretChat.CONSTRUCTOR,
            GetStakeDiceState.CONSTRUCTOR,
            GetStarAdAccountUrl.CONSTRUCTOR,
            GetStarGiftPaymentOptions.CONSTRUCTOR,
            GetStarGiveawayPaymentOptions.CONSTRUCTOR,
            GetStarPaymentOptions.CONSTRUCTOR,
            GetStarRevenueStatistics.CONSTRUCTOR,
            GetStarSubscriptions.CONSTRUCTOR,
            GetStarTransactions.CONSTRUCTOR,
            GetStarWithdrawalUrl.CONSTRUCTOR,
            GetStatisticalGraph.CONSTRUCTOR,
            GetStickerEmojis.CONSTRUCTOR,
            GetStickerOutline.CONSTRUCTOR,
            GetStickerOutlineSvgPath.CONSTRUCTOR,
            GetStickerSet.CONSTRUCTOR,
            GetStickerSetName.CONSTRUCTOR,
            GetStickers.CONSTRUCTOR,
            GetStorageStatistics.CONSTRUCTOR,
            GetStorageStatisticsFast.CONSTRUCTOR,
            GetStory.CONSTRUCTOR,
            GetStoryAlbumStories.CONSTRUCTOR,
            GetStoryAvailableReactions.CONSTRUCTOR,
            GetStoryInteractions.CONSTRUCTOR,
            GetStoryNotificationSettingsExceptions.CONSTRUCTOR,
            GetStoryPublicForwards.CONSTRUCTOR,
            GetStoryStatistics.CONSTRUCTOR,
            GetSuggestedFileName.CONSTRUCTOR,
            GetSuggestedStickerSetName.CONSTRUCTOR,
            GetSuitableDiscussionChats.CONSTRUCTOR,
            GetSuitablePersonalChats.CONSTRUCTOR,
            GetSupergroup.CONSTRUCTOR,
            GetSupergroupFullInfo.CONSTRUCTOR,
            GetSupergroupMembers.CONSTRUCTOR,
            GetSupportName.CONSTRUCTOR,
            GetSupportUser.CONSTRUCTOR,
            GetTemporaryPasswordState.CONSTRUCTOR,
            GetTextCompositionStyleExample.CONSTRUCTOR,
            GetTextEntities.CONSTRUCTOR,
            GetThemeParametersJsonString.CONSTRUCTOR,
            GetThemedChatEmojiStatuses.CONSTRUCTOR,
            GetThemedEmojiStatuses.CONSTRUCTOR,
            GetTimeZones.CONSTRUCTOR,
            GetTonRevenueStatistics.CONSTRUCTOR,
            GetTonTransactions.CONSTRUCTOR,
            GetTonWithdrawalUrl.CONSTRUCTOR,
            GetTopChats.CONSTRUCTOR,
            GetTrendingStickerSets.CONSTRUCTOR,
            GetUpgradedGift.CONSTRUCTOR,
            GetUpgradedGiftEmojiStatuses.CONSTRUCTOR,
            GetUpgradedGiftValueInfo.CONSTRUCTOR,
            GetUpgradedGiftVariants.CONSTRUCTOR,
            GetUpgradedGiftWithdrawalUrl.CONSTRUCTOR,
            GetUpgradedGiftsPromotionalAnimation.CONSTRUCTOR,
            GetUser.CONSTRUCTOR,
            GetUserChatBoosts.CONSTRUCTOR,
            GetUserFullInfo.CONSTRUCTOR,
            GetUserLink.CONSTRUCTOR,
            GetUserPrivacySettingRules.CONSTRUCTOR,
            GetUserProfileAudios.CONSTRUCTOR,
            GetUserProfilePhotos.CONSTRUCTOR,
            GetUserSupportInfo.CONSTRUCTOR,
            GetVideoChatAvailableParticipants.CONSTRUCTOR,
            GetVideoChatInviteLink.CONSTRUCTOR,
            GetVideoChatRtmpUrl.CONSTRUCTOR,
            GetVideoMessageAdvertisements.CONSTRUCTOR,
            GetWebAppLinkUrl.CONSTRUCTOR,
            GetWebAppPlaceholder.CONSTRUCTOR,
            GetWebAppUrl.CONSTRUCTOR,
            GetWebPageInstantView.CONSTRUCTOR,
            GiftPremiumWithStars.CONSTRUCTOR,
            HideContactCloseBirthdays.CONSTRUCTOR,
            HideSuggestedAction.CONSTRUCTOR,
            ImportContacts.CONSTRUCTOR,
            ImportMessages.CONSTRUCTOR,
            IncreaseGiftAuctionBid.CONSTRUCTOR,
            InviteGroupCallParticipant.CONSTRUCTOR,
            InviteVideoChatParticipants.CONSTRUCTOR,
            IsLoginEmailAddressRequired.CONSTRUCTOR,
            IsProfileAudio.CONSTRUCTOR,
            JoinChat.CONSTRUCTOR,
            JoinChatByInviteLink.CONSTRUCTOR,
            JoinGroupCall.CONSTRUCTOR,
            JoinLiveStory.CONSTRUCTOR,
            JoinVideoChat.CONSTRUCTOR,
            LaunchPrepaidGiveaway.CONSTRUCTOR,
            LeaveChat.CONSTRUCTOR,
            LeaveGroupCall.CONSTRUCTOR,
            ListenToAudio.CONSTRUCTOR,
            LoadActiveStories.CONSTRUCTOR,
            LoadChats.CONSTRUCTOR,
            LoadDirectMessagesChatTopics.CONSTRUCTOR,
            LoadGroupCallParticipants.CONSTRUCTOR,
            LoadQuickReplyShortcutMessages.CONSTRUCTOR,
            LoadQuickReplyShortcuts.CONSTRUCTOR,
            LoadSavedMessagesTopics.CONSTRUCTOR,
            LogOut.CONSTRUCTOR,
            MarkChecklistTasksAsDone.CONSTRUCTOR,
            OpenBotSimilarBot.CONSTRUCTOR,
            OpenChat.CONSTRUCTOR,
            OpenChatSimilarChat.CONSTRUCTOR,
            OpenGiftAuction.CONSTRUCTOR,
            OpenMessageContent.CONSTRUCTOR,
            OpenSponsoredChat.CONSTRUCTOR,
            OpenStory.CONSTRUCTOR,
            OpenWebApp.CONSTRUCTOR,
            OptimizeStorage.CONSTRUCTOR,
            ParseMarkdown.CONSTRUCTOR,
            ParseTextEntities.CONSTRUCTOR,
            PinChatMessage.CONSTRUCTOR,
            PingProxy.CONSTRUCTOR,
            PlaceGiftAuctionBid.CONSTRUCTOR,
            PostStory.CONSTRUCTOR,
            PreliminaryUploadFile.CONSTRUCTOR,
            ProcessChatFolderNewChats.CONSTRUCTOR,
            ProcessChatHasProtectedContentDisableRequest.CONSTRUCTOR,
            ProcessChatJoinRequest.CONSTRUCTOR,
            ProcessChatJoinRequests.CONSTRUCTOR,
            ProcessGiftPurchaseOffer.CONSTRUCTOR,
            ProcessPushNotification.CONSTRUCTOR,
            RateSpeechRecognition.CONSTRUCTOR,
            ReadAllChatMentions.CONSTRUCTOR,
            ReadAllChatPollVotes.CONSTRUCTOR,
            ReadAllChatReactions.CONSTRUCTOR,
            ReadAllDirectMessagesChatTopicReactions.CONSTRUCTOR,
            ReadAllForumTopicMentions.CONSTRUCTOR,
            ReadAllForumTopicPollVotes.CONSTRUCTOR,
            ReadAllForumTopicReactions.CONSTRUCTOR,
            ReadBusinessMessage.CONSTRUCTOR,
            ReadChatList.CONSTRUCTOR,
            ReadFilePart.CONSTRUCTOR,
            ReaddQuickReplyShortcutMessages.CONSTRUCTOR,
            RecognizeSpeech.CONSTRUCTOR,
            RecoverAuthenticationPassword.CONSTRUCTOR,
            RecoverPassword.CONSTRUCTOR,
            RefundStarPayment.CONSTRUCTOR,
            RegisterDevice.CONSTRUCTOR,
            RegisterUser.CONSTRUCTOR,
            RemoveAllFilesFromDownloads.CONSTRUCTOR,
            RemoveBusinessConnectedBotFromChat.CONSTRUCTOR,
            RemoveChatActionBar.CONSTRUCTOR,
            RemoveContacts.CONSTRUCTOR,
            RemoveFavoriteSticker.CONSTRUCTOR,
            RemoveFileFromDownloads.CONSTRUCTOR,
            RemoveGiftCollectionGifts.CONSTRUCTOR,
            RemoveInstalledBackground.CONSTRUCTOR,
            RemoveLoginPasskey.CONSTRUCTOR,
            RemoveMessageReaction.CONSTRUCTOR,
            RemoveMessageSenderBotVerification.CONSTRUCTOR,
            RemoveNotification.CONSTRUCTOR,
            RemoveNotificationGroup.CONSTRUCTOR,
            RemovePendingLiveStoryReactions.CONSTRUCTOR,
            RemovePendingPaidMessageReactions.CONSTRUCTOR,
            RemoveProfileAudio.CONSTRUCTOR,
            RemoveProxy.CONSTRUCTOR,
            RemoveRecentHashtag.CONSTRUCTOR,
            RemoveRecentSticker.CONSTRUCTOR,
            RemoveRecentlyFoundChat.CONSTRUCTOR,
            RemoveSavedAnimation.CONSTRUCTOR,
            RemoveSavedNotificationSound.CONSTRUCTOR,
            RemoveSearchedForTag.CONSTRUCTOR,
            RemoveStickerFromSet.CONSTRUCTOR,
            RemoveStoryAlbumStories.CONSTRUCTOR,
            RemoveTextCompositionStyle.CONSTRUCTOR,
            RemoveTopChat.CONSTRUCTOR,
            ReorderActiveUsernames.CONSTRUCTOR,
            ReorderBotActiveUsernames.CONSTRUCTOR,
            ReorderBotMediaPreviews.CONSTRUCTOR,
            ReorderChatFolders.CONSTRUCTOR,
            ReorderGiftCollectionGifts.CONSTRUCTOR,
            ReorderGiftCollections.CONSTRUCTOR,
            ReorderInstalledStickerSets.CONSTRUCTOR,
            ReorderQuickReplyShortcuts.CONSTRUCTOR,
            ReorderStoryAlbumStories.CONSTRUCTOR,
            ReorderStoryAlbums.CONSTRUCTOR,
            ReorderSupergroupActiveUsernames.CONSTRUCTOR,
            ReplaceLiveStoryRtmpUrl.CONSTRUCTOR,
            ReplacePrimaryChatInviteLink.CONSTRUCTOR,
            ReplaceStickerInSet.CONSTRUCTOR,
            ReplaceVideoChatRtmpUrl.CONSTRUCTOR,
            ReportAuthenticationCodeMissing.CONSTRUCTOR,
            ReportChat.CONSTRUCTOR,
            ReportChatPhoto.CONSTRUCTOR,
            ReportChatSponsoredMessage.CONSTRUCTOR,
            ReportMessageReactions.CONSTRUCTOR,
            ReportPhoneNumberCodeMissing.CONSTRUCTOR,
            ReportSponsoredChat.CONSTRUCTOR,
            ReportStory.CONSTRUCTOR,
            ReportSupergroupAntiSpamFalsePositive.CONSTRUCTOR,
            ReportSupergroupSpam.CONSTRUCTOR,
            ReportVideoMessageAdvertisement.CONSTRUCTOR,
            RequestAuthenticationPasswordRecovery.CONSTRUCTOR,
            RequestPasswordRecovery.CONSTRUCTOR,
            RequestQrCodeAuthentication.CONSTRUCTOR,
            ResendAuthenticationCode.CONSTRUCTOR,
            ResendEmailAddressVerificationCode.CONSTRUCTOR,
            ResendLoginEmailAddressCode.CONSTRUCTOR,
            ResendMessages.CONSTRUCTOR,
            ResendPhoneNumberCode.CONSTRUCTOR,
            ResendRecoveryEmailAddressCode.CONSTRUCTOR,
            ResetAllNotificationSettings.CONSTRUCTOR,
            ResetAuthenticationEmailAddress.CONSTRUCTOR,
            ResetInstalledBackgrounds.CONSTRUCTOR,
            ResetNetworkStatistics.CONSTRUCTOR,
            ResetPassword.CONSTRUCTOR,
            ReuseStarSubscription.CONSTRUCTOR,
            RevokeChatInviteLink.CONSTRUCTOR,
            RevokeGroupCallInviteLink.CONSTRUCTOR,
            SaveApplicationLogEvent.CONSTRUCTOR,
            SavePreparedInlineMessage.CONSTRUCTOR,
            SavePreparedKeyboardButton.CONSTRUCTOR,
            SearchAffiliatePrograms.CONSTRUCTOR,
            SearchBackground.CONSTRUCTOR,
            SearchCallMessages.CONSTRUCTOR,
            SearchChatAffiliateProgram.CONSTRUCTOR,
            SearchChatMembers.CONSTRUCTOR,
            SearchChatMessages.CONSTRUCTOR,
            SearchChatRecentLocationMessages.CONSTRUCTOR,
            SearchChats.CONSTRUCTOR,
            SearchChatsOnServer.CONSTRUCTOR,
            SearchContacts.CONSTRUCTOR,
            SearchEmojis.CONSTRUCTOR,
            SearchFileDownloads.CONSTRUCTOR,
            SearchGiftsForResale.CONSTRUCTOR,
            SearchHashtags.CONSTRUCTOR,
            SearchInstalledStickerSets.CONSTRUCTOR,
            SearchMessages.CONSTRUCTOR,
            SearchOutgoingDocumentMessages.CONSTRUCTOR,
            SearchPublicChat.CONSTRUCTOR,
            SearchPublicChats.CONSTRUCTOR,
            SearchPublicMessagesByTag.CONSTRUCTOR,
            SearchPublicPosts.CONSTRUCTOR,
            SearchPublicStoriesByLocation.CONSTRUCTOR,
            SearchPublicStoriesByTag.CONSTRUCTOR,
            SearchPublicStoriesByVenue.CONSTRUCTOR,
            SearchQuote.CONSTRUCTOR,
            SearchRecentlyFoundChats.CONSTRUCTOR,
            SearchSavedMessages.CONSTRUCTOR,
            SearchSecretMessages.CONSTRUCTOR,
            SearchStickerSet.CONSTRUCTOR,
            SearchStickerSets.CONSTRUCTOR,
            SearchStickers.CONSTRUCTOR,
            SearchStringsByPrefix.CONSTRUCTOR,
            SearchTextCompositionStyle.CONSTRUCTOR,
            SearchUserByPhoneNumber.CONSTRUCTOR,
            SearchUserByToken.CONSTRUCTOR,
            SearchWebApp.CONSTRUCTOR,
            SellGift.CONSTRUCTOR,
            SendAuthenticationFirebaseSms.CONSTRUCTOR,
            SendBotStartMessage.CONSTRUCTOR,
            SendBusinessMessage.CONSTRUCTOR,
            SendBusinessMessageAlbum.CONSTRUCTOR,
            SendCallDebugInformation.CONSTRUCTOR,
            SendCallLog.CONSTRUCTOR,
            SendCallRating.CONSTRUCTOR,
            SendCallSignalingData.CONSTRUCTOR,
            SendChatAction.CONSTRUCTOR,
            SendCustomRequest.CONSTRUCTOR,
            SendEmailAddressVerificationCode.CONSTRUCTOR,
            SendGift.CONSTRUCTOR,
            SendGiftPurchaseOffer.CONSTRUCTOR,
            SendGroupCallMessage.CONSTRUCTOR,
            SendInlineQueryResultMessage.CONSTRUCTOR,
            SendMessage.CONSTRUCTOR,
            SendMessageAlbum.CONSTRUCTOR,
            SendMessageViewMetrics.CONSTRUCTOR,
            SendPassportAuthorizationForm.CONSTRUCTOR,
            SendPaymentForm.CONSTRUCTOR,
            SendPhoneNumberCode.CONSTRUCTOR,
            SendPhoneNumberFirebaseSms.CONSTRUCTOR,
            SendQuickReplyShortcutMessages.CONSTRUCTOR,
            SendResoldGift.CONSTRUCTOR,
            SendTextMessageDraft.CONSTRUCTOR,
            SendWebAppCustomRequest.CONSTRUCTOR,
            SendWebAppData.CONSTRUCTOR,
            SetAccentColor.CONSTRUCTOR,
            SetAccountTtl.CONSTRUCTOR,
            SetAlarm.CONSTRUCTOR,
            SetApplicationVerificationToken.CONSTRUCTOR,
            SetArchiveChatListSettings.CONSTRUCTOR,
            SetAuthenticationEmailAddress.CONSTRUCTOR,
            SetAuthenticationPhoneNumber.CONSTRUCTOR,
            SetAuthenticationPremiumPurchaseTransaction.CONSTRUCTOR,
            SetAutoDownloadSettings.CONSTRUCTOR,
            SetAutosaveSettings.CONSTRUCTOR,
            SetBio.CONSTRUCTOR,
            SetBirthdate.CONSTRUCTOR,
            SetBotInfoDescription.CONSTRUCTOR,
            SetBotInfoShortDescription.CONSTRUCTOR,
            SetBotName.CONSTRUCTOR,
            SetBotProfilePhoto.CONSTRUCTOR,
            SetBotUpdatesStatus.CONSTRUCTOR,
            SetBusinessAccountBio.CONSTRUCTOR,
            SetBusinessAccountGiftSettings.CONSTRUCTOR,
            SetBusinessAccountName.CONSTRUCTOR,
            SetBusinessAccountProfilePhoto.CONSTRUCTOR,
            SetBusinessAccountUsername.CONSTRUCTOR,
            SetBusinessAwayMessageSettings.CONSTRUCTOR,
            SetBusinessConnectedBot.CONSTRUCTOR,
            SetBusinessGreetingMessageSettings.CONSTRUCTOR,
            SetBusinessLocation.CONSTRUCTOR,
            SetBusinessMessageIsPinned.CONSTRUCTOR,
            SetBusinessOpeningHours.CONSTRUCTOR,
            SetBusinessStartPage.CONSTRUCTOR,
            SetChatAccentColor.CONSTRUCTOR,
            SetChatActiveStoriesList.CONSTRUCTOR,
            SetChatAffiliateProgram.CONSTRUCTOR,
            SetChatAvailableReactions.CONSTRUCTOR,
            SetChatBackground.CONSTRUCTOR,
            SetChatClientData.CONSTRUCTOR,
            SetChatDescription.CONSTRUCTOR,
            SetChatDirectMessagesGroup.CONSTRUCTOR,
            SetChatDiscussionGroup.CONSTRUCTOR,
            SetChatDraftMessage.CONSTRUCTOR,
            SetChatEmojiStatus.CONSTRUCTOR,
            SetChatLocation.CONSTRUCTOR,
            SetChatMemberStatus.CONSTRUCTOR,
            SetChatMemberTag.CONSTRUCTOR,
            SetChatMessageAutoDeleteTime.CONSTRUCTOR,
            SetChatMessageSender.CONSTRUCTOR,
            SetChatNotificationSettings.CONSTRUCTOR,
            SetChatPaidMessageStarCount.CONSTRUCTOR,
            SetChatPermissions.CONSTRUCTOR,
            SetChatPhoto.CONSTRUCTOR,
            SetChatPinnedStories.CONSTRUCTOR,
            SetChatProfileAccentColor.CONSTRUCTOR,
            SetChatSlowModeDelay.CONSTRUCTOR,
            SetChatTheme.CONSTRUCTOR,
            SetChatTitle.CONSTRUCTOR,
            SetCloseFriends.CONSTRUCTOR,
            SetCommands.CONSTRUCTOR,
            SetCustomEmojiStickerSetThumbnail.CONSTRUCTOR,
            SetCustomLanguagePack.CONSTRUCTOR,
            SetCustomLanguagePackString.CONSTRUCTOR,
            SetDatabaseEncryptionKey.CONSTRUCTOR,
            SetDefaultBackground.CONSTRUCTOR,
            SetDefaultChannelAdministratorRights.CONSTRUCTOR,
            SetDefaultGroupAdministratorRights.CONSTRUCTOR,
            SetDefaultMessageAutoDeleteTime.CONSTRUCTOR,
            SetDefaultReactionType.CONSTRUCTOR,
            SetDirectMessagesChatTopicIsMarkedAsUnread.CONSTRUCTOR,
            SetEmojiStatus.CONSTRUCTOR,
            SetFileGenerationProgress.CONSTRUCTOR,
            SetForumTopicNotificationSettings.CONSTRUCTOR,
            SetGameScore.CONSTRUCTOR,
            SetGiftCollectionName.CONSTRUCTOR,
            SetGiftResalePrice.CONSTRUCTOR,
            SetGiftSettings.CONSTRUCTOR,
            SetGroupCallPaidMessageStarCount.CONSTRUCTOR,
            SetGroupCallParticipantIsSpeaking.CONSTRUCTOR,
            SetGroupCallParticipantVolumeLevel.CONSTRUCTOR,
            SetInactiveSessionTtl.CONSTRUCTOR,
            SetInlineGameScore.CONSTRUCTOR,
            SetLiveStoryMessageSender.CONSTRUCTOR,
            SetLogStream.CONSTRUCTOR,
            SetLogTagVerbosityLevel.CONSTRUCTOR,
            SetLogVerbosityLevel.CONSTRUCTOR,
            SetLoginEmailAddress.CONSTRUCTOR,
            SetMainProfileTab.CONSTRUCTOR,
            SetManagedBotAccessSettings.CONSTRUCTOR,
            SetMenuButton.CONSTRUCTOR,
            SetMessageFactCheck.CONSTRUCTOR,
            SetMessageReactions.CONSTRUCTOR,
            SetMessageSenderBlockList.CONSTRUCTOR,
            SetMessageSenderBotVerification.CONSTRUCTOR,
            SetName.CONSTRUCTOR,
            SetNetworkType.CONSTRUCTOR,
            SetNewChatPrivacySettings.CONSTRUCTOR,
            SetOption.CONSTRUCTOR,
            SetPaidMessageReactionType.CONSTRUCTOR,
            SetPassportElement.CONSTRUCTOR,
            SetPassportElementErrors.CONSTRUCTOR,
            SetPassword.CONSTRUCTOR,
            SetPersonalChat.CONSTRUCTOR,
            SetPinnedChats.CONSTRUCTOR,
            SetPinnedForumTopics.CONSTRUCTOR,
            SetPinnedGifts.CONSTRUCTOR,
            SetPinnedSavedMessagesTopics.CONSTRUCTOR,
            SetPollAnswer.CONSTRUCTOR,
            SetProfileAccentColor.CONSTRUCTOR,
            SetProfileAudioPosition.CONSTRUCTOR,
            SetProfilePhoto.CONSTRUCTOR,
            SetQuickReplyShortcutName.CONSTRUCTOR,
            SetReactionNotificationSettings.CONSTRUCTOR,
            SetReadDatePrivacySettings.CONSTRUCTOR,
            SetRecoveryEmailAddress.CONSTRUCTOR,
            SetSavedMessagesTagLabel.CONSTRUCTOR,
            SetScopeNotificationSettings.CONSTRUCTOR,
            SetStickerEmojis.CONSTRUCTOR,
            SetStickerKeywords.CONSTRUCTOR,
            SetStickerMaskPosition.CONSTRUCTOR,
            SetStickerPositionInSet.CONSTRUCTOR,
            SetStickerSetThumbnail.CONSTRUCTOR,
            SetStickerSetTitle.CONSTRUCTOR,
            SetStoryAlbumName.CONSTRUCTOR,
            SetStoryPrivacySettings.CONSTRUCTOR,
            SetStoryReaction.CONSTRUCTOR,
            SetSupergroupCustomEmojiStickerSet.CONSTRUCTOR,
            SetSupergroupMainProfileTab.CONSTRUCTOR,
            SetSupergroupStickerSet.CONSTRUCTOR,
            SetSupergroupUnrestrictBoostCount.CONSTRUCTOR,
            SetSupergroupUsername.CONSTRUCTOR,
            SetTdlibParameters.CONSTRUCTOR,
            SetUpgradedGiftColors.CONSTRUCTOR,
            SetUserEmojiStatus.CONSTRUCTOR,
            SetUserNote.CONSTRUCTOR,
            SetUserPersonalProfilePhoto.CONSTRUCTOR,
            SetUserPrivacySettingRules.CONSTRUCTOR,
            SetUserSupportInfo.CONSTRUCTOR,
            SetUsername.CONSTRUCTOR,
            SetVideoChatDefaultParticipant.CONSTRUCTOR,
            SetVideoChatTitle.CONSTRUCTOR,
            ShareChatWithBot.CONSTRUCTOR,
            SharePhoneNumber.CONSTRUCTOR,
            ShareUsersWithBot.CONSTRUCTOR,
            StartGroupCallRecording.CONSTRUCTOR,
            StartGroupCallScreenSharing.CONSTRUCTOR,
            StartLiveStory.CONSTRUCTOR,
            StartScheduledVideoChat.CONSTRUCTOR,
            StopBusinessPoll.CONSTRUCTOR,
            StopPoll.CONSTRUCTOR,
            SuggestUserBirthdate.CONSTRUCTOR,
            SuggestUserProfilePhoto.CONSTRUCTOR,
            SummarizeMessage.CONSTRUCTOR,
            SynchronizeLanguagePack.CONSTRUCTOR,
            TerminateAllOtherSessions.CONSTRUCTOR,
            TerminateSession.CONSTRUCTOR,
            TestCallBytes.CONSTRUCTOR,
            TestCallEmpty.CONSTRUCTOR,
            TestCallString.CONSTRUCTOR,
            TestCallVectorInt.CONSTRUCTOR,
            TestCallVectorIntObject.CONSTRUCTOR,
            TestCallVectorString.CONSTRUCTOR,
            TestCallVectorStringObject.CONSTRUCTOR,
            TestGetDifference.CONSTRUCTOR,
            TestNetwork.CONSTRUCTOR,
            TestProxy.CONSTRUCTOR,
            TestReturnError.CONSTRUCTOR,
            TestSquareInt.CONSTRUCTOR,
            TestUseUpdate.CONSTRUCTOR,
            ToggleAllDownloadsArePaused.CONSTRUCTOR,
            ToggleBotCanManageEmojiStatus.CONSTRUCTOR,
            ToggleBotIsAddedToAttachmentMenu.CONSTRUCTOR,
            ToggleBotUsernameIsActive.CONSTRUCTOR,
            ToggleBusinessConnectedBotChatIsPaused.CONSTRUCTOR,
            ToggleChatDefaultDisableNotification.CONSTRUCTOR,
            ToggleChatFolderTags.CONSTRUCTOR,
            ToggleChatGiftNotifications.CONSTRUCTOR,
            ToggleChatHasProtectedContent.CONSTRUCTOR,
            ToggleChatIsMarkedAsUnread.CONSTRUCTOR,
            ToggleChatIsPinned.CONSTRUCTOR,
            ToggleChatIsTranslatable.CONSTRUCTOR,
            ToggleChatViewAsTopics.CONSTRUCTOR,
            ToggleDirectMessagesChatTopicCanSendUnpaidMessages.CONSTRUCTOR,
            ToggleDownloadIsPaused.CONSTRUCTOR,
            ToggleForumTopicIsClosed.CONSTRUCTOR,
            ToggleForumTopicIsPinned.CONSTRUCTOR,
            ToggleGeneralForumTopicIsHidden.CONSTRUCTOR,
            ToggleGiftIsSaved.CONSTRUCTOR,
            ToggleGroupCallAreMessagesAllowed.CONSTRUCTOR,
            ToggleGroupCallIsMyVideoEnabled.CONSTRUCTOR,
            ToggleGroupCallIsMyVideoPaused.CONSTRUCTOR,
            ToggleGroupCallParticipantIsHandRaised.CONSTRUCTOR,
            ToggleGroupCallParticipantIsMuted.CONSTRUCTOR,
            ToggleGroupCallScreenSharingIsPaused.CONSTRUCTOR,
            ToggleHasSponsoredMessagesEnabled.CONSTRUCTOR,
            ToggleSavedMessagesTopicIsPinned.CONSTRUCTOR,
            ToggleSessionCanAcceptCalls.CONSTRUCTOR,
            ToggleSessionCanAcceptSecretChats.CONSTRUCTOR,
            ToggleStoryIsPostedToChatPage.CONSTRUCTOR,
            ToggleSupergroupCanHaveSponsoredMessages.CONSTRUCTOR,
            ToggleSupergroupHasAggressiveAntiSpamEnabled.CONSTRUCTOR,
            ToggleSupergroupHasAutomaticTranslation.CONSTRUCTOR,
            ToggleSupergroupHasHiddenMembers.CONSTRUCTOR,
            ToggleSupergroupIsAllHistoryAvailable.CONSTRUCTOR,
            ToggleSupergroupIsBroadcastGroup.CONSTRUCTOR,
            ToggleSupergroupIsForum.CONSTRUCTOR,
            ToggleSupergroupJoinByRequest.CONSTRUCTOR,
            ToggleSupergroupJoinToSendMessages.CONSTRUCTOR,
            ToggleSupergroupSignMessages.CONSTRUCTOR,
            ToggleSupergroupUsernameIsActive.CONSTRUCTOR,
            ToggleUsernameIsActive.CONSTRUCTOR,
            ToggleVideoChatEnabledStartNotification.CONSTRUCTOR,
            ToggleVideoChatMuteNewParticipants.CONSTRUCTOR,
            TransferBusinessAccountStars.CONSTRUCTOR,
            TransferChatOwnership.CONSTRUCTOR,
            TransferGift.CONSTRUCTOR,
            TranslateMessageText.CONSTRUCTOR,
            TranslateText.CONSTRUCTOR,
            UnpinAllChatMessages.CONSTRUCTOR,
            UnpinAllDirectMessagesChatTopicMessages.CONSTRUCTOR,
            UnpinAllForumTopicMessages.CONSTRUCTOR,
            UnpinChatMessage.CONSTRUCTOR,
            UpgradeBasicGroupChatToSupergroupChat.CONSTRUCTOR,
            UpgradeGift.CONSTRUCTOR,
            UploadStickerFile.CONSTRUCTOR,
            ValidateOrderInfo.CONSTRUCTOR,
            ViewMessages.CONSTRUCTOR,
            ViewPremiumFeature.CONSTRUCTOR,
            ViewSponsoredChat.CONSTRUCTOR,
            ViewTrendingStickerSets.CONSTRUCTOR,
            ViewVideoMessageAdvertisement.CONSTRUCTOR,
            WriteGeneratedFilePart.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default Function constructor.
         */
        public Function() {
        }

        /**
         * Returns a string representation of the object.
         *
         * @return a string representation of the object.
         */
        public native String toString();
    }

    /**
     * Contains information about supported accent color for user/chat name, background of empty chat photo, replies to messages and link previews.
     */
    public static class AccentColor extends Object {
        /**
         * Accent color identifier.
         */
        public int id;
        /**
         * Identifier of a built-in color to use in places, where only one color is needed; 0-6.
         */
        public int builtInAccentColorId;
        /**
         * The list of 1-3 colors in RGB format, describing the accent color, as expected to be shown in light themes.
         */
        public int[] lightThemeColors;
        /**
         * The list of 1-3 colors in RGB format, describing the accent color, as expected to be shown in dark themes.
         */
        public int[] darkThemeColors;
        /**
         * The minimum chat boost level required to use the color in a channel chat.
         */
        public int minChannelChatBoostLevel;

        /**
         * Contains information about supported accent color for user/chat name, background of empty chat photo, replies to messages and link previews.
         */
        public AccentColor() {
        }

        /**
         * Contains information about supported accent color for user/chat name, background of empty chat photo, replies to messages and link previews.
         *
         * @param id Accent color identifier.
         * @param builtInAccentColorId Identifier of a built-in color to use in places, where only one color is needed; 0-6.
         * @param lightThemeColors The list of 1-3 colors in RGB format, describing the accent color, as expected to be shown in light themes.
         * @param darkThemeColors The list of 1-3 colors in RGB format, describing the accent color, as expected to be shown in dark themes.
         * @param minChannelChatBoostLevel The minimum chat boost level required to use the color in a channel chat.
         */
        public AccentColor(int id, int builtInAccentColorId, int[] lightThemeColors, int[] darkThemeColors, int minChannelChatBoostLevel) {
            this.id = id;
            this.builtInAccentColorId = builtInAccentColorId;
            this.lightThemeColors = lightThemeColors;
            this.darkThemeColors = darkThemeColors;
            this.minChannelChatBoostLevel = minChannelChatBoostLevel;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -496870680;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes gift types that are accepted by a user.
     */
    public static class AcceptedGiftTypes extends Object {
        /**
         * True, if unlimited regular gifts are accepted.
         */
        public boolean unlimitedGifts;
        /**
         * True, if limited regular gifts are accepted.
         */
        public boolean limitedGifts;
        /**
         * True, if upgraded gifts and regular gifts that can be upgraded for free are accepted.
         */
        public boolean upgradedGifts;
        /**
         * True, if gifts from channels are accepted subject to other restrictions.
         */
        public boolean giftsFromChannels;
        /**
         * True, if Telegram Premium subscription is accepted.
         */
        public boolean premiumSubscription;

        /**
         * Describes gift types that are accepted by a user.
         */
        public AcceptedGiftTypes() {
        }

        /**
         * Describes gift types that are accepted by a user.
         *
         * @param unlimitedGifts True, if unlimited regular gifts are accepted.
         * @param limitedGifts True, if limited regular gifts are accepted.
         * @param upgradedGifts True, if upgraded gifts and regular gifts that can be upgraded for free are accepted.
         * @param giftsFromChannels True, if gifts from channels are accepted subject to other restrictions.
         * @param premiumSubscription True, if Telegram Premium subscription is accepted.
         */
        public AcceptedGiftTypes(boolean unlimitedGifts, boolean limitedGifts, boolean upgradedGifts, boolean giftsFromChannels, boolean premiumSubscription) {
            this.unlimitedGifts = unlimitedGifts;
            this.limitedGifts = limitedGifts;
            this.upgradedGifts = upgradedGifts;
            this.giftsFromChannels = giftsFromChannels;
            this.premiumSubscription = premiumSubscription;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1288451078;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains basic information about another user who started a chat with the current user.
     */
    public static class AccountInfo extends Object {
        /**
         * Month when the user was registered in Telegram; 0-12; may be 0 if unknown.
         */
        public int registrationMonth;
        /**
         * Year when the user was registered in Telegram; 0-9999; may be 0 if unknown.
         */
        public int registrationYear;
        /**
         * A two-letter ISO 3166-1 alpha-2 country code based on the phone number of the user; may be empty if unknown.
         */
        public String phoneNumberCountryCode;
        /**
         * Point in time (Unix timestamp) when the user changed name last time; 0 if unknown.
         */
        public int lastNameChangeDate;
        /**
         * Point in time (Unix timestamp) when the user changed photo last time; 0 if unknown.
         */
        public int lastPhotoChangeDate;

        /**
         * Contains basic information about another user who started a chat with the current user.
         */
        public AccountInfo() {
        }

        /**
         * Contains basic information about another user who started a chat with the current user.
         *
         * @param registrationMonth Month when the user was registered in Telegram; 0-12; may be 0 if unknown.
         * @param registrationYear Year when the user was registered in Telegram; 0-9999; may be 0 if unknown.
         * @param phoneNumberCountryCode A two-letter ISO 3166-1 alpha-2 country code based on the phone number of the user; may be empty if unknown.
         * @param lastNameChangeDate Point in time (Unix timestamp) when the user changed name last time; 0 if unknown.
         * @param lastPhotoChangeDate Point in time (Unix timestamp) when the user changed photo last time; 0 if unknown.
         */
        public AccountInfo(int registrationMonth, int registrationYear, String phoneNumberCountryCode, int lastNameChangeDate, int lastPhotoChangeDate) {
            this.registrationMonth = registrationMonth;
            this.registrationYear = registrationYear;
            this.phoneNumberCountryCode = phoneNumberCountryCode;
            this.lastNameChangeDate = lastNameChangeDate;
            this.lastPhotoChangeDate = lastPhotoChangeDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1803492711;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about the period of inactivity after which the current user's account will automatically be deleted.
     */
    public static class AccountTtl extends Object {
        /**
         * Number of days of inactivity before the account will be flagged for deletion; 30-730 days.
         */
        public int days;

        /**
         * Contains information about the period of inactivity after which the current user's account will automatically be deleted.
         */
        public AccountTtl() {
        }

        /**
         * Contains information about the period of inactivity after which the current user's account will automatically be deleted.
         *
         * @param days Number of days of inactivity before the account will be flagged for deletion; 30-730 days.
         */
        public AccountTtl(int days) {
            this.days = days;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1324495492;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes state of active stories posted by a chat.
     */
    public abstract static class ActiveStoryState extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ActiveStoryStateLive.CONSTRUCTOR,
            ActiveStoryStateUnread.CONSTRUCTOR,
            ActiveStoryStateRead.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ActiveStoryState() {
        }
    }

    /**
     * The chat has an active live story.
     */
    public static class ActiveStoryStateLive extends ActiveStoryState {
        /**
         * Identifier of the active live story.
         */
        public int storyId;

        /**
         * The chat has an active live story.
         */
        public ActiveStoryStateLive() {
        }

        /**
         * The chat has an active live story.
         *
         * @param storyId Identifier of the active live story.
         */
        public ActiveStoryStateLive(int storyId) {
            this.storyId = storyId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -292947851;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat has some unread active stories.
     */
    public static class ActiveStoryStateUnread extends ActiveStoryState {

        /**
         * The chat has some unread active stories.
         */
        public ActiveStoryStateUnread() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1903622483;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat has active stories, all of which were read.
     */
    public static class ActiveStoryStateRead extends ActiveStoryState {

        /**
         * The chat has active stories, all of which were read.
         */
        public ActiveStoryStateRead() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 153525350;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of added proxy servers.
     */
    public static class AddedProxies extends Object {
        /**
         * List of proxy servers.
         */
        public AddedProxy[] proxies;

        /**
         * Represents a list of added proxy servers.
         */
        public AddedProxies() {
        }

        /**
         * Represents a list of added proxy servers.
         *
         * @param proxies List of proxy servers.
         */
        public AddedProxies(AddedProxy[] proxies) {
            this.proxies = proxies;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 833708853;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a proxy server added to the list of proxies.
     */
    public static class AddedProxy extends Object {
        /**
         * Unique identifier of the proxy.
         */
        public int id;
        /**
         * Point in time (Unix timestamp) when the proxy was last used; 0 if never.
         */
        public int lastUsedDate;
        /**
         * True, if the proxy is enabled now.
         */
        public boolean isEnabled;
        /**
         * Comment for the proxy added by the user.
         */
        public String comment;
        /**
         * The proxy.
         */
        public Proxy proxy;

        /**
         * Contains information about a proxy server added to the list of proxies.
         */
        public AddedProxy() {
        }

        /**
         * Contains information about a proxy server added to the list of proxies.
         *
         * @param id Unique identifier of the proxy.
         * @param lastUsedDate Point in time (Unix timestamp) when the proxy was last used; 0 if never.
         * @param isEnabled True, if the proxy is enabled now.
         * @param comment Comment for the proxy added by the user.
         * @param proxy The proxy.
         */
        public AddedProxy(int id, int lastUsedDate, boolean isEnabled, String comment, Proxy proxy) {
            this.id = id;
            this.lastUsedDate = lastUsedDate;
            this.isEnabled = isEnabled;
            this.comment = comment;
            this.proxy = proxy;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2076257392;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a reaction applied to a message.
     */
    public static class AddedReaction extends Object {
        /**
         * Type of the reaction.
         */
        public ReactionType type;
        /**
         * Identifier of the chat member, applied the reaction.
         */
        public MessageSender senderId;
        /**
         * True, if the reaction was added by the current user.
         */
        public boolean isOutgoing;
        /**
         * Point in time (Unix timestamp) when the reaction was added.
         */
        public int date;

        /**
         * Represents a reaction applied to a message.
         */
        public AddedReaction() {
        }

        /**
         * Represents a reaction applied to a message.
         *
         * @param type Type of the reaction.
         * @param senderId Identifier of the chat member, applied the reaction.
         * @param isOutgoing True, if the reaction was added by the current user.
         * @param date Point in time (Unix timestamp) when the reaction was added.
         */
        public AddedReaction(ReactionType type, MessageSender senderId, boolean isOutgoing, int date) {
            this.type = type;
            this.senderId = senderId;
            this.isOutgoing = isOutgoing;
            this.date = date;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1258586525;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of reactions added to a message.
     */
    public static class AddedReactions extends Object {
        /**
         * The total number of found reactions.
         */
        public int totalCount;
        /**
         * The list of added reactions.
         */
        public AddedReaction[] reactions;
        /**
         * The offset for the next request. If empty, then there are no more results.
         */
        public String nextOffset;

        /**
         * Represents a list of reactions added to a message.
         */
        public AddedReactions() {
        }

        /**
         * Represents a list of reactions added to a message.
         *
         * @param totalCount The total number of found reactions.
         * @param reactions The list of added reactions.
         * @param nextOffset The offset for the next request. If empty, then there are no more results.
         */
        public AddedReactions(int totalCount, AddedReaction[] reactions, String nextOffset) {
            this.totalCount = totalCount;
            this.reactions = reactions;
            this.nextOffset = nextOffset;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 226352304;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an address.
     */
    public static class Address extends Object {
        /**
         * A two-letter ISO 3166-1 alpha-2 country code.
         */
        public String countryCode;
        /**
         * State, if applicable.
         */
        public String state;
        /**
         * City.
         */
        public String city;
        /**
         * First line of the address.
         */
        public String streetLine1;
        /**
         * Second line of the address.
         */
        public String streetLine2;
        /**
         * Address postal code.
         */
        public String postalCode;

        /**
         * Describes an address.
         */
        public Address() {
        }

        /**
         * Describes an address.
         *
         * @param countryCode A two-letter ISO 3166-1 alpha-2 country code.
         * @param state State, if applicable.
         * @param city City.
         * @param streetLine1 First line of the address.
         * @param streetLine2 Second line of the address.
         * @param postalCode Address postal code.
         */
        public Address(String countryCode, String state, String city, String streetLine1, String streetLine2, String postalCode) {
            this.countryCode = countryCode;
            this.state = state;
            this.city = city;
            this.streetLine1 = streetLine1;
            this.streetLine2 = streetLine2;
            this.postalCode = postalCode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2043654342;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Information about the sponsor of an advertisement.
     */
    public static class AdvertisementSponsor extends Object {
        /**
         * URL of the sponsor to be opened when the advertisement is clicked.
         */
        public String url;
        /**
         * Photo of the sponsor; may be null if must not be shown.
         */
        @Nullable public Photo photo;
        /**
         * Additional optional information about the sponsor to be shown along with the advertisement.
         */
        public String info;

        /**
         * Information about the sponsor of an advertisement.
         */
        public AdvertisementSponsor() {
        }

        /**
         * Information about the sponsor of an advertisement.
         *
         * @param url URL of the sponsor to be opened when the advertisement is clicked.
         * @param photo Photo of the sponsor; may be null if must not be shown.
         * @param info Additional optional information about the sponsor to be shown along with the advertisement.
         */
        public AdvertisementSponsor(String url, Photo photo, String info) {
            this.url = url;
            this.photo = photo;
            this.info = info;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1388914159;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about an affiliate that received commission from a Telegram Star transaction.
     */
    public static class AffiliateInfo extends Object {
        /**
         * The number of Telegram Stars received by the affiliate for each 1000 Telegram Stars received by the program owner.
         */
        public int commissionPerMille;
        /**
         * Identifier of the chat which received the commission.
         */
        public long affiliateChatId;
        /**
         * The Telegram Star amount that was received by the affiliate; can be negative for refunds.
         */
        public StarAmount starAmount;

        /**
         * Contains information about an affiliate that received commission from a Telegram Star transaction.
         */
        public AffiliateInfo() {
        }

        /**
         * Contains information about an affiliate that received commission from a Telegram Star transaction.
         *
         * @param commissionPerMille The number of Telegram Stars received by the affiliate for each 1000 Telegram Stars received by the program owner.
         * @param affiliateChatId Identifier of the chat which received the commission.
         * @param starAmount The Telegram Star amount that was received by the affiliate; can be negative for refunds.
         */
        public AffiliateInfo(int commissionPerMille, long affiliateChatId, StarAmount starAmount) {
            this.commissionPerMille = commissionPerMille;
            this.affiliateChatId = affiliateChatId;
            this.starAmount = starAmount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1312695046;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about an active affiliate program.
     */
    public static class AffiliateProgramInfo extends Object {
        /**
         * Parameters of the affiliate program.
         */
        public AffiliateProgramParameters parameters;
        /**
         * Point in time (Unix timestamp) when the affiliate program will be closed; 0 if the affiliate program isn't scheduled to be closed. If positive, then the program can't be connected using connectAffiliateProgram, but active connections will work until the date.
         */
        public int endDate;
        /**
         * The amount of daily revenue per user in Telegram Stars of the bot that created the affiliate program.
         */
        public StarAmount dailyRevenuePerUserAmount;

        /**
         * Contains information about an active affiliate program.
         */
        public AffiliateProgramInfo() {
        }

        /**
         * Contains information about an active affiliate program.
         *
         * @param parameters Parameters of the affiliate program.
         * @param endDate Point in time (Unix timestamp) when the affiliate program will be closed; 0 if the affiliate program isn't scheduled to be closed. If positive, then the program can't be connected using connectAffiliateProgram, but active connections will work until the date.
         * @param dailyRevenuePerUserAmount The amount of daily revenue per user in Telegram Stars of the bot that created the affiliate program.
         */
        public AffiliateProgramInfo(AffiliateProgramParameters parameters, int endDate, StarAmount dailyRevenuePerUserAmount) {
            this.parameters = parameters;
            this.endDate = endDate;
            this.dailyRevenuePerUserAmount = dailyRevenuePerUserAmount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1761810251;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes parameters of an affiliate program.
     */
    public static class AffiliateProgramParameters extends Object {
        /**
         * The number of Telegram Stars received by the affiliate for each 1000 Telegram Stars received by the program owner; getOption(&quot;affiliate_program_commission_per_mille_min&quot;)-getOption(&quot;affiliate_program_commission_per_mille_max&quot;).
         */
        public int commissionPerMille;
        /**
         * Number of months the program will be active; 0-36. If 0, then the program is eternal.
         */
        public int monthCount;

        /**
         * Describes parameters of an affiliate program.
         */
        public AffiliateProgramParameters() {
        }

        /**
         * Describes parameters of an affiliate program.
         *
         * @param commissionPerMille The number of Telegram Stars received by the affiliate for each 1000 Telegram Stars received by the program owner; getOption(&quot;affiliate_program_commission_per_mille_min&quot;)-getOption(&quot;affiliate_program_commission_per_mille_max&quot;).
         * @param monthCount Number of months the program will be active; 0-36. If 0, then the program is eternal.
         */
        public AffiliateProgramParameters(int commissionPerMille, int monthCount) {
            this.commissionPerMille = commissionPerMille;
            this.monthCount = monthCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1642662996;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the order of the found affiliate programs.
     */
    public abstract static class AffiliateProgramSortOrder extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            AffiliateProgramSortOrderProfitability.CONSTRUCTOR,
            AffiliateProgramSortOrderCreationDate.CONSTRUCTOR,
            AffiliateProgramSortOrderRevenue.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public AffiliateProgramSortOrder() {
        }
    }

    /**
     * The affiliate programs must be sorted by the profitability.
     */
    public static class AffiliateProgramSortOrderProfitability extends AffiliateProgramSortOrder {

        /**
         * The affiliate programs must be sorted by the profitability.
         */
        public AffiliateProgramSortOrderProfitability() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1963282585;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The affiliate programs must be sorted by creation date.
     */
    public static class AffiliateProgramSortOrderCreationDate extends AffiliateProgramSortOrder {

        /**
         * The affiliate programs must be sorted by creation date.
         */
        public AffiliateProgramSortOrderCreationDate() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1558628083;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The affiliate programs must be sorted by the expected revenue.
     */
    public static class AffiliateProgramSortOrderRevenue extends AffiliateProgramSortOrder {

        /**
         * The affiliate programs must be sorted by the expected revenue.
         */
        public AffiliateProgramSortOrderRevenue() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1923269304;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes type of affiliate for an affiliate program.
     */
    public abstract static class AffiliateType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            AffiliateTypeCurrentUser.CONSTRUCTOR,
            AffiliateTypeBot.CONSTRUCTOR,
            AffiliateTypeChannel.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public AffiliateType() {
        }
    }

    /**
     * The affiliate is the current user.
     */
    public static class AffiliateTypeCurrentUser extends AffiliateType {

        /**
         * The affiliate is the current user.
         */
        public AffiliateTypeCurrentUser() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1453785589;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The affiliate is a bot owned by the current user.
     */
    public static class AffiliateTypeBot extends AffiliateType {
        /**
         * User identifier of the bot.
         */
        public long userId;

        /**
         * The affiliate is a bot owned by the current user.
         */
        public AffiliateTypeBot() {
        }

        /**
         * The affiliate is a bot owned by the current user.
         *
         * @param userId User identifier of the bot.
         */
        public AffiliateTypeBot(long userId) {
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1032587200;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The affiliate is a channel chat where the current user has canPostMessages administrator right.
     */
    public static class AffiliateTypeChannel extends AffiliateType {
        /**
         * Identifier of the channel chat.
         */
        public long chatId;

        /**
         * The affiliate is a channel chat where the current user has canPostMessages administrator right.
         */
        public AffiliateTypeChannel() {
        }

        /**
         * The affiliate is a channel chat where the current user has canPostMessages administrator right.
         *
         * @param chatId Identifier of the channel chat.
         */
        public AffiliateTypeChannel(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -683939735;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes parameters for age verification of the current user.
     */
    public static class AgeVerificationParameters extends Object {
        /**
         * The minimum age required to view restricted content.
         */
        public int minAge;
        /**
         * Username of the bot which main Web App may be used to verify age of the user.
         */
        public String verificationBotUsername;
        /**
         * Unique name for the country or region, which legislation required age verification. May be used to get the corresponding localization key.
         */
        public String country;

        /**
         * Describes parameters for age verification of the current user.
         */
        public AgeVerificationParameters() {
        }

        /**
         * Describes parameters for age verification of the current user.
         *
         * @param minAge The minimum age required to view restricted content.
         * @param verificationBotUsername Username of the bot which main Web App may be used to verify age of the user.
         * @param country Unique name for the country or region, which legislation required age verification. May be used to get the corresponding localization key.
         */
        public AgeVerificationParameters(int minAge, String verificationBotUsername, String country) {
            this.minAge = minAge;
            this.verificationBotUsername = verificationBotUsername;
            this.country = country;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2050025833;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an alternative re-encoded quality of a video file.
     */
    public static class AlternativeVideo extends Object {
        /**
         * Unique identifier of the alternative video, which is used in the HLS file.
         */
        public long id;
        /**
         * Video width.
         */
        public int width;
        /**
         * Video height.
         */
        public int height;
        /**
         * Codec used for video file encoding, for example, &quot;h264&quot;, &quot;h265&quot;, &quot;av1&quot;, or &quot;av01&quot;.
         */
        public String codec;
        /**
         * HLS file describing the video.
         */
        public File hlsFile;
        /**
         * File containing the video.
         */
        public File video;

        /**
         * Describes an alternative re-encoded quality of a video file.
         */
        public AlternativeVideo() {
        }

        /**
         * Describes an alternative re-encoded quality of a video file.
         *
         * @param id Unique identifier of the alternative video, which is used in the HLS file.
         * @param width Video width.
         * @param height Video height.
         * @param codec Codec used for video file encoding, for example, &quot;h264&quot;, &quot;h265&quot;, &quot;av1&quot;, or &quot;av01&quot;.
         * @param hlsFile HLS file describing the video.
         * @param video File containing the video.
         */
        public AlternativeVideo(long id, int width, int height, String codec, File hlsFile, File video) {
            this.id = id;
            this.width = width;
            this.height = height;
            this.codec = codec;
            this.hlsFile = hlsFile;
            this.video = video;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 483379470;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Animated variant of a chat photo in MPEG4 format.
     */
    public static class AnimatedChatPhoto extends Object {
        /**
         * Animation width and height.
         */
        public int length;
        /**
         * Information about the animation file.
         */
        public File file;
        /**
         * Timestamp of the frame, used as a static chat photo.
         */
        public double mainFrameTimestamp;

        /**
         * Animated variant of a chat photo in MPEG4 format.
         */
        public AnimatedChatPhoto() {
        }

        /**
         * Animated variant of a chat photo in MPEG4 format.
         *
         * @param length Animation width and height.
         * @param file Information about the animation file.
         * @param mainFrameTimestamp Timestamp of the frame, used as a static chat photo.
         */
        public AnimatedChatPhoto(int length, File file, double mainFrameTimestamp) {
            this.length = length;
            this.file = file;
            this.mainFrameTimestamp = mainFrameTimestamp;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 191994926;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an animated or custom representation of an emoji.
     */
    public static class AnimatedEmoji extends Object {
        /**
         * Sticker for the emoji; may be null if yet unknown for a custom emoji. If the sticker is a custom emoji, then it can have arbitrary format.
         */
        @Nullable public Sticker sticker;
        /**
         * Expected width of the sticker, which can be used if the sticker is null.
         */
        public int stickerWidth;
        /**
         * Expected height of the sticker, which can be used if the sticker is null.
         */
        public int stickerHeight;
        /**
         * Emoji modifier fitzpatrick type; 0-6; 0 if none.
         */
        public int fitzpatrickType;
        /**
         * File containing the sound to be played when the sticker is clicked; may be null. The sound is encoded with the Opus codec, and stored inside an OGG container.
         */
        @Nullable public File sound;

        /**
         * Describes an animated or custom representation of an emoji.
         */
        public AnimatedEmoji() {
        }

        /**
         * Describes an animated or custom representation of an emoji.
         *
         * @param sticker Sticker for the emoji; may be null if yet unknown for a custom emoji. If the sticker is a custom emoji, then it can have arbitrary format.
         * @param stickerWidth Expected width of the sticker, which can be used if the sticker is null.
         * @param stickerHeight Expected height of the sticker, which can be used if the sticker is null.
         * @param fitzpatrickType Emoji modifier fitzpatrick type; 0-6; 0 if none.
         * @param sound File containing the sound to be played when the sticker is clicked; may be null. The sound is encoded with the Opus codec, and stored inside an OGG container.
         */
        public AnimatedEmoji(Sticker sticker, int stickerWidth, int stickerHeight, int fitzpatrickType, File sound) {
            this.sticker = sticker;
            this.stickerWidth = stickerWidth;
            this.stickerHeight = stickerHeight;
            this.fitzpatrickType = fitzpatrickType;
            this.sound = sound;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1378918079;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an animation file. The animation must be encoded in GIF or MPEG4 format.
     */
    public static class Animation extends Object {
        /**
         * Duration of the animation, in seconds; as defined by the sender.
         */
        public int duration;
        /**
         * Width of the animation.
         */
        public int width;
        /**
         * Height of the animation.
         */
        public int height;
        /**
         * Original name of the file; as defined by the sender.
         */
        public String fileName;
        /**
         * MIME type of the file, usually &quot;image/gif&quot; or &quot;video/mp4&quot;.
         */
        public String mimeType;
        /**
         * True, if stickers were added to the animation. The list of corresponding sticker set can be received using getAttachedStickerSets.
         */
        public boolean hasStickers;
        /**
         * Animation minithumbnail; may be null.
         */
        @Nullable public Minithumbnail minithumbnail;
        /**
         * Animation thumbnail in JPEG or MPEG4 format; may be null.
         */
        @Nullable public Thumbnail thumbnail;
        /**
         * File containing the animation.
         */
        public File animation;

        /**
         * Describes an animation file. The animation must be encoded in GIF or MPEG4 format.
         */
        public Animation() {
        }

        /**
         * Describes an animation file. The animation must be encoded in GIF or MPEG4 format.
         *
         * @param duration Duration of the animation, in seconds; as defined by the sender.
         * @param width Width of the animation.
         * @param height Height of the animation.
         * @param fileName Original name of the file; as defined by the sender.
         * @param mimeType MIME type of the file, usually &quot;image/gif&quot; or &quot;video/mp4&quot;.
         * @param hasStickers True, if stickers were added to the animation. The list of corresponding sticker set can be received using getAttachedStickerSets.
         * @param minithumbnail Animation minithumbnail; may be null.
         * @param thumbnail Animation thumbnail in JPEG or MPEG4 format; may be null.
         * @param animation File containing the animation.
         */
        public Animation(int duration, int width, int height, String fileName, String mimeType, boolean hasStickers, Minithumbnail minithumbnail, Thumbnail thumbnail, File animation) {
            this.duration = duration;
            this.width = width;
            this.height = height;
            this.fileName = fileName;
            this.mimeType = mimeType;
            this.hasStickers = hasStickers;
            this.minithumbnail = minithumbnail;
            this.thumbnail = thumbnail;
            this.animation = animation;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -872359106;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of animations.
     */
    public static class Animations extends Object {
        /**
         * List of animations.
         */
        public Animation[] animations;

        /**
         * Represents a list of animations.
         */
        public Animations() {
        }

        /**
         * Represents a list of animations.
         *
         * @param animations List of animations.
         */
        public Animations(Animation[] animations) {
            this.animations = animations;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 344216945;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains settings for automatic moving of chats to and from the Archive chat lists.
     */
    public static class ArchiveChatListSettings extends Object {
        /**
         * True, if new chats from non-contacts will be automatically archived and muted. Can be set to true only if the option &quot;can_archive_and_mute_new_chats_from_unknown_users&quot; is true.
         */
        public boolean archiveAndMuteNewChatsFromUnknownUsers;
        /**
         * True, if unmuted chats will be kept in the Archive chat list when they get a new message.
         */
        public boolean keepUnmutedChatsArchived;
        /**
         * True, if unmuted chats, that are always included or pinned in a folder, will be kept in the Archive chat list when they get a new message. Ignored if keepUnmutedChatsArchived == true.
         */
        public boolean keepChatsFromFoldersArchived;

        /**
         * Contains settings for automatic moving of chats to and from the Archive chat lists.
         */
        public ArchiveChatListSettings() {
        }

        /**
         * Contains settings for automatic moving of chats to and from the Archive chat lists.
         *
         * @param archiveAndMuteNewChatsFromUnknownUsers True, if new chats from non-contacts will be automatically archived and muted. Can be set to true only if the option &quot;can_archive_and_mute_new_chats_from_unknown_users&quot; is true.
         * @param keepUnmutedChatsArchived True, if unmuted chats will be kept in the Archive chat list when they get a new message.
         * @param keepChatsFromFoldersArchived True, if unmuted chats, that are always included or pinned in a folder, will be kept in the Archive chat list when they get a new message. Ignored if keepUnmutedChatsArchived == true.
         */
        public ArchiveChatListSettings(boolean archiveAndMuteNewChatsFromUnknownUsers, boolean keepUnmutedChatsArchived, boolean keepChatsFromFoldersArchived) {
            this.archiveAndMuteNewChatsFromUnknownUsers = archiveAndMuteNewChatsFromUnknownUsers;
            this.keepUnmutedChatsArchived = keepUnmutedChatsArchived;
            this.keepChatsFromFoldersArchived = keepChatsFromFoldersArchived;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1058499236;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a bot, which can be added to attachment or side menu.
     */
    public static class AttachmentMenuBot extends Object {
        /**
         * User identifier of the bot.
         */
        public long botUserId;
        /**
         * True, if the bot supports opening from attachment menu in the chat with the bot.
         */
        public boolean supportsSelfChat;
        /**
         * True, if the bot supports opening from attachment menu in private chats with ordinary users.
         */
        public boolean supportsUserChats;
        /**
         * True, if the bot supports opening from attachment menu in private chats with other bots.
         */
        public boolean supportsBotChats;
        /**
         * True, if the bot supports opening from attachment menu in basic group and supergroup chats.
         */
        public boolean supportsGroupChats;
        /**
         * True, if the bot supports opening from attachment menu in channel chats.
         */
        public boolean supportsChannelChats;
        /**
         * True, if the user must be asked for the permission to send messages to the bot.
         */
        public boolean requestWriteAccess;
        /**
         * True, if the bot was explicitly added by the user. If the bot isn't added, then on the first bot launch toggleBotIsAddedToAttachmentMenu must be called and the bot must be added or removed.
         */
        public boolean isAdded;
        /**
         * True, if the bot must be shown in the attachment menu.
         */
        public boolean showInAttachmentMenu;
        /**
         * True, if the bot must be shown in the side menu.
         */
        public boolean showInSideMenu;
        /**
         * True, if a disclaimer, why the bot is shown in the side menu, is needed.
         */
        public boolean showDisclaimerInSideMenu;
        /**
         * Name for the bot in attachment menu.
         */
        public String name;
        /**
         * Color to highlight selected name of the bot if appropriate; may be null.
         */
        @Nullable public AttachmentMenuBotColor nameColor;
        /**
         * Default icon for the bot in SVG format; may be null.
         */
        @Nullable public File defaultIcon;
        /**
         * Icon for the bot in SVG format for the official iOS app; may be null.
         */
        @Nullable public File iosStaticIcon;
        /**
         * Icon for the bot in TGS format for the official iOS app; may be null.
         */
        @Nullable public File iosAnimatedIcon;
        /**
         * Icon for the bot in PNG format for the official iOS app side menu; may be null.
         */
        @Nullable public File iosSideMenuIcon;
        /**
         * Icon for the bot in TGS format for the official Android app; may be null.
         */
        @Nullable public File androidIcon;
        /**
         * Icon for the bot in SVG format for the official Android app side menu; may be null.
         */
        @Nullable public File androidSideMenuIcon;
        /**
         * Icon for the bot in TGS format for the official native macOS app; may be null.
         */
        @Nullable public File macosIcon;
        /**
         * Icon for the bot in PNG format for the official macOS app side menu; may be null.
         */
        @Nullable public File macosSideMenuIcon;
        /**
         * Color to highlight selected icon of the bot if appropriate; may be null.
         */
        @Nullable public AttachmentMenuBotColor iconColor;
        /**
         * Default placeholder for opened Web Apps in SVG format; may be null.
         */
        @Nullable public File webAppPlaceholder;

        /**
         * Represents a bot, which can be added to attachment or side menu.
         */
        public AttachmentMenuBot() {
        }

        /**
         * Represents a bot, which can be added to attachment or side menu.
         *
         * @param botUserId User identifier of the bot.
         * @param supportsSelfChat True, if the bot supports opening from attachment menu in the chat with the bot.
         * @param supportsUserChats True, if the bot supports opening from attachment menu in private chats with ordinary users.
         * @param supportsBotChats True, if the bot supports opening from attachment menu in private chats with other bots.
         * @param supportsGroupChats True, if the bot supports opening from attachment menu in basic group and supergroup chats.
         * @param supportsChannelChats True, if the bot supports opening from attachment menu in channel chats.
         * @param requestWriteAccess True, if the user must be asked for the permission to send messages to the bot.
         * @param isAdded True, if the bot was explicitly added by the user. If the bot isn't added, then on the first bot launch toggleBotIsAddedToAttachmentMenu must be called and the bot must be added or removed.
         * @param showInAttachmentMenu True, if the bot must be shown in the attachment menu.
         * @param showInSideMenu True, if the bot must be shown in the side menu.
         * @param showDisclaimerInSideMenu True, if a disclaimer, why the bot is shown in the side menu, is needed.
         * @param name Name for the bot in attachment menu.
         * @param nameColor Color to highlight selected name of the bot if appropriate; may be null.
         * @param defaultIcon Default icon for the bot in SVG format; may be null.
         * @param iosStaticIcon Icon for the bot in SVG format for the official iOS app; may be null.
         * @param iosAnimatedIcon Icon for the bot in TGS format for the official iOS app; may be null.
         * @param iosSideMenuIcon Icon for the bot in PNG format for the official iOS app side menu; may be null.
         * @param androidIcon Icon for the bot in TGS format for the official Android app; may be null.
         * @param androidSideMenuIcon Icon for the bot in SVG format for the official Android app side menu; may be null.
         * @param macosIcon Icon for the bot in TGS format for the official native macOS app; may be null.
         * @param macosSideMenuIcon Icon for the bot in PNG format for the official macOS app side menu; may be null.
         * @param iconColor Color to highlight selected icon of the bot if appropriate; may be null.
         * @param webAppPlaceholder Default placeholder for opened Web Apps in SVG format; may be null.
         */
        public AttachmentMenuBot(long botUserId, boolean supportsSelfChat, boolean supportsUserChats, boolean supportsBotChats, boolean supportsGroupChats, boolean supportsChannelChats, boolean requestWriteAccess, boolean isAdded, boolean showInAttachmentMenu, boolean showInSideMenu, boolean showDisclaimerInSideMenu, String name, AttachmentMenuBotColor nameColor, File defaultIcon, File iosStaticIcon, File iosAnimatedIcon, File iosSideMenuIcon, File androidIcon, File androidSideMenuIcon, File macosIcon, File macosSideMenuIcon, AttachmentMenuBotColor iconColor, File webAppPlaceholder) {
            this.botUserId = botUserId;
            this.supportsSelfChat = supportsSelfChat;
            this.supportsUserChats = supportsUserChats;
            this.supportsBotChats = supportsBotChats;
            this.supportsGroupChats = supportsGroupChats;
            this.supportsChannelChats = supportsChannelChats;
            this.requestWriteAccess = requestWriteAccess;
            this.isAdded = isAdded;
            this.showInAttachmentMenu = showInAttachmentMenu;
            this.showInSideMenu = showInSideMenu;
            this.showDisclaimerInSideMenu = showDisclaimerInSideMenu;
            this.name = name;
            this.nameColor = nameColor;
            this.defaultIcon = defaultIcon;
            this.iosStaticIcon = iosStaticIcon;
            this.iosAnimatedIcon = iosAnimatedIcon;
            this.iosSideMenuIcon = iosSideMenuIcon;
            this.androidIcon = androidIcon;
            this.androidSideMenuIcon = androidSideMenuIcon;
            this.macosIcon = macosIcon;
            this.macosSideMenuIcon = macosSideMenuIcon;
            this.iconColor = iconColor;
            this.webAppPlaceholder = webAppPlaceholder;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1183966273;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a color to highlight a bot added to attachment menu.
     */
    public static class AttachmentMenuBotColor extends Object {
        /**
         * Color in the RGB format for light themes.
         */
        public int lightColor;
        /**
         * Color in the RGB format for dark themes.
         */
        public int darkColor;

        /**
         * Describes a color to highlight a bot added to attachment menu.
         */
        public AttachmentMenuBotColor() {
        }

        /**
         * Describes a color to highlight a bot added to attachment menu.
         *
         * @param lightColor Color in the RGB format for light themes.
         * @param darkColor Color in the RGB format for dark themes.
         */
        public AttachmentMenuBotColor(int lightColor, int darkColor) {
            this.lightColor = lightColor;
            this.darkColor = darkColor;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1680039612;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes chance of the crafted gift to have the backdrop or symbol of one of the original gifts.
     */
    public static class AttributeCraftPersistenceProbability extends Object {
        /**
         * The 4 numbers that describe probability of the craft result to have the same attribute as one of the original gifts if 1, 2, 3, or 4 gifts with the attribute are used in the craft. Each number represents the number of crafted gifts with the original attribute per 1000 successful craftings.
         */
        public int[] persistenceChancePerMille;

        /**
         * Describes chance of the crafted gift to have the backdrop or symbol of one of the original gifts.
         */
        public AttributeCraftPersistenceProbability() {
        }

        /**
         * Describes chance of the crafted gift to have the backdrop or symbol of one of the original gifts.
         *
         * @param persistenceChancePerMille The 4 numbers that describe probability of the craft result to have the same attribute as one of the original gifts if 1, 2, 3, or 4 gifts with the attribute are used in the craft. Each number represents the number of crafted gifts with the original attribute per 1000 successful craftings.
         */
        public AttributeCraftPersistenceProbability(int[] persistenceChancePerMille) {
            this.persistenceChancePerMille = persistenceChancePerMille;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -922780991;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a bid in an auction.
     */
    public static class AuctionBid extends Object {
        /**
         * The number of Telegram Stars that were put in the bid.
         */
        public long starCount;
        /**
         * Point in time (Unix timestamp) when the bid was made.
         */
        public int bidDate;
        /**
         * Position of the bid in the list of all bids.
         */
        public int position;

        /**
         * Describes a bid in an auction.
         */
        public AuctionBid() {
        }

        /**
         * Describes a bid in an auction.
         *
         * @param starCount The number of Telegram Stars that were put in the bid.
         * @param bidDate Point in time (Unix timestamp) when the bid was made.
         * @param position Position of the bid in the list of all bids.
         */
        public AuctionBid(long starCount, int bidDate, int position) {
            this.starCount = starCount;
            this.bidDate = bidDate;
            this.position = position;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1756434144;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a round of an auction.
     */
    public static class AuctionRound extends Object {
        /**
         * 1-based number of the round.
         */
        public int number;
        /**
         * Duration of the round, in seconds.
         */
        public int duration;
        /**
         * The number of seconds for which the round will be extended if there are changes in the top winners.
         */
        public int extendTime;
        /**
         * The number of top winners who trigger round extension if changed.
         */
        public int topWinnerCount;

        /**
         * Describes a round of an auction.
         */
        public AuctionRound() {
        }

        /**
         * Describes a round of an auction.
         *
         * @param number 1-based number of the round.
         * @param duration Duration of the round, in seconds.
         * @param extendTime The number of seconds for which the round will be extended if there are changes in the top winners.
         * @param topWinnerCount The number of top winners who trigger round extension if changed.
         */
        public AuctionRound(int number, int duration, int extendTime, int topWinnerCount) {
            this.number = number;
            this.duration = duration;
            this.extendTime = extendTime;
            this.topWinnerCount = topWinnerCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -986948877;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes state of an auction.
     */
    public abstract static class AuctionState extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            AuctionStateActive.CONSTRUCTOR,
            AuctionStateFinished.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public AuctionState() {
        }
    }

    /**
     * Contains information about an ongoing or scheduled auction.
     */
    public static class AuctionStateActive extends AuctionState {
        /**
         * Point in time (Unix timestamp) when the auction started or will start.
         */
        public int startDate;
        /**
         * Point in time (Unix timestamp) when the auction will be ended.
         */
        public int endDate;
        /**
         * The minimum possible bid in the auction in Telegram Stars.
         */
        public long minBid;
        /**
         * A sparse list of bids that were made in the auction.
         */
        public AuctionBid[] bidLevels;
        /**
         * User identifiers of at most 3 users with the biggest bids.
         */
        public long[] topBidderUserIds;
        /**
         * Rounds of the auction in which their duration or extension rules are changed.
         */
        public AuctionRound[] rounds;
        /**
         * Point in time (Unix timestamp) when the current round will end.
         */
        public int currentRoundEndDate;
        /**
         * 1-based number of the current round.
         */
        public int currentRoundNumber;
        /**
         * The total number of rounds.
         */
        public int totalRoundCount;
        /**
         * The number of items that were purchased on the auction by all users.
         */
        public int distributedItemCount;
        /**
         * The number of items that have to be distributed on the auction.
         */
        public int leftItemCount;
        /**
         * The number of items that were purchased by the current user on the auction.
         */
        public int acquiredItemCount;
        /**
         * Bid of the current user in the auction; may be null if none.
         */
        @Nullable public UserAuctionBid userBid;

        /**
         * Contains information about an ongoing or scheduled auction.
         */
        public AuctionStateActive() {
        }

        /**
         * Contains information about an ongoing or scheduled auction.
         *
         * @param startDate Point in time (Unix timestamp) when the auction started or will start.
         * @param endDate Point in time (Unix timestamp) when the auction will be ended.
         * @param minBid The minimum possible bid in the auction in Telegram Stars.
         * @param bidLevels A sparse list of bids that were made in the auction.
         * @param topBidderUserIds User identifiers of at most 3 users with the biggest bids.
         * @param rounds Rounds of the auction in which their duration or extension rules are changed.
         * @param currentRoundEndDate Point in time (Unix timestamp) when the current round will end.
         * @param currentRoundNumber 1-based number of the current round.
         * @param totalRoundCount The total number of rounds.
         * @param distributedItemCount The number of items that were purchased on the auction by all users.
         * @param leftItemCount The number of items that have to be distributed on the auction.
         * @param acquiredItemCount The number of items that were purchased by the current user on the auction.
         * @param userBid Bid of the current user in the auction; may be null if none.
         */
        public AuctionStateActive(int startDate, int endDate, long minBid, AuctionBid[] bidLevels, long[] topBidderUserIds, AuctionRound[] rounds, int currentRoundEndDate, int currentRoundNumber, int totalRoundCount, int distributedItemCount, int leftItemCount, int acquiredItemCount, UserAuctionBid userBid) {
            this.startDate = startDate;
            this.endDate = endDate;
            this.minBid = minBid;
            this.bidLevels = bidLevels;
            this.topBidderUserIds = topBidderUserIds;
            this.rounds = rounds;
            this.currentRoundEndDate = currentRoundEndDate;
            this.currentRoundNumber = currentRoundNumber;
            this.totalRoundCount = totalRoundCount;
            this.distributedItemCount = distributedItemCount;
            this.leftItemCount = leftItemCount;
            this.acquiredItemCount = acquiredItemCount;
            this.userBid = userBid;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1169774099;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a finished auction.
     */
    public static class AuctionStateFinished extends AuctionState {
        /**
         * Point in time (Unix timestamp) when the auction started.
         */
        public int startDate;
        /**
         * Point in time (Unix timestamp) when the auction will be ended.
         */
        public int endDate;
        /**
         * Average price of bought items in Telegram Stars.
         */
        public long averagePrice;
        /**
         * The number of items that were purchased by the current user on the auction.
         */
        public int acquiredItemCount;
        /**
         * Number of items from the auction being resold on Telegram.
         */
        public int telegramListedItemCount;
        /**
         * Number of items from the auction being resold on Fragment.
         */
        public int fragmentListedItemCount;
        /**
         * The HTTPS link to the Fragment for the resold items; may be empty if there are no such items being sold on Fragment.
         */
        public String fragmentUrl;

        /**
         * Contains information about a finished auction.
         */
        public AuctionStateFinished() {
        }

        /**
         * Contains information about a finished auction.
         *
         * @param startDate Point in time (Unix timestamp) when the auction started.
         * @param endDate Point in time (Unix timestamp) when the auction will be ended.
         * @param averagePrice Average price of bought items in Telegram Stars.
         * @param acquiredItemCount The number of items that were purchased by the current user on the auction.
         * @param telegramListedItemCount Number of items from the auction being resold on Telegram.
         * @param fragmentListedItemCount Number of items from the auction being resold on Fragment.
         * @param fragmentUrl The HTTPS link to the Fragment for the resold items; may be empty if there are no such items being sold on Fragment.
         */
        public AuctionStateFinished(int startDate, int endDate, long averagePrice, int acquiredItemCount, int telegramListedItemCount, int fragmentListedItemCount, String fragmentUrl) {
            this.startDate = startDate;
            this.endDate = endDate;
            this.averagePrice = averagePrice;
            this.acquiredItemCount = acquiredItemCount;
            this.telegramListedItemCount = telegramListedItemCount;
            this.fragmentListedItemCount = fragmentListedItemCount;
            this.fragmentUrl = fragmentUrl;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -451306439;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an audio file. Audio is usually in MP3 or M4A format.
     */
    public static class Audio extends Object {
        /**
         * Duration of the audio, in seconds; as defined by the sender.
         */
        public int duration;
        /**
         * Title of the audio; as defined by the sender.
         */
        public String title;
        /**
         * Performer of the audio; as defined by the sender.
         */
        public String performer;
        /**
         * Original name of the file; as defined by the sender.
         */
        public String fileName;
        /**
         * The MIME type of the file; as defined by the sender.
         */
        public String mimeType;
        /**
         * The minithumbnail of the album cover; may be null.
         */
        @Nullable public Minithumbnail albumCoverMinithumbnail;
        /**
         * The thumbnail of the album cover in JPEG format; as defined by the sender. The full size thumbnail is expected to be extracted from the downloaded audio file; may be null.
         */
        @Nullable public Thumbnail albumCoverThumbnail;
        /**
         * Album cover variants to use if the downloaded audio file contains no album cover. Provided thumbnail dimensions are approximate.
         */
        public Thumbnail[] externalAlbumCovers;
        /**
         * File containing the audio.
         */
        public File audio;

        /**
         * Describes an audio file. Audio is usually in MP3 or M4A format.
         */
        public Audio() {
        }

        /**
         * Describes an audio file. Audio is usually in MP3 or M4A format.
         *
         * @param duration Duration of the audio, in seconds; as defined by the sender.
         * @param title Title of the audio; as defined by the sender.
         * @param performer Performer of the audio; as defined by the sender.
         * @param fileName Original name of the file; as defined by the sender.
         * @param mimeType The MIME type of the file; as defined by the sender.
         * @param albumCoverMinithumbnail The minithumbnail of the album cover; may be null.
         * @param albumCoverThumbnail The thumbnail of the album cover in JPEG format; as defined by the sender. The full size thumbnail is expected to be extracted from the downloaded audio file; may be null.
         * @param externalAlbumCovers Album cover variants to use if the downloaded audio file contains no album cover. Provided thumbnail dimensions are approximate.
         * @param audio File containing the audio.
         */
        public Audio(int duration, String title, String performer, String fileName, String mimeType, Minithumbnail albumCoverMinithumbnail, Thumbnail albumCoverThumbnail, Thumbnail[] externalAlbumCovers, File audio) {
            this.duration = duration;
            this.title = title;
            this.performer = performer;
            this.fileName = fileName;
            this.mimeType = mimeType;
            this.albumCoverMinithumbnail = albumCoverMinithumbnail;
            this.albumCoverThumbnail = albumCoverThumbnail;
            this.externalAlbumCovers = externalAlbumCovers;
            this.audio = audio;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -166398841;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of audio files.
     */
    public static class Audios extends Object {
        /**
         * Approximate total number of audio files found.
         */
        public int totalCount;
        /**
         * List of audio files.
         */
        public Audio[] audios;

        /**
         * Contains a list of audio files.
         */
        public Audios() {
        }

        /**
         * Contains a list of audio files.
         *
         * @param totalCount Approximate total number of audio files found.
         * @param audios List of audio files.
         */
        public Audios(int totalCount, Audio[] audios) {
            this.totalCount = totalCount;
            this.audios = audios;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -680688982;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Information about the authentication code that was sent.
     */
    public static class AuthenticationCodeInfo extends Object {
        /**
         * A phone number that is being authenticated.
         */
        public String phoneNumber;
        /**
         * The way the code was sent to the user.
         */
        public AuthenticationCodeType type;
        /**
         * The way the next code will be sent to the user; may be null.
         */
        @Nullable public AuthenticationCodeType nextType;
        /**
         * Timeout before the code can be re-sent, in seconds.
         */
        public int timeout;

        /**
         * Information about the authentication code that was sent.
         */
        public AuthenticationCodeInfo() {
        }

        /**
         * Information about the authentication code that was sent.
         *
         * @param phoneNumber A phone number that is being authenticated.
         * @param type The way the code was sent to the user.
         * @param nextType The way the next code will be sent to the user; may be null.
         * @param timeout Timeout before the code can be re-sent, in seconds.
         */
        public AuthenticationCodeInfo(String phoneNumber, AuthenticationCodeType type, AuthenticationCodeType nextType, int timeout) {
            this.phoneNumber = phoneNumber;
            this.type = type;
            this.nextType = nextType;
            this.timeout = timeout;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -860345416;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Provides information about the method by which an authentication code is delivered to the user.
     */
    public abstract static class AuthenticationCodeType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            AuthenticationCodeTypeTelegramMessage.CONSTRUCTOR,
            AuthenticationCodeTypeSms.CONSTRUCTOR,
            AuthenticationCodeTypeSmsWord.CONSTRUCTOR,
            AuthenticationCodeTypeSmsPhrase.CONSTRUCTOR,
            AuthenticationCodeTypeCall.CONSTRUCTOR,
            AuthenticationCodeTypeFlashCall.CONSTRUCTOR,
            AuthenticationCodeTypeMissedCall.CONSTRUCTOR,
            AuthenticationCodeTypeFragment.CONSTRUCTOR,
            AuthenticationCodeTypeFirebaseAndroid.CONSTRUCTOR,
            AuthenticationCodeTypeFirebaseIos.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public AuthenticationCodeType() {
        }
    }

    /**
     * A digit-only authentication code is delivered via a private Telegram message, which can be viewed from another active session.
     */
    public static class AuthenticationCodeTypeTelegramMessage extends AuthenticationCodeType {
        /**
         * Length of the code.
         */
        public int length;

        /**
         * A digit-only authentication code is delivered via a private Telegram message, which can be viewed from another active session.
         */
        public AuthenticationCodeTypeTelegramMessage() {
        }

        /**
         * A digit-only authentication code is delivered via a private Telegram message, which can be viewed from another active session.
         *
         * @param length Length of the code.
         */
        public AuthenticationCodeTypeTelegramMessage(int length) {
            this.length = length;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2079628074;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A digit-only authentication code is delivered via an SMS message to the specified phone number; non-official applications may not receive this type of code.
     */
    public static class AuthenticationCodeTypeSms extends AuthenticationCodeType {
        /**
         * Length of the code.
         */
        public int length;

        /**
         * A digit-only authentication code is delivered via an SMS message to the specified phone number; non-official applications may not receive this type of code.
         */
        public AuthenticationCodeTypeSms() {
        }

        /**
         * A digit-only authentication code is delivered via an SMS message to the specified phone number; non-official applications may not receive this type of code.
         *
         * @param length Length of the code.
         */
        public AuthenticationCodeTypeSms(int length) {
            this.length = length;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 962650760;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An authentication code is a word delivered via an SMS message to the specified phone number; non-official applications may not receive this type of code.
     */
    public static class AuthenticationCodeTypeSmsWord extends AuthenticationCodeType {
        /**
         * The first letters of the word if known.
         */
        public String firstLetter;

        /**
         * An authentication code is a word delivered via an SMS message to the specified phone number; non-official applications may not receive this type of code.
         */
        public AuthenticationCodeTypeSmsWord() {
        }

        /**
         * An authentication code is a word delivered via an SMS message to the specified phone number; non-official applications may not receive this type of code.
         *
         * @param firstLetter The first letters of the word if known.
         */
        public AuthenticationCodeTypeSmsWord(String firstLetter) {
            this.firstLetter = firstLetter;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1509540765;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An authentication code is a phrase from multiple words delivered via an SMS message to the specified phone number; non-official applications may not receive this type of code.
     */
    public static class AuthenticationCodeTypeSmsPhrase extends AuthenticationCodeType {
        /**
         * The first word of the phrase if known.
         */
        public String firstWord;

        /**
         * An authentication code is a phrase from multiple words delivered via an SMS message to the specified phone number; non-official applications may not receive this type of code.
         */
        public AuthenticationCodeTypeSmsPhrase() {
        }

        /**
         * An authentication code is a phrase from multiple words delivered via an SMS message to the specified phone number; non-official applications may not receive this type of code.
         *
         * @param firstWord The first word of the phrase if known.
         */
        public AuthenticationCodeTypeSmsPhrase(String firstWord) {
            this.firstWord = firstWord;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 784108753;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A digit-only authentication code is delivered via a phone call to the specified phone number.
     */
    public static class AuthenticationCodeTypeCall extends AuthenticationCodeType {
        /**
         * Length of the code.
         */
        public int length;

        /**
         * A digit-only authentication code is delivered via a phone call to the specified phone number.
         */
        public AuthenticationCodeTypeCall() {
        }

        /**
         * A digit-only authentication code is delivered via a phone call to the specified phone number.
         *
         * @param length Length of the code.
         */
        public AuthenticationCodeTypeCall(int length) {
            this.length = length;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1636265063;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An authentication code is delivered by an immediately canceled call to the specified phone number. The phone number that calls is the code that must be entered automatically.
     */
    public static class AuthenticationCodeTypeFlashCall extends AuthenticationCodeType {
        /**
         * Pattern of the phone number from which the call will be made.
         */
        public String pattern;

        /**
         * An authentication code is delivered by an immediately canceled call to the specified phone number. The phone number that calls is the code that must be entered automatically.
         */
        public AuthenticationCodeTypeFlashCall() {
        }

        /**
         * An authentication code is delivered by an immediately canceled call to the specified phone number. The phone number that calls is the code that must be entered automatically.
         *
         * @param pattern Pattern of the phone number from which the call will be made.
         */
        public AuthenticationCodeTypeFlashCall(String pattern) {
            this.pattern = pattern;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1395882402;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An authentication code is delivered by an immediately canceled call to the specified phone number. The last digits of the phone number that calls are the code that must be entered manually by the user.
     */
    public static class AuthenticationCodeTypeMissedCall extends AuthenticationCodeType {
        /**
         * Prefix of the phone number from which the call will be made.
         */
        public String phoneNumberPrefix;
        /**
         * Number of digits in the code, excluding the prefix.
         */
        public int length;

        /**
         * An authentication code is delivered by an immediately canceled call to the specified phone number. The last digits of the phone number that calls are the code that must be entered manually by the user.
         */
        public AuthenticationCodeTypeMissedCall() {
        }

        /**
         * An authentication code is delivered by an immediately canceled call to the specified phone number. The last digits of the phone number that calls are the code that must be entered manually by the user.
         *
         * @param phoneNumberPrefix Prefix of the phone number from which the call will be made.
         * @param length Number of digits in the code, excluding the prefix.
         */
        public AuthenticationCodeTypeMissedCall(String phoneNumberPrefix, int length) {
            this.phoneNumberPrefix = phoneNumberPrefix;
            this.length = length;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 700123783;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A digit-only authentication code is delivered to https://fragment.com. The user must be logged in there via a wallet owning the phone number's NFT.
     */
    public static class AuthenticationCodeTypeFragment extends AuthenticationCodeType {
        /**
         * URL to open to receive the code.
         */
        public String url;
        /**
         * Length of the code.
         */
        public int length;

        /**
         * A digit-only authentication code is delivered to https://fragment.com. The user must be logged in there via a wallet owning the phone number's NFT.
         */
        public AuthenticationCodeTypeFragment() {
        }

        /**
         * A digit-only authentication code is delivered to https://fragment.com. The user must be logged in there via a wallet owning the phone number's NFT.
         *
         * @param url URL to open to receive the code.
         * @param length Length of the code.
         */
        public AuthenticationCodeTypeFragment(String url, int length) {
            this.url = url;
            this.length = length;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2129693491;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A digit-only authentication code is delivered via Firebase Authentication to the official Android application.
     */
    public static class AuthenticationCodeTypeFirebaseAndroid extends AuthenticationCodeType {
        /**
         * Parameters to be used for device verification.
         */
        public FirebaseDeviceVerificationParameters deviceVerificationParameters;
        /**
         * Length of the code.
         */
        public int length;

        /**
         * A digit-only authentication code is delivered via Firebase Authentication to the official Android application.
         */
        public AuthenticationCodeTypeFirebaseAndroid() {
        }

        /**
         * A digit-only authentication code is delivered via Firebase Authentication to the official Android application.
         *
         * @param deviceVerificationParameters Parameters to be used for device verification.
         * @param length Length of the code.
         */
        public AuthenticationCodeTypeFirebaseAndroid(FirebaseDeviceVerificationParameters deviceVerificationParameters, int length) {
            this.deviceVerificationParameters = deviceVerificationParameters;
            this.length = length;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1872475422;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A digit-only authentication code is delivered via Firebase Authentication to the official iOS application.
     */
    public static class AuthenticationCodeTypeFirebaseIos extends AuthenticationCodeType {
        /**
         * Receipt of successful application token validation to compare with receipt from push notification.
         */
        public String receipt;
        /**
         * Time after the next authentication method is expected to be used if verification push notification isn't received, in seconds.
         */
        public int pushTimeout;
        /**
         * Length of the code.
         */
        public int length;

        /**
         * A digit-only authentication code is delivered via Firebase Authentication to the official iOS application.
         */
        public AuthenticationCodeTypeFirebaseIos() {
        }

        /**
         * A digit-only authentication code is delivered via Firebase Authentication to the official iOS application.
         *
         * @param receipt Receipt of successful application token validation to compare with receipt from push notification.
         * @param pushTimeout Time after the next authentication method is expected to be used if verification push notification isn't received, in seconds.
         * @param length Length of the code.
         */
        public AuthenticationCodeTypeFirebaseIos(String receipt, int pushTimeout, int length) {
            this.receipt = receipt;
            this.pushTimeout = pushTimeout;
            this.length = length;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -11162989;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents the current authorization state of the TDLib client.
     */
    public abstract static class AuthorizationState extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            AuthorizationStateWaitTdlibParameters.CONSTRUCTOR,
            AuthorizationStateWaitPhoneNumber.CONSTRUCTOR,
            AuthorizationStateWaitPremiumPurchase.CONSTRUCTOR,
            AuthorizationStateWaitEmailAddress.CONSTRUCTOR,
            AuthorizationStateWaitEmailCode.CONSTRUCTOR,
            AuthorizationStateWaitCode.CONSTRUCTOR,
            AuthorizationStateWaitOtherDeviceConfirmation.CONSTRUCTOR,
            AuthorizationStateWaitRegistration.CONSTRUCTOR,
            AuthorizationStateWaitPassword.CONSTRUCTOR,
            AuthorizationStateReady.CONSTRUCTOR,
            AuthorizationStateLoggingOut.CONSTRUCTOR,
            AuthorizationStateClosing.CONSTRUCTOR,
            AuthorizationStateClosed.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public AuthorizationState() {
        }
    }

    /**
     * Initialization parameters are needed. Call setTdlibParameters to provide them.
     */
    public static class AuthorizationStateWaitTdlibParameters extends AuthorizationState {

        /**
         * Initialization parameters are needed. Call setTdlibParameters to provide them.
         */
        public AuthorizationStateWaitTdlibParameters() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 904720988;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * TDLib needs the user's phone number to authorize. Call setAuthenticationPhoneNumber to provide the phone number, or use requestQrCodeAuthentication, getAuthenticationPasskeyParameters, or checkAuthenticationBotToken for other authentication options.
     */
    public static class AuthorizationStateWaitPhoneNumber extends AuthorizationState {

        /**
         * TDLib needs the user's phone number to authorize. Call setAuthenticationPhoneNumber to provide the phone number, or use requestQrCodeAuthentication, getAuthenticationPasskeyParameters, or checkAuthenticationBotToken for other authentication options.
         */
        public AuthorizationStateWaitPhoneNumber() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 306402531;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user must buy Telegram Premium as an in-store purchase to log in. Call checkAuthenticationPremiumPurchase and then setAuthenticationPremiumPurchaseTransaction.
     */
    public static class AuthorizationStateWaitPremiumPurchase extends AuthorizationState {
        /**
         * Identifier of the store product that must be bought.
         */
        public String storeProductId;
        /**
         * Duration of the Telegram Premium subscription after the purchase; may be 0 if Telegram Premium subscription will not be granted.
         */
        public int premiumDayCount;
        /**
         * Email address to use for support if the user has issues with Telegram Premium purchase.
         */
        public String supportEmailAddress;
        /**
         * Subject for the email sent to the support email address.
         */
        public String supportEmailSubject;

        /**
         * The user must buy Telegram Premium as an in-store purchase to log in. Call checkAuthenticationPremiumPurchase and then setAuthenticationPremiumPurchaseTransaction.
         */
        public AuthorizationStateWaitPremiumPurchase() {
        }

        /**
         * The user must buy Telegram Premium as an in-store purchase to log in. Call checkAuthenticationPremiumPurchase and then setAuthenticationPremiumPurchaseTransaction.
         *
         * @param storeProductId Identifier of the store product that must be bought.
         * @param premiumDayCount Duration of the Telegram Premium subscription after the purchase; may be 0 if Telegram Premium subscription will not be granted.
         * @param supportEmailAddress Email address to use for support if the user has issues with Telegram Premium purchase.
         * @param supportEmailSubject Subject for the email sent to the support email address.
         */
        public AuthorizationStateWaitPremiumPurchase(String storeProductId, int premiumDayCount, String supportEmailAddress, String supportEmailSubject) {
            this.storeProductId = storeProductId;
            this.premiumDayCount = premiumDayCount;
            this.supportEmailAddress = supportEmailAddress;
            this.supportEmailSubject = supportEmailSubject;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1192878334;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * TDLib needs the user's email address to authorize. Call setAuthenticationEmailAddress to provide the email address, or directly call checkAuthenticationEmailCode with Apple ID/Google ID token if allowed.
     */
    public static class AuthorizationStateWaitEmailAddress extends AuthorizationState {
        /**
         * True, if authorization through Apple ID is allowed.
         */
        public boolean allowAppleId;
        /**
         * True, if authorization through Google ID is allowed.
         */
        public boolean allowGoogleId;

        /**
         * TDLib needs the user's email address to authorize. Call setAuthenticationEmailAddress to provide the email address, or directly call checkAuthenticationEmailCode with Apple ID/Google ID token if allowed.
         */
        public AuthorizationStateWaitEmailAddress() {
        }

        /**
         * TDLib needs the user's email address to authorize. Call setAuthenticationEmailAddress to provide the email address, or directly call checkAuthenticationEmailCode with Apple ID/Google ID token if allowed.
         *
         * @param allowAppleId True, if authorization through Apple ID is allowed.
         * @param allowGoogleId True, if authorization through Google ID is allowed.
         */
        public AuthorizationStateWaitEmailAddress(boolean allowAppleId, boolean allowGoogleId) {
            this.allowAppleId = allowAppleId;
            this.allowGoogleId = allowGoogleId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1040478663;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * TDLib needs the user's authentication code sent to an email address to authorize. Call checkAuthenticationEmailCode to provide the code.
     */
    public static class AuthorizationStateWaitEmailCode extends AuthorizationState {
        /**
         * True, if authorization through Apple ID is allowed.
         */
        public boolean allowAppleId;
        /**
         * True, if authorization through Google ID is allowed.
         */
        public boolean allowGoogleId;
        /**
         * Information about the sent authentication code.
         */
        public EmailAddressAuthenticationCodeInfo codeInfo;
        /**
         * Reset state of the email address; may be null if the email address can't be reset.
         */
        @Nullable public EmailAddressResetState emailAddressResetState;

        /**
         * TDLib needs the user's authentication code sent to an email address to authorize. Call checkAuthenticationEmailCode to provide the code.
         */
        public AuthorizationStateWaitEmailCode() {
        }

        /**
         * TDLib needs the user's authentication code sent to an email address to authorize. Call checkAuthenticationEmailCode to provide the code.
         *
         * @param allowAppleId True, if authorization through Apple ID is allowed.
         * @param allowGoogleId True, if authorization through Google ID is allowed.
         * @param codeInfo Information about the sent authentication code.
         * @param emailAddressResetState Reset state of the email address; may be null if the email address can't be reset.
         */
        public AuthorizationStateWaitEmailCode(boolean allowAppleId, boolean allowGoogleId, EmailAddressAuthenticationCodeInfo codeInfo, EmailAddressResetState emailAddressResetState) {
            this.allowAppleId = allowAppleId;
            this.allowGoogleId = allowGoogleId;
            this.codeInfo = codeInfo;
            this.emailAddressResetState = emailAddressResetState;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1868627365;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * TDLib needs the user's authentication code to authorize. Call checkAuthenticationCode to check the code.
     */
    public static class AuthorizationStateWaitCode extends AuthorizationState {
        /**
         * Information about the authorization code that was sent.
         */
        public AuthenticationCodeInfo codeInfo;

        /**
         * TDLib needs the user's authentication code to authorize. Call checkAuthenticationCode to check the code.
         */
        public AuthorizationStateWaitCode() {
        }

        /**
         * TDLib needs the user's authentication code to authorize. Call checkAuthenticationCode to check the code.
         *
         * @param codeInfo Information about the authorization code that was sent.
         */
        public AuthorizationStateWaitCode(AuthenticationCodeInfo codeInfo) {
            this.codeInfo = codeInfo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 52643073;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user needs to confirm authorization on another logged in device by scanning a QR code with the provided link.
     */
    public static class AuthorizationStateWaitOtherDeviceConfirmation extends AuthorizationState {
        /**
         * A tg:// URL for the QR code. The link will be updated frequently.
         */
        public String link;

        /**
         * The user needs to confirm authorization on another logged in device by scanning a QR code with the provided link.
         */
        public AuthorizationStateWaitOtherDeviceConfirmation() {
        }

        /**
         * The user needs to confirm authorization on another logged in device by scanning a QR code with the provided link.
         *
         * @param link A tg:// URL for the QR code. The link will be updated frequently.
         */
        public AuthorizationStateWaitOtherDeviceConfirmation(String link) {
            this.link = link;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 860166378;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user is unregistered and needs to accept terms of service and enter their first name and last name to finish registration. Call registerUser to accept the terms of service and provide the data.
     */
    public static class AuthorizationStateWaitRegistration extends AuthorizationState {
        /**
         * Telegram terms of service.
         */
        public TermsOfService termsOfService;

        /**
         * The user is unregistered and needs to accept terms of service and enter their first name and last name to finish registration. Call registerUser to accept the terms of service and provide the data.
         */
        public AuthorizationStateWaitRegistration() {
        }

        /**
         * The user is unregistered and needs to accept terms of service and enter their first name and last name to finish registration. Call registerUser to accept the terms of service and provide the data.
         *
         * @param termsOfService Telegram terms of service.
         */
        public AuthorizationStateWaitRegistration(TermsOfService termsOfService) {
            this.termsOfService = termsOfService;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 550350511;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user has been authorized, but needs to enter a 2-step verification password to start using the application. Call checkAuthenticationPassword to provide the password, or requestAuthenticationPasswordRecovery to recover the password, or deleteAccount to delete the account after a week.
     */
    public static class AuthorizationStateWaitPassword extends AuthorizationState {
        /**
         * Hint for the password; may be empty.
         */
        public String passwordHint;
        /**
         * True, if a recovery email address has been set up.
         */
        public boolean hasRecoveryEmailAddress;
        /**
         * True, if some Telegram Passport elements were saved.
         */
        public boolean hasPassportData;
        /**
         * Pattern of the email address to which the recovery email was sent; empty until a recovery email has been sent.
         */
        public String recoveryEmailAddressPattern;

        /**
         * The user has been authorized, but needs to enter a 2-step verification password to start using the application. Call checkAuthenticationPassword to provide the password, or requestAuthenticationPasswordRecovery to recover the password, or deleteAccount to delete the account after a week.
         */
        public AuthorizationStateWaitPassword() {
        }

        /**
         * The user has been authorized, but needs to enter a 2-step verification password to start using the application. Call checkAuthenticationPassword to provide the password, or requestAuthenticationPasswordRecovery to recover the password, or deleteAccount to delete the account after a week.
         *
         * @param passwordHint Hint for the password; may be empty.
         * @param hasRecoveryEmailAddress True, if a recovery email address has been set up.
         * @param hasPassportData True, if some Telegram Passport elements were saved.
         * @param recoveryEmailAddressPattern Pattern of the email address to which the recovery email was sent; empty until a recovery email has been sent.
         */
        public AuthorizationStateWaitPassword(String passwordHint, boolean hasRecoveryEmailAddress, boolean hasPassportData, String recoveryEmailAddressPattern) {
            this.passwordHint = passwordHint;
            this.hasRecoveryEmailAddress = hasRecoveryEmailAddress;
            this.hasPassportData = hasPassportData;
            this.recoveryEmailAddressPattern = recoveryEmailAddressPattern;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 112238030;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user has been successfully authorized. TDLib is now ready to answer general requests.
     */
    public static class AuthorizationStateReady extends AuthorizationState {

        /**
         * The user has been successfully authorized. TDLib is now ready to answer general requests.
         */
        public AuthorizationStateReady() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1834871737;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user is currently logging out.
     */
    public static class AuthorizationStateLoggingOut extends AuthorizationState {

        /**
         * The user is currently logging out.
         */
        public AuthorizationStateLoggingOut() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 154449270;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * TDLib is closing, all subsequent queries will be answered with the error 500. Note that closing TDLib can take a while. All resources will be freed only after authorizationStateClosed has been received.
     */
    public static class AuthorizationStateClosing extends AuthorizationState {

        /**
         * TDLib is closing, all subsequent queries will be answered with the error 500. Note that closing TDLib can take a while. All resources will be freed only after authorizationStateClosed has been received.
         */
        public AuthorizationStateClosing() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 445855311;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * TDLib client is in its final state. All databases are closed and all resources are released. No other updates will be received after this. All queries will be responded to with error code 500. To continue working, one must create a new instance of the TDLib client.
     */
    public static class AuthorizationStateClosed extends AuthorizationState {

        /**
         * TDLib client is in its final state. All databases are closed and all resources are released. No other updates will be received after this. All queries will be responded to with error code 500. To continue working, one must create a new instance of the TDLib client.
         */
        public AuthorizationStateClosed() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1526047584;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains auto-download settings.
     */
    public static class AutoDownloadSettings extends Object {
        /**
         * True, if the auto-download is enabled.
         */
        public boolean isAutoDownloadEnabled;
        /**
         * The maximum size of a photo file to be auto-downloaded, in bytes.
         */
        public int maxPhotoFileSize;
        /**
         * The maximum size of a video file to be auto-downloaded, in bytes.
         */
        public long maxVideoFileSize;
        /**
         * The maximum size of other file types to be auto-downloaded, in bytes.
         */
        public long maxOtherFileSize;
        /**
         * The maximum suggested bitrate for uploaded videos, in kbit/s.
         */
        public int videoUploadBitrate;
        /**
         * True, if the beginning of video files needs to be preloaded for instant playback.
         */
        public boolean preloadLargeVideos;
        /**
         * True, if the next audio track needs to be preloaded while the user is listening to an audio file.
         */
        public boolean preloadNextAudio;
        /**
         * True, if stories needs to be preloaded.
         */
        public boolean preloadStories;
        /**
         * True, if &quot;use less data for calls&quot; option needs to be enabled.
         */
        public boolean useLessDataForCalls;

        /**
         * Contains auto-download settings.
         */
        public AutoDownloadSettings() {
        }

        /**
         * Contains auto-download settings.
         *
         * @param isAutoDownloadEnabled True, if the auto-download is enabled.
         * @param maxPhotoFileSize The maximum size of a photo file to be auto-downloaded, in bytes.
         * @param maxVideoFileSize The maximum size of a video file to be auto-downloaded, in bytes.
         * @param maxOtherFileSize The maximum size of other file types to be auto-downloaded, in bytes.
         * @param videoUploadBitrate The maximum suggested bitrate for uploaded videos, in kbit/s.
         * @param preloadLargeVideos True, if the beginning of video files needs to be preloaded for instant playback.
         * @param preloadNextAudio True, if the next audio track needs to be preloaded while the user is listening to an audio file.
         * @param preloadStories True, if stories needs to be preloaded.
         * @param useLessDataForCalls True, if &quot;use less data for calls&quot; option needs to be enabled.
         */
        public AutoDownloadSettings(boolean isAutoDownloadEnabled, int maxPhotoFileSize, long maxVideoFileSize, long maxOtherFileSize, int videoUploadBitrate, boolean preloadLargeVideos, boolean preloadNextAudio, boolean preloadStories, boolean useLessDataForCalls) {
            this.isAutoDownloadEnabled = isAutoDownloadEnabled;
            this.maxPhotoFileSize = maxPhotoFileSize;
            this.maxVideoFileSize = maxVideoFileSize;
            this.maxOtherFileSize = maxOtherFileSize;
            this.videoUploadBitrate = videoUploadBitrate;
            this.preloadLargeVideos = preloadLargeVideos;
            this.preloadNextAudio = preloadNextAudio;
            this.preloadStories = preloadStories;
            this.useLessDataForCalls = useLessDataForCalls;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 991433696;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains auto-download settings presets for the current user.
     */
    public static class AutoDownloadSettingsPresets extends Object {
        /**
         * Preset with lowest settings; expected to be used by default when roaming.
         */
        public AutoDownloadSettings low;
        /**
         * Preset with medium settings; expected to be used by default when using mobile data.
         */
        public AutoDownloadSettings medium;
        /**
         * Preset with highest settings; expected to be used by default when connected on Wi-Fi.
         */
        public AutoDownloadSettings high;

        /**
         * Contains auto-download settings presets for the current user.
         */
        public AutoDownloadSettingsPresets() {
        }

        /**
         * Contains auto-download settings presets for the current user.
         *
         * @param low Preset with lowest settings; expected to be used by default when roaming.
         * @param medium Preset with medium settings; expected to be used by default when using mobile data.
         * @param high Preset with highest settings; expected to be used by default when connected on Wi-Fi.
         */
        public AutoDownloadSettingsPresets(AutoDownloadSettings low, AutoDownloadSettings medium, AutoDownloadSettings high) {
            this.low = low;
            this.medium = medium;
            this.high = high;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -782099166;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes autosave settings.
     */
    public static class AutosaveSettings extends Object {
        /**
         * Default autosave settings for private chats.
         */
        public ScopeAutosaveSettings privateChatSettings;
        /**
         * Default autosave settings for basic group and supergroup chats.
         */
        public ScopeAutosaveSettings groupSettings;
        /**
         * Default autosave settings for channel chats.
         */
        public ScopeAutosaveSettings channelSettings;
        /**
         * Autosave settings for specific chats.
         */
        public AutosaveSettingsException[] exceptions;

        /**
         * Describes autosave settings.
         */
        public AutosaveSettings() {
        }

        /**
         * Describes autosave settings.
         *
         * @param privateChatSettings Default autosave settings for private chats.
         * @param groupSettings Default autosave settings for basic group and supergroup chats.
         * @param channelSettings Default autosave settings for channel chats.
         * @param exceptions Autosave settings for specific chats.
         */
        public AutosaveSettings(ScopeAutosaveSettings privateChatSettings, ScopeAutosaveSettings groupSettings, ScopeAutosaveSettings channelSettings, AutosaveSettingsException[] exceptions) {
            this.privateChatSettings = privateChatSettings;
            this.groupSettings = groupSettings;
            this.channelSettings = channelSettings;
            this.exceptions = exceptions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1629412502;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains autosave settings for a chat, which overrides default settings for the corresponding scope.
     */
    public static class AutosaveSettingsException extends Object {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Autosave settings for the chat.
         */
        public ScopeAutosaveSettings settings;

        /**
         * Contains autosave settings for a chat, which overrides default settings for the corresponding scope.
         */
        public AutosaveSettingsException() {
        }

        /**
         * Contains autosave settings for a chat, which overrides default settings for the corresponding scope.
         *
         * @param chatId Chat identifier.
         * @param settings Autosave settings for the chat.
         */
        public AutosaveSettingsException(long chatId, ScopeAutosaveSettings settings) {
            this.chatId = chatId;
            this.settings = settings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1483470280;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes scope of autosave settings.
     */
    public abstract static class AutosaveSettingsScope extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            AutosaveSettingsScopePrivateChats.CONSTRUCTOR,
            AutosaveSettingsScopeGroupChats.CONSTRUCTOR,
            AutosaveSettingsScopeChannelChats.CONSTRUCTOR,
            AutosaveSettingsScopeChat.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public AutosaveSettingsScope() {
        }
    }

    /**
     * Autosave settings applied to all private chats without chat-specific settings.
     */
    public static class AutosaveSettingsScopePrivateChats extends AutosaveSettingsScope {

        /**
         * Autosave settings applied to all private chats without chat-specific settings.
         */
        public AutosaveSettingsScopePrivateChats() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1395227007;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Autosave settings applied to all basic group and supergroup chats without chat-specific settings.
     */
    public static class AutosaveSettingsScopeGroupChats extends AutosaveSettingsScope {

        /**
         * Autosave settings applied to all basic group and supergroup chats without chat-specific settings.
         */
        public AutosaveSettingsScopeGroupChats() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 853544526;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Autosave settings applied to all channel chats without chat-specific settings.
     */
    public static class AutosaveSettingsScopeChannelChats extends AutosaveSettingsScope {

        /**
         * Autosave settings applied to all channel chats without chat-specific settings.
         */
        public AutosaveSettingsScopeChannelChats() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -499572783;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Autosave settings applied to a chat.
     */
    public static class AutosaveSettingsScopeChat extends AutosaveSettingsScope {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Autosave settings applied to a chat.
         */
        public AutosaveSettingsScopeChat() {
        }

        /**
         * Autosave settings applied to a chat.
         *
         * @param chatId Chat identifier.
         */
        public AutosaveSettingsScopeChat(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1632255255;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a gift that is available for purchase.
     */
    public static class AvailableGift extends Object {
        /**
         * The gift.
         */
        public Gift gift;
        /**
         * Number of gifts that are available for resale.
         */
        public int resaleCount;
        /**
         * The minimum price for the gifts available for resale in Telegram Star equivalent; 0 if there are no such gifts.
         */
        public long minResaleStarCount;
        /**
         * The title of the upgraded gift; empty if the gift isn't available for resale.
         */
        public String title;

        /**
         * Describes a gift that is available for purchase.
         */
        public AvailableGift() {
        }

        /**
         * Describes a gift that is available for purchase.
         *
         * @param gift The gift.
         * @param resaleCount Number of gifts that are available for resale.
         * @param minResaleStarCount The minimum price for the gifts available for resale in Telegram Star equivalent; 0 if there are no such gifts.
         * @param title The title of the upgraded gift; empty if the gift isn't available for resale.
         */
        public AvailableGift(Gift gift, int resaleCount, long minResaleStarCount, String title) {
            this.gift = gift;
            this.resaleCount = resaleCount;
            this.minResaleStarCount = minResaleStarCount;
            this.title = title;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 850530502;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of gifts that can be sent to another user or channel chat.
     */
    public static class AvailableGifts extends Object {
        /**
         * The list of gifts.
         */
        public AvailableGift[] gifts;

        /**
         * Contains a list of gifts that can be sent to another user or channel chat.
         */
        public AvailableGifts() {
        }

        /**
         * Contains a list of gifts that can be sent to another user or channel chat.
         *
         * @param gifts The list of gifts.
         */
        public AvailableGifts(AvailableGift[] gifts) {
            this.gifts = gifts;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1450341886;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents an available reaction.
     */
    public static class AvailableReaction extends Object {
        /**
         * Type of the reaction.
         */
        public ReactionType type;
        /**
         * True, if Telegram Premium is needed to send the reaction.
         */
        public boolean needsPremium;

        /**
         * Represents an available reaction.
         */
        public AvailableReaction() {
        }

        /**
         * Represents an available reaction.
         *
         * @param type Type of the reaction.
         * @param needsPremium True, if Telegram Premium is needed to send the reaction.
         */
        public AvailableReaction(ReactionType type, boolean needsPremium) {
            this.type = type;
            this.needsPremium = needsPremium;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -117292153;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of reactions that can be added to a message.
     */
    public static class AvailableReactions extends Object {
        /**
         * List of reactions to be shown at the top.
         */
        public AvailableReaction[] topReactions;
        /**
         * List of recently used reactions.
         */
        public AvailableReaction[] recentReactions;
        /**
         * List of popular reactions.
         */
        public AvailableReaction[] popularReactions;
        /**
         * True, if any custom emoji reaction can be added by Telegram Premium subscribers.
         */
        public boolean allowCustomEmoji;
        /**
         * True, if the reactions will be tags and the message can be found by them.
         */
        public boolean areTags;
        /**
         * The reason why the current user can't add reactions to the message, despite some other users can; may be null if none.
         */
        @Nullable public ReactionUnavailabilityReason unavailabilityReason;

        /**
         * Represents a list of reactions that can be added to a message.
         */
        public AvailableReactions() {
        }

        /**
         * Represents a list of reactions that can be added to a message.
         *
         * @param topReactions List of reactions to be shown at the top.
         * @param recentReactions List of recently used reactions.
         * @param popularReactions List of popular reactions.
         * @param allowCustomEmoji True, if any custom emoji reaction can be added by Telegram Premium subscribers.
         * @param areTags True, if the reactions will be tags and the message can be found by them.
         * @param unavailabilityReason The reason why the current user can't add reactions to the message, despite some other users can; may be null if none.
         */
        public AvailableReactions(AvailableReaction[] topReactions, AvailableReaction[] recentReactions, AvailableReaction[] popularReactions, boolean allowCustomEmoji, boolean areTags, ReactionUnavailabilityReason unavailabilityReason) {
            this.topReactions = topReactions;
            this.recentReactions = recentReactions;
            this.popularReactions = popularReactions;
            this.allowCustomEmoji = allowCustomEmoji;
            this.areTags = areTags;
            this.unavailabilityReason = unavailabilityReason;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 912529522;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a chat background.
     */
    public static class Background extends Object {
        /**
         * Unique background identifier.
         */
        public long id;
        /**
         * True, if this is one of default backgrounds.
         */
        public boolean isDefault;
        /**
         * True, if the background is dark and is recommended to be used with dark theme.
         */
        public boolean isDark;
        /**
         * Unique background name.
         */
        public String name;
        /**
         * Document with the background; may be null. Null only for filled and chat theme backgrounds.
         */
        @Nullable public Document document;
        /**
         * Type of the background.
         */
        public BackgroundType type;

        /**
         * Describes a chat background.
         */
        public Background() {
        }

        /**
         * Describes a chat background.
         *
         * @param id Unique background identifier.
         * @param isDefault True, if this is one of default backgrounds.
         * @param isDark True, if the background is dark and is recommended to be used with dark theme.
         * @param name Unique background name.
         * @param document Document with the background; may be null. Null only for filled and chat theme backgrounds.
         * @param type Type of the background.
         */
        public Background(long id, boolean isDefault, boolean isDark, String name, Document document, BackgroundType type) {
            this.id = id;
            this.isDefault = isDefault;
            this.isDark = isDark;
            this.name = name;
            this.document = document;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -429971172;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a fill of a background.
     */
    public abstract static class BackgroundFill extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            BackgroundFillSolid.CONSTRUCTOR,
            BackgroundFillGradient.CONSTRUCTOR,
            BackgroundFillFreeformGradient.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public BackgroundFill() {
        }
    }

    /**
     * Describes a solid fill of a background.
     */
    public static class BackgroundFillSolid extends BackgroundFill {
        /**
         * A color of the background in the RGB format.
         */
        public int color;

        /**
         * Describes a solid fill of a background.
         */
        public BackgroundFillSolid() {
        }

        /**
         * Describes a solid fill of a background.
         *
         * @param color A color of the background in the RGB format.
         */
        public BackgroundFillSolid(int color) {
            this.color = color;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1010678813;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a gradient fill of a background.
     */
    public static class BackgroundFillGradient extends BackgroundFill {
        /**
         * A top color of the background in the RGB format.
         */
        public int topColor;
        /**
         * A bottom color of the background in the RGB format.
         */
        public int bottomColor;
        /**
         * Clockwise rotation angle of the gradient, in degrees; 0-359. Must always be divisible by 45.
         */
        public int rotationAngle;

        /**
         * Describes a gradient fill of a background.
         */
        public BackgroundFillGradient() {
        }

        /**
         * Describes a gradient fill of a background.
         *
         * @param topColor A top color of the background in the RGB format.
         * @param bottomColor A bottom color of the background in the RGB format.
         * @param rotationAngle Clockwise rotation angle of the gradient, in degrees; 0-359. Must always be divisible by 45.
         */
        public BackgroundFillGradient(int topColor, int bottomColor, int rotationAngle) {
            this.topColor = topColor;
            this.bottomColor = bottomColor;
            this.rotationAngle = rotationAngle;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1839206017;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a freeform gradient fill of a background.
     */
    public static class BackgroundFillFreeformGradient extends BackgroundFill {
        /**
         * A list of 3 or 4 colors of the freeform gradient in the RGB format.
         */
        public int[] colors;

        /**
         * Describes a freeform gradient fill of a background.
         */
        public BackgroundFillFreeformGradient() {
        }

        /**
         * Describes a freeform gradient fill of a background.
         *
         * @param colors A list of 3 or 4 colors of the freeform gradient in the RGB format.
         */
        public BackgroundFillFreeformGradient(int[] colors) {
            this.colors = colors;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1145469255;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the type of background.
     */
    public abstract static class BackgroundType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            BackgroundTypeWallpaper.CONSTRUCTOR,
            BackgroundTypePattern.CONSTRUCTOR,
            BackgroundTypeFill.CONSTRUCTOR,
            BackgroundTypeChatTheme.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public BackgroundType() {
        }
    }

    /**
     * A wallpaper in JPEG format.
     */
    public static class BackgroundTypeWallpaper extends BackgroundType {
        /**
         * True, if the wallpaper must be downscaled to fit in 450x450 square and then box-blurred with radius 12.
         */
        public boolean isBlurred;
        /**
         * True, if the background needs to be slightly moved when device is tilted.
         */
        public boolean isMoving;

        /**
         * A wallpaper in JPEG format.
         */
        public BackgroundTypeWallpaper() {
        }

        /**
         * A wallpaper in JPEG format.
         *
         * @param isBlurred True, if the wallpaper must be downscaled to fit in 450x450 square and then box-blurred with radius 12.
         * @param isMoving True, if the background needs to be slightly moved when device is tilted.
         */
        public BackgroundTypeWallpaper(boolean isBlurred, boolean isMoving) {
            this.isBlurred = isBlurred;
            this.isMoving = isMoving;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1972128891;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A PNG or TGV (gzipped subset of SVG with MIME type &quot;application/x-tgwallpattern&quot;) pattern to be combined with the background fill chosen by the user.
     */
    public static class BackgroundTypePattern extends BackgroundType {
        /**
         * Fill of the background.
         */
        public BackgroundFill fill;
        /**
         * Intensity of the pattern when it is shown above the filled background; 0-100.
         */
        public int intensity;
        /**
         * True, if the background fill must be applied only to the pattern itself. All other pixels are black in this case. For dark themes only.
         */
        public boolean isInverted;
        /**
         * True, if the background needs to be slightly moved when device is tilted.
         */
        public boolean isMoving;

        /**
         * A PNG or TGV (gzipped subset of SVG with MIME type &quot;application/x-tgwallpattern&quot;) pattern to be combined with the background fill chosen by the user.
         */
        public BackgroundTypePattern() {
        }

        /**
         * A PNG or TGV (gzipped subset of SVG with MIME type &quot;application/x-tgwallpattern&quot;) pattern to be combined with the background fill chosen by the user.
         *
         * @param fill Fill of the background.
         * @param intensity Intensity of the pattern when it is shown above the filled background; 0-100.
         * @param isInverted True, if the background fill must be applied only to the pattern itself. All other pixels are black in this case. For dark themes only.
         * @param isMoving True, if the background needs to be slightly moved when device is tilted.
         */
        public BackgroundTypePattern(BackgroundFill fill, int intensity, boolean isInverted, boolean isMoving) {
            this.fill = fill;
            this.intensity = intensity;
            this.isInverted = isInverted;
            this.isMoving = isMoving;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1290213117;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A filled background.
     */
    public static class BackgroundTypeFill extends BackgroundType {
        /**
         * The background fill.
         */
        public BackgroundFill fill;

        /**
         * A filled background.
         */
        public BackgroundTypeFill() {
        }

        /**
         * A filled background.
         *
         * @param fill The background fill.
         */
        public BackgroundTypeFill(BackgroundFill fill) {
            this.fill = fill;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 993008684;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A background from a chat theme based on an emoji; can be used only as a chat background in channels.
     */
    public static class BackgroundTypeChatTheme extends BackgroundType {
        /**
         * Name of the emoji chat theme.
         */
        public String themeName;

        /**
         * A background from a chat theme based on an emoji; can be used only as a chat background in channels.
         */
        public BackgroundTypeChatTheme() {
        }

        /**
         * A background from a chat theme based on an emoji; can be used only as a chat background in channels.
         *
         * @param themeName Name of the emoji chat theme.
         */
        public BackgroundTypeChatTheme(String themeName) {
            this.themeName = themeName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1299879762;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of backgrounds.
     */
    public static class Backgrounds extends Object {
        /**
         * A list of backgrounds.
         */
        public Background[] backgrounds;

        /**
         * Contains a list of backgrounds.
         */
        public Backgrounds() {
        }

        /**
         * Contains a list of backgrounds.
         *
         * @param backgrounds A list of backgrounds.
         */
        public Backgrounds(Background[] backgrounds) {
            this.backgrounds = backgrounds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 724728704;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an action associated with a bank card number.
     */
    public static class BankCardActionOpenUrl extends Object {
        /**
         * Action text.
         */
        public String text;
        /**
         * The URL to be opened.
         */
        public String url;

        /**
         * Describes an action associated with a bank card number.
         */
        public BankCardActionOpenUrl() {
        }

        /**
         * Describes an action associated with a bank card number.
         *
         * @param text Action text.
         * @param url The URL to be opened.
         */
        public BankCardActionOpenUrl(String text, String url) {
            this.text = text;
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -196454267;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Information about a bank card.
     */
    public static class BankCardInfo extends Object {
        /**
         * Title of the bank card description.
         */
        public String title;
        /**
         * Actions that can be done with the bank card number.
         */
        public BankCardActionOpenUrl[] actions;

        /**
         * Information about a bank card.
         */
        public BankCardInfo() {
        }

        /**
         * Information about a bank card.
         *
         * @param title Title of the bank card description.
         * @param actions Actions that can be done with the bank card number.
         */
        public BankCardInfo(String title, BankCardActionOpenUrl[] actions) {
            this.title = title;
            this.actions = actions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2116647730;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a basic group of 0-200 users (must be upgraded to a supergroup to accommodate more than 200 users).
     */
    public static class BasicGroup extends Object {
        /**
         * Group identifier.
         */
        public long id;
        /**
         * Number of members in the group.
         */
        public int memberCount;
        /**
         * Status of the current user in the group.
         */
        public ChatMemberStatus status;
        /**
         * True, if the group is active.
         */
        public boolean isActive;
        /**
         * Identifier of the supergroup to which this group was upgraded; 0 if none.
         */
        public long upgradedToSupergroupId;

        /**
         * Represents a basic group of 0-200 users (must be upgraded to a supergroup to accommodate more than 200 users).
         */
        public BasicGroup() {
        }

        /**
         * Represents a basic group of 0-200 users (must be upgraded to a supergroup to accommodate more than 200 users).
         *
         * @param id Group identifier.
         * @param memberCount Number of members in the group.
         * @param status Status of the current user in the group.
         * @param isActive True, if the group is active.
         * @param upgradedToSupergroupId Identifier of the supergroup to which this group was upgraded; 0 if none.
         */
        public BasicGroup(long id, int memberCount, ChatMemberStatus status, boolean isActive, long upgradedToSupergroupId) {
            this.id = id;
            this.memberCount = memberCount;
            this.status = status;
            this.isActive = isActive;
            this.upgradedToSupergroupId = upgradedToSupergroupId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -194767217;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains full information about a basic group.
     */
    public static class BasicGroupFullInfo extends Object {
        /**
         * Chat photo; may be null if empty or unknown. If non-null, then it is the same photo as in chat.photo.
         */
        @Nullable public ChatPhoto photo;
        /**
         * Group description. Updated only after the basic group is opened.
         */
        public String description;
        /**
         * User identifier of the creator of the group; 0 if unknown.
         */
        public long creatorUserId;
        /**
         * Group members.
         */
        public ChatMember[] members;
        /**
         * True, if non-administrators and non-bots can be hidden in responses to getSupergroupMembers and searchChatMembers for non-administrators after upgrading the basic group to a supergroup.
         */
        public boolean canHideMembers;
        /**
         * True, if aggressive anti-spam checks can be enabled or disabled in the supergroup after upgrading the basic group to a supergroup.
         */
        public boolean canToggleAggressiveAntiSpam;
        /**
         * Primary invite link for this group; may be null. For chat administrators with canInviteUsers right only. Updated only after the basic group is opened.
         */
        @Nullable public ChatInviteLink inviteLink;
        /**
         * List of commands of bots in the group.
         */
        public BotCommands[] botCommands;

        /**
         * Contains full information about a basic group.
         */
        public BasicGroupFullInfo() {
        }

        /**
         * Contains full information about a basic group.
         *
         * @param photo Chat photo; may be null if empty or unknown. If non-null, then it is the same photo as in chat.photo.
         * @param description Group description. Updated only after the basic group is opened.
         * @param creatorUserId User identifier of the creator of the group; 0 if unknown.
         * @param members Group members.
         * @param canHideMembers True, if non-administrators and non-bots can be hidden in responses to getSupergroupMembers and searchChatMembers for non-administrators after upgrading the basic group to a supergroup.
         * @param canToggleAggressiveAntiSpam True, if aggressive anti-spam checks can be enabled or disabled in the supergroup after upgrading the basic group to a supergroup.
         * @param inviteLink Primary invite link for this group; may be null. For chat administrators with canInviteUsers right only. Updated only after the basic group is opened.
         * @param botCommands List of commands of bots in the group.
         */
        public BasicGroupFullInfo(ChatPhoto photo, String description, long creatorUserId, ChatMember[] members, boolean canHideMembers, boolean canToggleAggressiveAntiSpam, ChatInviteLink inviteLink, BotCommands[] botCommands) {
            this.photo = photo;
            this.description = description;
            this.creatorUserId = creatorUserId;
            this.members = members;
            this.canHideMembers = canHideMembers;
            this.canToggleAggressiveAntiSpam = canToggleAggressiveAntiSpam;
            this.inviteLink = inviteLink;
            this.botCommands = botCommands;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1879035520;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a birthdate of a user.
     */
    public static class Birthdate extends Object {
        /**
         * Day of the month; 1-31.
         */
        public int day;
        /**
         * Month of the year; 1-12.
         */
        public int month;
        /**
         * Birth year; 0 if unknown.
         */
        public int year;

        /**
         * Represents a birthdate of a user.
         */
        public Birthdate() {
        }

        /**
         * Represents a birthdate of a user.
         *
         * @param day Day of the month; 1-31.
         * @param month Month of the year; 1-12.
         * @param year Birth year; 0 if unknown.
         */
        public Birthdate(int day, int month, int year) {
            this.day = day;
            this.month = month;
            this.year = year;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1644064030;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes type of block list.
     */
    public abstract static class BlockList extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            BlockListMain.CONSTRUCTOR,
            BlockListStories.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public BlockList() {
        }
    }

    /**
     * The main block list that disallows writing messages to the current user, receiving their status and photo, viewing of stories, and some other actions.
     */
    public static class BlockListMain extends BlockList {

        /**
         * The main block list that disallows writing messages to the current user, receiving their status and photo, viewing of stories, and some other actions.
         */
        public BlockListMain() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1352930172;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The block list that disallows viewing of stories of the current user.
     */
    public static class BlockListStories extends BlockList {

        /**
         * The block list that disallows viewing of stories of the current user.
         */
        public BlockListStories() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 103323228;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes users that have access to a bot.
     */
    public static class BotAccessSettings extends Object {
        /**
         * True, if access to the bot is restricted to its owner and selected users.
         */
        public boolean isRestricted;
        /**
         * Identifiers of the users who can use the bot additionally to the owner of the bot.
         */
        public long[] addedUserIds;

        /**
         * Describes users that have access to a bot.
         */
        public BotAccessSettings() {
        }

        /**
         * Describes users that have access to a bot.
         *
         * @param isRestricted True, if access to the bot is restricted to its owner and selected users.
         * @param addedUserIds Identifiers of the users who can use the bot additionally to the owner of the bot.
         */
        public BotAccessSettings(boolean isRestricted, long[] addedUserIds) {
            this.isRestricted = isRestricted;
            this.addedUserIds = addedUserIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 735061332;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a command supported by a bot.
     */
    public static class BotCommand extends Object {
        /**
         * Text of the bot command.
         */
        public String command;
        /**
         * Description of the bot command.
         */
        public String description;

        /**
         * Represents a command supported by a bot.
         */
        public BotCommand() {
        }

        /**
         * Represents a command supported by a bot.
         *
         * @param command Text of the bot command.
         * @param description Description of the bot command.
         */
        public BotCommand(String command, String description) {
            this.command = command;
            this.description = description;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1032140601;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents the scope to which bot commands are relevant.
     */
    public abstract static class BotCommandScope extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            BotCommandScopeDefault.CONSTRUCTOR,
            BotCommandScopeAllPrivateChats.CONSTRUCTOR,
            BotCommandScopeAllGroupChats.CONSTRUCTOR,
            BotCommandScopeAllChatAdministrators.CONSTRUCTOR,
            BotCommandScopeChat.CONSTRUCTOR,
            BotCommandScopeChatAdministrators.CONSTRUCTOR,
            BotCommandScopeChatMember.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public BotCommandScope() {
        }
    }

    /**
     * A scope covering all users.
     */
    public static class BotCommandScopeDefault extends BotCommandScope {

        /**
         * A scope covering all users.
         */
        public BotCommandScopeDefault() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 795652779;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A scope covering all private chats.
     */
    public static class BotCommandScopeAllPrivateChats extends BotCommandScope {

        /**
         * A scope covering all private chats.
         */
        public BotCommandScopeAllPrivateChats() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -344889543;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A scope covering all group and supergroup chats.
     */
    public static class BotCommandScopeAllGroupChats extends BotCommandScope {

        /**
         * A scope covering all group and supergroup chats.
         */
        public BotCommandScopeAllGroupChats() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -981088162;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A scope covering all group and supergroup chat administrators.
     */
    public static class BotCommandScopeAllChatAdministrators extends BotCommandScope {

        /**
         * A scope covering all group and supergroup chat administrators.
         */
        public BotCommandScopeAllChatAdministrators() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1998329169;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A scope covering all members of a chat.
     */
    public static class BotCommandScopeChat extends BotCommandScope {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * A scope covering all members of a chat.
         */
        public BotCommandScopeChat() {
        }

        /**
         * A scope covering all members of a chat.
         *
         * @param chatId Chat identifier.
         */
        public BotCommandScopeChat(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -430234971;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A scope covering all administrators of a chat.
     */
    public static class BotCommandScopeChatAdministrators extends BotCommandScope {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * A scope covering all administrators of a chat.
         */
        public BotCommandScopeChatAdministrators() {
        }

        /**
         * A scope covering all administrators of a chat.
         *
         * @param chatId Chat identifier.
         */
        public BotCommandScopeChatAdministrators(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1119682126;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A scope covering a member of a chat.
     */
    public static class BotCommandScopeChatMember extends BotCommandScope {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * User identifier.
         */
        public long userId;

        /**
         * A scope covering a member of a chat.
         */
        public BotCommandScopeChatMember() {
        }

        /**
         * A scope covering a member of a chat.
         *
         * @param chatId Chat identifier.
         * @param userId User identifier.
         */
        public BotCommandScopeChatMember(long chatId, long userId) {
            this.chatId = chatId;
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -211380494;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of bot commands.
     */
    public static class BotCommands extends Object {
        /**
         * Bot's user identifier.
         */
        public long botUserId;
        /**
         * List of bot commands.
         */
        public BotCommand[] commands;

        /**
         * Contains a list of bot commands.
         */
        public BotCommands() {
        }

        /**
         * Contains a list of bot commands.
         *
         * @param botUserId Bot's user identifier.
         * @param commands List of bot commands.
         */
        public BotCommands(long botUserId, BotCommand[] commands) {
            this.botUserId = botUserId;
            this.commands = commands;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1741364468;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a bot.
     */
    public static class BotInfo extends Object {
        /**
         * The text that is shown on the bot's profile page and is sent together with the link when users share the bot.
         */
        public String shortDescription;
        /**
         * The text shown in the chat with the bot if the chat is empty.
         */
        public String description;
        /**
         * Photo shown in the chat with the bot if the chat is empty; may be null.
         */
        @Nullable public Photo photo;
        /**
         * Animation shown in the chat with the bot if the chat is empty; may be null.
         */
        @Nullable public Animation animation;
        /**
         * Identifier of the bot, which manages the bot; 0 if none or unknown; for owner of the bot only.
         */
        public long managerBotUserId;
        /**
         * Information about a button to show instead of the bot commands menu button; may be null if ordinary bot commands menu must be shown.
         */
        @Nullable public BotMenuButton menuButton;
        /**
         * List of the bot commands.
         */
        public BotCommand[] commands;
        /**
         * The HTTP link to the privacy policy of the bot. If empty, then /privacy command must be used if supported by the bot. If the command isn't supported, then https://telegram.org/privacy-tpa must be opened.
         */
        public String privacyPolicyUrl;
        /**
         * Default administrator rights for adding the bot to basic group and supergroup chats; may be null.
         */
        @Nullable public ChatAdministratorRights defaultGroupAdministratorRights;
        /**
         * Default administrator rights for adding the bot to channels; may be null.
         */
        @Nullable public ChatAdministratorRights defaultChannelAdministratorRights;
        /**
         * Information about the affiliate program of the bot; may be null if none.
         */
        @Nullable public AffiliateProgramInfo affiliateProgram;
        /**
         * Default light background color for bot Web Apps; -1 if not specified.
         */
        public int webAppBackgroundLightColor;
        /**
         * Default dark background color for bot Web Apps; -1 if not specified.
         */
        public int webAppBackgroundDarkColor;
        /**
         * Default light header color for bot Web Apps; -1 if not specified.
         */
        public int webAppHeaderLightColor;
        /**
         * Default dark header color for bot Web Apps; -1 if not specified.
         */
        public int webAppHeaderDarkColor;
        /**
         * Parameters of the verification that can be provided by the bot; may be null if none or the current user isn't the owner of the bot.
         */
        @Nullable public BotVerificationParameters verificationParameters;
        /**
         * True, if the bot's revenue statistics are available to the current user.
         */
        public boolean canGetRevenueStatistics;
        /**
         * True, if the bot can manage emoji status of the current user.
         */
        public boolean canManageEmojiStatus;
        /**
         * True, if the bot has media previews.
         */
        public boolean hasMediaPreviews;
        /**
         * The internal link, which can be used to edit bot commands; may be null.
         */
        @Nullable public InternalLinkType editCommandsLink;
        /**
         * The internal link, which can be used to edit bot description; may be null.
         */
        @Nullable public InternalLinkType editDescriptionLink;
        /**
         * The internal link, which can be used to edit the photo or animation shown in the chat with the bot if the chat is empty; may be null.
         */
        @Nullable public InternalLinkType editDescriptionMediaLink;
        /**
         * The internal link, which can be used to edit bot settings; may be null.
         */
        @Nullable public InternalLinkType editSettingsLink;

        /**
         * Contains information about a bot.
         */
        public BotInfo() {
        }

        /**
         * Contains information about a bot.
         *
         * @param shortDescription The text that is shown on the bot's profile page and is sent together with the link when users share the bot.
         * @param description The text shown in the chat with the bot if the chat is empty.
         * @param photo Photo shown in the chat with the bot if the chat is empty; may be null.
         * @param animation Animation shown in the chat with the bot if the chat is empty; may be null.
         * @param managerBotUserId Identifier of the bot, which manages the bot; 0 if none or unknown; for owner of the bot only.
         * @param menuButton Information about a button to show instead of the bot commands menu button; may be null if ordinary bot commands menu must be shown.
         * @param commands List of the bot commands.
         * @param privacyPolicyUrl The HTTP link to the privacy policy of the bot. If empty, then /privacy command must be used if supported by the bot. If the command isn't supported, then https://telegram.org/privacy-tpa must be opened.
         * @param defaultGroupAdministratorRights Default administrator rights for adding the bot to basic group and supergroup chats; may be null.
         * @param defaultChannelAdministratorRights Default administrator rights for adding the bot to channels; may be null.
         * @param affiliateProgram Information about the affiliate program of the bot; may be null if none.
         * @param webAppBackgroundLightColor Default light background color for bot Web Apps; -1 if not specified.
         * @param webAppBackgroundDarkColor Default dark background color for bot Web Apps; -1 if not specified.
         * @param webAppHeaderLightColor Default light header color for bot Web Apps; -1 if not specified.
         * @param webAppHeaderDarkColor Default dark header color for bot Web Apps; -1 if not specified.
         * @param verificationParameters Parameters of the verification that can be provided by the bot; may be null if none or the current user isn't the owner of the bot.
         * @param canGetRevenueStatistics True, if the bot's revenue statistics are available to the current user.
         * @param canManageEmojiStatus True, if the bot can manage emoji status of the current user.
         * @param hasMediaPreviews True, if the bot has media previews.
         * @param editCommandsLink The internal link, which can be used to edit bot commands; may be null.
         * @param editDescriptionLink The internal link, which can be used to edit bot description; may be null.
         * @param editDescriptionMediaLink The internal link, which can be used to edit the photo or animation shown in the chat with the bot if the chat is empty; may be null.
         * @param editSettingsLink The internal link, which can be used to edit bot settings; may be null.
         */
        public BotInfo(String shortDescription, String description, Photo photo, Animation animation, long managerBotUserId, BotMenuButton menuButton, BotCommand[] commands, String privacyPolicyUrl, ChatAdministratorRights defaultGroupAdministratorRights, ChatAdministratorRights defaultChannelAdministratorRights, AffiliateProgramInfo affiliateProgram, int webAppBackgroundLightColor, int webAppBackgroundDarkColor, int webAppHeaderLightColor, int webAppHeaderDarkColor, BotVerificationParameters verificationParameters, boolean canGetRevenueStatistics, boolean canManageEmojiStatus, boolean hasMediaPreviews, InternalLinkType editCommandsLink, InternalLinkType editDescriptionLink, InternalLinkType editDescriptionMediaLink, InternalLinkType editSettingsLink) {
            this.shortDescription = shortDescription;
            this.description = description;
            this.photo = photo;
            this.animation = animation;
            this.managerBotUserId = managerBotUserId;
            this.menuButton = menuButton;
            this.commands = commands;
            this.privacyPolicyUrl = privacyPolicyUrl;
            this.defaultGroupAdministratorRights = defaultGroupAdministratorRights;
            this.defaultChannelAdministratorRights = defaultChannelAdministratorRights;
            this.affiliateProgram = affiliateProgram;
            this.webAppBackgroundLightColor = webAppBackgroundLightColor;
            this.webAppBackgroundDarkColor = webAppBackgroundDarkColor;
            this.webAppHeaderLightColor = webAppHeaderLightColor;
            this.webAppHeaderDarkColor = webAppHeaderDarkColor;
            this.verificationParameters = verificationParameters;
            this.canGetRevenueStatistics = canGetRevenueStatistics;
            this.canManageEmojiStatus = canManageEmojiStatus;
            this.hasMediaPreviews = hasMediaPreviews;
            this.editCommandsLink = editCommandsLink;
            this.editDescriptionLink = editDescriptionLink;
            this.editDescriptionMediaLink = editDescriptionMediaLink;
            this.editSettingsLink = editSettingsLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -586441582;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes media previews of a bot.
     */
    public static class BotMediaPreview extends Object {
        /**
         * Point in time (Unix timestamp) when the preview was added or changed last time.
         */
        public int date;
        /**
         * Content of the preview; may only be of the types storyContentPhoto, storyContentVideo, or storyContentUnsupported.
         */
        public StoryContent content;

        /**
         * Describes media previews of a bot.
         */
        public BotMediaPreview() {
        }

        /**
         * Describes media previews of a bot.
         *
         * @param date Point in time (Unix timestamp) when the preview was added or changed last time.
         * @param content Content of the preview; may only be of the types storyContentPhoto, storyContentVideo, or storyContentUnsupported.
         */
        public BotMediaPreview(int date, StoryContent content) {
            this.date = date;
            this.content = content;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1632264984;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of media previews of a bot for the given language and the list of languages for which the bot has dedicated previews.
     */
    public static class BotMediaPreviewInfo extends Object {
        /**
         * List of media previews.
         */
        public BotMediaPreview[] previews;
        /**
         * List of language codes for which the bot has dedicated previews.
         */
        public String[] languageCodes;

        /**
         * Contains a list of media previews of a bot for the given language and the list of languages for which the bot has dedicated previews.
         */
        public BotMediaPreviewInfo() {
        }

        /**
         * Contains a list of media previews of a bot for the given language and the list of languages for which the bot has dedicated previews.
         *
         * @param previews List of media previews.
         * @param languageCodes List of language codes for which the bot has dedicated previews.
         */
        public BotMediaPreviewInfo(BotMediaPreview[] previews, String[] languageCodes) {
            this.previews = previews;
            this.languageCodes = languageCodes;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -284783012;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of media previews of a bot.
     */
    public static class BotMediaPreviews extends Object {
        /**
         * List of media previews.
         */
        public BotMediaPreview[] previews;

        /**
         * Contains a list of media previews of a bot.
         */
        public BotMediaPreviews() {
        }

        /**
         * Contains a list of media previews of a bot.
         *
         * @param previews List of media previews.
         */
        public BotMediaPreviews(BotMediaPreview[] previews) {
            this.previews = previews;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1787720586;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a button to be shown instead of bot commands menu button.
     */
    public static class BotMenuButton extends Object {
        /**
         * Text of the button.
         */
        public String text;
        /**
         * URL of a Web App to open when the button is pressed. If the link is of the type internalLinkTypeWebApp, then it must be processed accordingly. Otherwise, the link must be passed to openWebApp.
         */
        public String url;

        /**
         * Describes a button to be shown instead of bot commands menu button.
         */
        public BotMenuButton() {
        }

        /**
         * Describes a button to be shown instead of bot commands menu button.
         *
         * @param text Text of the button.
         * @param url URL of a Web App to open when the button is pressed. If the link is of the type internalLinkTypeWebApp, then it must be processed accordingly. Otherwise, the link must be passed to openWebApp.
         */
        public BotMenuButton(String text, String url) {
            this.text = text;
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -944407322;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes verification status provided by a bot.
     */
    public static class BotVerification extends Object {
        /**
         * Identifier of the bot that provided the verification.
         */
        public long botUserId;
        /**
         * Identifier of the custom emoji that is used as the verification sign.
         */
        public long iconCustomEmojiId;
        /**
         * Custom description of verification reason set by the bot. Can contain only Mention, Hashtag, Cashtag, PhoneNumber, BankCardNumber, Url, and EmailAddress entities.
         */
        public FormattedText customDescription;

        /**
         * Describes verification status provided by a bot.
         */
        public BotVerification() {
        }

        /**
         * Describes verification status provided by a bot.
         *
         * @param botUserId Identifier of the bot that provided the verification.
         * @param iconCustomEmojiId Identifier of the custom emoji that is used as the verification sign.
         * @param customDescription Custom description of verification reason set by the bot. Can contain only Mention, Hashtag, Cashtag, PhoneNumber, BankCardNumber, Url, and EmailAddress entities.
         */
        public BotVerification(long botUserId, long iconCustomEmojiId, FormattedText customDescription) {
            this.botUserId = botUserId;
            this.iconCustomEmojiId = iconCustomEmojiId;
            this.customDescription = customDescription;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1319061774;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes parameters of verification that is provided by a bot.
     */
    public static class BotVerificationParameters extends Object {
        /**
         * Identifier of the custom emoji that is used as the verification sign.
         */
        public long iconCustomEmojiId;
        /**
         * Name of the organization that provides verification.
         */
        public String organizationName;
        /**
         * Default custom description of verification reason to be used as placeholder in setMessageSenderBotVerification; may be null if none.
         */
        @Nullable public FormattedText defaultCustomDescription;
        /**
         * True, if the bot is allowed to provide custom description for verified entities.
         */
        public boolean canSetCustomDescription;

        /**
         * Describes parameters of verification that is provided by a bot.
         */
        public BotVerificationParameters() {
        }

        /**
         * Describes parameters of verification that is provided by a bot.
         *
         * @param iconCustomEmojiId Identifier of the custom emoji that is used as the verification sign.
         * @param organizationName Name of the organization that provides verification.
         * @param defaultCustomDescription Default custom description of verification reason to be used as placeholder in setMessageSenderBotVerification; may be null if none.
         * @param canSetCustomDescription True, if the bot is allowed to provide custom description for verified entities.
         */
        public BotVerificationParameters(long iconCustomEmojiId, String organizationName, FormattedText defaultCustomDescription, boolean canSetCustomDescription) {
            this.iconCustomEmojiId = iconCustomEmojiId;
            this.organizationName = organizationName;
            this.defaultCustomDescription = defaultCustomDescription;
            this.canSetCustomDescription = canSetCustomDescription;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -723737249;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a reason why a bot was allowed to write messages to the current user.
     */
    public abstract static class BotWriteAccessAllowReason extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            BotWriteAccessAllowReasonConnectedWebsite.CONSTRUCTOR,
            BotWriteAccessAllowReasonAddedToAttachmentMenu.CONSTRUCTOR,
            BotWriteAccessAllowReasonLaunchedWebApp.CONSTRUCTOR,
            BotWriteAccessAllowReasonAcceptedRequest.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public BotWriteAccessAllowReason() {
        }
    }

    /**
     * The user connected a website by logging in using Telegram Login Widget on it.
     */
    public static class BotWriteAccessAllowReasonConnectedWebsite extends BotWriteAccessAllowReason {
        /**
         * Domain name of the connected website.
         */
        public String domainName;

        /**
         * The user connected a website by logging in using Telegram Login Widget on it.
         */
        public BotWriteAccessAllowReasonConnectedWebsite() {
        }

        /**
         * The user connected a website by logging in using Telegram Login Widget on it.
         *
         * @param domainName Domain name of the connected website.
         */
        public BotWriteAccessAllowReasonConnectedWebsite(String domainName) {
            this.domainName = domainName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2016325603;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user added the bot to attachment or side menu using toggleBotIsAddedToAttachmentMenu.
     */
    public static class BotWriteAccessAllowReasonAddedToAttachmentMenu extends BotWriteAccessAllowReason {

        /**
         * The user added the bot to attachment or side menu using toggleBotIsAddedToAttachmentMenu.
         */
        public BotWriteAccessAllowReasonAddedToAttachmentMenu() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2104795235;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user launched a Web App using getWebAppLinkUrl.
     */
    public static class BotWriteAccessAllowReasonLaunchedWebApp extends BotWriteAccessAllowReason {
        /**
         * Information about the Web App.
         */
        public WebApp webApp;

        /**
         * The user launched a Web App using getWebAppLinkUrl.
         */
        public BotWriteAccessAllowReasonLaunchedWebApp() {
        }

        /**
         * The user launched a Web App using getWebAppLinkUrl.
         *
         * @param webApp Information about the Web App.
         */
        public BotWriteAccessAllowReasonLaunchedWebApp(WebApp webApp) {
            this.webApp = webApp;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -240843561;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user accepted bot's request to send messages with allowBotToSendMessages.
     */
    public static class BotWriteAccessAllowReasonAcceptedRequest extends BotWriteAccessAllowReason {

        /**
         * The user accepted bot's request to send messages with allowBotToSendMessages.
         */
        public BotWriteAccessAllowReasonAcceptedRequest() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1983497220;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a built-in theme of an official application.
     */
    public abstract static class BuiltInTheme extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            BuiltInThemeClassic.CONSTRUCTOR,
            BuiltInThemeDay.CONSTRUCTOR,
            BuiltInThemeNight.CONSTRUCTOR,
            BuiltInThemeTinted.CONSTRUCTOR,
            BuiltInThemeArctic.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public BuiltInTheme() {
        }
    }

    /**
     * Classic light theme.
     */
    public static class BuiltInThemeClassic extends BuiltInTheme {

        /**
         * Classic light theme.
         */
        public BuiltInThemeClassic() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -696429972;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Regular light theme.
     */
    public static class BuiltInThemeDay extends BuiltInTheme {

        /**
         * Regular light theme.
         */
        public BuiltInThemeDay() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 411774754;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Regular dark theme.
     */
    public static class BuiltInThemeNight extends BuiltInTheme {

        /**
         * Regular dark theme.
         */
        public BuiltInThemeNight() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 429672829;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Tinted dark theme.
     */
    public static class BuiltInThemeTinted extends BuiltInTheme {

        /**
         * Tinted dark theme.
         */
        public BuiltInThemeTinted() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 513932973;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Arctic light theme.
     */
    public static class BuiltInThemeArctic extends BuiltInTheme {

        /**
         * Arctic light theme.
         */
        public BuiltInThemeArctic() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1427659554;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes conditions for sending of away messages by a Telegram Business account.
     */
    public abstract static class BusinessAwayMessageSchedule extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            BusinessAwayMessageScheduleAlways.CONSTRUCTOR,
            BusinessAwayMessageScheduleOutsideOfOpeningHours.CONSTRUCTOR,
            BusinessAwayMessageScheduleCustom.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public BusinessAwayMessageSchedule() {
        }
    }

    /**
     * Send away messages always.
     */
    public static class BusinessAwayMessageScheduleAlways extends BusinessAwayMessageSchedule {

        /**
         * Send away messages always.
         */
        public BusinessAwayMessageScheduleAlways() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -910564679;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Send away messages outside of the business opening hours.
     */
    public static class BusinessAwayMessageScheduleOutsideOfOpeningHours extends BusinessAwayMessageSchedule {

        /**
         * Send away messages outside of the business opening hours.
         */
        public BusinessAwayMessageScheduleOutsideOfOpeningHours() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -968630506;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Send away messages only in the specified time span.
     */
    public static class BusinessAwayMessageScheduleCustom extends BusinessAwayMessageSchedule {
        /**
         * Point in time (Unix timestamp) when the away messages will start to be sent.
         */
        public int startDate;
        /**
         * Point in time (Unix timestamp) when the away messages will stop to be sent.
         */
        public int endDate;

        /**
         * Send away messages only in the specified time span.
         */
        public BusinessAwayMessageScheduleCustom() {
        }

        /**
         * Send away messages only in the specified time span.
         *
         * @param startDate Point in time (Unix timestamp) when the away messages will start to be sent.
         * @param endDate Point in time (Unix timestamp) when the away messages will stop to be sent.
         */
        public BusinessAwayMessageScheduleCustom(int startDate, int endDate) {
            this.startDate = startDate;
            this.endDate = endDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1967108654;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes settings for messages that are automatically sent by a Telegram Business account when it is away.
     */
    public static class BusinessAwayMessageSettings extends Object {
        /**
         * Unique quick reply shortcut identifier for the away messages.
         */
        public int shortcutId;
        /**
         * Chosen recipients of the away messages.
         */
        public BusinessRecipients recipients;
        /**
         * Settings used to check whether the current user is away.
         */
        public BusinessAwayMessageSchedule schedule;
        /**
         * True, if the messages must not be sent if the account was online in the last 10 minutes.
         */
        public boolean offlineOnly;

        /**
         * Describes settings for messages that are automatically sent by a Telegram Business account when it is away.
         */
        public BusinessAwayMessageSettings() {
        }

        /**
         * Describes settings for messages that are automatically sent by a Telegram Business account when it is away.
         *
         * @param shortcutId Unique quick reply shortcut identifier for the away messages.
         * @param recipients Chosen recipients of the away messages.
         * @param schedule Settings used to check whether the current user is away.
         * @param offlineOnly True, if the messages must not be sent if the account was online in the last 10 minutes.
         */
        public BusinessAwayMessageSettings(int shortcutId, BusinessRecipients recipients, BusinessAwayMessageSchedule schedule, boolean offlineOnly) {
            this.shortcutId = shortcutId;
            this.recipients = recipients;
            this.schedule = schedule;
            this.offlineOnly = offlineOnly;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 353084137;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a business bot that manages the chat.
     */
    public static class BusinessBotManageBar extends Object {
        /**
         * User identifier of the bot.
         */
        public long botUserId;
        /**
         * URL to be opened to manage the bot.
         */
        public String manageUrl;
        /**
         * True, if the bot is paused. Use toggleBusinessConnectedBotChatIsPaused to change the value of the field.
         */
        public boolean isBotPaused;
        /**
         * True, if the bot can reply.
         */
        public boolean canBotReply;

        /**
         * Contains information about a business bot that manages the chat.
         */
        public BusinessBotManageBar() {
        }

        /**
         * Contains information about a business bot that manages the chat.
         *
         * @param botUserId User identifier of the bot.
         * @param manageUrl URL to be opened to manage the bot.
         * @param isBotPaused True, if the bot is paused. Use toggleBusinessConnectedBotChatIsPaused to change the value of the field.
         * @param canBotReply True, if the bot can reply.
         */
        public BusinessBotManageBar(long botUserId, String manageUrl, boolean isBotPaused, boolean canBotReply) {
            this.botUserId = botUserId;
            this.manageUrl = manageUrl;
            this.isBotPaused = isBotPaused;
            this.canBotReply = canBotReply;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -311399806;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes rights of a business bot.
     */
    public static class BusinessBotRights extends Object {
        /**
         * True, if the bot can send and edit messages in the private chats that had incoming messages in the last 24 hours.
         */
        public boolean canReply;
        /**
         * True, if the bot can mark incoming private messages as read.
         */
        public boolean canReadMessages;
        /**
         * True, if the bot can delete sent messages.
         */
        public boolean canDeleteSentMessages;
        /**
         * True, if the bot can delete any message.
         */
        public boolean canDeleteAllMessages;
        /**
         * True, if the bot can edit name of the business account.
         */
        public boolean canEditName;
        /**
         * True, if the bot can edit bio of the business account.
         */
        public boolean canEditBio;
        /**
         * True, if the bot can edit profile photo of the business account.
         */
        public boolean canEditProfilePhoto;
        /**
         * True, if the bot can edit username of the business account.
         */
        public boolean canEditUsername;
        /**
         * True, if the bot can view gifts and Telegram Star amount owned by the business account.
         */
        public boolean canViewGiftsAndStars;
        /**
         * True, if the bot can sell regular gifts received by the business account.
         */
        public boolean canSellGifts;
        /**
         * True, if the bot can change gift receiving settings of the business account.
         */
        public boolean canChangeGiftSettings;
        /**
         * True, if the bot can transfer and upgrade gifts received by the business account.
         */
        public boolean canTransferAndUpgradeGifts;
        /**
         * True, if the bot can transfer Telegram Stars received by the business account to account of the bot, or use them to upgrade and transfer gifts.
         */
        public boolean canTransferStars;
        /**
         * True, if the bot can post, edit and delete stories.
         */
        public boolean canManageStories;

        /**
         * Describes rights of a business bot.
         */
        public BusinessBotRights() {
        }

        /**
         * Describes rights of a business bot.
         *
         * @param canReply True, if the bot can send and edit messages in the private chats that had incoming messages in the last 24 hours.
         * @param canReadMessages True, if the bot can mark incoming private messages as read.
         * @param canDeleteSentMessages True, if the bot can delete sent messages.
         * @param canDeleteAllMessages True, if the bot can delete any message.
         * @param canEditName True, if the bot can edit name of the business account.
         * @param canEditBio True, if the bot can edit bio of the business account.
         * @param canEditProfilePhoto True, if the bot can edit profile photo of the business account.
         * @param canEditUsername True, if the bot can edit username of the business account.
         * @param canViewGiftsAndStars True, if the bot can view gifts and Telegram Star amount owned by the business account.
         * @param canSellGifts True, if the bot can sell regular gifts received by the business account.
         * @param canChangeGiftSettings True, if the bot can change gift receiving settings of the business account.
         * @param canTransferAndUpgradeGifts True, if the bot can transfer and upgrade gifts received by the business account.
         * @param canTransferStars True, if the bot can transfer Telegram Stars received by the business account to account of the bot, or use them to upgrade and transfer gifts.
         * @param canManageStories True, if the bot can post, edit and delete stories.
         */
        public BusinessBotRights(boolean canReply, boolean canReadMessages, boolean canDeleteSentMessages, boolean canDeleteAllMessages, boolean canEditName, boolean canEditBio, boolean canEditProfilePhoto, boolean canEditUsername, boolean canViewGiftsAndStars, boolean canSellGifts, boolean canChangeGiftSettings, boolean canTransferAndUpgradeGifts, boolean canTransferStars, boolean canManageStories) {
            this.canReply = canReply;
            this.canReadMessages = canReadMessages;
            this.canDeleteSentMessages = canDeleteSentMessages;
            this.canDeleteAllMessages = canDeleteAllMessages;
            this.canEditName = canEditName;
            this.canEditBio = canEditBio;
            this.canEditProfilePhoto = canEditProfilePhoto;
            this.canEditUsername = canEditUsername;
            this.canViewGiftsAndStars = canViewGiftsAndStars;
            this.canSellGifts = canSellGifts;
            this.canChangeGiftSettings = canChangeGiftSettings;
            this.canTransferAndUpgradeGifts = canTransferAndUpgradeGifts;
            this.canTransferStars = canTransferStars;
            this.canManageStories = canManageStories;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1224839038;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a business chat link.
     */
    public static class BusinessChatLink extends Object {
        /**
         * The HTTPS link.
         */
        public String link;
        /**
         * Message draft text that will be added to the input field.
         */
        public FormattedText text;
        /**
         * Link title.
         */
        public String title;
        /**
         * Number of times the link was used.
         */
        public int viewCount;

        /**
         * Contains information about a business chat link.
         */
        public BusinessChatLink() {
        }

        /**
         * Contains information about a business chat link.
         *
         * @param link The HTTPS link.
         * @param text Message draft text that will be added to the input field.
         * @param title Link title.
         * @param viewCount Number of times the link was used.
         */
        public BusinessChatLink(String link, FormattedText text, String title, int viewCount) {
            this.link = link;
            this.text = text;
            this.title = title;
            this.viewCount = viewCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1902539901;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a business chat link.
     */
    public static class BusinessChatLinkInfo extends Object {
        /**
         * Identifier of the private chat that created the link.
         */
        public long chatId;
        /**
         * Message draft text that must be added to the input field.
         */
        public FormattedText text;

        /**
         * Contains information about a business chat link.
         */
        public BusinessChatLinkInfo() {
        }

        /**
         * Contains information about a business chat link.
         *
         * @param chatId Identifier of the private chat that created the link.
         * @param text Message draft text that must be added to the input field.
         */
        public BusinessChatLinkInfo(long chatId, FormattedText text) {
            this.chatId = chatId;
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -864865105;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of business chat links created by the user.
     */
    public static class BusinessChatLinks extends Object {
        /**
         * List of links.
         */
        public BusinessChatLink[] links;

        /**
         * Contains a list of business chat links created by the user.
         */
        public BusinessChatLinks() {
        }

        /**
         * Contains a list of business chat links created by the user.
         *
         * @param links List of links.
         */
        public BusinessChatLinks(BusinessChatLink[] links) {
            this.links = links;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 79067036;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a bot connected to a business account.
     */
    public static class BusinessConnectedBot extends Object {
        /**
         * User identifier of the bot.
         */
        public long botUserId;
        /**
         * Private chats that will be accessible to the bot.
         */
        public BusinessRecipients recipients;
        /**
         * Rights of the bot.
         */
        public BusinessBotRights rights;

        /**
         * Describes a bot connected to a business account.
         */
        public BusinessConnectedBot() {
        }

        /**
         * Describes a bot connected to a business account.
         *
         * @param botUserId User identifier of the bot.
         * @param recipients Private chats that will be accessible to the bot.
         * @param rights Rights of the bot.
         */
        public BusinessConnectedBot(long botUserId, BusinessRecipients recipients, BusinessBotRights rights) {
            this.botUserId = botUserId;
            this.recipients = recipients;
            this.rights = rights;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1815439021;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a connection of the bot with a business account.
     */
    public static class BusinessConnection extends Object {
        /**
         * Unique identifier of the connection.
         */
        public String id;
        /**
         * Identifier of the business user who created the connection.
         */
        public long userId;
        /**
         * Chat identifier of the private chat with the user.
         */
        public long userChatId;
        /**
         * Point in time (Unix timestamp) when the connection was established.
         */
        public int date;
        /**
         * Rights of the bot; may be null if the connection was disabled.
         */
        @Nullable public BusinessBotRights rights;
        /**
         * True, if the connection is enabled; false otherwise.
         */
        public boolean isEnabled;

        /**
         * Describes a connection of the bot with a business account.
         */
        public BusinessConnection() {
        }

        /**
         * Describes a connection of the bot with a business account.
         *
         * @param id Unique identifier of the connection.
         * @param userId Identifier of the business user who created the connection.
         * @param userChatId Chat identifier of the private chat with the user.
         * @param date Point in time (Unix timestamp) when the connection was established.
         * @param rights Rights of the bot; may be null if the connection was disabled.
         * @param isEnabled True, if the connection is enabled; false otherwise.
         */
        public BusinessConnection(String id, long userId, long userChatId, int date, BusinessBotRights rights, boolean isEnabled) {
            this.id = id;
            this.userId = userId;
            this.userChatId = userChatId;
            this.date = date;
            this.rights = rights;
            this.isEnabled = isEnabled;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -995703933;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a feature available to Business user accounts.
     */
    public abstract static class BusinessFeature extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            BusinessFeatureLocation.CONSTRUCTOR,
            BusinessFeatureOpeningHours.CONSTRUCTOR,
            BusinessFeatureQuickReplies.CONSTRUCTOR,
            BusinessFeatureGreetingMessage.CONSTRUCTOR,
            BusinessFeatureAwayMessage.CONSTRUCTOR,
            BusinessFeatureAccountLinks.CONSTRUCTOR,
            BusinessFeatureStartPage.CONSTRUCTOR,
            BusinessFeatureBots.CONSTRUCTOR,
            BusinessFeatureEmojiStatus.CONSTRUCTOR,
            BusinessFeatureChatFolderTags.CONSTRUCTOR,
            BusinessFeatureUpgradedStories.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public BusinessFeature() {
        }
    }

    /**
     * The ability to set location.
     */
    public static class BusinessFeatureLocation extends BusinessFeature {

        /**
         * The ability to set location.
         */
        public BusinessFeatureLocation() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1064304004;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to set opening hours.
     */
    public static class BusinessFeatureOpeningHours extends BusinessFeature {

        /**
         * The ability to set opening hours.
         */
        public BusinessFeatureOpeningHours() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 461054701;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to use quick replies.
     */
    public static class BusinessFeatureQuickReplies extends BusinessFeature {

        /**
         * The ability to use quick replies.
         */
        public BusinessFeatureQuickReplies() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1674048894;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to set up a greeting message.
     */
    public static class BusinessFeatureGreetingMessage extends BusinessFeature {

        /**
         * The ability to set up a greeting message.
         */
        public BusinessFeatureGreetingMessage() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1789424756;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to set up an away message.
     */
    public static class BusinessFeatureAwayMessage extends BusinessFeature {

        /**
         * The ability to set up an away message.
         */
        public BusinessFeatureAwayMessage() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1090119901;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to create links to the business account with predefined message text.
     */
    public static class BusinessFeatureAccountLinks extends BusinessFeature {

        /**
         * The ability to create links to the business account with predefined message text.
         */
        public BusinessFeatureAccountLinks() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1878693646;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to customize start page.
     */
    public static class BusinessFeatureStartPage extends BusinessFeature {

        /**
         * The ability to customize start page.
         */
        public BusinessFeatureStartPage() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 401471457;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to connect a bot to the account.
     */
    public static class BusinessFeatureBots extends BusinessFeature {

        /**
         * The ability to connect a bot to the account.
         */
        public BusinessFeatureBots() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 275084773;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to show an emoji status along with the business name.
     */
    public static class BusinessFeatureEmojiStatus extends BusinessFeature {

        /**
         * The ability to show an emoji status along with the business name.
         */
        public BusinessFeatureEmojiStatus() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -846282523;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to display folder names for each chat in the chat list.
     */
    public static class BusinessFeatureChatFolderTags extends BusinessFeature {

        /**
         * The ability to display folder names for each chat in the chat list.
         */
        public BusinessFeatureChatFolderTags() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -543880918;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Allowed to use many additional features for stories.
     */
    public static class BusinessFeatureUpgradedStories extends BusinessFeature {

        /**
         * Allowed to use many additional features for stories.
         */
        public BusinessFeatureUpgradedStories() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1812245550;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a promotion animation for a Business feature.
     */
    public static class BusinessFeaturePromotionAnimation extends Object {
        /**
         * Business feature.
         */
        public BusinessFeature feature;
        /**
         * Promotion animation for the feature.
         */
        public Animation animation;

        /**
         * Describes a promotion animation for a Business feature.
         */
        public BusinessFeaturePromotionAnimation() {
        }

        /**
         * Describes a promotion animation for a Business feature.
         *
         * @param feature Business feature.
         * @param animation Promotion animation for the feature.
         */
        public BusinessFeaturePromotionAnimation(BusinessFeature feature, Animation animation) {
            this.feature = feature;
            this.animation = animation;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2047174666;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about features, available to Business user accounts.
     */
    public static class BusinessFeatures extends Object {
        /**
         * The list of available business features.
         */
        public BusinessFeature[] features;

        /**
         * Contains information about features, available to Business user accounts.
         */
        public BusinessFeatures() {
        }

        /**
         * Contains information about features, available to Business user accounts.
         *
         * @param features The list of available business features.
         */
        public BusinessFeatures(BusinessFeature[] features) {
            this.features = features;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1532468184;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes settings for greeting messages that are automatically sent by a Telegram Business account as response to incoming messages in an inactive private chat.
     */
    public static class BusinessGreetingMessageSettings extends Object {
        /**
         * Unique quick reply shortcut identifier for the greeting messages.
         */
        public int shortcutId;
        /**
         * Chosen recipients of the greeting messages.
         */
        public BusinessRecipients recipients;
        /**
         * The number of days after which a chat will be considered as inactive; currently, must be on of 7, 14, 21, or 28.
         */
        public int inactivityDays;

        /**
         * Describes settings for greeting messages that are automatically sent by a Telegram Business account as response to incoming messages in an inactive private chat.
         */
        public BusinessGreetingMessageSettings() {
        }

        /**
         * Describes settings for greeting messages that are automatically sent by a Telegram Business account as response to incoming messages in an inactive private chat.
         *
         * @param shortcutId Unique quick reply shortcut identifier for the greeting messages.
         * @param recipients Chosen recipients of the greeting messages.
         * @param inactivityDays The number of days after which a chat will be considered as inactive; currently, must be on of 7, 14, 21, or 28.
         */
        public BusinessGreetingMessageSettings(int shortcutId, BusinessRecipients recipients, int inactivityDays) {
            this.shortcutId = shortcutId;
            this.recipients = recipients;
            this.inactivityDays = inactivityDays;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1689140754;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a Telegram Business account.
     */
    public static class BusinessInfo extends Object {
        /**
         * Location of the business; may be null if none.
         */
        @Nullable public BusinessLocation location;
        /**
         * Opening hours of the business; may be null if none. The hours are guaranteed to be valid and has already been split by week days.
         */
        @Nullable public BusinessOpeningHours openingHours;
        /**
         * Opening hours of the business in the local time; may be null if none. The hours are guaranteed to be valid and has already been split by week days. Local time zone identifier will be empty. An updateUserFullInfo update is not triggered when value of this field changes.
         */
        @Nullable public BusinessOpeningHours localOpeningHours;
        /**
         * Time left before the business will open the next time, in seconds; 0 if unknown. An updateUserFullInfo update is not triggered when value of this field changes.
         */
        public int nextOpenIn;
        /**
         * Time left before the business will close the next time, in seconds; 0 if unknown. An updateUserFullInfo update is not triggered when value of this field changes.
         */
        public int nextCloseIn;
        /**
         * The greeting message; may be null if none or the Business account is not of the current user.
         */
        @Nullable public BusinessGreetingMessageSettings greetingMessageSettings;
        /**
         * The away message; may be null if none or the Business account is not of the current user.
         */
        @Nullable public BusinessAwayMessageSettings awayMessageSettings;
        /**
         * Information about start page of the account; may be null if none.
         */
        @Nullable public BusinessStartPage startPage;

        /**
         * Contains information about a Telegram Business account.
         */
        public BusinessInfo() {
        }

        /**
         * Contains information about a Telegram Business account.
         *
         * @param location Location of the business; may be null if none.
         * @param openingHours Opening hours of the business; may be null if none. The hours are guaranteed to be valid and has already been split by week days.
         * @param localOpeningHours Opening hours of the business in the local time; may be null if none. The hours are guaranteed to be valid and has already been split by week days. Local time zone identifier will be empty. An updateUserFullInfo update is not triggered when value of this field changes.
         * @param nextOpenIn Time left before the business will open the next time, in seconds; 0 if unknown. An updateUserFullInfo update is not triggered when value of this field changes.
         * @param nextCloseIn Time left before the business will close the next time, in seconds; 0 if unknown. An updateUserFullInfo update is not triggered when value of this field changes.
         * @param greetingMessageSettings The greeting message; may be null if none or the Business account is not of the current user.
         * @param awayMessageSettings The away message; may be null if none or the Business account is not of the current user.
         * @param startPage Information about start page of the account; may be null if none.
         */
        public BusinessInfo(BusinessLocation location, BusinessOpeningHours openingHours, BusinessOpeningHours localOpeningHours, int nextOpenIn, int nextCloseIn, BusinessGreetingMessageSettings greetingMessageSettings, BusinessAwayMessageSettings awayMessageSettings, BusinessStartPage startPage) {
            this.location = location;
            this.openingHours = openingHours;
            this.localOpeningHours = localOpeningHours;
            this.nextOpenIn = nextOpenIn;
            this.nextCloseIn = nextCloseIn;
            this.greetingMessageSettings = greetingMessageSettings;
            this.awayMessageSettings = awayMessageSettings;
            this.startPage = startPage;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1428179342;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a location of a business.
     */
    public static class BusinessLocation extends Object {
        /**
         * The location; may be null if not specified.
         */
        @Nullable public Location location;
        /**
         * Location address; 1-96 characters.
         */
        public String address;

        /**
         * Represents a location of a business.
         */
        public BusinessLocation() {
        }

        /**
         * Represents a location of a business.
         *
         * @param location The location; may be null if not specified.
         * @param address Location address; 1-96 characters.
         */
        public BusinessLocation(Location location, String address) {
            this.location = location;
            this.address = address;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1084969126;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a message from a business account as received by a bot.
     */
    public static class BusinessMessage extends Object {
        /**
         * The message.
         */
        public Message message;
        /**
         * Message that is replied by the message in the same chat; may be null if none.
         */
        @Nullable public Message replyToMessage;

        /**
         * Describes a message from a business account as received by a bot.
         */
        public BusinessMessage() {
        }

        /**
         * Describes a message from a business account as received by a bot.
         *
         * @param message The message.
         * @param replyToMessage Message that is replied by the message in the same chat; may be null if none.
         */
        public BusinessMessage(Message message, Message replyToMessage) {
            this.message = message;
            this.replyToMessage = replyToMessage;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -94353850;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of messages from a business account as received by a bot.
     */
    public static class BusinessMessages extends Object {
        /**
         * List of business messages.
         */
        public BusinessMessage[] messages;

        /**
         * Contains a list of messages from a business account as received by a bot.
         */
        public BusinessMessages() {
        }

        /**
         * Contains a list of messages from a business account as received by a bot.
         *
         * @param messages List of business messages.
         */
        public BusinessMessages(BusinessMessage[] messages) {
            this.messages = messages;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -764562473;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes opening hours of a business.
     */
    public static class BusinessOpeningHours extends Object {
        /**
         * Unique time zone identifier.
         */
        public String timeZoneId;
        /**
         * Intervals of the time when the business is open.
         */
        public BusinessOpeningHoursInterval[] openingHours;

        /**
         * Describes opening hours of a business.
         */
        public BusinessOpeningHours() {
        }

        /**
         * Describes opening hours of a business.
         *
         * @param timeZoneId Unique time zone identifier.
         * @param openingHours Intervals of the time when the business is open.
         */
        public BusinessOpeningHours(String timeZoneId, BusinessOpeningHoursInterval[] openingHours) {
            this.timeZoneId = timeZoneId;
            this.openingHours = openingHours;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 816603700;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an interval of time when the business is open.
     */
    public static class BusinessOpeningHoursInterval extends Object {
        /**
         * The minute's sequence number in a week, starting on Monday, marking the start of the time interval during which the business is open; 0-7*24*60.
         */
        public int startMinute;
        /**
         * The minute's sequence number in a week, starting on Monday, marking the end of the time interval during which the business is open; 1-8*24*60.
         */
        public int endMinute;

        /**
         * Describes an interval of time when the business is open.
         */
        public BusinessOpeningHoursInterval() {
        }

        /**
         * Describes an interval of time when the business is open.
         *
         * @param startMinute The minute's sequence number in a week, starting on Monday, marking the start of the time interval during which the business is open; 0-7*24*60.
         * @param endMinute The minute's sequence number in a week, starting on Monday, marking the end of the time interval during which the business is open; 1-8*24*60.
         */
        public BusinessOpeningHoursInterval(int startMinute, int endMinute) {
            this.startMinute = startMinute;
            this.endMinute = endMinute;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1108322732;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes private chats chosen for automatic interaction with a business.
     */
    public static class BusinessRecipients extends Object {
        /**
         * Identifiers of selected private chats.
         */
        public long[] chatIds;
        /**
         * Identifiers of private chats that are always excluded; for businessConnectedBot only.
         */
        public long[] excludedChatIds;
        /**
         * True, if all existing private chats are selected.
         */
        public boolean selectExistingChats;
        /**
         * True, if all new private chats are selected.
         */
        public boolean selectNewChats;
        /**
         * True, if all private chats with contacts are selected.
         */
        public boolean selectContacts;
        /**
         * True, if all private chats with non-contacts are selected.
         */
        public boolean selectNonContacts;
        /**
         * If true, then all private chats except the selected are chosen. Otherwise, only the selected chats are chosen.
         */
        public boolean excludeSelected;

        /**
         * Describes private chats chosen for automatic interaction with a business.
         */
        public BusinessRecipients() {
        }

        /**
         * Describes private chats chosen for automatic interaction with a business.
         *
         * @param chatIds Identifiers of selected private chats.
         * @param excludedChatIds Identifiers of private chats that are always excluded; for businessConnectedBot only.
         * @param selectExistingChats True, if all existing private chats are selected.
         * @param selectNewChats True, if all new private chats are selected.
         * @param selectContacts True, if all private chats with contacts are selected.
         * @param selectNonContacts True, if all private chats with non-contacts are selected.
         * @param excludeSelected If true, then all private chats except the selected are chosen. Otherwise, only the selected chats are chosen.
         */
        public BusinessRecipients(long[] chatIds, long[] excludedChatIds, boolean selectExistingChats, boolean selectNewChats, boolean selectContacts, boolean selectNonContacts, boolean excludeSelected) {
            this.chatIds = chatIds;
            this.excludedChatIds = excludedChatIds;
            this.selectExistingChats = selectExistingChats;
            this.selectNewChats = selectNewChats;
            this.selectContacts = selectContacts;
            this.selectNonContacts = selectNonContacts;
            this.excludeSelected = excludeSelected;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 868656909;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes settings for a business account start page.
     */
    public static class BusinessStartPage extends Object {
        /**
         * Title text of the start page.
         */
        public String title;
        /**
         * Message text of the start page.
         */
        public String message;
        /**
         * Greeting sticker of the start page; may be null if none.
         */
        @Nullable public Sticker sticker;

        /**
         * Describes settings for a business account start page.
         */
        public BusinessStartPage() {
        }

        /**
         * Describes settings for a business account start page.
         *
         * @param title Title text of the start page.
         * @param message Message text of the start page.
         * @param sticker Greeting sticker of the start page; may be null if none.
         */
        public BusinessStartPage(String title, String message, Sticker sticker) {
            this.title = title;
            this.message = message;
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1616709681;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes style of a button.
     */
    public abstract static class ButtonStyle extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ButtonStyleDefault.CONSTRUCTOR,
            ButtonStylePrimary.CONSTRUCTOR,
            ButtonStyleDanger.CONSTRUCTOR,
            ButtonStyleSuccess.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ButtonStyle() {
        }
    }

    /**
     * The button has default style.
     */
    public static class ButtonStyleDefault extends ButtonStyle {

        /**
         * The button has default style.
         */
        public ButtonStyleDefault() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 588834315;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The button has dark blue color.
     */
    public static class ButtonStylePrimary extends ButtonStyle {

        /**
         * The button has dark blue color.
         */
        public ButtonStylePrimary() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2048071333;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The button has red color.
     */
    public static class ButtonStyleDanger extends ButtonStyle {

        /**
         * The button has red color.
         */
        public ButtonStyleDanger() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1637377793;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The button has green color.
     */
    public static class ButtonStyleSuccess extends ButtonStyle {

        /**
         * The button has green color.
         */
        public ButtonStyleSuccess() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1042215008;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a call.
     */
    public static class Call extends Object {
        /**
         * Call identifier, not persistent.
         */
        public int id;
        /**
         * Persistent unique call identifier; 0 if isn't assigned yet by the server.
         */
        public long uniqueId;
        /**
         * User identifier of the other call participant.
         */
        public long userId;
        /**
         * True, if the call is outgoing.
         */
        public boolean isOutgoing;
        /**
         * True, if the call is a video call.
         */
        public boolean isVideo;
        /**
         * Call state.
         */
        public CallState state;

        /**
         * Describes a call.
         */
        public Call() {
        }

        /**
         * Describes a call.
         *
         * @param id Call identifier, not persistent.
         * @param uniqueId Persistent unique call identifier; 0 if isn't assigned yet by the server.
         * @param userId User identifier of the other call participant.
         * @param isOutgoing True, if the call is outgoing.
         * @param isVideo True, if the call is a video call.
         * @param state Call state.
         */
        public Call(int id, long uniqueId, long userId, boolean isOutgoing, boolean isVideo, CallState state) {
            this.id = id;
            this.uniqueId = uniqueId;
            this.userId = userId;
            this.isOutgoing = isOutgoing;
            this.isVideo = isVideo;
            this.state = state;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 837356336;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the reason why a call was discarded.
     */
    public abstract static class CallDiscardReason extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            CallDiscardReasonEmpty.CONSTRUCTOR,
            CallDiscardReasonMissed.CONSTRUCTOR,
            CallDiscardReasonDeclined.CONSTRUCTOR,
            CallDiscardReasonDisconnected.CONSTRUCTOR,
            CallDiscardReasonHungUp.CONSTRUCTOR,
            CallDiscardReasonUpgradeToGroupCall.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public CallDiscardReason() {
        }
    }

    /**
     * The call wasn't discarded, or the reason is unknown.
     */
    public static class CallDiscardReasonEmpty extends CallDiscardReason {

        /**
         * The call wasn't discarded, or the reason is unknown.
         */
        public CallDiscardReasonEmpty() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1258917949;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The call was ended before the conversation started. It was canceled by the caller or missed by the other party.
     */
    public static class CallDiscardReasonMissed extends CallDiscardReason {

        /**
         * The call was ended before the conversation started. It was canceled by the caller or missed by the other party.
         */
        public CallDiscardReasonMissed() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1680358012;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The call was ended before the conversation started. It was declined by the other party.
     */
    public static class CallDiscardReasonDeclined extends CallDiscardReason {

        /**
         * The call was ended before the conversation started. It was declined by the other party.
         */
        public CallDiscardReasonDeclined() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1729926094;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The call was ended during the conversation because the users were disconnected.
     */
    public static class CallDiscardReasonDisconnected extends CallDiscardReason {

        /**
         * The call was ended during the conversation because the users were disconnected.
         */
        public CallDiscardReasonDisconnected() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1342872670;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The call was ended because one of the parties hung up.
     */
    public static class CallDiscardReasonHungUp extends CallDiscardReason {

        /**
         * The call was ended because one of the parties hung up.
         */
        public CallDiscardReasonHungUp() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 438216166;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The call was ended because it has been upgraded to a group call.
     */
    public static class CallDiscardReasonUpgradeToGroupCall extends CallDiscardReason {
        /**
         * Invite link for the group call.
         */
        public String inviteLink;

        /**
         * The call was ended because it has been upgraded to a group call.
         */
        public CallDiscardReasonUpgradeToGroupCall() {
        }

        /**
         * The call was ended because it has been upgraded to a group call.
         *
         * @param inviteLink Invite link for the group call.
         */
        public CallDiscardReasonUpgradeToGroupCall(String inviteLink) {
            this.inviteLink = inviteLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1254509319;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains the call identifier.
     */
    public static class CallId extends Object {
        /**
         * Call identifier.
         */
        public int id;

        /**
         * Contains the call identifier.
         */
        public CallId() {
        }

        /**
         * Contains the call identifier.
         *
         * @param id Call identifier.
         */
        public CallId(int id) {
            this.id = id;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 65717769;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the exact type of problem with a call.
     */
    public abstract static class CallProblem extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            CallProblemEcho.CONSTRUCTOR,
            CallProblemNoise.CONSTRUCTOR,
            CallProblemInterruptions.CONSTRUCTOR,
            CallProblemDistortedSpeech.CONSTRUCTOR,
            CallProblemSilentLocal.CONSTRUCTOR,
            CallProblemSilentRemote.CONSTRUCTOR,
            CallProblemDropped.CONSTRUCTOR,
            CallProblemDistortedVideo.CONSTRUCTOR,
            CallProblemPixelatedVideo.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public CallProblem() {
        }
    }

    /**
     * The user heard their own voice.
     */
    public static class CallProblemEcho extends CallProblem {

        /**
         * The user heard their own voice.
         */
        public CallProblemEcho() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 801116548;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user heard background noise.
     */
    public static class CallProblemNoise extends CallProblem {

        /**
         * The user heard background noise.
         */
        public CallProblemNoise() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1053065359;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The other side kept disappearing.
     */
    public static class CallProblemInterruptions extends CallProblem {

        /**
         * The other side kept disappearing.
         */
        public CallProblemInterruptions() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1119493218;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The speech was distorted.
     */
    public static class CallProblemDistortedSpeech extends CallProblem {

        /**
         * The speech was distorted.
         */
        public CallProblemDistortedSpeech() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 379960581;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user couldn't hear the other side.
     */
    public static class CallProblemSilentLocal extends CallProblem {

        /**
         * The user couldn't hear the other side.
         */
        public CallProblemSilentLocal() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 253652790;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The other side couldn't hear the user.
     */
    public static class CallProblemSilentRemote extends CallProblem {

        /**
         * The other side couldn't hear the user.
         */
        public CallProblemSilentRemote() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 573634714;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The call ended unexpectedly.
     */
    public static class CallProblemDropped extends CallProblem {

        /**
         * The call ended unexpectedly.
         */
        public CallProblemDropped() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1207311487;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The video was distorted.
     */
    public static class CallProblemDistortedVideo extends CallProblem {

        /**
         * The video was distorted.
         */
        public CallProblemDistortedVideo() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 385245706;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The video was pixelated.
     */
    public static class CallProblemPixelatedVideo extends CallProblem {

        /**
         * The video was pixelated.
         */
        public CallProblemPixelatedVideo() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2115315411;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Specifies the supported call protocols.
     */
    public static class CallProtocol extends Object {
        /**
         * True, if UDP peer-to-peer connections are supported.
         */
        public boolean udpP2p;
        /**
         * True, if connection through UDP reflectors is supported.
         */
        public boolean udpReflector;
        /**
         * The minimum supported API layer; use 65.
         */
        public int minLayer;
        /**
         * The maximum supported API layer; use 92.
         */
        public int maxLayer;
        /**
         * List of supported tgcalls versions.
         */
        public String[] libraryVersions;

        /**
         * Specifies the supported call protocols.
         */
        public CallProtocol() {
        }

        /**
         * Specifies the supported call protocols.
         *
         * @param udpP2p True, if UDP peer-to-peer connections are supported.
         * @param udpReflector True, if connection through UDP reflectors is supported.
         * @param minLayer The minimum supported API layer; use 65.
         * @param maxLayer The maximum supported API layer; use 92.
         * @param libraryVersions List of supported tgcalls versions.
         */
        public CallProtocol(boolean udpP2p, boolean udpReflector, int minLayer, int maxLayer, String[] libraryVersions) {
            this.udpP2p = udpP2p;
            this.udpReflector = udpReflector;
            this.minLayer = minLayer;
            this.maxLayer = maxLayer;
            this.libraryVersions = libraryVersions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1075562897;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a server for relaying call data.
     */
    public static class CallServer extends Object {
        /**
         * Server identifier.
         */
        public long id;
        /**
         * Server IPv4 address.
         */
        public String ipAddress;
        /**
         * Server IPv6 address.
         */
        public String ipv6Address;
        /**
         * Server port number.
         */
        public int port;
        /**
         * Server type.
         */
        public CallServerType type;

        /**
         * Describes a server for relaying call data.
         */
        public CallServer() {
        }

        /**
         * Describes a server for relaying call data.
         *
         * @param id Server identifier.
         * @param ipAddress Server IPv4 address.
         * @param ipv6Address Server IPv6 address.
         * @param port Server port number.
         * @param type Server type.
         */
        public CallServer(long id, String ipAddress, String ipv6Address, int port, CallServerType type) {
            this.id = id;
            this.ipAddress = ipAddress;
            this.ipv6Address = ipv6Address;
            this.port = port;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1865932695;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the type of call server.
     */
    public abstract static class CallServerType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            CallServerTypeTelegramReflector.CONSTRUCTOR,
            CallServerTypeWebrtc.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public CallServerType() {
        }
    }

    /**
     * A Telegram call reflector.
     */
    public static class CallServerTypeTelegramReflector extends CallServerType {
        /**
         * A peer tag to be used with the reflector.
         */
        public byte[] peerTag;
        /**
         * True, if the server uses TCP instead of UDP.
         */
        public boolean isTcp;

        /**
         * A Telegram call reflector.
         */
        public CallServerTypeTelegramReflector() {
        }

        /**
         * A Telegram call reflector.
         *
         * @param peerTag A peer tag to be used with the reflector.
         * @param isTcp True, if the server uses TCP instead of UDP.
         */
        public CallServerTypeTelegramReflector(byte[] peerTag, boolean isTcp) {
            this.peerTag = peerTag;
            this.isTcp = isTcp;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 850343189;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A WebRTC server.
     */
    public static class CallServerTypeWebrtc extends CallServerType {
        /**
         * Username to be used for authentication.
         */
        public String username;
        /**
         * Authentication password.
         */
        public String password;
        /**
         * True, if the server supports TURN.
         */
        public boolean supportsTurn;
        /**
         * True, if the server supports STUN.
         */
        public boolean supportsStun;

        /**
         * A WebRTC server.
         */
        public CallServerTypeWebrtc() {
        }

        /**
         * A WebRTC server.
         *
         * @param username Username to be used for authentication.
         * @param password Authentication password.
         * @param supportsTurn True, if the server supports TURN.
         * @param supportsStun True, if the server supports STUN.
         */
        public CallServerTypeWebrtc(String username, String password, boolean supportsTurn, boolean supportsStun) {
            this.username = username;
            this.password = password;
            this.supportsTurn = supportsTurn;
            this.supportsStun = supportsStun;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1250622821;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the current call state.
     */
    public abstract static class CallState extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            CallStatePending.CONSTRUCTOR,
            CallStateExchangingKeys.CONSTRUCTOR,
            CallStateReady.CONSTRUCTOR,
            CallStateHangingUp.CONSTRUCTOR,
            CallStateDiscarded.CONSTRUCTOR,
            CallStateError.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public CallState() {
        }
    }

    /**
     * The call is pending, waiting to be accepted by a user.
     */
    public static class CallStatePending extends CallState {
        /**
         * True, if the call has already been created by the server.
         */
        public boolean isCreated;
        /**
         * True, if the call has already been received by the other party.
         */
        public boolean isReceived;

        /**
         * The call is pending, waiting to be accepted by a user.
         */
        public CallStatePending() {
        }

        /**
         * The call is pending, waiting to be accepted by a user.
         *
         * @param isCreated True, if the call has already been created by the server.
         * @param isReceived True, if the call has already been received by the other party.
         */
        public CallStatePending(boolean isCreated, boolean isReceived) {
            this.isCreated = isCreated;
            this.isReceived = isReceived;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1073048620;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The call has been answered and encryption keys are being exchanged.
     */
    public static class CallStateExchangingKeys extends CallState {

        /**
         * The call has been answered and encryption keys are being exchanged.
         */
        public CallStateExchangingKeys() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1848149403;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The call is ready to use.
     */
    public static class CallStateReady extends CallState {
        /**
         * Call protocols supported by the other call participant.
         */
        public CallProtocol protocol;
        /**
         * List of available call servers.
         */
        public CallServer[] servers;
        /**
         * A JSON-encoded call config.
         */
        public String config;
        /**
         * Call encryption key.
         */
        public byte[] encryptionKey;
        /**
         * Encryption key fingerprint represented as 4 emoji.
         */
        public String[] emojis;
        /**
         * True, if peer-to-peer connection is allowed by users privacy settings.
         */
        public boolean allowP2p;
        /**
         * True, if the other party supports upgrading of the call to a group call.
         */
        public boolean isGroupCallSupported;
        /**
         * Custom JSON-encoded call parameters to be passed to tgcalls.
         */
        public String customParameters;

        /**
         * The call is ready to use.
         */
        public CallStateReady() {
        }

        /**
         * The call is ready to use.
         *
         * @param protocol Call protocols supported by the other call participant.
         * @param servers List of available call servers.
         * @param config A JSON-encoded call config.
         * @param encryptionKey Call encryption key.
         * @param emojis Encryption key fingerprint represented as 4 emoji.
         * @param allowP2p True, if peer-to-peer connection is allowed by users privacy settings.
         * @param isGroupCallSupported True, if the other party supports upgrading of the call to a group call.
         * @param customParameters Custom JSON-encoded call parameters to be passed to tgcalls.
         */
        public CallStateReady(CallProtocol protocol, CallServer[] servers, String config, byte[] encryptionKey, String[] emojis, boolean allowP2p, boolean isGroupCallSupported, String customParameters) {
            this.protocol = protocol;
            this.servers = servers;
            this.config = config;
            this.encryptionKey = encryptionKey;
            this.emojis = emojis;
            this.allowP2p = allowP2p;
            this.isGroupCallSupported = isGroupCallSupported;
            this.customParameters = customParameters;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -281776921;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The call is hanging up after discardCall has been called.
     */
    public static class CallStateHangingUp extends CallState {

        /**
         * The call is hanging up after discardCall has been called.
         */
        public CallStateHangingUp() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2133790038;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The call has ended successfully.
     */
    public static class CallStateDiscarded extends CallState {
        /**
         * The reason why the call has ended.
         */
        public CallDiscardReason reason;
        /**
         * True, if the call rating must be sent to the server.
         */
        public boolean needRating;
        /**
         * True, if the call debug information must be sent to the server.
         */
        public boolean needDebugInformation;
        /**
         * True, if the call log must be sent to the server.
         */
        public boolean needLog;

        /**
         * The call has ended successfully.
         */
        public CallStateDiscarded() {
        }

        /**
         * The call has ended successfully.
         *
         * @param reason The reason why the call has ended.
         * @param needRating True, if the call rating must be sent to the server.
         * @param needDebugInformation True, if the call debug information must be sent to the server.
         * @param needLog True, if the call log must be sent to the server.
         */
        public CallStateDiscarded(CallDiscardReason reason, boolean needRating, boolean needDebugInformation, boolean needLog) {
            this.reason = reason;
            this.needRating = needRating;
            this.needDebugInformation = needDebugInformation;
            this.needLog = needLog;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1394310213;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The call has ended with an error.
     */
    public static class CallStateError extends CallState {
        /**
         * Error. An error with the code 4005000 will be returned if an outgoing call is missed because of an expired timeout.
         */
        public Error error;

        /**
         * The call has ended with an error.
         */
        public CallStateError() {
        }

        /**
         * The call has ended with an error.
         *
         * @param error Error. An error with the code 4005000 will be returned if an outgoing call is missed because of an expired timeout.
         */
        public CallStateError(Error error) {
            this.error = error;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -975215467;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a bot's answer to a callback query.
     */
    public static class CallbackQueryAnswer extends Object {
        /**
         * Text of the answer.
         */
        public String text;
        /**
         * True, if an alert must be shown to the user instead of a toast notification.
         */
        public boolean showAlert;
        /**
         * URL to be opened.
         */
        public String url;

        /**
         * Contains a bot's answer to a callback query.
         */
        public CallbackQueryAnswer() {
        }

        /**
         * Contains a bot's answer to a callback query.
         *
         * @param text Text of the answer.
         * @param showAlert True, if an alert must be shown to the user instead of a toast notification.
         * @param url URL to be opened.
         */
        public CallbackQueryAnswer(String text, boolean showAlert, String url) {
            this.text = text;
            this.showAlert = showAlert;
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 360867933;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents a payload of a callback query.
     */
    public abstract static class CallbackQueryPayload extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            CallbackQueryPayloadData.CONSTRUCTOR,
            CallbackQueryPayloadDataWithPassword.CONSTRUCTOR,
            CallbackQueryPayloadGame.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public CallbackQueryPayload() {
        }
    }

    /**
     * The payload for a general callback button.
     */
    public static class CallbackQueryPayloadData extends CallbackQueryPayload {
        /**
         * Data that was attached to the callback button.
         */
        public byte[] data;

        /**
         * The payload for a general callback button.
         */
        public CallbackQueryPayloadData() {
        }

        /**
         * The payload for a general callback button.
         *
         * @param data Data that was attached to the callback button.
         */
        public CallbackQueryPayloadData(byte[] data) {
            this.data = data;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1977729946;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The payload for a callback button requiring password.
     */
    public static class CallbackQueryPayloadDataWithPassword extends CallbackQueryPayload {
        /**
         * The 2-step verification password for the current user.
         */
        public String password;
        /**
         * Data that was attached to the callback button.
         */
        public byte[] data;

        /**
         * The payload for a callback button requiring password.
         */
        public CallbackQueryPayloadDataWithPassword() {
        }

        /**
         * The payload for a callback button requiring password.
         *
         * @param password The 2-step verification password for the current user.
         * @param data Data that was attached to the callback button.
         */
        public CallbackQueryPayloadDataWithPassword(String password, byte[] data) {
            this.password = password;
            this.data = data;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1340266738;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The payload for a game callback button.
     */
    public static class CallbackQueryPayloadGame extends CallbackQueryPayload {
        /**
         * A short name of the game that was attached to the callback button.
         */
        public String gameShortName;

        /**
         * The payload for a game callback button.
         */
        public CallbackQueryPayloadGame() {
        }

        /**
         * The payload for a game callback button.
         *
         * @param gameShortName A short name of the game that was attached to the callback button.
         */
        public CallbackQueryPayloadGame(String gameShortName) {
            this.gameShortName = gameShortName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1303571512;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents result of checking whether the current user can post a story on behalf of the specific chat.
     */
    public abstract static class CanPostStoryResult extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            CanPostStoryResultOk.CONSTRUCTOR,
            CanPostStoryResultPremiumNeeded.CONSTRUCTOR,
            CanPostStoryResultBoostNeeded.CONSTRUCTOR,
            CanPostStoryResultActiveStoryLimitExceeded.CONSTRUCTOR,
            CanPostStoryResultWeeklyLimitExceeded.CONSTRUCTOR,
            CanPostStoryResultMonthlyLimitExceeded.CONSTRUCTOR,
            CanPostStoryResultLiveStoryIsActive.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public CanPostStoryResult() {
        }
    }

    /**
     * A story can be sent.
     */
    public static class CanPostStoryResultOk extends CanPostStoryResult {
        /**
         * Number of stories that can be posted by the user.
         */
        public int storyCount;

        /**
         * A story can be sent.
         */
        public CanPostStoryResultOk() {
        }

        /**
         * A story can be sent.
         *
         * @param storyCount Number of stories that can be posted by the user.
         */
        public CanPostStoryResultOk(int storyCount) {
            this.storyCount = storyCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2083205610;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user must subscribe to Telegram Premium to be able to post stories.
     */
    public static class CanPostStoryResultPremiumNeeded extends CanPostStoryResult {

        /**
         * The user must subscribe to Telegram Premium to be able to post stories.
         */
        public CanPostStoryResultPremiumNeeded() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 935130501;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat must be boosted first by Telegram Premium subscribers to post more stories. Call getChatBoostStatus to get current boost status of the chat.
     */
    public static class CanPostStoryResultBoostNeeded extends CanPostStoryResult {

        /**
         * The chat must be boosted first by Telegram Premium subscribers to post more stories. Call getChatBoostStatus to get current boost status of the chat.
         */
        public CanPostStoryResultBoostNeeded() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 80246195;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The limit for the number of active stories exceeded. The user can buy Telegram Premium, delete an active story, or wait for the oldest story to expire.
     */
    public static class CanPostStoryResultActiveStoryLimitExceeded extends CanPostStoryResult {

        /**
         * The limit for the number of active stories exceeded. The user can buy Telegram Premium, delete an active story, or wait for the oldest story to expire.
         */
        public CanPostStoryResultActiveStoryLimitExceeded() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1640759002;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The weekly limit for the number of posted stories exceeded. The user needs to buy Telegram Premium or wait specified time.
     */
    public static class CanPostStoryResultWeeklyLimitExceeded extends CanPostStoryResult {
        /**
         * Time left before the user can post the next story, in seconds.
         */
        public int retryAfter;

        /**
         * The weekly limit for the number of posted stories exceeded. The user needs to buy Telegram Premium or wait specified time.
         */
        public CanPostStoryResultWeeklyLimitExceeded() {
        }

        /**
         * The weekly limit for the number of posted stories exceeded. The user needs to buy Telegram Premium or wait specified time.
         *
         * @param retryAfter Time left before the user can post the next story, in seconds.
         */
        public CanPostStoryResultWeeklyLimitExceeded(int retryAfter) {
            this.retryAfter = retryAfter;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 552858605;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The monthly limit for the number of posted stories exceeded. The user needs to buy Telegram Premium or wait specified time.
     */
    public static class CanPostStoryResultMonthlyLimitExceeded extends CanPostStoryResult {
        /**
         * Time left before the user can post the next story, in seconds.
         */
        public int retryAfter;

        /**
         * The monthly limit for the number of posted stories exceeded. The user needs to buy Telegram Premium or wait specified time.
         */
        public CanPostStoryResultMonthlyLimitExceeded() {
        }

        /**
         * The monthly limit for the number of posted stories exceeded. The user needs to buy Telegram Premium or wait specified time.
         *
         * @param retryAfter Time left before the user can post the next story, in seconds.
         */
        public CanPostStoryResultMonthlyLimitExceeded(int retryAfter) {
            this.retryAfter = retryAfter;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -784208562;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user or the chat has an active live story. The live story must be deleted first.
     */
    public static class CanPostStoryResultLiveStoryIsActive extends CanPostStoryResult {
        /**
         * Identifier of the active live story.
         */
        public int storyId;

        /**
         * The user or the chat has an active live story. The live story must be deleted first.
         */
        public CanPostStoryResultLiveStoryIsActive() {
        }

        /**
         * The user or the chat has an active live story. The live story must be deleted first.
         *
         * @param storyId Identifier of the active live story.
         */
        public CanPostStoryResultLiveStoryIsActive(int storyId) {
            this.storyId = storyId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1156939675;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes whether a gift can be sent now by the current user.
     */
    public abstract static class CanSendGiftResult extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            CanSendGiftResultOk.CONSTRUCTOR,
            CanSendGiftResultFail.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public CanSendGiftResult() {
        }
    }

    /**
     * The gift can be sent now by the current user.
     */
    public static class CanSendGiftResultOk extends CanSendGiftResult {

        /**
         * The gift can be sent now by the current user.
         */
        public CanSendGiftResultOk() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 641908725;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The gift can't be sent now by the current user.
     */
    public static class CanSendGiftResultFail extends CanSendGiftResult {
        /**
         * Reason to be shown to the user.
         */
        public FormattedText reason;

        /**
         * The gift can't be sent now by the current user.
         */
        public CanSendGiftResultFail() {
        }

        /**
         * The gift can't be sent now by the current user.
         *
         * @param reason Reason to be shown to the user.
         */
        public CanSendGiftResultFail(FormattedText reason) {
            this.reason = reason;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1359108924;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes result of canSendMessageToUser.
     */
    public abstract static class CanSendMessageToUserResult extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            CanSendMessageToUserResultOk.CONSTRUCTOR,
            CanSendMessageToUserResultUserHasPaidMessages.CONSTRUCTOR,
            CanSendMessageToUserResultUserIsDeleted.CONSTRUCTOR,
            CanSendMessageToUserResultUserRestrictsNewChats.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public CanSendMessageToUserResult() {
        }
    }

    /**
     * The user can be messaged.
     */
    public static class CanSendMessageToUserResultOk extends CanSendMessageToUserResult {

        /**
         * The user can be messaged.
         */
        public CanSendMessageToUserResultOk() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1530583042;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user can be messaged, but the messages are paid.
     */
    public static class CanSendMessageToUserResultUserHasPaidMessages extends CanSendMessageToUserResult {
        /**
         * Number of Telegram Stars that must be paid by the current user for each sent message to the user.
         */
        public long outgoingPaidMessageStarCount;

        /**
         * The user can be messaged, but the messages are paid.
         */
        public CanSendMessageToUserResultUserHasPaidMessages() {
        }

        /**
         * The user can be messaged, but the messages are paid.
         *
         * @param outgoingPaidMessageStarCount Number of Telegram Stars that must be paid by the current user for each sent message to the user.
         */
        public CanSendMessageToUserResultUserHasPaidMessages(long outgoingPaidMessageStarCount) {
            this.outgoingPaidMessageStarCount = outgoingPaidMessageStarCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1346487602;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user can't be messaged, because they are deleted or unknown.
     */
    public static class CanSendMessageToUserResultUserIsDeleted extends CanSendMessageToUserResult {

        /**
         * The user can't be messaged, because they are deleted or unknown.
         */
        public CanSendMessageToUserResultUserIsDeleted() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1944639903;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user can't be messaged, because they restrict new chats with non-contacts.
     */
    public static class CanSendMessageToUserResultUserRestrictsNewChats extends CanSendMessageToUserResult {

        /**
         * The user can't be messaged, because they restrict new chats with non-contacts.
         */
        public CanSendMessageToUserResultUserRestrictsNewChats() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1929699797;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents result of checking whether the current session can be used to transfer a chat ownership to another user.
     */
    public abstract static class CanTransferOwnershipResult extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            CanTransferOwnershipResultOk.CONSTRUCTOR,
            CanTransferOwnershipResultPasswordNeeded.CONSTRUCTOR,
            CanTransferOwnershipResultPasswordTooFresh.CONSTRUCTOR,
            CanTransferOwnershipResultSessionTooFresh.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public CanTransferOwnershipResult() {
        }
    }

    /**
     * The session can be used.
     */
    public static class CanTransferOwnershipResultOk extends CanTransferOwnershipResult {

        /**
         * The session can be used.
         */
        public CanTransferOwnershipResultOk() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -89881021;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The 2-step verification needs to be enabled first.
     */
    public static class CanTransferOwnershipResultPasswordNeeded extends CanTransferOwnershipResult {

        /**
         * The 2-step verification needs to be enabled first.
         */
        public CanTransferOwnershipResultPasswordNeeded() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1548372703;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The 2-step verification was enabled recently, user needs to wait.
     */
    public static class CanTransferOwnershipResultPasswordTooFresh extends CanTransferOwnershipResult {
        /**
         * Time left before the session can be used to transfer ownership of a chat, in seconds.
         */
        public int retryAfter;

        /**
         * The 2-step verification was enabled recently, user needs to wait.
         */
        public CanTransferOwnershipResultPasswordTooFresh() {
        }

        /**
         * The 2-step verification was enabled recently, user needs to wait.
         *
         * @param retryAfter Time left before the session can be used to transfer ownership of a chat, in seconds.
         */
        public CanTransferOwnershipResultPasswordTooFresh(int retryAfter) {
            this.retryAfter = retryAfter;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 811440913;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The session was created recently, user needs to wait.
     */
    public static class CanTransferOwnershipResultSessionTooFresh extends CanTransferOwnershipResult {
        /**
         * Time left before the session can be used to transfer ownership of a chat, in seconds.
         */
        public int retryAfter;

        /**
         * The session was created recently, user needs to wait.
         */
        public CanTransferOwnershipResultSessionTooFresh() {
        }

        /**
         * The session was created recently, user needs to wait.
         *
         * @param retryAfter Time left before the session can be used to transfer ownership of a chat, in seconds.
         */
        public CanTransferOwnershipResultSessionTooFresh(int retryAfter) {
            this.retryAfter = retryAfter;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 984664289;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat. (Can be a private chat, basic group, supergroup, or secret chat.)
     */
    public static class Chat extends Object {
        /**
         * Chat unique identifier.
         */
        public long id;
        /**
         * Type of the chat.
         */
        public ChatType type;
        /**
         * Chat title.
         */
        public String title;
        /**
         * Chat photo; may be null.
         */
        @Nullable public ChatPhotoInfo photo;
        /**
         * Identifier of the accent color for message sender name, and backgrounds of chat photo, reply header, and link preview.
         */
        public int accentColorId;
        /**
         * Identifier of a custom emoji to be shown on the reply header and link preview background for messages sent by the chat; 0 if none.
         */
        public long backgroundCustomEmojiId;
        /**
         * Color scheme based on an upgraded gift to be used for the chat instead of accentColorId and backgroundCustomEmojiId; may be null if none.
         */
        @Nullable public UpgradedGiftColors upgradedGiftColors;
        /**
         * Identifier of the profile accent color for the chat's profile; -1 if none.
         */
        public int profileAccentColorId;
        /**
         * Identifier of a custom emoji to be shown on the background of the chat's profile; 0 if none.
         */
        public long profileBackgroundCustomEmojiId;
        /**
         * Actions that non-administrator chat members are allowed to take in the chat.
         */
        public ChatPermissions permissions;
        /**
         * Last message in the chat; may be null if none or unknown.
         */
        @Nullable public Message lastMessage;
        /**
         * Positions of the chat in chat lists.
         */
        public ChatPosition[] positions;
        /**
         * Chat lists to which the chat belongs. A chat can have a non-zero position in a chat list even if it doesn't belong to the chat list and have no position in a chat list even if it belongs to the chat list.
         */
        public ChatList[] chatLists;
        /**
         * Identifier of a user or chat that is selected to send messages in the chat; may be null if the user can't change message sender.
         */
        @Nullable public MessageSender messageSenderId;
        /**
         * Block list to which the chat is added; may be null if none.
         */
        @Nullable public BlockList blockList;
        /**
         * True, if chat content can't be saved locally, forwarded, or copied.
         */
        public boolean hasProtectedContent;
        /**
         * True, if translation of all messages in the chat must be suggested to the user.
         */
        public boolean isTranslatable;
        /**
         * True, if the chat is marked as unread.
         */
        public boolean isMarkedAsUnread;
        /**
         * True, if the chat is a forum supergroup that must be shown in the &quot;View as topics&quot; mode, or Saved Messages chat that must be shown in the &quot;View as chats&quot;.
         */
        public boolean viewAsTopics;
        /**
         * True, if the chat has scheduled messages.
         */
        public boolean hasScheduledMessages;
        /**
         * True, if the chat messages can be deleted only for the current user while other users will continue to see the messages.
         */
        public boolean canBeDeletedOnlyForSelf;
        /**
         * True, if the chat messages can be deleted for all users.
         */
        public boolean canBeDeletedForAllUsers;
        /**
         * True, if the chat can be reported to Telegram moderators through reportChat or reportChatPhoto.
         */
        public boolean canBeReported;
        /**
         * Default value of the disableNotification parameter, used when a message is sent to the chat.
         */
        public boolean defaultDisableNotification;
        /**
         * Number of unread messages in the chat.
         */
        public int unreadCount;
        /**
         * Identifier of the last read incoming message.
         */
        public long lastReadInboxMessageId;
        /**
         * Identifier of the last read outgoing message.
         */
        public long lastReadOutboxMessageId;
        /**
         * Number of unread messages with a mention/reply in the chat.
         */
        public int unreadMentionCount;
        /**
         * Number of messages with unread reactions in the chat.
         */
        public int unreadReactionCount;
        /**
         * Number of messages with unread poll votes in the chat.
         */
        public int unreadPollVoteCount;
        /**
         * Notification settings for the chat.
         */
        public ChatNotificationSettings notificationSettings;
        /**
         * Types of reaction, available in the chat.
         */
        public ChatAvailableReactions availableReactions;
        /**
         * Current message auto-delete or self-destruct timer setting for the chat, in seconds; 0 if disabled. Self-destruct timer in secret chats starts after the message or its content is viewed. Auto-delete timer in other chats starts from the send date.
         */
        public int messageAutoDeleteTime;
        /**
         * Emoji status to be shown along with chat title; may be null.
         */
        @Nullable public EmojiStatus emojiStatus;
        /**
         * Background set for the chat; may be null if none.
         */
        @Nullable public ChatBackground background;
        /**
         * Theme set for the chat; may be null if none.
         */
        @Nullable public ChatTheme theme;
        /**
         * Information about actions which must be possible to do through the chat action bar; may be null if none.
         */
        @Nullable public ChatActionBar actionBar;
        /**
         * Information about bar for managing a business bot in the chat; may be null if none.
         */
        @Nullable public BusinessBotManageBar businessBotManageBar;
        /**
         * Information about video chat of the chat.
         */
        public VideoChat videoChat;
        /**
         * Information about pending join requests; may be null if none.
         */
        @Nullable public ChatJoinRequestsInfo pendingJoinRequests;
        /**
         * Identifier of the message from which reply markup needs to be used; 0 if there is no reply markup in the chat.
         */
        public long replyMarkupMessageId;
        /**
         * A draft of a message in the chat; may be null if none.
         */
        @Nullable public DraftMessage draftMessage;
        /**
         * Application-specific data associated with the chat. (For example, the chat scroll position or local chat notification settings can be stored here.) Persistent if the message database is used.
         */
        public String clientData;

        /**
         * A chat. (Can be a private chat, basic group, supergroup, or secret chat.)
         */
        public Chat() {
        }

        /**
         * A chat. (Can be a private chat, basic group, supergroup, or secret chat.)
         *
         * @param id Chat unique identifier.
         * @param type Type of the chat.
         * @param title Chat title.
         * @param photo Chat photo; may be null.
         * @param accentColorId Identifier of the accent color for message sender name, and backgrounds of chat photo, reply header, and link preview.
         * @param backgroundCustomEmojiId Identifier of a custom emoji to be shown on the reply header and link preview background for messages sent by the chat; 0 if none.
         * @param upgradedGiftColors Color scheme based on an upgraded gift to be used for the chat instead of accentColorId and backgroundCustomEmojiId; may be null if none.
         * @param profileAccentColorId Identifier of the profile accent color for the chat's profile; -1 if none.
         * @param profileBackgroundCustomEmojiId Identifier of a custom emoji to be shown on the background of the chat's profile; 0 if none.
         * @param permissions Actions that non-administrator chat members are allowed to take in the chat.
         * @param lastMessage Last message in the chat; may be null if none or unknown.
         * @param positions Positions of the chat in chat lists.
         * @param chatLists Chat lists to which the chat belongs. A chat can have a non-zero position in a chat list even if it doesn't belong to the chat list and have no position in a chat list even if it belongs to the chat list.
         * @param messageSenderId Identifier of a user or chat that is selected to send messages in the chat; may be null if the user can't change message sender.
         * @param blockList Block list to which the chat is added; may be null if none.
         * @param hasProtectedContent True, if chat content can't be saved locally, forwarded, or copied.
         * @param isTranslatable True, if translation of all messages in the chat must be suggested to the user.
         * @param isMarkedAsUnread True, if the chat is marked as unread.
         * @param viewAsTopics True, if the chat is a forum supergroup that must be shown in the &quot;View as topics&quot; mode, or Saved Messages chat that must be shown in the &quot;View as chats&quot;.
         * @param hasScheduledMessages True, if the chat has scheduled messages.
         * @param canBeDeletedOnlyForSelf True, if the chat messages can be deleted only for the current user while other users will continue to see the messages.
         * @param canBeDeletedForAllUsers True, if the chat messages can be deleted for all users.
         * @param canBeReported True, if the chat can be reported to Telegram moderators through reportChat or reportChatPhoto.
         * @param defaultDisableNotification Default value of the disableNotification parameter, used when a message is sent to the chat.
         * @param unreadCount Number of unread messages in the chat.
         * @param lastReadInboxMessageId Identifier of the last read incoming message.
         * @param lastReadOutboxMessageId Identifier of the last read outgoing message.
         * @param unreadMentionCount Number of unread messages with a mention/reply in the chat.
         * @param unreadReactionCount Number of messages with unread reactions in the chat.
         * @param unreadPollVoteCount Number of messages with unread poll votes in the chat.
         * @param notificationSettings Notification settings for the chat.
         * @param availableReactions Types of reaction, available in the chat.
         * @param messageAutoDeleteTime Current message auto-delete or self-destruct timer setting for the chat, in seconds; 0 if disabled. Self-destruct timer in secret chats starts after the message or its content is viewed. Auto-delete timer in other chats starts from the send date.
         * @param emojiStatus Emoji status to be shown along with chat title; may be null.
         * @param background Background set for the chat; may be null if none.
         * @param theme Theme set for the chat; may be null if none.
         * @param actionBar Information about actions which must be possible to do through the chat action bar; may be null if none.
         * @param businessBotManageBar Information about bar for managing a business bot in the chat; may be null if none.
         * @param videoChat Information about video chat of the chat.
         * @param pendingJoinRequests Information about pending join requests; may be null if none.
         * @param replyMarkupMessageId Identifier of the message from which reply markup needs to be used; 0 if there is no reply markup in the chat.
         * @param draftMessage A draft of a message in the chat; may be null if none.
         * @param clientData Application-specific data associated with the chat. (For example, the chat scroll position or local chat notification settings can be stored here.) Persistent if the message database is used.
         */
        public Chat(long id, ChatType type, String title, ChatPhotoInfo photo, int accentColorId, long backgroundCustomEmojiId, UpgradedGiftColors upgradedGiftColors, int profileAccentColorId, long profileBackgroundCustomEmojiId, ChatPermissions permissions, Message lastMessage, ChatPosition[] positions, ChatList[] chatLists, MessageSender messageSenderId, BlockList blockList, boolean hasProtectedContent, boolean isTranslatable, boolean isMarkedAsUnread, boolean viewAsTopics, boolean hasScheduledMessages, boolean canBeDeletedOnlyForSelf, boolean canBeDeletedForAllUsers, boolean canBeReported, boolean defaultDisableNotification, int unreadCount, long lastReadInboxMessageId, long lastReadOutboxMessageId, int unreadMentionCount, int unreadReactionCount, int unreadPollVoteCount, ChatNotificationSettings notificationSettings, ChatAvailableReactions availableReactions, int messageAutoDeleteTime, EmojiStatus emojiStatus, ChatBackground background, ChatTheme theme, ChatActionBar actionBar, BusinessBotManageBar businessBotManageBar, VideoChat videoChat, ChatJoinRequestsInfo pendingJoinRequests, long replyMarkupMessageId, DraftMessage draftMessage, String clientData) {
            this.id = id;
            this.type = type;
            this.title = title;
            this.photo = photo;
            this.accentColorId = accentColorId;
            this.backgroundCustomEmojiId = backgroundCustomEmojiId;
            this.upgradedGiftColors = upgradedGiftColors;
            this.profileAccentColorId = profileAccentColorId;
            this.profileBackgroundCustomEmojiId = profileBackgroundCustomEmojiId;
            this.permissions = permissions;
            this.lastMessage = lastMessage;
            this.positions = positions;
            this.chatLists = chatLists;
            this.messageSenderId = messageSenderId;
            this.blockList = blockList;
            this.hasProtectedContent = hasProtectedContent;
            this.isTranslatable = isTranslatable;
            this.isMarkedAsUnread = isMarkedAsUnread;
            this.viewAsTopics = viewAsTopics;
            this.hasScheduledMessages = hasScheduledMessages;
            this.canBeDeletedOnlyForSelf = canBeDeletedOnlyForSelf;
            this.canBeDeletedForAllUsers = canBeDeletedForAllUsers;
            this.canBeReported = canBeReported;
            this.defaultDisableNotification = defaultDisableNotification;
            this.unreadCount = unreadCount;
            this.lastReadInboxMessageId = lastReadInboxMessageId;
            this.lastReadOutboxMessageId = lastReadOutboxMessageId;
            this.unreadMentionCount = unreadMentionCount;
            this.unreadReactionCount = unreadReactionCount;
            this.unreadPollVoteCount = unreadPollVoteCount;
            this.notificationSettings = notificationSettings;
            this.availableReactions = availableReactions;
            this.messageAutoDeleteTime = messageAutoDeleteTime;
            this.emojiStatus = emojiStatus;
            this.background = background;
            this.theme = theme;
            this.actionBar = actionBar;
            this.businessBotManageBar = businessBotManageBar;
            this.videoChat = videoChat;
            this.pendingJoinRequests = pendingJoinRequests;
            this.replyMarkupMessageId = replyMarkupMessageId;
            this.draftMessage = draftMessage;
            this.clientData = clientData;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -520699983;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the different types of activity in a chat.
     */
    public abstract static class ChatAction extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ChatActionTyping.CONSTRUCTOR,
            ChatActionRecordingVideo.CONSTRUCTOR,
            ChatActionUploadingVideo.CONSTRUCTOR,
            ChatActionRecordingVoiceNote.CONSTRUCTOR,
            ChatActionUploadingVoiceNote.CONSTRUCTOR,
            ChatActionUploadingPhoto.CONSTRUCTOR,
            ChatActionUploadingDocument.CONSTRUCTOR,
            ChatActionChoosingSticker.CONSTRUCTOR,
            ChatActionChoosingLocation.CONSTRUCTOR,
            ChatActionChoosingContact.CONSTRUCTOR,
            ChatActionStartPlayingGame.CONSTRUCTOR,
            ChatActionRecordingVideoNote.CONSTRUCTOR,
            ChatActionUploadingVideoNote.CONSTRUCTOR,
            ChatActionWatchingAnimations.CONSTRUCTOR,
            ChatActionCancel.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ChatAction() {
        }
    }

    /**
     * The user is typing a message.
     */
    public static class ChatActionTyping extends ChatAction {

        /**
         * The user is typing a message.
         */
        public ChatActionTyping() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 380122167;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user is recording a video.
     */
    public static class ChatActionRecordingVideo extends ChatAction {

        /**
         * The user is recording a video.
         */
        public ChatActionRecordingVideo() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 216553362;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user is uploading a video.
     */
    public static class ChatActionUploadingVideo extends ChatAction {
        /**
         * Upload progress, as a percentage.
         */
        public int progress;

        /**
         * The user is uploading a video.
         */
        public ChatActionUploadingVideo() {
        }

        /**
         * The user is uploading a video.
         *
         * @param progress Upload progress, as a percentage.
         */
        public ChatActionUploadingVideo(int progress) {
            this.progress = progress;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1234185270;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user is recording a voice note.
     */
    public static class ChatActionRecordingVoiceNote extends ChatAction {

        /**
         * The user is recording a voice note.
         */
        public ChatActionRecordingVoiceNote() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -808850058;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user is uploading a voice note.
     */
    public static class ChatActionUploadingVoiceNote extends ChatAction {
        /**
         * Upload progress, as a percentage.
         */
        public int progress;

        /**
         * The user is uploading a voice note.
         */
        public ChatActionUploadingVoiceNote() {
        }

        /**
         * The user is uploading a voice note.
         *
         * @param progress Upload progress, as a percentage.
         */
        public ChatActionUploadingVoiceNote(int progress) {
            this.progress = progress;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -613643666;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user is uploading a photo.
     */
    public static class ChatActionUploadingPhoto extends ChatAction {
        /**
         * Upload progress, as a percentage.
         */
        public int progress;

        /**
         * The user is uploading a photo.
         */
        public ChatActionUploadingPhoto() {
        }

        /**
         * The user is uploading a photo.
         *
         * @param progress Upload progress, as a percentage.
         */
        public ChatActionUploadingPhoto(int progress) {
            this.progress = progress;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 654240583;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user is uploading a document.
     */
    public static class ChatActionUploadingDocument extends ChatAction {
        /**
         * Upload progress, as a percentage.
         */
        public int progress;

        /**
         * The user is uploading a document.
         */
        public ChatActionUploadingDocument() {
        }

        /**
         * The user is uploading a document.
         *
         * @param progress Upload progress, as a percentage.
         */
        public ChatActionUploadingDocument(int progress) {
            this.progress = progress;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 167884362;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user is picking a sticker to send.
     */
    public static class ChatActionChoosingSticker extends ChatAction {

        /**
         * The user is picking a sticker to send.
         */
        public ChatActionChoosingSticker() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 372753697;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user is picking a location or venue to send.
     */
    public static class ChatActionChoosingLocation extends ChatAction {

        /**
         * The user is picking a location or venue to send.
         */
        public ChatActionChoosingLocation() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2017893596;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user is picking a contact to send.
     */
    public static class ChatActionChoosingContact extends ChatAction {

        /**
         * The user is picking a contact to send.
         */
        public ChatActionChoosingContact() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1222507496;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user has started to play a game.
     */
    public static class ChatActionStartPlayingGame extends ChatAction {

        /**
         * The user has started to play a game.
         */
        public ChatActionStartPlayingGame() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -865884164;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user is recording a video note.
     */
    public static class ChatActionRecordingVideoNote extends ChatAction {

        /**
         * The user is recording a video note.
         */
        public ChatActionRecordingVideoNote() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 16523393;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user is uploading a video note.
     */
    public static class ChatActionUploadingVideoNote extends ChatAction {
        /**
         * Upload progress, as a percentage.
         */
        public int progress;

        /**
         * The user is uploading a video note.
         */
        public ChatActionUploadingVideoNote() {
        }

        /**
         * The user is uploading a video note.
         *
         * @param progress Upload progress, as a percentage.
         */
        public ChatActionUploadingVideoNote(int progress) {
            this.progress = progress;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1172364918;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user is watching animations sent by the other party by clicking on an animated emoji.
     */
    public static class ChatActionWatchingAnimations extends ChatAction {
        /**
         * The animated emoji.
         */
        public String emoji;

        /**
         * The user is watching animations sent by the other party by clicking on an animated emoji.
         */
        public ChatActionWatchingAnimations() {
        }

        /**
         * The user is watching animations sent by the other party by clicking on an animated emoji.
         *
         * @param emoji The animated emoji.
         */
        public ChatActionWatchingAnimations(String emoji) {
            this.emoji = emoji;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2052990641;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user has canceled the previous action.
     */
    public static class ChatActionCancel extends ChatAction {

        /**
         * The user has canceled the previous action.
         */
        public ChatActionCancel() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1160523958;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes actions which must be possible to do through a chat action bar.
     */
    public abstract static class ChatActionBar extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ChatActionBarReportSpam.CONSTRUCTOR,
            ChatActionBarInviteMembers.CONSTRUCTOR,
            ChatActionBarReportAddBlock.CONSTRUCTOR,
            ChatActionBarAddContact.CONSTRUCTOR,
            ChatActionBarSharePhoneNumber.CONSTRUCTOR,
            ChatActionBarJoinRequest.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ChatActionBar() {
        }
    }

    /**
     * The chat can be reported as spam using the method reportChat with an empty optionId and messageIds. If the chat is a private chat with a user with an emoji status, then a notice about emoji status usage must be shown.
     */
    public static class ChatActionBarReportSpam extends ChatActionBar {
        /**
         * If true, the chat was automatically archived and can be moved back to the main chat list using addChatToList simultaneously with setting chat notification settings to default using setChatNotificationSettings.
         */
        public boolean canUnarchive;

        /**
         * The chat can be reported as spam using the method reportChat with an empty optionId and messageIds. If the chat is a private chat with a user with an emoji status, then a notice about emoji status usage must be shown.
         */
        public ChatActionBarReportSpam() {
        }

        /**
         * The chat can be reported as spam using the method reportChat with an empty optionId and messageIds. If the chat is a private chat with a user with an emoji status, then a notice about emoji status usage must be shown.
         *
         * @param canUnarchive If true, the chat was automatically archived and can be moved back to the main chat list using addChatToList simultaneously with setting chat notification settings to default using setChatNotificationSettings.
         */
        public ChatActionBarReportSpam(boolean canUnarchive) {
            this.canUnarchive = canUnarchive;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1312758246;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat is a recently created group chat to which new members can be invited.
     */
    public static class ChatActionBarInviteMembers extends ChatActionBar {

        /**
         * The chat is a recently created group chat to which new members can be invited.
         */
        public ChatActionBarInviteMembers() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1985313904;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat is a private or secret chat, which can be reported using the method reportChat, or the other user can be blocked using the method setMessageSenderBlockList, or the other user can be added to the contact list using the method addContact. If the chat is a private chat with a user with an emoji status, then a notice about emoji status usage must be shown.
     */
    public static class ChatActionBarReportAddBlock extends ChatActionBar {
        /**
         * If true, the chat was automatically archived and can be moved back to the main chat list using addChatToList simultaneously with setting chat notification settings to default using setChatNotificationSettings.
         */
        public boolean canUnarchive;
        /**
         * Basic information about the other user in the chat; may be null if unknown.
         */
        @Nullable public AccountInfo accountInfo;

        /**
         * The chat is a private or secret chat, which can be reported using the method reportChat, or the other user can be blocked using the method setMessageSenderBlockList, or the other user can be added to the contact list using the method addContact. If the chat is a private chat with a user with an emoji status, then a notice about emoji status usage must be shown.
         */
        public ChatActionBarReportAddBlock() {
        }

        /**
         * The chat is a private or secret chat, which can be reported using the method reportChat, or the other user can be blocked using the method setMessageSenderBlockList, or the other user can be added to the contact list using the method addContact. If the chat is a private chat with a user with an emoji status, then a notice about emoji status usage must be shown.
         *
         * @param canUnarchive If true, the chat was automatically archived and can be moved back to the main chat list using addChatToList simultaneously with setting chat notification settings to default using setChatNotificationSettings.
         * @param accountInfo Basic information about the other user in the chat; may be null if unknown.
         */
        public ChatActionBarReportAddBlock(boolean canUnarchive, AccountInfo accountInfo) {
            this.canUnarchive = canUnarchive;
            this.accountInfo = accountInfo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1476817269;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat is a private or secret chat and the other user can be added to the contact list using the method addContact.
     */
    public static class ChatActionBarAddContact extends ChatActionBar {

        /**
         * The chat is a private or secret chat and the other user can be added to the contact list using the method addContact.
         */
        public ChatActionBarAddContact() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -733325295;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat is a private or secret chat with a mutual contact and the user's phone number can be shared with the other user using the method sharePhoneNumber.
     */
    public static class ChatActionBarSharePhoneNumber extends ChatActionBar {

        /**
         * The chat is a private or secret chat with a mutual contact and the user's phone number can be shared with the other user using the method sharePhoneNumber.
         */
        public ChatActionBarSharePhoneNumber() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 35188697;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat is a private chat with an administrator of a chat to which the user sent join request.
     */
    public static class ChatActionBarJoinRequest extends ChatActionBar {
        /**
         * Title of the chat to which the join request was sent.
         */
        public String title;
        /**
         * True, if the join request was sent to a channel chat.
         */
        public boolean isChannel;
        /**
         * Point in time (Unix timestamp) when the join request was sent.
         */
        public int requestDate;

        /**
         * The chat is a private chat with an administrator of a chat to which the user sent join request.
         */
        public ChatActionBarJoinRequest() {
        }

        /**
         * The chat is a private chat with an administrator of a chat to which the user sent join request.
         *
         * @param title Title of the chat to which the join request was sent.
         * @param isChannel True, if the join request was sent to a channel chat.
         * @param requestDate Point in time (Unix timestamp) when the join request was sent.
         */
        public ChatActionBarJoinRequest(String title, boolean isChannel, int requestDate) {
            this.title = title;
            this.isChannel = isChannel;
            this.requestDate = requestDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1037140744;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes active stories posted by a chat.
     */
    public static class ChatActiveStories extends Object {
        /**
         * Identifier of the chat that posted the stories.
         */
        public long chatId;
        /**
         * Identifier of the story list in which the stories are shown; may be null if the stories aren't shown in a story list.
         */
        @Nullable public StoryList list;
        /**
         * A parameter used to determine order of the stories in the story list; 0 if the stories don't need to be shown in the story list. Stories must be sorted by the pair (order, storyPosterChatId) in descending order.
         */
        public long order;
        /**
         * True, if the stories are shown in the main story list and can be archived; otherwise, the stories can be hidden from the main story list only by calling removeTopChat with topChatCategoryUsers and the chatId. Stories of the current user can't be archived nor hidden using removeTopChat.
         */
        public boolean canBeArchived;
        /**
         * Identifier of the last read active story.
         */
        public int maxReadStoryId;
        /**
         * Basic information about the stories; use getStory to get full information about the stories. The stories are in chronological order (i.e., in order of increasing story identifiers).
         */
        public StoryInfo[] stories;

        /**
         * Describes active stories posted by a chat.
         */
        public ChatActiveStories() {
        }

        /**
         * Describes active stories posted by a chat.
         *
         * @param chatId Identifier of the chat that posted the stories.
         * @param list Identifier of the story list in which the stories are shown; may be null if the stories aren't shown in a story list.
         * @param order A parameter used to determine order of the stories in the story list; 0 if the stories don't need to be shown in the story list. Stories must be sorted by the pair (order, storyPosterChatId) in descending order.
         * @param canBeArchived True, if the stories are shown in the main story list and can be archived; otherwise, the stories can be hidden from the main story list only by calling removeTopChat with topChatCategoryUsers and the chatId. Stories of the current user can't be archived nor hidden using removeTopChat.
         * @param maxReadStoryId Identifier of the last read active story.
         * @param stories Basic information about the stories; use getStory to get full information about the stories. The stories are in chronological order (i.e., in order of increasing story identifiers).
         */
        public ChatActiveStories(long chatId, StoryList list, long order, boolean canBeArchived, int maxReadStoryId, StoryInfo[] stories) {
            this.chatId = chatId;
            this.list = list;
            this.order = order;
            this.canBeArchived = canBeArchived;
            this.maxReadStoryId = maxReadStoryId;
            this.stories = stories;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 396502772;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a chat administrator.
     */
    public static class ChatAdministrator extends Object {
        /**
         * User identifier of the administrator.
         */
        public long userId;
        /**
         * Custom title of the administrator.
         */
        public String customTitle;
        /**
         * True, if the user is the owner of the chat.
         */
        public boolean isOwner;
        /**
         * True, if the current user can edit the administrator privileges for the administrator.
         */
        public boolean canBeEdited;

        /**
         * Contains information about a chat administrator.
         */
        public ChatAdministrator() {
        }

        /**
         * Contains information about a chat administrator.
         *
         * @param userId User identifier of the administrator.
         * @param customTitle Custom title of the administrator.
         * @param isOwner True, if the user is the owner of the chat.
         * @param canBeEdited True, if the current user can edit the administrator privileges for the administrator.
         */
        public ChatAdministrator(long userId, String customTitle, boolean isOwner, boolean canBeEdited) {
            this.userId = userId;
            this.customTitle = customTitle;
            this.isOwner = isOwner;
            this.canBeEdited = canBeEdited;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 436066785;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes rights of the administrator.
     */
    public static class ChatAdministratorRights extends Object {
        /**
         * True, if the administrator can access the chat event log, get boost list, see hidden supergroup and channel members, report supergroup spam messages, ignore slow mode, and send messages to the chat without paying Telegram Stars. Implied by any other privilege; applicable to supergroups and channels only.
         */
        public boolean canManageChat;
        /**
         * True, if the administrator can change the chat title, photo, and other settings.
         */
        public boolean canChangeInfo;
        /**
         * True, if the administrator can create channel posts, approve suggested channel posts, or view channel statistics; applicable to channels only.
         */
        public boolean canPostMessages;
        /**
         * True, if the administrator can edit messages of other users and pin messages; applicable to channels only.
         */
        public boolean canEditMessages;
        /**
         * True, if the administrator can delete messages of other users.
         */
        public boolean canDeleteMessages;
        /**
         * True, if the administrator can invite new users to the chat.
         */
        public boolean canInviteUsers;
        /**
         * True, if the administrator can restrict, ban, or unban chat members or view supergroup statistics.
         */
        public boolean canRestrictMembers;
        /**
         * True, if the administrator can pin messages; applicable to basic groups and supergroups only.
         */
        public boolean canPinMessages;
        /**
         * True, if the administrator can create, rename, close, reopen, hide, and unhide forum topics; applicable to forum supergroups only.
         */
        public boolean canManageTopics;
        /**
         * True, if the administrator can add new administrators with a subset of their own privileges or demote administrators that were directly or indirectly promoted by them.
         */
        public boolean canPromoteMembers;
        /**
         * True, if the administrator can manage video chats.
         */
        public boolean canManageVideoChats;
        /**
         * True, if the administrator can create new chat stories, or edit and delete posted stories; applicable to supergroups and channels only.
         */
        public boolean canPostStories;
        /**
         * True, if the administrator can edit stories posted by other users, post stories to the chat page, pin chat stories, and access story archive; applicable to supergroups and channels only.
         */
        public boolean canEditStories;
        /**
         * True, if the administrator can delete stories posted by other users; applicable to supergroups and channels only.
         */
        public boolean canDeleteStories;
        /**
         * True, if the administrator can answer to channel direct messages; applicable to channels only.
         */
        public boolean canManageDirectMessages;
        /**
         * True, if the administrator can change tags of other users; applicable to basic groups and supergroups only.
         */
        public boolean canManageTags;
        /**
         * True, if the administrator isn't shown in the chat member list and sends messages anonymously; applicable to supergroups only.
         */
        public boolean isAnonymous;

        /**
         * Describes rights of the administrator.
         */
        public ChatAdministratorRights() {
        }

        /**
         * Describes rights of the administrator.
         *
         * @param canManageChat True, if the administrator can access the chat event log, get boost list, see hidden supergroup and channel members, report supergroup spam messages, ignore slow mode, and send messages to the chat without paying Telegram Stars. Implied by any other privilege; applicable to supergroups and channels only.
         * @param canChangeInfo True, if the administrator can change the chat title, photo, and other settings.
         * @param canPostMessages True, if the administrator can create channel posts, approve suggested channel posts, or view channel statistics; applicable to channels only.
         * @param canEditMessages True, if the administrator can edit messages of other users and pin messages; applicable to channels only.
         * @param canDeleteMessages True, if the administrator can delete messages of other users.
         * @param canInviteUsers True, if the administrator can invite new users to the chat.
         * @param canRestrictMembers True, if the administrator can restrict, ban, or unban chat members or view supergroup statistics.
         * @param canPinMessages True, if the administrator can pin messages; applicable to basic groups and supergroups only.
         * @param canManageTopics True, if the administrator can create, rename, close, reopen, hide, and unhide forum topics; applicable to forum supergroups only.
         * @param canPromoteMembers True, if the administrator can add new administrators with a subset of their own privileges or demote administrators that were directly or indirectly promoted by them.
         * @param canManageVideoChats True, if the administrator can manage video chats.
         * @param canPostStories True, if the administrator can create new chat stories, or edit and delete posted stories; applicable to supergroups and channels only.
         * @param canEditStories True, if the administrator can edit stories posted by other users, post stories to the chat page, pin chat stories, and access story archive; applicable to supergroups and channels only.
         * @param canDeleteStories True, if the administrator can delete stories posted by other users; applicable to supergroups and channels only.
         * @param canManageDirectMessages True, if the administrator can answer to channel direct messages; applicable to channels only.
         * @param canManageTags True, if the administrator can change tags of other users; applicable to basic groups and supergroups only.
         * @param isAnonymous True, if the administrator isn't shown in the chat member list and sends messages anonymously; applicable to supergroups only.
         */
        public ChatAdministratorRights(boolean canManageChat, boolean canChangeInfo, boolean canPostMessages, boolean canEditMessages, boolean canDeleteMessages, boolean canInviteUsers, boolean canRestrictMembers, boolean canPinMessages, boolean canManageTopics, boolean canPromoteMembers, boolean canManageVideoChats, boolean canPostStories, boolean canEditStories, boolean canDeleteStories, boolean canManageDirectMessages, boolean canManageTags, boolean isAnonymous) {
            this.canManageChat = canManageChat;
            this.canChangeInfo = canChangeInfo;
            this.canPostMessages = canPostMessages;
            this.canEditMessages = canEditMessages;
            this.canDeleteMessages = canDeleteMessages;
            this.canInviteUsers = canInviteUsers;
            this.canRestrictMembers = canRestrictMembers;
            this.canPinMessages = canPinMessages;
            this.canManageTopics = canManageTopics;
            this.canPromoteMembers = canPromoteMembers;
            this.canManageVideoChats = canManageVideoChats;
            this.canPostStories = canPostStories;
            this.canEditStories = canEditStories;
            this.canDeleteStories = canDeleteStories;
            this.canManageDirectMessages = canManageDirectMessages;
            this.canManageTags = canManageTags;
            this.isAnonymous = isAnonymous;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1562741834;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of chat administrators.
     */
    public static class ChatAdministrators extends Object {
        /**
         * A list of chat administrators.
         */
        public ChatAdministrator[] administrators;

        /**
         * Represents a list of chat administrators.
         */
        public ChatAdministrators() {
        }

        /**
         * Represents a list of chat administrators.
         *
         * @param administrators A list of chat administrators.
         */
        public ChatAdministrators(ChatAdministrator[] administrators) {
            this.administrators = administrators;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2126186435;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes reactions available in the chat.
     */
    public abstract static class ChatAvailableReactions extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ChatAvailableReactionsAll.CONSTRUCTOR,
            ChatAvailableReactionsSome.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ChatAvailableReactions() {
        }
    }

    /**
     * All reactions are available in the chat, excluding the paid reaction and custom reactions in channel chats.
     */
    public static class ChatAvailableReactionsAll extends ChatAvailableReactions {
        /**
         * The maximum allowed number of reactions per message; 1-11.
         */
        public int maxReactionCount;

        /**
         * All reactions are available in the chat, excluding the paid reaction and custom reactions in channel chats.
         */
        public ChatAvailableReactionsAll() {
        }

        /**
         * All reactions are available in the chat, excluding the paid reaction and custom reactions in channel chats.
         *
         * @param maxReactionCount The maximum allowed number of reactions per message; 1-11.
         */
        public ChatAvailableReactionsAll(int maxReactionCount) {
            this.maxReactionCount = maxReactionCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 694160279;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Only specific reactions are available in the chat.
     */
    public static class ChatAvailableReactionsSome extends ChatAvailableReactions {
        /**
         * The list of reactions.
         */
        public ReactionType[] reactions;
        /**
         * The maximum allowed number of reactions per message; 1-11.
         */
        public int maxReactionCount;

        /**
         * Only specific reactions are available in the chat.
         */
        public ChatAvailableReactionsSome() {
        }

        /**
         * Only specific reactions are available in the chat.
         *
         * @param reactions The list of reactions.
         * @param maxReactionCount The maximum allowed number of reactions per message; 1-11.
         */
        public ChatAvailableReactionsSome(ReactionType[] reactions, int maxReactionCount) {
            this.reactions = reactions;
            this.maxReactionCount = maxReactionCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 152513153;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a background set for a specific chat.
     */
    public static class ChatBackground extends Object {
        /**
         * The background.
         */
        public Background background;
        /**
         * Dimming of the background in dark themes, as a percentage; 0-100. Applied only to Wallpaper and Fill types of background.
         */
        public int darkThemeDimming;

        /**
         * Describes a background set for a specific chat.
         */
        public ChatBackground() {
        }

        /**
         * Describes a background set for a specific chat.
         *
         * @param background The background.
         * @param darkThemeDimming Dimming of the background in dark themes, as a percentage; 0-100. Applied only to Wallpaper and Fill types of background.
         */
        public ChatBackground(Background background, int darkThemeDimming) {
            this.background = background;
            this.darkThemeDimming = darkThemeDimming;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1653152104;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a boost applied to a chat.
     */
    public static class ChatBoost extends Object {
        /**
         * Unique identifier of the boost.
         */
        public String id;
        /**
         * The number of identical boosts applied.
         */
        public int count;
        /**
         * Source of the boost.
         */
        public ChatBoostSource source;
        /**
         * Point in time (Unix timestamp) when the chat was boosted.
         */
        public int startDate;
        /**
         * Point in time (Unix timestamp) when the boost will expire.
         */
        public int expirationDate;

        /**
         * Describes a boost applied to a chat.
         */
        public ChatBoost() {
        }

        /**
         * Describes a boost applied to a chat.
         *
         * @param id Unique identifier of the boost.
         * @param count The number of identical boosts applied.
         * @param source Source of the boost.
         * @param startDate Point in time (Unix timestamp) when the chat was boosted.
         * @param expirationDate Point in time (Unix timestamp) when the boost will expire.
         */
        public ChatBoost(String id, int count, ChatBoostSource source, int startDate, int expirationDate) {
            this.id = id;
            this.count = count;
            this.source = source;
            this.startDate = startDate;
            this.expirationDate = expirationDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1765815118;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of features available on the first chat boost levels.
     */
    public static class ChatBoostFeatures extends Object {
        /**
         * The list of features.
         */
        public ChatBoostLevelFeatures[] features;
        /**
         * The minimum boost level required to set custom emoji for profile background.
         */
        public int minProfileBackgroundCustomEmojiBoostLevel;
        /**
         * The minimum boost level required to set custom emoji for reply header and link preview background; for channel chats only.
         */
        public int minBackgroundCustomEmojiBoostLevel;
        /**
         * The minimum boost level required to set emoji status.
         */
        public int minEmojiStatusBoostLevel;
        /**
         * The minimum boost level required to set a chat theme background as chat background.
         */
        public int minChatThemeBackgroundBoostLevel;
        /**
         * The minimum boost level required to set custom chat background.
         */
        public int minCustomBackgroundBoostLevel;
        /**
         * The minimum boost level required to set custom emoji sticker set for the chat; for supergroup chats only.
         */
        public int minCustomEmojiStickerSetBoostLevel;
        /**
         * The minimum boost level allowing to enable automatic translation of messages for non-Premium users; for channel chats only.
         */
        public int minAutomaticTranslationBoostLevel;
        /**
         * The minimum boost level allowing to recognize speech in video note and voice note messages for non-Premium users; for supergroup chats only.
         */
        public int minSpeechRecognitionBoostLevel;
        /**
         * The minimum boost level allowing to disable sponsored messages in the chat; for channel chats only.
         */
        public int minSponsoredMessageDisableBoostLevel;

        /**
         * Contains a list of features available on the first chat boost levels.
         */
        public ChatBoostFeatures() {
        }

        /**
         * Contains a list of features available on the first chat boost levels.
         *
         * @param features The list of features.
         * @param minProfileBackgroundCustomEmojiBoostLevel The minimum boost level required to set custom emoji for profile background.
         * @param minBackgroundCustomEmojiBoostLevel The minimum boost level required to set custom emoji for reply header and link preview background; for channel chats only.
         * @param minEmojiStatusBoostLevel The minimum boost level required to set emoji status.
         * @param minChatThemeBackgroundBoostLevel The minimum boost level required to set a chat theme background as chat background.
         * @param minCustomBackgroundBoostLevel The minimum boost level required to set custom chat background.
         * @param minCustomEmojiStickerSetBoostLevel The minimum boost level required to set custom emoji sticker set for the chat; for supergroup chats only.
         * @param minAutomaticTranslationBoostLevel The minimum boost level allowing to enable automatic translation of messages for non-Premium users; for channel chats only.
         * @param minSpeechRecognitionBoostLevel The minimum boost level allowing to recognize speech in video note and voice note messages for non-Premium users; for supergroup chats only.
         * @param minSponsoredMessageDisableBoostLevel The minimum boost level allowing to disable sponsored messages in the chat; for channel chats only.
         */
        public ChatBoostFeatures(ChatBoostLevelFeatures[] features, int minProfileBackgroundCustomEmojiBoostLevel, int minBackgroundCustomEmojiBoostLevel, int minEmojiStatusBoostLevel, int minChatThemeBackgroundBoostLevel, int minCustomBackgroundBoostLevel, int minCustomEmojiStickerSetBoostLevel, int minAutomaticTranslationBoostLevel, int minSpeechRecognitionBoostLevel, int minSponsoredMessageDisableBoostLevel) {
            this.features = features;
            this.minProfileBackgroundCustomEmojiBoostLevel = minProfileBackgroundCustomEmojiBoostLevel;
            this.minBackgroundCustomEmojiBoostLevel = minBackgroundCustomEmojiBoostLevel;
            this.minEmojiStatusBoostLevel = minEmojiStatusBoostLevel;
            this.minChatThemeBackgroundBoostLevel = minChatThemeBackgroundBoostLevel;
            this.minCustomBackgroundBoostLevel = minCustomBackgroundBoostLevel;
            this.minCustomEmojiStickerSetBoostLevel = minCustomEmojiStickerSetBoostLevel;
            this.minAutomaticTranslationBoostLevel = minAutomaticTranslationBoostLevel;
            this.minSpeechRecognitionBoostLevel = minSpeechRecognitionBoostLevel;
            this.minSponsoredMessageDisableBoostLevel = minSponsoredMessageDisableBoostLevel;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -940531367;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of features available on a specific chat boost level.
     */
    public static class ChatBoostLevelFeatures extends Object {
        /**
         * Target chat boost level.
         */
        public int level;
        /**
         * Number of stories that the chat can publish daily.
         */
        public int storyPerDayCount;
        /**
         * Number of custom emoji reactions that can be added to the list of available reactions.
         */
        public int customEmojiReactionCount;
        /**
         * Number of custom colors for chat title.
         */
        public int titleColorCount;
        /**
         * Number of custom colors for profile photo background.
         */
        public int profileAccentColorCount;
        /**
         * True, if custom emoji for profile background can be set.
         */
        public boolean canSetProfileBackgroundCustomEmoji;
        /**
         * Number of custom colors for background of empty chat photo, replies to messages and link previews.
         */
        public int accentColorCount;
        /**
         * True, if custom emoji for reply header and link preview background can be set.
         */
        public boolean canSetBackgroundCustomEmoji;
        /**
         * True, if emoji status can be set.
         */
        public boolean canSetEmojiStatus;
        /**
         * Number of chat theme backgrounds that can be set as chat background.
         */
        public int chatThemeBackgroundCount;
        /**
         * True, if custom background can be set in the chat for all users.
         */
        public boolean canSetCustomBackground;
        /**
         * True, if custom emoji sticker set can be set for the chat.
         */
        public boolean canSetCustomEmojiStickerSet;
        /**
         * True, if automatic translation of messages can be enabled in the chat.
         */
        public boolean canEnableAutomaticTranslation;
        /**
         * True, if speech recognition can be used for video note and voice note messages by all users.
         */
        public boolean canRecognizeSpeech;
        /**
         * True, if sponsored messages can be disabled in the chat.
         */
        public boolean canDisableSponsoredMessages;

        /**
         * Contains a list of features available on a specific chat boost level.
         */
        public ChatBoostLevelFeatures() {
        }

        /**
         * Contains a list of features available on a specific chat boost level.
         *
         * @param level Target chat boost level.
         * @param storyPerDayCount Number of stories that the chat can publish daily.
         * @param customEmojiReactionCount Number of custom emoji reactions that can be added to the list of available reactions.
         * @param titleColorCount Number of custom colors for chat title.
         * @param profileAccentColorCount Number of custom colors for profile photo background.
         * @param canSetProfileBackgroundCustomEmoji True, if custom emoji for profile background can be set.
         * @param accentColorCount Number of custom colors for background of empty chat photo, replies to messages and link previews.
         * @param canSetBackgroundCustomEmoji True, if custom emoji for reply header and link preview background can be set.
         * @param canSetEmojiStatus True, if emoji status can be set.
         * @param chatThemeBackgroundCount Number of chat theme backgrounds that can be set as chat background.
         * @param canSetCustomBackground True, if custom background can be set in the chat for all users.
         * @param canSetCustomEmojiStickerSet True, if custom emoji sticker set can be set for the chat.
         * @param canEnableAutomaticTranslation True, if automatic translation of messages can be enabled in the chat.
         * @param canRecognizeSpeech True, if speech recognition can be used for video note and voice note messages by all users.
         * @param canDisableSponsoredMessages True, if sponsored messages can be disabled in the chat.
         */
        public ChatBoostLevelFeatures(int level, int storyPerDayCount, int customEmojiReactionCount, int titleColorCount, int profileAccentColorCount, boolean canSetProfileBackgroundCustomEmoji, int accentColorCount, boolean canSetBackgroundCustomEmoji, boolean canSetEmojiStatus, int chatThemeBackgroundCount, boolean canSetCustomBackground, boolean canSetCustomEmojiStickerSet, boolean canEnableAutomaticTranslation, boolean canRecognizeSpeech, boolean canDisableSponsoredMessages) {
            this.level = level;
            this.storyPerDayCount = storyPerDayCount;
            this.customEmojiReactionCount = customEmojiReactionCount;
            this.titleColorCount = titleColorCount;
            this.profileAccentColorCount = profileAccentColorCount;
            this.canSetProfileBackgroundCustomEmoji = canSetProfileBackgroundCustomEmoji;
            this.accentColorCount = accentColorCount;
            this.canSetBackgroundCustomEmoji = canSetBackgroundCustomEmoji;
            this.canSetEmojiStatus = canSetEmojiStatus;
            this.chatThemeBackgroundCount = chatThemeBackgroundCount;
            this.canSetCustomBackground = canSetCustomBackground;
            this.canSetCustomEmojiStickerSet = canSetCustomEmojiStickerSet;
            this.canEnableAutomaticTranslation = canEnableAutomaticTranslation;
            this.canRecognizeSpeech = canRecognizeSpeech;
            this.canDisableSponsoredMessages = canDisableSponsoredMessages;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 975439470;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains an HTTPS link to boost a chat.
     */
    public static class ChatBoostLink extends Object {
        /**
         * The link.
         */
        public String link;
        /**
         * True, if the link will work for non-members of the chat.
         */
        public boolean isPublic;

        /**
         * Contains an HTTPS link to boost a chat.
         */
        public ChatBoostLink() {
        }

        /**
         * Contains an HTTPS link to boost a chat.
         *
         * @param link The link.
         * @param isPublic True, if the link will work for non-members of the chat.
         */
        public ChatBoostLink(String link, boolean isPublic) {
            this.link = link;
            this.isPublic = isPublic;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1253999503;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a link to boost a chat.
     */
    public static class ChatBoostLinkInfo extends Object {
        /**
         * True, if the link will work for non-members of the chat.
         */
        public boolean isPublic;
        /**
         * Identifier of the chat to which the link points; 0 if the chat isn't found.
         */
        public long chatId;

        /**
         * Contains information about a link to boost a chat.
         */
        public ChatBoostLinkInfo() {
        }

        /**
         * Contains information about a link to boost a chat.
         *
         * @param isPublic True, if the link will work for non-members of the chat.
         * @param chatId Identifier of the chat to which the link points; 0 if the chat isn't found.
         */
        public ChatBoostLinkInfo(boolean isPublic, long chatId) {
            this.isPublic = isPublic;
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -602785660;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a slot for chat boost.
     */
    public static class ChatBoostSlot extends Object {
        /**
         * Unique identifier of the slot.
         */
        public int slotId;
        /**
         * Identifier of the currently boosted chat; 0 if none.
         */
        public long currentlyBoostedChatId;
        /**
         * Point in time (Unix timestamp) when the chat was boosted; 0 if none.
         */
        public int startDate;
        /**
         * Point in time (Unix timestamp) when the boost will expire.
         */
        public int expirationDate;
        /**
         * Point in time (Unix timestamp) after which the boost can be used for another chat.
         */
        public int cooldownUntilDate;

        /**
         * Describes a slot for chat boost.
         */
        public ChatBoostSlot() {
        }

        /**
         * Describes a slot for chat boost.
         *
         * @param slotId Unique identifier of the slot.
         * @param currentlyBoostedChatId Identifier of the currently boosted chat; 0 if none.
         * @param startDate Point in time (Unix timestamp) when the chat was boosted; 0 if none.
         * @param expirationDate Point in time (Unix timestamp) when the boost will expire.
         * @param cooldownUntilDate Point in time (Unix timestamp) after which the boost can be used for another chat.
         */
        public ChatBoostSlot(int slotId, long currentlyBoostedChatId, int startDate, int expirationDate, int cooldownUntilDate) {
            this.slotId = slotId;
            this.currentlyBoostedChatId = currentlyBoostedChatId;
            this.startDate = startDate;
            this.expirationDate = expirationDate;
            this.cooldownUntilDate = cooldownUntilDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 123206343;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of chat boost slots.
     */
    public static class ChatBoostSlots extends Object {
        /**
         * List of boost slots.
         */
        public ChatBoostSlot[] slots;

        /**
         * Contains a list of chat boost slots.
         */
        public ChatBoostSlots() {
        }

        /**
         * Contains a list of chat boost slots.
         *
         * @param slots List of boost slots.
         */
        public ChatBoostSlots(ChatBoostSlot[] slots) {
            this.slots = slots;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1014966293;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes source of a chat boost.
     */
    public abstract static class ChatBoostSource extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ChatBoostSourceGiftCode.CONSTRUCTOR,
            ChatBoostSourceGiveaway.CONSTRUCTOR,
            ChatBoostSourcePremium.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ChatBoostSource() {
        }
    }

    /**
     * The chat created a Telegram Premium gift code for a user.
     */
    public static class ChatBoostSourceGiftCode extends ChatBoostSource {
        /**
         * Identifier of a user, for which the gift code was created.
         */
        public long userId;
        /**
         * The created Telegram Premium gift code, which is known only if this is a gift code for the current user, or it has already been claimed.
         */
        public String giftCode;

        /**
         * The chat created a Telegram Premium gift code for a user.
         */
        public ChatBoostSourceGiftCode() {
        }

        /**
         * The chat created a Telegram Premium gift code for a user.
         *
         * @param userId Identifier of a user, for which the gift code was created.
         * @param giftCode The created Telegram Premium gift code, which is known only if this is a gift code for the current user, or it has already been claimed.
         */
        public ChatBoostSourceGiftCode(long userId, String giftCode) {
            this.userId = userId;
            this.giftCode = giftCode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -98299206;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat created a giveaway.
     */
    public static class ChatBoostSourceGiveaway extends ChatBoostSource {
        /**
         * Identifier of a user who won in the giveaway; 0 if none.
         */
        public long userId;
        /**
         * The created Telegram Premium gift code if it was used by the user or can be claimed by the current user; an empty string otherwise; for Telegram Premium giveways only.
         */
        public String giftCode;
        /**
         * Number of Telegram Stars distributed among winners of the giveaway.
         */
        public long starCount;
        /**
         * Identifier of the corresponding giveaway message; can be an identifier of a deleted message.
         */
        public long giveawayMessageId;
        /**
         * True, if the winner for the corresponding giveaway prize wasn't chosen, because there were not enough participants.
         */
        public boolean isUnclaimed;

        /**
         * The chat created a giveaway.
         */
        public ChatBoostSourceGiveaway() {
        }

        /**
         * The chat created a giveaway.
         *
         * @param userId Identifier of a user who won in the giveaway; 0 if none.
         * @param giftCode The created Telegram Premium gift code if it was used by the user or can be claimed by the current user; an empty string otherwise; for Telegram Premium giveways only.
         * @param starCount Number of Telegram Stars distributed among winners of the giveaway.
         * @param giveawayMessageId Identifier of the corresponding giveaway message; can be an identifier of a deleted message.
         * @param isUnclaimed True, if the winner for the corresponding giveaway prize wasn't chosen, because there were not enough participants.
         */
        public ChatBoostSourceGiveaway(long userId, String giftCode, long starCount, long giveawayMessageId, boolean isUnclaimed) {
            this.userId = userId;
            this.giftCode = giftCode;
            this.starCount = starCount;
            this.giveawayMessageId = giveawayMessageId;
            this.isUnclaimed = isUnclaimed;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1918145690;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A user with Telegram Premium subscription or gifted Telegram Premium boosted the chat.
     */
    public static class ChatBoostSourcePremium extends ChatBoostSource {
        /**
         * Identifier of the user.
         */
        public long userId;

        /**
         * A user with Telegram Premium subscription or gifted Telegram Premium boosted the chat.
         */
        public ChatBoostSourcePremium() {
        }

        /**
         * A user with Telegram Premium subscription or gifted Telegram Premium boosted the chat.
         *
         * @param userId Identifier of the user.
         */
        public ChatBoostSourcePremium(long userId) {
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 972011;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes current boost status of a chat.
     */
    public static class ChatBoostStatus extends Object {
        /**
         * An HTTP URL, which can be used to boost the chat.
         */
        public String boostUrl;
        /**
         * Identifiers of boost slots of the current user applied to the chat.
         */
        public int[] appliedSlotIds;
        /**
         * Current boost level of the chat.
         */
        public int level;
        /**
         * The number of boosts received by the chat from created Telegram Premium gift codes and giveaways; always 0 if the current user isn't an administrator in the chat.
         */
        public int giftCodeBoostCount;
        /**
         * The number of boosts received by the chat.
         */
        public int boostCount;
        /**
         * The number of boosts added to reach the current level.
         */
        public int currentLevelBoostCount;
        /**
         * The number of boosts needed to reach the next level; 0 if the next level isn't available.
         */
        public int nextLevelBoostCount;
        /**
         * Approximate number of Telegram Premium subscribers joined the chat; always 0 if the current user isn't an administrator in the chat.
         */
        public int premiumMemberCount;
        /**
         * A percentage of Telegram Premium subscribers joined the chat; always 0 if the current user isn't an administrator in the chat.
         */
        public double premiumMemberPercentage;
        /**
         * The list of prepaid giveaways available for the chat; only for chat administrators.
         */
        public PrepaidGiveaway[] prepaidGiveaways;

        /**
         * Describes current boost status of a chat.
         */
        public ChatBoostStatus() {
        }

        /**
         * Describes current boost status of a chat.
         *
         * @param boostUrl An HTTP URL, which can be used to boost the chat.
         * @param appliedSlotIds Identifiers of boost slots of the current user applied to the chat.
         * @param level Current boost level of the chat.
         * @param giftCodeBoostCount The number of boosts received by the chat from created Telegram Premium gift codes and giveaways; always 0 if the current user isn't an administrator in the chat.
         * @param boostCount The number of boosts received by the chat.
         * @param currentLevelBoostCount The number of boosts added to reach the current level.
         * @param nextLevelBoostCount The number of boosts needed to reach the next level; 0 if the next level isn't available.
         * @param premiumMemberCount Approximate number of Telegram Premium subscribers joined the chat; always 0 if the current user isn't an administrator in the chat.
         * @param premiumMemberPercentage A percentage of Telegram Premium subscribers joined the chat; always 0 if the current user isn't an administrator in the chat.
         * @param prepaidGiveaways The list of prepaid giveaways available for the chat; only for chat administrators.
         */
        public ChatBoostStatus(String boostUrl, int[] appliedSlotIds, int level, int giftCodeBoostCount, int boostCount, int currentLevelBoostCount, int nextLevelBoostCount, int premiumMemberCount, double premiumMemberPercentage, PrepaidGiveaway[] prepaidGiveaways) {
            this.boostUrl = boostUrl;
            this.appliedSlotIds = appliedSlotIds;
            this.level = level;
            this.giftCodeBoostCount = giftCodeBoostCount;
            this.boostCount = boostCount;
            this.currentLevelBoostCount = currentLevelBoostCount;
            this.nextLevelBoostCount = nextLevelBoostCount;
            this.premiumMemberCount = premiumMemberCount;
            this.premiumMemberPercentage = premiumMemberPercentage;
            this.prepaidGiveaways = prepaidGiveaways;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1050332618;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a chat event.
     */
    public static class ChatEvent extends Object {
        /**
         * Chat event identifier.
         */
        public long id;
        /**
         * Point in time (Unix timestamp) when the event happened.
         */
        public int date;
        /**
         * Identifier of the user or chat who performed the action.
         */
        public MessageSender memberId;
        /**
         * The action.
         */
        public ChatEventAction action;

        /**
         * Represents a chat event.
         */
        public ChatEvent() {
        }

        /**
         * Represents a chat event.
         *
         * @param id Chat event identifier.
         * @param date Point in time (Unix timestamp) when the event happened.
         * @param memberId Identifier of the user or chat who performed the action.
         * @param action The action.
         */
        public ChatEvent(long id, int date, MessageSender memberId, ChatEventAction action) {
            this.id = id;
            this.date = date;
            this.memberId = memberId;
            this.action = action;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -652102704;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents a chat event.
     */
    public abstract static class ChatEventAction extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ChatEventMessageEdited.CONSTRUCTOR,
            ChatEventMessageDeleted.CONSTRUCTOR,
            ChatEventMessagePinned.CONSTRUCTOR,
            ChatEventMessageUnpinned.CONSTRUCTOR,
            ChatEventPollStopped.CONSTRUCTOR,
            ChatEventMemberJoined.CONSTRUCTOR,
            ChatEventMemberJoinedByInviteLink.CONSTRUCTOR,
            ChatEventMemberJoinedByRequest.CONSTRUCTOR,
            ChatEventMemberInvited.CONSTRUCTOR,
            ChatEventMemberLeft.CONSTRUCTOR,
            ChatEventMemberPromoted.CONSTRUCTOR,
            ChatEventMemberRestricted.CONSTRUCTOR,
            ChatEventMemberTagChanged.CONSTRUCTOR,
            ChatEventMemberSubscriptionExtended.CONSTRUCTOR,
            ChatEventAvailableReactionsChanged.CONSTRUCTOR,
            ChatEventBackgroundChanged.CONSTRUCTOR,
            ChatEventDescriptionChanged.CONSTRUCTOR,
            ChatEventEmojiStatusChanged.CONSTRUCTOR,
            ChatEventLinkedChatChanged.CONSTRUCTOR,
            ChatEventLocationChanged.CONSTRUCTOR,
            ChatEventMessageAutoDeleteTimeChanged.CONSTRUCTOR,
            ChatEventPermissionsChanged.CONSTRUCTOR,
            ChatEventPhotoChanged.CONSTRUCTOR,
            ChatEventSlowModeDelayChanged.CONSTRUCTOR,
            ChatEventStickerSetChanged.CONSTRUCTOR,
            ChatEventCustomEmojiStickerSetChanged.CONSTRUCTOR,
            ChatEventTitleChanged.CONSTRUCTOR,
            ChatEventUsernameChanged.CONSTRUCTOR,
            ChatEventActiveUsernamesChanged.CONSTRUCTOR,
            ChatEventAccentColorChanged.CONSTRUCTOR,
            ChatEventProfileAccentColorChanged.CONSTRUCTOR,
            ChatEventHasProtectedContentToggled.CONSTRUCTOR,
            ChatEventInvitesToggled.CONSTRUCTOR,
            ChatEventIsAllHistoryAvailableToggled.CONSTRUCTOR,
            ChatEventHasAggressiveAntiSpamEnabledToggled.CONSTRUCTOR,
            ChatEventSignMessagesToggled.CONSTRUCTOR,
            ChatEventShowMessageSenderToggled.CONSTRUCTOR,
            ChatEventAutomaticTranslationToggled.CONSTRUCTOR,
            ChatEventInviteLinkEdited.CONSTRUCTOR,
            ChatEventInviteLinkRevoked.CONSTRUCTOR,
            ChatEventInviteLinkDeleted.CONSTRUCTOR,
            ChatEventVideoChatCreated.CONSTRUCTOR,
            ChatEventVideoChatEnded.CONSTRUCTOR,
            ChatEventVideoChatMuteNewParticipantsToggled.CONSTRUCTOR,
            ChatEventVideoChatParticipantIsMutedToggled.CONSTRUCTOR,
            ChatEventVideoChatParticipantVolumeLevelChanged.CONSTRUCTOR,
            ChatEventIsForumToggled.CONSTRUCTOR,
            ChatEventForumTopicCreated.CONSTRUCTOR,
            ChatEventForumTopicEdited.CONSTRUCTOR,
            ChatEventForumTopicToggleIsClosed.CONSTRUCTOR,
            ChatEventForumTopicToggleIsHidden.CONSTRUCTOR,
            ChatEventForumTopicDeleted.CONSTRUCTOR,
            ChatEventForumTopicPinned.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ChatEventAction() {
        }
    }

    /**
     * A message was edited.
     */
    public static class ChatEventMessageEdited extends ChatEventAction {
        /**
         * The original message before the edit.
         */
        public Message oldMessage;
        /**
         * The message after it was edited.
         */
        public Message newMessage;

        /**
         * A message was edited.
         */
        public ChatEventMessageEdited() {
        }

        /**
         * A message was edited.
         *
         * @param oldMessage The original message before the edit.
         * @param newMessage The message after it was edited.
         */
        public ChatEventMessageEdited(Message oldMessage, Message newMessage) {
            this.oldMessage = oldMessage;
            this.newMessage = newMessage;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -430967304;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message was deleted.
     */
    public static class ChatEventMessageDeleted extends ChatEventAction {
        /**
         * Deleted message.
         */
        public Message message;
        /**
         * True, if the message deletion can be reported via reportSupergroupAntiSpamFalsePositive.
         */
        public boolean canReportAntiSpamFalsePositive;

        /**
         * A message was deleted.
         */
        public ChatEventMessageDeleted() {
        }

        /**
         * A message was deleted.
         *
         * @param message Deleted message.
         * @param canReportAntiSpamFalsePositive True, if the message deletion can be reported via reportSupergroupAntiSpamFalsePositive.
         */
        public ChatEventMessageDeleted(Message message, boolean canReportAntiSpamFalsePositive) {
            this.message = message;
            this.canReportAntiSpamFalsePositive = canReportAntiSpamFalsePositive;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 935316851;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message was pinned.
     */
    public static class ChatEventMessagePinned extends ChatEventAction {
        /**
         * Pinned message.
         */
        public Message message;

        /**
         * A message was pinned.
         */
        public ChatEventMessagePinned() {
        }

        /**
         * A message was pinned.
         *
         * @param message Pinned message.
         */
        public ChatEventMessagePinned(Message message) {
            this.message = message;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 438742298;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message was unpinned.
     */
    public static class ChatEventMessageUnpinned extends ChatEventAction {
        /**
         * Unpinned message.
         */
        public Message message;

        /**
         * A message was unpinned.
         */
        public ChatEventMessageUnpinned() {
        }

        /**
         * A message was unpinned.
         *
         * @param message Unpinned message.
         */
        public ChatEventMessageUnpinned(Message message) {
            this.message = message;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -376161513;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A poll in a message was stopped.
     */
    public static class ChatEventPollStopped extends ChatEventAction {
        /**
         * The message with the poll.
         */
        public Message message;

        /**
         * A poll in a message was stopped.
         */
        public ChatEventPollStopped() {
        }

        /**
         * A poll in a message was stopped.
         *
         * @param message The message with the poll.
         */
        public ChatEventPollStopped(Message message) {
            this.message = message;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2009893861;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new member joined the chat.
     */
    public static class ChatEventMemberJoined extends ChatEventAction {

        /**
         * A new member joined the chat.
         */
        public ChatEventMemberJoined() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -235468508;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new member joined the chat via an invite link.
     */
    public static class ChatEventMemberJoinedByInviteLink extends ChatEventAction {
        /**
         * Invite link used to join the chat.
         */
        public ChatInviteLink inviteLink;
        /**
         * True, if the user has joined the chat using an invite link for a chat folder.
         */
        public boolean viaChatFolderInviteLink;

        /**
         * A new member joined the chat via an invite link.
         */
        public ChatEventMemberJoinedByInviteLink() {
        }

        /**
         * A new member joined the chat via an invite link.
         *
         * @param inviteLink Invite link used to join the chat.
         * @param viaChatFolderInviteLink True, if the user has joined the chat using an invite link for a chat folder.
         */
        public ChatEventMemberJoinedByInviteLink(ChatInviteLink inviteLink, boolean viaChatFolderInviteLink) {
            this.inviteLink = inviteLink;
            this.viaChatFolderInviteLink = viaChatFolderInviteLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1445536390;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new member was accepted to the chat by an administrator.
     */
    public static class ChatEventMemberJoinedByRequest extends ChatEventAction {
        /**
         * User identifier of the chat administrator, approved user join request.
         */
        public long approverUserId;
        /**
         * Invite link used to join the chat; may be null.
         */
        @Nullable public ChatInviteLink inviteLink;

        /**
         * A new member was accepted to the chat by an administrator.
         */
        public ChatEventMemberJoinedByRequest() {
        }

        /**
         * A new member was accepted to the chat by an administrator.
         *
         * @param approverUserId User identifier of the chat administrator, approved user join request.
         * @param inviteLink Invite link used to join the chat; may be null.
         */
        public ChatEventMemberJoinedByRequest(long approverUserId, ChatInviteLink inviteLink) {
            this.approverUserId = approverUserId;
            this.inviteLink = inviteLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1647804865;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new chat member was invited.
     */
    public static class ChatEventMemberInvited extends ChatEventAction {
        /**
         * New member user identifier.
         */
        public long userId;
        /**
         * New member status.
         */
        public ChatMemberStatus status;

        /**
         * A new chat member was invited.
         */
        public ChatEventMemberInvited() {
        }

        /**
         * A new chat member was invited.
         *
         * @param userId New member user identifier.
         * @param status New member status.
         */
        public ChatEventMemberInvited(long userId, ChatMemberStatus status) {
            this.userId = userId;
            this.status = status;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 953663433;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A member left the chat.
     */
    public static class ChatEventMemberLeft extends ChatEventAction {

        /**
         * A member left the chat.
         */
        public ChatEventMemberLeft() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -948420593;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat member has gained/lost administrator status, or the list of their administrator privileges has changed.
     */
    public static class ChatEventMemberPromoted extends ChatEventAction {
        /**
         * Affected chat member user identifier.
         */
        public long userId;
        /**
         * Previous status of the chat member.
         */
        public ChatMemberStatus oldStatus;
        /**
         * New status of the chat member.
         */
        public ChatMemberStatus newStatus;

        /**
         * A chat member has gained/lost administrator status, or the list of their administrator privileges has changed.
         */
        public ChatEventMemberPromoted() {
        }

        /**
         * A chat member has gained/lost administrator status, or the list of their administrator privileges has changed.
         *
         * @param userId Affected chat member user identifier.
         * @param oldStatus Previous status of the chat member.
         * @param newStatus New status of the chat member.
         */
        public ChatEventMemberPromoted(long userId, ChatMemberStatus oldStatus, ChatMemberStatus newStatus) {
            this.userId = userId;
            this.oldStatus = oldStatus;
            this.newStatus = newStatus;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 525297761;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat member was restricted/unrestricted or banned/unbanned, or the list of their restrictions has changed.
     */
    public static class ChatEventMemberRestricted extends ChatEventAction {
        /**
         * Affected chat member identifier.
         */
        public MessageSender memberId;
        /**
         * Previous status of the chat member.
         */
        public ChatMemberStatus oldStatus;
        /**
         * New status of the chat member.
         */
        public ChatMemberStatus newStatus;

        /**
         * A chat member was restricted/unrestricted or banned/unbanned, or the list of their restrictions has changed.
         */
        public ChatEventMemberRestricted() {
        }

        /**
         * A chat member was restricted/unrestricted or banned/unbanned, or the list of their restrictions has changed.
         *
         * @param memberId Affected chat member identifier.
         * @param oldStatus Previous status of the chat member.
         * @param newStatus New status of the chat member.
         */
        public ChatEventMemberRestricted(MessageSender memberId, ChatMemberStatus oldStatus, ChatMemberStatus newStatus) {
            this.memberId = memberId;
            this.oldStatus = oldStatus;
            this.newStatus = newStatus;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1603608069;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat member tag has been changed.
     */
    public static class ChatEventMemberTagChanged extends ChatEventAction {
        /**
         * Affected chat member user identifier.
         */
        public long userId;
        /**
         * Previous tag of the chat member.
         */
        public String oldTag;
        /**
         * New tag of the chat member.
         */
        public String newTag;

        /**
         * A chat member tag has been changed.
         */
        public ChatEventMemberTagChanged() {
        }

        /**
         * A chat member tag has been changed.
         *
         * @param userId Affected chat member user identifier.
         * @param oldTag Previous tag of the chat member.
         * @param newTag New tag of the chat member.
         */
        public ChatEventMemberTagChanged(long userId, String oldTag, String newTag) {
            this.userId = userId;
            this.oldTag = oldTag;
            this.newTag = newTag;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 63814442;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat member extended their subscription to the chat.
     */
    public static class ChatEventMemberSubscriptionExtended extends ChatEventAction {
        /**
         * Affected chat member user identifier.
         */
        public long userId;
        /**
         * Previous status of the chat member.
         */
        public ChatMemberStatus oldStatus;
        /**
         * New status of the chat member.
         */
        public ChatMemberStatus newStatus;

        /**
         * A chat member extended their subscription to the chat.
         */
        public ChatEventMemberSubscriptionExtended() {
        }

        /**
         * A chat member extended their subscription to the chat.
         *
         * @param userId Affected chat member user identifier.
         * @param oldStatus Previous status of the chat member.
         * @param newStatus New status of the chat member.
         */
        public ChatEventMemberSubscriptionExtended(long userId, ChatMemberStatus oldStatus, ChatMemberStatus newStatus) {
            this.userId = userId;
            this.oldStatus = oldStatus;
            this.newStatus = newStatus;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1141198846;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat available reactions were changed.
     */
    public static class ChatEventAvailableReactionsChanged extends ChatEventAction {
        /**
         * Previous chat available reactions.
         */
        public ChatAvailableReactions oldAvailableReactions;
        /**
         * New chat available reactions.
         */
        public ChatAvailableReactions newAvailableReactions;

        /**
         * The chat available reactions were changed.
         */
        public ChatEventAvailableReactionsChanged() {
        }

        /**
         * The chat available reactions were changed.
         *
         * @param oldAvailableReactions Previous chat available reactions.
         * @param newAvailableReactions New chat available reactions.
         */
        public ChatEventAvailableReactionsChanged(ChatAvailableReactions oldAvailableReactions, ChatAvailableReactions newAvailableReactions) {
            this.oldAvailableReactions = oldAvailableReactions;
            this.newAvailableReactions = newAvailableReactions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1749491521;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat background was changed.
     */
    public static class ChatEventBackgroundChanged extends ChatEventAction {
        /**
         * Previous background; may be null if none.
         */
        @Nullable public ChatBackground oldBackground;
        /**
         * New background; may be null if none.
         */
        @Nullable public ChatBackground newBackground;

        /**
         * The chat background was changed.
         */
        public ChatEventBackgroundChanged() {
        }

        /**
         * The chat background was changed.
         *
         * @param oldBackground Previous background; may be null if none.
         * @param newBackground New background; may be null if none.
         */
        public ChatEventBackgroundChanged(ChatBackground oldBackground, ChatBackground newBackground) {
            this.oldBackground = oldBackground;
            this.newBackground = newBackground;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1225953992;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat description was changed.
     */
    public static class ChatEventDescriptionChanged extends ChatEventAction {
        /**
         * Previous chat description.
         */
        public String oldDescription;
        /**
         * New chat description.
         */
        public String newDescription;

        /**
         * The chat description was changed.
         */
        public ChatEventDescriptionChanged() {
        }

        /**
         * The chat description was changed.
         *
         * @param oldDescription Previous chat description.
         * @param newDescription New chat description.
         */
        public ChatEventDescriptionChanged(String oldDescription, String newDescription) {
            this.oldDescription = oldDescription;
            this.newDescription = newDescription;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 39112478;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat emoji status was changed.
     */
    public static class ChatEventEmojiStatusChanged extends ChatEventAction {
        /**
         * Previous emoji status; may be null if none.
         */
        @Nullable public EmojiStatus oldEmojiStatus;
        /**
         * New emoji status; may be null if none.
         */
        @Nullable public EmojiStatus newEmojiStatus;

        /**
         * The chat emoji status was changed.
         */
        public ChatEventEmojiStatusChanged() {
        }

        /**
         * The chat emoji status was changed.
         *
         * @param oldEmojiStatus Previous emoji status; may be null if none.
         * @param newEmojiStatus New emoji status; may be null if none.
         */
        public ChatEventEmojiStatusChanged(EmojiStatus oldEmojiStatus, EmojiStatus newEmojiStatus) {
            this.oldEmojiStatus = oldEmojiStatus;
            this.newEmojiStatus = newEmojiStatus;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2081850594;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The linked chat of a supergroup was changed.
     */
    public static class ChatEventLinkedChatChanged extends ChatEventAction {
        /**
         * Previous supergroup linked chat identifier.
         */
        public long oldLinkedChatId;
        /**
         * New supergroup linked chat identifier.
         */
        public long newLinkedChatId;

        /**
         * The linked chat of a supergroup was changed.
         */
        public ChatEventLinkedChatChanged() {
        }

        /**
         * The linked chat of a supergroup was changed.
         *
         * @param oldLinkedChatId Previous supergroup linked chat identifier.
         * @param newLinkedChatId New supergroup linked chat identifier.
         */
        public ChatEventLinkedChatChanged(long oldLinkedChatId, long newLinkedChatId) {
            this.oldLinkedChatId = oldLinkedChatId;
            this.newLinkedChatId = newLinkedChatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1797419439;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The supergroup location was changed.
     */
    public static class ChatEventLocationChanged extends ChatEventAction {
        /**
         * Previous location; may be null.
         */
        @Nullable public ChatLocation oldLocation;
        /**
         * New location; may be null.
         */
        @Nullable public ChatLocation newLocation;

        /**
         * The supergroup location was changed.
         */
        public ChatEventLocationChanged() {
        }

        /**
         * The supergroup location was changed.
         *
         * @param oldLocation Previous location; may be null.
         * @param newLocation New location; may be null.
         */
        public ChatEventLocationChanged(ChatLocation oldLocation, ChatLocation newLocation) {
            this.oldLocation = oldLocation;
            this.newLocation = newLocation;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -405930674;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message auto-delete timer was changed.
     */
    public static class ChatEventMessageAutoDeleteTimeChanged extends ChatEventAction {
        /**
         * Previous value of messageAutoDeleteTime.
         */
        public int oldMessageAutoDeleteTime;
        /**
         * New value of messageAutoDeleteTime.
         */
        public int newMessageAutoDeleteTime;

        /**
         * The message auto-delete timer was changed.
         */
        public ChatEventMessageAutoDeleteTimeChanged() {
        }

        /**
         * The message auto-delete timer was changed.
         *
         * @param oldMessageAutoDeleteTime Previous value of messageAutoDeleteTime.
         * @param newMessageAutoDeleteTime New value of messageAutoDeleteTime.
         */
        public ChatEventMessageAutoDeleteTimeChanged(int oldMessageAutoDeleteTime, int newMessageAutoDeleteTime) {
            this.oldMessageAutoDeleteTime = oldMessageAutoDeleteTime;
            this.newMessageAutoDeleteTime = newMessageAutoDeleteTime;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 17317668;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat permissions were changed.
     */
    public static class ChatEventPermissionsChanged extends ChatEventAction {
        /**
         * Previous chat permissions.
         */
        public ChatPermissions oldPermissions;
        /**
         * New chat permissions.
         */
        public ChatPermissions newPermissions;

        /**
         * The chat permissions were changed.
         */
        public ChatEventPermissionsChanged() {
        }

        /**
         * The chat permissions were changed.
         *
         * @param oldPermissions Previous chat permissions.
         * @param newPermissions New chat permissions.
         */
        public ChatEventPermissionsChanged(ChatPermissions oldPermissions, ChatPermissions newPermissions) {
            this.oldPermissions = oldPermissions;
            this.newPermissions = newPermissions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1311557720;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat photo was changed.
     */
    public static class ChatEventPhotoChanged extends ChatEventAction {
        /**
         * Previous chat photo value; may be null.
         */
        @Nullable public ChatPhoto oldPhoto;
        /**
         * New chat photo value; may be null.
         */
        @Nullable public ChatPhoto newPhoto;

        /**
         * The chat photo was changed.
         */
        public ChatEventPhotoChanged() {
        }

        /**
         * The chat photo was changed.
         *
         * @param oldPhoto Previous chat photo value; may be null.
         * @param newPhoto New chat photo value; may be null.
         */
        public ChatEventPhotoChanged(ChatPhoto oldPhoto, ChatPhoto newPhoto) {
            this.oldPhoto = oldPhoto;
            this.newPhoto = newPhoto;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -811572541;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The slowModeDelay setting of a supergroup was changed.
     */
    public static class ChatEventSlowModeDelayChanged extends ChatEventAction {
        /**
         * Previous value of slowModeDelay, in seconds.
         */
        public int oldSlowModeDelay;
        /**
         * New value of slowModeDelay, in seconds.
         */
        public int newSlowModeDelay;

        /**
         * The slowModeDelay setting of a supergroup was changed.
         */
        public ChatEventSlowModeDelayChanged() {
        }

        /**
         * The slowModeDelay setting of a supergroup was changed.
         *
         * @param oldSlowModeDelay Previous value of slowModeDelay, in seconds.
         * @param newSlowModeDelay New value of slowModeDelay, in seconds.
         */
        public ChatEventSlowModeDelayChanged(int oldSlowModeDelay, int newSlowModeDelay) {
            this.oldSlowModeDelay = oldSlowModeDelay;
            this.newSlowModeDelay = newSlowModeDelay;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1653195765;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The supergroup sticker set was changed.
     */
    public static class ChatEventStickerSetChanged extends ChatEventAction {
        /**
         * Previous identifier of the chat sticker set; 0 if none.
         */
        public long oldStickerSetId;
        /**
         * New identifier of the chat sticker set; 0 if none.
         */
        public long newStickerSetId;

        /**
         * The supergroup sticker set was changed.
         */
        public ChatEventStickerSetChanged() {
        }

        /**
         * The supergroup sticker set was changed.
         *
         * @param oldStickerSetId Previous identifier of the chat sticker set; 0 if none.
         * @param newStickerSetId New identifier of the chat sticker set; 0 if none.
         */
        public ChatEventStickerSetChanged(long oldStickerSetId, long newStickerSetId) {
            this.oldStickerSetId = oldStickerSetId;
            this.newStickerSetId = newStickerSetId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1243130481;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The supergroup sticker set with allowed custom emoji was changed.
     */
    public static class ChatEventCustomEmojiStickerSetChanged extends ChatEventAction {
        /**
         * Previous identifier of the chat sticker set; 0 if none.
         */
        public long oldStickerSetId;
        /**
         * New identifier of the chat sticker set; 0 if none.
         */
        public long newStickerSetId;

        /**
         * The supergroup sticker set with allowed custom emoji was changed.
         */
        public ChatEventCustomEmojiStickerSetChanged() {
        }

        /**
         * The supergroup sticker set with allowed custom emoji was changed.
         *
         * @param oldStickerSetId Previous identifier of the chat sticker set; 0 if none.
         * @param newStickerSetId New identifier of the chat sticker set; 0 if none.
         */
        public ChatEventCustomEmojiStickerSetChanged(long oldStickerSetId, long newStickerSetId) {
            this.oldStickerSetId = oldStickerSetId;
            this.newStickerSetId = newStickerSetId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 118244123;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat title was changed.
     */
    public static class ChatEventTitleChanged extends ChatEventAction {
        /**
         * Previous chat title.
         */
        public String oldTitle;
        /**
         * New chat title.
         */
        public String newTitle;

        /**
         * The chat title was changed.
         */
        public ChatEventTitleChanged() {
        }

        /**
         * The chat title was changed.
         *
         * @param oldTitle Previous chat title.
         * @param newTitle New chat title.
         */
        public ChatEventTitleChanged(String oldTitle, String newTitle) {
            this.oldTitle = oldTitle;
            this.newTitle = newTitle;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1134103250;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat editable username was changed.
     */
    public static class ChatEventUsernameChanged extends ChatEventAction {
        /**
         * Previous chat username.
         */
        public String oldUsername;
        /**
         * New chat username.
         */
        public String newUsername;

        /**
         * The chat editable username was changed.
         */
        public ChatEventUsernameChanged() {
        }

        /**
         * The chat editable username was changed.
         *
         * @param oldUsername Previous chat username.
         * @param newUsername New chat username.
         */
        public ChatEventUsernameChanged(String oldUsername, String newUsername) {
            this.oldUsername = oldUsername;
            this.newUsername = newUsername;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1728558443;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat active usernames were changed.
     */
    public static class ChatEventActiveUsernamesChanged extends ChatEventAction {
        /**
         * Previous list of active usernames.
         */
        public String[] oldUsernames;
        /**
         * New list of active usernames.
         */
        public String[] newUsernames;

        /**
         * The chat active usernames were changed.
         */
        public ChatEventActiveUsernamesChanged() {
        }

        /**
         * The chat active usernames were changed.
         *
         * @param oldUsernames Previous list of active usernames.
         * @param newUsernames New list of active usernames.
         */
        public ChatEventActiveUsernamesChanged(String[] oldUsernames, String[] newUsernames) {
            this.oldUsernames = oldUsernames;
            this.newUsernames = newUsernames;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1508790810;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat accent color or background custom emoji were changed.
     */
    public static class ChatEventAccentColorChanged extends ChatEventAction {
        /**
         * Previous identifier of chat accent color.
         */
        public int oldAccentColorId;
        /**
         * Previous identifier of the custom emoji; 0 if none.
         */
        public long oldBackgroundCustomEmojiId;
        /**
         * New identifier of chat accent color.
         */
        public int newAccentColorId;
        /**
         * New identifier of the custom emoji; 0 if none.
         */
        public long newBackgroundCustomEmojiId;

        /**
         * The chat accent color or background custom emoji were changed.
         */
        public ChatEventAccentColorChanged() {
        }

        /**
         * The chat accent color or background custom emoji were changed.
         *
         * @param oldAccentColorId Previous identifier of chat accent color.
         * @param oldBackgroundCustomEmojiId Previous identifier of the custom emoji; 0 if none.
         * @param newAccentColorId New identifier of chat accent color.
         * @param newBackgroundCustomEmojiId New identifier of the custom emoji; 0 if none.
         */
        public ChatEventAccentColorChanged(int oldAccentColorId, long oldBackgroundCustomEmojiId, int newAccentColorId, long newBackgroundCustomEmojiId) {
            this.oldAccentColorId = oldAccentColorId;
            this.oldBackgroundCustomEmojiId = oldBackgroundCustomEmojiId;
            this.newAccentColorId = newAccentColorId;
            this.newBackgroundCustomEmojiId = newBackgroundCustomEmojiId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -427591885;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat's profile accent color or profile background custom emoji were changed.
     */
    public static class ChatEventProfileAccentColorChanged extends ChatEventAction {
        /**
         * Previous identifier of chat's profile accent color; -1 if none.
         */
        public int oldProfileAccentColorId;
        /**
         * Previous identifier of the custom emoji; 0 if none.
         */
        public long oldProfileBackgroundCustomEmojiId;
        /**
         * New identifier of chat's profile accent color; -1 if none.
         */
        public int newProfileAccentColorId;
        /**
         * New identifier of the custom emoji; 0 if none.
         */
        public long newProfileBackgroundCustomEmojiId;

        /**
         * The chat's profile accent color or profile background custom emoji were changed.
         */
        public ChatEventProfileAccentColorChanged() {
        }

        /**
         * The chat's profile accent color or profile background custom emoji were changed.
         *
         * @param oldProfileAccentColorId Previous identifier of chat's profile accent color; -1 if none.
         * @param oldProfileBackgroundCustomEmojiId Previous identifier of the custom emoji; 0 if none.
         * @param newProfileAccentColorId New identifier of chat's profile accent color; -1 if none.
         * @param newProfileBackgroundCustomEmojiId New identifier of the custom emoji; 0 if none.
         */
        public ChatEventProfileAccentColorChanged(int oldProfileAccentColorId, long oldProfileBackgroundCustomEmojiId, int newProfileAccentColorId, long newProfileBackgroundCustomEmojiId) {
            this.oldProfileAccentColorId = oldProfileAccentColorId;
            this.oldProfileBackgroundCustomEmojiId = oldProfileBackgroundCustomEmojiId;
            this.newProfileAccentColorId = newProfileAccentColorId;
            this.newProfileBackgroundCustomEmojiId = newProfileBackgroundCustomEmojiId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1514612124;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The hasProtectedContent setting of a channel was toggled.
     */
    public static class ChatEventHasProtectedContentToggled extends ChatEventAction {
        /**
         * New value of hasProtectedContent.
         */
        public boolean hasProtectedContent;

        /**
         * The hasProtectedContent setting of a channel was toggled.
         */
        public ChatEventHasProtectedContentToggled() {
        }

        /**
         * The hasProtectedContent setting of a channel was toggled.
         *
         * @param hasProtectedContent New value of hasProtectedContent.
         */
        public ChatEventHasProtectedContentToggled(boolean hasProtectedContent) {
            this.hasProtectedContent = hasProtectedContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -184270335;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The canInviteUsers permission of a supergroup chat was toggled.
     */
    public static class ChatEventInvitesToggled extends ChatEventAction {
        /**
         * New value of canInviteUsers permission.
         */
        public boolean canInviteUsers;

        /**
         * The canInviteUsers permission of a supergroup chat was toggled.
         */
        public ChatEventInvitesToggled() {
        }

        /**
         * The canInviteUsers permission of a supergroup chat was toggled.
         *
         * @param canInviteUsers New value of canInviteUsers permission.
         */
        public ChatEventInvitesToggled(boolean canInviteUsers) {
            this.canInviteUsers = canInviteUsers;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -62548373;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The isAllHistoryAvailable setting of a supergroup was toggled.
     */
    public static class ChatEventIsAllHistoryAvailableToggled extends ChatEventAction {
        /**
         * New value of isAllHistoryAvailable.
         */
        public boolean isAllHistoryAvailable;

        /**
         * The isAllHistoryAvailable setting of a supergroup was toggled.
         */
        public ChatEventIsAllHistoryAvailableToggled() {
        }

        /**
         * The isAllHistoryAvailable setting of a supergroup was toggled.
         *
         * @param isAllHistoryAvailable New value of isAllHistoryAvailable.
         */
        public ChatEventIsAllHistoryAvailableToggled(boolean isAllHistoryAvailable) {
            this.isAllHistoryAvailable = isAllHistoryAvailable;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1599063019;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The hasAggressiveAntiSpamEnabled setting of a supergroup was toggled.
     */
    public static class ChatEventHasAggressiveAntiSpamEnabledToggled extends ChatEventAction {
        /**
         * New value of hasAggressiveAntiSpamEnabled.
         */
        public boolean hasAggressiveAntiSpamEnabled;

        /**
         * The hasAggressiveAntiSpamEnabled setting of a supergroup was toggled.
         */
        public ChatEventHasAggressiveAntiSpamEnabledToggled() {
        }

        /**
         * The hasAggressiveAntiSpamEnabled setting of a supergroup was toggled.
         *
         * @param hasAggressiveAntiSpamEnabled New value of hasAggressiveAntiSpamEnabled.
         */
        public ChatEventHasAggressiveAntiSpamEnabledToggled(boolean hasAggressiveAntiSpamEnabled) {
            this.hasAggressiveAntiSpamEnabled = hasAggressiveAntiSpamEnabled;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -125348094;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The signMessages setting of a channel was toggled.
     */
    public static class ChatEventSignMessagesToggled extends ChatEventAction {
        /**
         * New value of signMessages.
         */
        public boolean signMessages;

        /**
         * The signMessages setting of a channel was toggled.
         */
        public ChatEventSignMessagesToggled() {
        }

        /**
         * The signMessages setting of a channel was toggled.
         *
         * @param signMessages New value of signMessages.
         */
        public ChatEventSignMessagesToggled(boolean signMessages) {
            this.signMessages = signMessages;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1313265634;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The showMessageSender setting of a channel was toggled.
     */
    public static class ChatEventShowMessageSenderToggled extends ChatEventAction {
        /**
         * New value of showMessageSender.
         */
        public boolean showMessageSender;

        /**
         * The showMessageSender setting of a channel was toggled.
         */
        public ChatEventShowMessageSenderToggled() {
        }

        /**
         * The showMessageSender setting of a channel was toggled.
         *
         * @param showMessageSender New value of showMessageSender.
         */
        public ChatEventShowMessageSenderToggled(boolean showMessageSender) {
            this.showMessageSender = showMessageSender;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -794343453;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The hasAutomaticTranslation setting of a channel was toggled.
     */
    public static class ChatEventAutomaticTranslationToggled extends ChatEventAction {
        /**
         * New value of hasAutomaticTranslation.
         */
        public boolean hasAutomaticTranslation;

        /**
         * The hasAutomaticTranslation setting of a channel was toggled.
         */
        public ChatEventAutomaticTranslationToggled() {
        }

        /**
         * The hasAutomaticTranslation setting of a channel was toggled.
         *
         * @param hasAutomaticTranslation New value of hasAutomaticTranslation.
         */
        public ChatEventAutomaticTranslationToggled(boolean hasAutomaticTranslation) {
            this.hasAutomaticTranslation = hasAutomaticTranslation;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 194147926;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat invite link was edited.
     */
    public static class ChatEventInviteLinkEdited extends ChatEventAction {
        /**
         * Previous information about the invite link.
         */
        public ChatInviteLink oldInviteLink;
        /**
         * New information about the invite link.
         */
        public ChatInviteLink newInviteLink;

        /**
         * A chat invite link was edited.
         */
        public ChatEventInviteLinkEdited() {
        }

        /**
         * A chat invite link was edited.
         *
         * @param oldInviteLink Previous information about the invite link.
         * @param newInviteLink New information about the invite link.
         */
        public ChatEventInviteLinkEdited(ChatInviteLink oldInviteLink, ChatInviteLink newInviteLink) {
            this.oldInviteLink = oldInviteLink;
            this.newInviteLink = newInviteLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -460190366;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat invite link was revoked.
     */
    public static class ChatEventInviteLinkRevoked extends ChatEventAction {
        /**
         * The invite link.
         */
        public ChatInviteLink inviteLink;

        /**
         * A chat invite link was revoked.
         */
        public ChatEventInviteLinkRevoked() {
        }

        /**
         * A chat invite link was revoked.
         *
         * @param inviteLink The invite link.
         */
        public ChatEventInviteLinkRevoked(ChatInviteLink inviteLink) {
            this.inviteLink = inviteLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1579417629;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A revoked chat invite link was deleted.
     */
    public static class ChatEventInviteLinkDeleted extends ChatEventAction {
        /**
         * The invite link.
         */
        public ChatInviteLink inviteLink;

        /**
         * A revoked chat invite link was deleted.
         */
        public ChatEventInviteLinkDeleted() {
        }

        /**
         * A revoked chat invite link was deleted.
         *
         * @param inviteLink The invite link.
         */
        public ChatEventInviteLinkDeleted(ChatInviteLink inviteLink) {
            this.inviteLink = inviteLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1394974361;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A video chat was created.
     */
    public static class ChatEventVideoChatCreated extends ChatEventAction {
        /**
         * Identifier of the video chat. The video chat can be received through the method getGroupCall.
         */
        public int groupCallId;

        /**
         * A video chat was created.
         */
        public ChatEventVideoChatCreated() {
        }

        /**
         * A video chat was created.
         *
         * @param groupCallId Identifier of the video chat. The video chat can be received through the method getGroupCall.
         */
        public ChatEventVideoChatCreated(int groupCallId) {
            this.groupCallId = groupCallId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1822853755;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A video chat was ended.
     */
    public static class ChatEventVideoChatEnded extends ChatEventAction {
        /**
         * Identifier of the video chat. The video chat can be received through the method getGroupCall.
         */
        public int groupCallId;

        /**
         * A video chat was ended.
         */
        public ChatEventVideoChatEnded() {
        }

        /**
         * A video chat was ended.
         *
         * @param groupCallId Identifier of the video chat. The video chat can be received through the method getGroupCall.
         */
        public ChatEventVideoChatEnded(int groupCallId) {
            this.groupCallId = groupCallId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1630039112;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The muteNewParticipants setting of a video chat was toggled.
     */
    public static class ChatEventVideoChatMuteNewParticipantsToggled extends ChatEventAction {
        /**
         * New value of the muteNewParticipants setting.
         */
        public boolean muteNewParticipants;

        /**
         * The muteNewParticipants setting of a video chat was toggled.
         */
        public ChatEventVideoChatMuteNewParticipantsToggled() {
        }

        /**
         * The muteNewParticipants setting of a video chat was toggled.
         *
         * @param muteNewParticipants New value of the muteNewParticipants setting.
         */
        public ChatEventVideoChatMuteNewParticipantsToggled(boolean muteNewParticipants) {
            this.muteNewParticipants = muteNewParticipants;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -126547970;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A video chat participant was muted or unmuted.
     */
    public static class ChatEventVideoChatParticipantIsMutedToggled extends ChatEventAction {
        /**
         * Identifier of the affected group call participant.
         */
        public MessageSender participantId;
        /**
         * New value of isMuted.
         */
        public boolean isMuted;

        /**
         * A video chat participant was muted or unmuted.
         */
        public ChatEventVideoChatParticipantIsMutedToggled() {
        }

        /**
         * A video chat participant was muted or unmuted.
         *
         * @param participantId Identifier of the affected group call participant.
         * @param isMuted New value of isMuted.
         */
        public ChatEventVideoChatParticipantIsMutedToggled(MessageSender participantId, boolean isMuted) {
            this.participantId = participantId;
            this.isMuted = isMuted;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 521165047;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A video chat participant volume level was changed.
     */
    public static class ChatEventVideoChatParticipantVolumeLevelChanged extends ChatEventAction {
        /**
         * Identifier of the affected group call participant.
         */
        public MessageSender participantId;
        /**
         * New value of volumeLevel; 1-20000 in hundreds of percents.
         */
        public int volumeLevel;

        /**
         * A video chat participant volume level was changed.
         */
        public ChatEventVideoChatParticipantVolumeLevelChanged() {
        }

        /**
         * A video chat participant volume level was changed.
         *
         * @param participantId Identifier of the affected group call participant.
         * @param volumeLevel New value of volumeLevel; 1-20000 in hundreds of percents.
         */
        public ChatEventVideoChatParticipantVolumeLevelChanged(MessageSender participantId, int volumeLevel) {
            this.participantId = participantId;
            this.volumeLevel = volumeLevel;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1131385534;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The isForum setting of a channel was toggled.
     */
    public static class ChatEventIsForumToggled extends ChatEventAction {
        /**
         * New value of isForum.
         */
        public boolean isForum;

        /**
         * The isForum setting of a channel was toggled.
         */
        public ChatEventIsForumToggled() {
        }

        /**
         * The isForum setting of a channel was toggled.
         *
         * @param isForum New value of isForum.
         */
        public ChatEventIsForumToggled(boolean isForum) {
            this.isForum = isForum;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1516491033;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new forum topic was created.
     */
    public static class ChatEventForumTopicCreated extends ChatEventAction {
        /**
         * Information about the topic.
         */
        public ForumTopicInfo topicInfo;

        /**
         * A new forum topic was created.
         */
        public ChatEventForumTopicCreated() {
        }

        /**
         * A new forum topic was created.
         *
         * @param topicInfo Information about the topic.
         */
        public ChatEventForumTopicCreated(ForumTopicInfo topicInfo) {
            this.topicInfo = topicInfo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2005269314;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A forum topic was edited.
     */
    public static class ChatEventForumTopicEdited extends ChatEventAction {
        /**
         * Old information about the topic.
         */
        public ForumTopicInfo oldTopicInfo;
        /**
         * New information about the topic.
         */
        public ForumTopicInfo newTopicInfo;

        /**
         * A forum topic was edited.
         */
        public ChatEventForumTopicEdited() {
        }

        /**
         * A forum topic was edited.
         *
         * @param oldTopicInfo Old information about the topic.
         * @param newTopicInfo New information about the topic.
         */
        public ChatEventForumTopicEdited(ForumTopicInfo oldTopicInfo, ForumTopicInfo newTopicInfo) {
            this.oldTopicInfo = oldTopicInfo;
            this.newTopicInfo = newTopicInfo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1624910860;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A forum topic was closed or reopened.
     */
    public static class ChatEventForumTopicToggleIsClosed extends ChatEventAction {
        /**
         * New information about the topic.
         */
        public ForumTopicInfo topicInfo;

        /**
         * A forum topic was closed or reopened.
         */
        public ChatEventForumTopicToggleIsClosed() {
        }

        /**
         * A forum topic was closed or reopened.
         *
         * @param topicInfo New information about the topic.
         */
        public ChatEventForumTopicToggleIsClosed(ForumTopicInfo topicInfo) {
            this.topicInfo = topicInfo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -962704070;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The General forum topic was hidden or unhidden.
     */
    public static class ChatEventForumTopicToggleIsHidden extends ChatEventAction {
        /**
         * New information about the topic.
         */
        public ForumTopicInfo topicInfo;

        /**
         * The General forum topic was hidden or unhidden.
         */
        public ChatEventForumTopicToggleIsHidden() {
        }

        /**
         * The General forum topic was hidden or unhidden.
         *
         * @param topicInfo New information about the topic.
         */
        public ChatEventForumTopicToggleIsHidden(ForumTopicInfo topicInfo) {
            this.topicInfo = topicInfo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1609175250;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A forum topic was deleted.
     */
    public static class ChatEventForumTopicDeleted extends ChatEventAction {
        /**
         * Information about the topic.
         */
        public ForumTopicInfo topicInfo;

        /**
         * A forum topic was deleted.
         */
        public ChatEventForumTopicDeleted() {
        }

        /**
         * A forum topic was deleted.
         *
         * @param topicInfo Information about the topic.
         */
        public ChatEventForumTopicDeleted(ForumTopicInfo topicInfo) {
            this.topicInfo = topicInfo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1332795123;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A pinned forum topic was changed.
     */
    public static class ChatEventForumTopicPinned extends ChatEventAction {
        /**
         * Information about the old pinned topic; may be null.
         */
        @Nullable public ForumTopicInfo oldTopicInfo;
        /**
         * Information about the new pinned topic; may be null.
         */
        @Nullable public ForumTopicInfo newTopicInfo;

        /**
         * A pinned forum topic was changed.
         */
        public ChatEventForumTopicPinned() {
        }

        /**
         * A pinned forum topic was changed.
         *
         * @param oldTopicInfo Information about the old pinned topic; may be null.
         * @param newTopicInfo Information about the new pinned topic; may be null.
         */
        public ChatEventForumTopicPinned(ForumTopicInfo oldTopicInfo, ForumTopicInfo newTopicInfo) {
            this.oldTopicInfo = oldTopicInfo;
            this.newTopicInfo = newTopicInfo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2143626222;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a set of filters used to obtain a chat event log.
     */
    public static class ChatEventLogFilters extends Object {
        /**
         * True, if message edits need to be returned.
         */
        public boolean messageEdits;
        /**
         * True, if message deletions need to be returned.
         */
        public boolean messageDeletions;
        /**
         * True, if pin/unpin events need to be returned.
         */
        public boolean messagePins;
        /**
         * True, if members joining events need to be returned.
         */
        public boolean memberJoins;
        /**
         * True, if members leaving events need to be returned.
         */
        public boolean memberLeaves;
        /**
         * True, if invited member events need to be returned.
         */
        public boolean memberInvites;
        /**
         * True, if member promotion/demotion events need to be returned.
         */
        public boolean memberPromotions;
        /**
         * True, if member restricted/unrestricted/banned/unbanned events need to be returned.
         */
        public boolean memberRestrictions;
        /**
         * True, if member tag and custom title change events need to be returned.
         */
        public boolean memberTagChanges;
        /**
         * True, if changes in chat information need to be returned.
         */
        public boolean infoChanges;
        /**
         * True, if changes in chat settings need to be returned.
         */
        public boolean settingChanges;
        /**
         * True, if changes to invite links need to be returned.
         */
        public boolean inviteLinkChanges;
        /**
         * True, if video chat actions need to be returned.
         */
        public boolean videoChatChanges;
        /**
         * True, if forum-related actions need to be returned.
         */
        public boolean forumChanges;
        /**
         * True, if subscription extensions need to be returned.
         */
        public boolean subscriptionExtensions;

        /**
         * Represents a set of filters used to obtain a chat event log.
         */
        public ChatEventLogFilters() {
        }

        /**
         * Represents a set of filters used to obtain a chat event log.
         *
         * @param messageEdits True, if message edits need to be returned.
         * @param messageDeletions True, if message deletions need to be returned.
         * @param messagePins True, if pin/unpin events need to be returned.
         * @param memberJoins True, if members joining events need to be returned.
         * @param memberLeaves True, if members leaving events need to be returned.
         * @param memberInvites True, if invited member events need to be returned.
         * @param memberPromotions True, if member promotion/demotion events need to be returned.
         * @param memberRestrictions True, if member restricted/unrestricted/banned/unbanned events need to be returned.
         * @param memberTagChanges True, if member tag and custom title change events need to be returned.
         * @param infoChanges True, if changes in chat information need to be returned.
         * @param settingChanges True, if changes in chat settings need to be returned.
         * @param inviteLinkChanges True, if changes to invite links need to be returned.
         * @param videoChatChanges True, if video chat actions need to be returned.
         * @param forumChanges True, if forum-related actions need to be returned.
         * @param subscriptionExtensions True, if subscription extensions need to be returned.
         */
        public ChatEventLogFilters(boolean messageEdits, boolean messageDeletions, boolean messagePins, boolean memberJoins, boolean memberLeaves, boolean memberInvites, boolean memberPromotions, boolean memberRestrictions, boolean memberTagChanges, boolean infoChanges, boolean settingChanges, boolean inviteLinkChanges, boolean videoChatChanges, boolean forumChanges, boolean subscriptionExtensions) {
            this.messageEdits = messageEdits;
            this.messageDeletions = messageDeletions;
            this.messagePins = messagePins;
            this.memberJoins = memberJoins;
            this.memberLeaves = memberLeaves;
            this.memberInvites = memberInvites;
            this.memberPromotions = memberPromotions;
            this.memberRestrictions = memberRestrictions;
            this.memberTagChanges = memberTagChanges;
            this.infoChanges = infoChanges;
            this.settingChanges = settingChanges;
            this.inviteLinkChanges = inviteLinkChanges;
            this.videoChatChanges = videoChatChanges;
            this.forumChanges = forumChanges;
            this.subscriptionExtensions = subscriptionExtensions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1572752816;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of chat events.
     */
    public static class ChatEvents extends Object {
        /**
         * List of events.
         */
        public ChatEvent[] events;

        /**
         * Contains a list of chat events.
         */
        public ChatEvents() {
        }

        /**
         * Contains a list of chat events.
         *
         * @param events List of events.
         */
        public ChatEvents(ChatEvent[] events) {
            this.events = events;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -585329664;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a folder for user chats.
     */
    public static class ChatFolder extends Object {
        /**
         * The name of the folder.
         */
        public ChatFolderName name;
        /**
         * The chosen icon for the chat folder; may be null. If null, use getChatFolderDefaultIconName to get default icon name for the folder.
         */
        @Nullable public ChatFolderIcon icon;
        /**
         * The identifier of the chosen color for the chat folder icon; from -1 to 6. If -1, then color is disabled. Can't be changed if folder tags are disabled or the current user doesn't have Telegram Premium subscription.
         */
        public int colorId;
        /**
         * True, if at least one link has been created for the folder.
         */
        public boolean isShareable;
        /**
         * The chat identifiers of pinned chats in the folder. There can be up to getOption(&quot;chat_folder_chosen_chat_count_max&quot;) pinned and always included non-secret chats and the same number of secret chats, but the limit can be increased with Telegram Premium.
         */
        public long[] pinnedChatIds;
        /**
         * The chat identifiers of always included chats in the folder. There can be up to getOption(&quot;chat_folder_chosen_chat_count_max&quot;) pinned and always included non-secret chats and the same number of secret chats, but the limit can be increased with Telegram Premium.
         */
        public long[] includedChatIds;
        /**
         * The chat identifiers of always excluded chats in the folder. There can be up to getOption(&quot;chat_folder_chosen_chat_count_max&quot;) always excluded non-secret chats and the same number of secret chats, but the limit can be increased with Telegram Premium.
         */
        public long[] excludedChatIds;
        /**
         * True, if muted chats need to be excluded.
         */
        public boolean excludeMuted;
        /**
         * True, if read chats need to be excluded.
         */
        public boolean excludeRead;
        /**
         * True, if archived chats need to be excluded.
         */
        public boolean excludeArchived;
        /**
         * True, if contacts need to be included.
         */
        public boolean includeContacts;
        /**
         * True, if non-contact users need to be included.
         */
        public boolean includeNonContacts;
        /**
         * True, if bots need to be included.
         */
        public boolean includeBots;
        /**
         * True, if basic groups and supergroups need to be included.
         */
        public boolean includeGroups;
        /**
         * True, if channels need to be included.
         */
        public boolean includeChannels;

        /**
         * Represents a folder for user chats.
         */
        public ChatFolder() {
        }

        /**
         * Represents a folder for user chats.
         *
         * @param name The name of the folder.
         * @param icon The chosen icon for the chat folder; may be null. If null, use getChatFolderDefaultIconName to get default icon name for the folder.
         * @param colorId The identifier of the chosen color for the chat folder icon; from -1 to 6. If -1, then color is disabled. Can't be changed if folder tags are disabled or the current user doesn't have Telegram Premium subscription.
         * @param isShareable True, if at least one link has been created for the folder.
         * @param pinnedChatIds The chat identifiers of pinned chats in the folder. There can be up to getOption(&quot;chat_folder_chosen_chat_count_max&quot;) pinned and always included non-secret chats and the same number of secret chats, but the limit can be increased with Telegram Premium.
         * @param includedChatIds The chat identifiers of always included chats in the folder. There can be up to getOption(&quot;chat_folder_chosen_chat_count_max&quot;) pinned and always included non-secret chats and the same number of secret chats, but the limit can be increased with Telegram Premium.
         * @param excludedChatIds The chat identifiers of always excluded chats in the folder. There can be up to getOption(&quot;chat_folder_chosen_chat_count_max&quot;) always excluded non-secret chats and the same number of secret chats, but the limit can be increased with Telegram Premium.
         * @param excludeMuted True, if muted chats need to be excluded.
         * @param excludeRead True, if read chats need to be excluded.
         * @param excludeArchived True, if archived chats need to be excluded.
         * @param includeContacts True, if contacts need to be included.
         * @param includeNonContacts True, if non-contact users need to be included.
         * @param includeBots True, if bots need to be included.
         * @param includeGroups True, if basic groups and supergroups need to be included.
         * @param includeChannels True, if channels need to be included.
         */
        public ChatFolder(ChatFolderName name, ChatFolderIcon icon, int colorId, boolean isShareable, long[] pinnedChatIds, long[] includedChatIds, long[] excludedChatIds, boolean excludeMuted, boolean excludeRead, boolean excludeArchived, boolean includeContacts, boolean includeNonContacts, boolean includeBots, boolean includeGroups, boolean includeChannels) {
            this.name = name;
            this.icon = icon;
            this.colorId = colorId;
            this.isShareable = isShareable;
            this.pinnedChatIds = pinnedChatIds;
            this.includedChatIds = includedChatIds;
            this.excludedChatIds = excludedChatIds;
            this.excludeMuted = excludeMuted;
            this.excludeRead = excludeRead;
            this.excludeArchived = excludeArchived;
            this.includeContacts = includeContacts;
            this.includeNonContacts = includeNonContacts;
            this.includeBots = includeBots;
            this.includeGroups = includeGroups;
            this.includeChannels = includeChannels;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1596164696;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents an icon for a chat folder.
     */
    public static class ChatFolderIcon extends Object {
        /**
         * The chosen icon name for short folder representation; one of &quot;All&quot;, &quot;Unread&quot;, &quot;Unmuted&quot;, &quot;Bots&quot;, &quot;Channels&quot;, &quot;Groups&quot;, &quot;Private&quot;, &quot;Custom&quot;, &quot;Setup&quot;, &quot;Cat&quot;, &quot;Crown&quot;, &quot;Favorite&quot;, &quot;Flower&quot;, &quot;Game&quot;, &quot;Home&quot;, &quot;Love&quot;, &quot;Mask&quot;, &quot;Party&quot;, &quot;Sport&quot;, &quot;Study&quot;, &quot;Trade&quot;, &quot;Travel&quot;, &quot;Work&quot;, &quot;Airplane&quot;, &quot;Book&quot;, &quot;Light&quot;, &quot;Like&quot;, &quot;Money&quot;, &quot;Note&quot;, &quot;Palette&quot;.
         */
        public String name;

        /**
         * Represents an icon for a chat folder.
         */
        public ChatFolderIcon() {
        }

        /**
         * Represents an icon for a chat folder.
         *
         * @param name The chosen icon name for short folder representation; one of &quot;All&quot;, &quot;Unread&quot;, &quot;Unmuted&quot;, &quot;Bots&quot;, &quot;Channels&quot;, &quot;Groups&quot;, &quot;Private&quot;, &quot;Custom&quot;, &quot;Setup&quot;, &quot;Cat&quot;, &quot;Crown&quot;, &quot;Favorite&quot;, &quot;Flower&quot;, &quot;Game&quot;, &quot;Home&quot;, &quot;Love&quot;, &quot;Mask&quot;, &quot;Party&quot;, &quot;Sport&quot;, &quot;Study&quot;, &quot;Trade&quot;, &quot;Travel&quot;, &quot;Work&quot;, &quot;Airplane&quot;, &quot;Book&quot;, &quot;Light&quot;, &quot;Like&quot;, &quot;Money&quot;, &quot;Note&quot;, &quot;Palette&quot;.
         */
        public ChatFolderIcon(String name) {
            this.name = name;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -146104090;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains basic information about a chat folder.
     */
    public static class ChatFolderInfo extends Object {
        /**
         * Unique chat folder identifier.
         */
        public int id;
        /**
         * The name of the folder.
         */
        public ChatFolderName name;
        /**
         * The chosen or default icon for the chat folder.
         */
        public ChatFolderIcon icon;
        /**
         * The identifier of the chosen color for the chat folder icon; from -1 to 6. If -1, then color is disabled.
         */
        public int colorId;
        /**
         * True, if at least one link has been created for the folder.
         */
        public boolean isShareable;
        /**
         * True, if the chat folder has invite links created by the current user.
         */
        public boolean hasMyInviteLinks;

        /**
         * Contains basic information about a chat folder.
         */
        public ChatFolderInfo() {
        }

        /**
         * Contains basic information about a chat folder.
         *
         * @param id Unique chat folder identifier.
         * @param name The name of the folder.
         * @param icon The chosen or default icon for the chat folder.
         * @param colorId The identifier of the chosen color for the chat folder icon; from -1 to 6. If -1, then color is disabled.
         * @param isShareable True, if at least one link has been created for the folder.
         * @param hasMyInviteLinks True, if the chat folder has invite links created by the current user.
         */
        public ChatFolderInfo(int id, ChatFolderName name, ChatFolderIcon icon, int colorId, boolean isShareable, boolean hasMyInviteLinks) {
            this.id = id;
            this.name = name;
            this.icon = icon;
            this.colorId = colorId;
            this.isShareable = isShareable;
            this.hasMyInviteLinks = hasMyInviteLinks;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 815535117;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a chat folder invite link.
     */
    public static class ChatFolderInviteLink extends Object {
        /**
         * The chat folder invite link.
         */
        public String inviteLink;
        /**
         * Name of the link.
         */
        public String name;
        /**
         * Identifiers of chats, included in the link.
         */
        public long[] chatIds;

        /**
         * Contains a chat folder invite link.
         */
        public ChatFolderInviteLink() {
        }

        /**
         * Contains a chat folder invite link.
         *
         * @param inviteLink The chat folder invite link.
         * @param name Name of the link.
         * @param chatIds Identifiers of chats, included in the link.
         */
        public ChatFolderInviteLink(String inviteLink, String name, long[] chatIds) {
            this.inviteLink = inviteLink;
            this.name = name;
            this.chatIds = chatIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 493969661;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about an invite link to a chat folder.
     */
    public static class ChatFolderInviteLinkInfo extends Object {
        /**
         * Basic information about the chat folder; chat folder identifier will be 0 if the user didn't have the chat folder yet.
         */
        public ChatFolderInfo chatFolderInfo;
        /**
         * Identifiers of the chats from the link, which aren't added to the folder yet.
         */
        public long[] missingChatIds;
        /**
         * Identifiers of the chats from the link, which are added to the folder already.
         */
        public long[] addedChatIds;

        /**
         * Contains information about an invite link to a chat folder.
         */
        public ChatFolderInviteLinkInfo() {
        }

        /**
         * Contains information about an invite link to a chat folder.
         *
         * @param chatFolderInfo Basic information about the chat folder; chat folder identifier will be 0 if the user didn't have the chat folder yet.
         * @param missingChatIds Identifiers of the chats from the link, which aren't added to the folder yet.
         * @param addedChatIds Identifiers of the chats from the link, which are added to the folder already.
         */
        public ChatFolderInviteLinkInfo(ChatFolderInfo chatFolderInfo, long[] missingChatIds, long[] addedChatIds) {
            this.chatFolderInfo = chatFolderInfo;
            this.missingChatIds = missingChatIds;
            this.addedChatIds = addedChatIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1119450395;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of chat folder invite links.
     */
    public static class ChatFolderInviteLinks extends Object {
        /**
         * List of the invite links.
         */
        public ChatFolderInviteLink[] inviteLinks;

        /**
         * Represents a list of chat folder invite links.
         */
        public ChatFolderInviteLinks() {
        }

        /**
         * Represents a list of chat folder invite links.
         *
         * @param inviteLinks List of the invite links.
         */
        public ChatFolderInviteLinks(ChatFolderInviteLink[] inviteLinks) {
            this.inviteLinks = inviteLinks;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1853351525;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes name of a chat folder.
     */
    public static class ChatFolderName extends Object {
        /**
         * The text of the chat folder name; 1-12 characters without line feeds. May contain only CustomEmoji entities.
         */
        public FormattedText text;
        /**
         * True, if custom emoji in the name must be animated.
         */
        public boolean animateCustomEmoji;

        /**
         * Describes name of a chat folder.
         */
        public ChatFolderName() {
        }

        /**
         * Describes name of a chat folder.
         *
         * @param text The text of the chat folder name; 1-12 characters without line feeds. May contain only CustomEmoji entities.
         * @param animateCustomEmoji True, if custom emoji in the name must be animated.
         */
        public ChatFolderName(FormattedText text, boolean animateCustomEmoji) {
            this.text = text;
            this.animateCustomEmoji = animateCustomEmoji;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -330482274;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a chat invite link.
     */
    public static class ChatInviteLink extends Object {
        /**
         * Chat invite link.
         */
        public String inviteLink;
        /**
         * Name of the link.
         */
        public String name;
        /**
         * User identifier of an administrator created the link.
         */
        public long creatorUserId;
        /**
         * Point in time (Unix timestamp) when the link was created.
         */
        public int date;
        /**
         * Point in time (Unix timestamp) when the link was last edited; 0 if never or unknown.
         */
        public int editDate;
        /**
         * Point in time (Unix timestamp) when the link will expire; 0 if never.
         */
        public int expirationDate;
        /**
         * Information about subscription plan that is applied to the users joining the chat by the link; may be null if the link doesn't require subscription.
         */
        @Nullable public StarSubscriptionPricing subscriptionPricing;
        /**
         * The maximum number of members, which can join the chat using the link simultaneously; 0 if not limited. Always 0 if the link requires approval.
         */
        public int memberLimit;
        /**
         * Number of chat members, which joined the chat using the link.
         */
        public int memberCount;
        /**
         * Number of chat members, which joined the chat using the link, but have already left because of expired subscription; for subscription links only.
         */
        public int expiredMemberCount;
        /**
         * Number of pending join requests created using this link.
         */
        public int pendingJoinRequestCount;
        /**
         * True, if the link only creates join request. If true, total number of joining members will be unlimited.
         */
        public boolean createsJoinRequest;
        /**
         * True, if the link is primary. Primary invite link can't have name, expiration date, or usage limit. There is exactly one primary invite link for each administrator with canInviteUsers right at a given time.
         */
        public boolean isPrimary;
        /**
         * True, if the link was revoked.
         */
        public boolean isRevoked;

        /**
         * Contains a chat invite link.
         */
        public ChatInviteLink() {
        }

        /**
         * Contains a chat invite link.
         *
         * @param inviteLink Chat invite link.
         * @param name Name of the link.
         * @param creatorUserId User identifier of an administrator created the link.
         * @param date Point in time (Unix timestamp) when the link was created.
         * @param editDate Point in time (Unix timestamp) when the link was last edited; 0 if never or unknown.
         * @param expirationDate Point in time (Unix timestamp) when the link will expire; 0 if never.
         * @param subscriptionPricing Information about subscription plan that is applied to the users joining the chat by the link; may be null if the link doesn't require subscription.
         * @param memberLimit The maximum number of members, which can join the chat using the link simultaneously; 0 if not limited. Always 0 if the link requires approval.
         * @param memberCount Number of chat members, which joined the chat using the link.
         * @param expiredMemberCount Number of chat members, which joined the chat using the link, but have already left because of expired subscription; for subscription links only.
         * @param pendingJoinRequestCount Number of pending join requests created using this link.
         * @param createsJoinRequest True, if the link only creates join request. If true, total number of joining members will be unlimited.
         * @param isPrimary True, if the link is primary. Primary invite link can't have name, expiration date, or usage limit. There is exactly one primary invite link for each administrator with canInviteUsers right at a given time.
         * @param isRevoked True, if the link was revoked.
         */
        public ChatInviteLink(String inviteLink, String name, long creatorUserId, int date, int editDate, int expirationDate, StarSubscriptionPricing subscriptionPricing, int memberLimit, int memberCount, int expiredMemberCount, int pendingJoinRequestCount, boolean createsJoinRequest, boolean isPrimary, boolean isRevoked) {
            this.inviteLink = inviteLink;
            this.name = name;
            this.creatorUserId = creatorUserId;
            this.date = date;
            this.editDate = editDate;
            this.expirationDate = expirationDate;
            this.subscriptionPricing = subscriptionPricing;
            this.memberLimit = memberLimit;
            this.memberCount = memberCount;
            this.expiredMemberCount = expiredMemberCount;
            this.pendingJoinRequestCount = pendingJoinRequestCount;
            this.createsJoinRequest = createsJoinRequest;
            this.isPrimary = isPrimary;
            this.isRevoked = isRevoked;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -957651664;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a chat administrator with a number of active and revoked chat invite links.
     */
    public static class ChatInviteLinkCount extends Object {
        /**
         * Administrator's user identifier.
         */
        public long userId;
        /**
         * Number of active invite links.
         */
        public int inviteLinkCount;
        /**
         * Number of revoked invite links.
         */
        public int revokedInviteLinkCount;

        /**
         * Describes a chat administrator with a number of active and revoked chat invite links.
         */
        public ChatInviteLinkCount() {
        }

        /**
         * Describes a chat administrator with a number of active and revoked chat invite links.
         *
         * @param userId Administrator's user identifier.
         * @param inviteLinkCount Number of active invite links.
         * @param revokedInviteLinkCount Number of revoked invite links.
         */
        public ChatInviteLinkCount(long userId, int inviteLinkCount, int revokedInviteLinkCount) {
            this.userId = userId;
            this.inviteLinkCount = inviteLinkCount;
            this.revokedInviteLinkCount = revokedInviteLinkCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1021999210;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of chat invite link counts.
     */
    public static class ChatInviteLinkCounts extends Object {
        /**
         * List of invite link counts.
         */
        public ChatInviteLinkCount[] inviteLinkCounts;

        /**
         * Contains a list of chat invite link counts.
         */
        public ChatInviteLinkCounts() {
        }

        /**
         * Contains a list of chat invite link counts.
         *
         * @param inviteLinkCounts List of invite link counts.
         */
        public ChatInviteLinkCounts(ChatInviteLinkCount[] inviteLinkCounts) {
            this.inviteLinkCounts = inviteLinkCounts;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 920326637;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a chat invite link.
     */
    public static class ChatInviteLinkInfo extends Object {
        /**
         * Chat identifier of the invite link; 0 if the user has no access to the chat before joining.
         */
        public long chatId;
        /**
         * If non-zero, the amount of time for which read access to the chat will remain available, in seconds.
         */
        public int accessibleFor;
        /**
         * Type of the chat.
         */
        public InviteLinkChatType type;
        /**
         * Title of the chat.
         */
        public String title;
        /**
         * Chat photo; may be null.
         */
        @Nullable public ChatPhotoInfo photo;
        /**
         * Identifier of the accent color for chat title and background of chat photo.
         */
        public int accentColorId;
        /**
         * Chat description.
         */
        public String description;
        /**
         * Number of members in the chat.
         */
        public int memberCount;
        /**
         * User identifiers of some chat members that may be known to the current user.
         */
        public long[] memberUserIds;
        /**
         * Information about subscription plan that must be paid by the user to use the link; may be null if the link doesn't require subscription.
         */
        @Nullable public ChatInviteLinkSubscriptionInfo subscriptionInfo;
        /**
         * True, if the link only creates join request.
         */
        public boolean createsJoinRequest;
        /**
         * True, if the chat is a public supergroup or channel, i.e. it has a username or it is a location-based supergroup.
         */
        public boolean isPublic;
        /**
         * Information about verification status of the chat; may be null if none.
         */
        @Nullable public VerificationStatus verificationStatus;

        /**
         * Contains information about a chat invite link.
         */
        public ChatInviteLinkInfo() {
        }

        /**
         * Contains information about a chat invite link.
         *
         * @param chatId Chat identifier of the invite link; 0 if the user has no access to the chat before joining.
         * @param accessibleFor If non-zero, the amount of time for which read access to the chat will remain available, in seconds.
         * @param type Type of the chat.
         * @param title Title of the chat.
         * @param photo Chat photo; may be null.
         * @param accentColorId Identifier of the accent color for chat title and background of chat photo.
         * @param description Chat description.
         * @param memberCount Number of members in the chat.
         * @param memberUserIds User identifiers of some chat members that may be known to the current user.
         * @param subscriptionInfo Information about subscription plan that must be paid by the user to use the link; may be null if the link doesn't require subscription.
         * @param createsJoinRequest True, if the link only creates join request.
         * @param isPublic True, if the chat is a public supergroup or channel, i.e. it has a username or it is a location-based supergroup.
         * @param verificationStatus Information about verification status of the chat; may be null if none.
         */
        public ChatInviteLinkInfo(long chatId, int accessibleFor, InviteLinkChatType type, String title, ChatPhotoInfo photo, int accentColorId, String description, int memberCount, long[] memberUserIds, ChatInviteLinkSubscriptionInfo subscriptionInfo, boolean createsJoinRequest, boolean isPublic, VerificationStatus verificationStatus) {
            this.chatId = chatId;
            this.accessibleFor = accessibleFor;
            this.type = type;
            this.title = title;
            this.photo = photo;
            this.accentColorId = accentColorId;
            this.description = description;
            this.memberCount = memberCount;
            this.memberUserIds = memberUserIds;
            this.subscriptionInfo = subscriptionInfo;
            this.createsJoinRequest = createsJoinRequest;
            this.isPublic = isPublic;
            this.verificationStatus = verificationStatus;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1145310535;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a chat member joined a chat via an invite link.
     */
    public static class ChatInviteLinkMember extends Object {
        /**
         * User identifier.
         */
        public long userId;
        /**
         * Point in time (Unix timestamp) when the user joined the chat.
         */
        public int joinedChatDate;
        /**
         * True, if the user has joined the chat using an invite link for a chat folder.
         */
        public boolean viaChatFolderInviteLink;
        /**
         * User identifier of the chat administrator, approved user join request.
         */
        public long approverUserId;

        /**
         * Describes a chat member joined a chat via an invite link.
         */
        public ChatInviteLinkMember() {
        }

        /**
         * Describes a chat member joined a chat via an invite link.
         *
         * @param userId User identifier.
         * @param joinedChatDate Point in time (Unix timestamp) when the user joined the chat.
         * @param viaChatFolderInviteLink True, if the user has joined the chat using an invite link for a chat folder.
         * @param approverUserId User identifier of the chat administrator, approved user join request.
         */
        public ChatInviteLinkMember(long userId, int joinedChatDate, boolean viaChatFolderInviteLink, long approverUserId) {
            this.userId = userId;
            this.joinedChatDate = joinedChatDate;
            this.viaChatFolderInviteLink = viaChatFolderInviteLink;
            this.approverUserId = approverUserId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 29156795;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of chat members joined a chat via an invite link.
     */
    public static class ChatInviteLinkMembers extends Object {
        /**
         * Approximate total number of chat members found.
         */
        public int totalCount;
        /**
         * List of chat members, joined a chat via an invite link.
         */
        public ChatInviteLinkMember[] members;

        /**
         * Contains a list of chat members joined a chat via an invite link.
         */
        public ChatInviteLinkMembers() {
        }

        /**
         * Contains a list of chat members joined a chat via an invite link.
         *
         * @param totalCount Approximate total number of chat members found.
         * @param members List of chat members, joined a chat via an invite link.
         */
        public ChatInviteLinkMembers(int totalCount, ChatInviteLinkMember[] members) {
            this.totalCount = totalCount;
            this.members = members;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 315635051;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about subscription plan that must be paid by the user to use a chat invite link.
     */
    public static class ChatInviteLinkSubscriptionInfo extends Object {
        /**
         * Information about subscription plan that must be paid by the user to use the link.
         */
        public StarSubscriptionPricing pricing;
        /**
         * True, if the user has already paid for the subscription and can use joinChatByInviteLink to join the subscribed chat again.
         */
        public boolean canReuse;
        /**
         * Identifier of the payment form to use for subscription payment; 0 if the subscription can't be paid.
         */
        public long formId;

        /**
         * Contains information about subscription plan that must be paid by the user to use a chat invite link.
         */
        public ChatInviteLinkSubscriptionInfo() {
        }

        /**
         * Contains information about subscription plan that must be paid by the user to use a chat invite link.
         *
         * @param pricing Information about subscription plan that must be paid by the user to use the link.
         * @param canReuse True, if the user has already paid for the subscription and can use joinChatByInviteLink to join the subscribed chat again.
         * @param formId Identifier of the payment form to use for subscription payment; 0 if the subscription can't be paid.
         */
        public ChatInviteLinkSubscriptionInfo(StarSubscriptionPricing pricing, boolean canReuse, long formId) {
            this.pricing = pricing;
            this.canReuse = canReuse;
            this.formId = formId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 953119592;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of chat invite links.
     */
    public static class ChatInviteLinks extends Object {
        /**
         * Approximate total number of chat invite links found.
         */
        public int totalCount;
        /**
         * List of invite links.
         */
        public ChatInviteLink[] inviteLinks;

        /**
         * Contains a list of chat invite links.
         */
        public ChatInviteLinks() {
        }

        /**
         * Contains a list of chat invite links.
         *
         * @param totalCount Approximate total number of chat invite links found.
         * @param inviteLinks List of invite links.
         */
        public ChatInviteLinks(int totalCount, ChatInviteLink[] inviteLinks) {
            this.totalCount = totalCount;
            this.inviteLinks = inviteLinks;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 112891427;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a user who sent a join request and waits for administrator approval.
     */
    public static class ChatJoinRequest extends Object {
        /**
         * User identifier.
         */
        public long userId;
        /**
         * Point in time (Unix timestamp) when the user sent the join request.
         */
        public int date;
        /**
         * A short bio of the user.
         */
        public String bio;

        /**
         * Describes a user who sent a join request and waits for administrator approval.
         */
        public ChatJoinRequest() {
        }

        /**
         * Describes a user who sent a join request and waits for administrator approval.
         *
         * @param userId User identifier.
         * @param date Point in time (Unix timestamp) when the user sent the join request.
         * @param bio A short bio of the user.
         */
        public ChatJoinRequest(long userId, int date, String bio) {
            this.userId = userId;
            this.date = date;
            this.bio = bio;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 59341416;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of requests to join a chat.
     */
    public static class ChatJoinRequests extends Object {
        /**
         * Approximate total number of requests found.
         */
        public int totalCount;
        /**
         * List of the requests.
         */
        public ChatJoinRequest[] requests;

        /**
         * Contains a list of requests to join a chat.
         */
        public ChatJoinRequests() {
        }

        /**
         * Contains a list of requests to join a chat.
         *
         * @param totalCount Approximate total number of requests found.
         * @param requests List of the requests.
         */
        public ChatJoinRequests(int totalCount, ChatJoinRequest[] requests) {
            this.totalCount = totalCount;
            this.requests = requests;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1291680519;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about pending join requests for a chat.
     */
    public static class ChatJoinRequestsInfo extends Object {
        /**
         * Total number of pending join requests.
         */
        public int totalCount;
        /**
         * Identifiers of at most 3 users sent the newest pending join requests.
         */
        public long[] userIds;

        /**
         * Contains information about pending join requests for a chat.
         */
        public ChatJoinRequestsInfo() {
        }

        /**
         * Contains information about pending join requests for a chat.
         *
         * @param totalCount Total number of pending join requests.
         * @param userIds Identifiers of at most 3 users sent the newest pending join requests.
         */
        public ChatJoinRequestsInfo(int totalCount, long[] userIds) {
            this.totalCount = totalCount;
            this.userIds = userIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 888534463;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a list of chats.
     */
    public abstract static class ChatList extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ChatListMain.CONSTRUCTOR,
            ChatListArchive.CONSTRUCTOR,
            ChatListFolder.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ChatList() {
        }
    }

    /**
     * A main list of chats.
     */
    public static class ChatListMain extends ChatList {

        /**
         * A main list of chats.
         */
        public ChatListMain() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -400991316;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A list of chats usually located at the top of the main chat list. Unmuted chats are automatically moved from the Archive to the Main chat list when a new message arrives.
     */
    public static class ChatListArchive extends ChatList {

        /**
         * A list of chats usually located at the top of the main chat list. Unmuted chats are automatically moved from the Archive to the Main chat list when a new message arrives.
         */
        public ChatListArchive() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 362770115;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A list of chats added to a chat folder.
     */
    public static class ChatListFolder extends ChatList {
        /**
         * Chat folder identifier.
         */
        public int chatFolderId;

        /**
         * A list of chats added to a chat folder.
         */
        public ChatListFolder() {
        }

        /**
         * A list of chats added to a chat folder.
         *
         * @param chatFolderId Chat folder identifier.
         */
        public ChatListFolder(int chatFolderId) {
            this.chatFolderId = chatFolderId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 385760856;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of chat lists.
     */
    public static class ChatLists extends Object {
        /**
         * List of chat lists.
         */
        public ChatList[] chatLists;

        /**
         * Contains a list of chat lists.
         */
        public ChatLists() {
        }

        /**
         * Contains a list of chat lists.
         *
         * @param chatLists List of chat lists.
         */
        public ChatLists(ChatList[] chatLists) {
            this.chatLists = chatLists;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -258292771;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a location to which a chat is connected.
     */
    public static class ChatLocation extends Object {
        /**
         * The location.
         */
        public Location location;
        /**
         * Location address; 1-64 characters, as defined by the chat owner.
         */
        public String address;

        /**
         * Represents a location to which a chat is connected.
         */
        public ChatLocation() {
        }

        /**
         * Represents a location to which a chat is connected.
         *
         * @param location The location.
         * @param address Location address; 1-64 characters, as defined by the chat owner.
         */
        public ChatLocation(Location location, String address) {
            this.location = location;
            this.address = address;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1566863583;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a user or a chat as a member of another chat.
     */
    public static class ChatMember extends Object {
        /**
         * Identifier of the chat member. Currently, other chats can be only Left or Banned. Only supergroups and channels can have other chats as Left or Banned members and these chats must be supergroups or channels.
         */
        public MessageSender memberId;
        /**
         * Tag of the chat member or its custom title if the member is an administrator of the chat; 0-16 characters without emoji; applicable to basic groups and supergroups only.
         */
        public String tag;
        /**
         * Identifier of a user who invited/promoted/banned this member in the chat; 0 if unknown.
         */
        public long inviterUserId;
        /**
         * Point in time (Unix timestamp) when the user joined/was promoted/was banned in the chat.
         */
        public int joinedChatDate;
        /**
         * Status of the member in the chat.
         */
        public ChatMemberStatus status;

        /**
         * Describes a user or a chat as a member of another chat.
         */
        public ChatMember() {
        }

        /**
         * Describes a user or a chat as a member of another chat.
         *
         * @param memberId Identifier of the chat member. Currently, other chats can be only Left or Banned. Only supergroups and channels can have other chats as Left or Banned members and these chats must be supergroups or channels.
         * @param tag Tag of the chat member or its custom title if the member is an administrator of the chat; 0-16 characters without emoji; applicable to basic groups and supergroups only.
         * @param inviterUserId Identifier of a user who invited/promoted/banned this member in the chat; 0 if unknown.
         * @param joinedChatDate Point in time (Unix timestamp) when the user joined/was promoted/was banned in the chat.
         * @param status Status of the member in the chat.
         */
        public ChatMember(MessageSender memberId, String tag, long inviterUserId, int joinedChatDate, ChatMemberStatus status) {
            this.memberId = memberId;
            this.tag = tag;
            this.inviterUserId = inviterUserId;
            this.joinedChatDate = joinedChatDate;
            this.status = status;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1910810754;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Provides information about the status of a member in a chat.
     */
    public abstract static class ChatMemberStatus extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ChatMemberStatusCreator.CONSTRUCTOR,
            ChatMemberStatusAdministrator.CONSTRUCTOR,
            ChatMemberStatusMember.CONSTRUCTOR,
            ChatMemberStatusRestricted.CONSTRUCTOR,
            ChatMemberStatusLeft.CONSTRUCTOR,
            ChatMemberStatusBanned.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ChatMemberStatus() {
        }
    }

    /**
     * The user is the owner of the chat and has all the administrator privileges.
     */
    public static class ChatMemberStatusCreator extends ChatMemberStatus {
        /**
         * True, if the creator isn't shown in the chat member list and sends messages anonymously; applicable to supergroups only.
         */
        public boolean isAnonymous;
        /**
         * True, if the user is a member of the chat.
         */
        public boolean isMember;

        /**
         * The user is the owner of the chat and has all the administrator privileges.
         */
        public ChatMemberStatusCreator() {
        }

        /**
         * The user is the owner of the chat and has all the administrator privileges.
         *
         * @param isAnonymous True, if the creator isn't shown in the chat member list and sends messages anonymously; applicable to supergroups only.
         * @param isMember True, if the user is a member of the chat.
         */
        public ChatMemberStatusCreator(boolean isAnonymous, boolean isMember) {
            this.isAnonymous = isAnonymous;
            this.isMember = isMember;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 877825117;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user is a member of the chat and has some additional privileges. In basic groups, administrators can edit and delete messages sent by others, add new members, ban unprivileged members, and manage video chats. In supergroups and channels, there are more detailed options for administrator privileges.
     */
    public static class ChatMemberStatusAdministrator extends ChatMemberStatus {
        /**
         * True, if the current user can edit the administrator privileges for the called user.
         */
        public boolean canBeEdited;
        /**
         * Rights of the administrator.
         */
        public ChatAdministratorRights rights;

        /**
         * The user is a member of the chat and has some additional privileges. In basic groups, administrators can edit and delete messages sent by others, add new members, ban unprivileged members, and manage video chats. In supergroups and channels, there are more detailed options for administrator privileges.
         */
        public ChatMemberStatusAdministrator() {
        }

        /**
         * The user is a member of the chat and has some additional privileges. In basic groups, administrators can edit and delete messages sent by others, add new members, ban unprivileged members, and manage video chats. In supergroups and channels, there are more detailed options for administrator privileges.
         *
         * @param canBeEdited True, if the current user can edit the administrator privileges for the called user.
         * @param rights Rights of the administrator.
         */
        public ChatMemberStatusAdministrator(boolean canBeEdited, ChatAdministratorRights rights) {
            this.canBeEdited = canBeEdited;
            this.rights = rights;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -861316634;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user is a member of the chat, without any additional privileges or restrictions.
     */
    public static class ChatMemberStatusMember extends ChatMemberStatus {
        /**
         * Point in time (Unix timestamp) when the user will be removed from the chat because of the expired subscription; 0 if never. Ignored in setChatMemberStatus.
         */
        public int memberUntilDate;

        /**
         * The user is a member of the chat, without any additional privileges or restrictions.
         */
        public ChatMemberStatusMember() {
        }

        /**
         * The user is a member of the chat, without any additional privileges or restrictions.
         *
         * @param memberUntilDate Point in time (Unix timestamp) when the user will be removed from the chat because of the expired subscription; 0 if never. Ignored in setChatMemberStatus.
         */
        public ChatMemberStatusMember(int memberUntilDate) {
            this.memberUntilDate = memberUntilDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -32707562;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user is under certain restrictions in the chat. Not supported in basic groups and channels.
     */
    public static class ChatMemberStatusRestricted extends ChatMemberStatus {
        /**
         * True, if the user is a member of the chat.
         */
        public boolean isMember;
        /**
         * Point in time (Unix timestamp) when restrictions will be lifted from the user; 0 if never. If the user is restricted for more than 366 days or for less than 30 seconds from the current time, the user is considered to be restricted forever.
         */
        public int restrictedUntilDate;
        /**
         * User permissions in the chat.
         */
        public ChatPermissions permissions;

        /**
         * The user is under certain restrictions in the chat. Not supported in basic groups and channels.
         */
        public ChatMemberStatusRestricted() {
        }

        /**
         * The user is under certain restrictions in the chat. Not supported in basic groups and channels.
         *
         * @param isMember True, if the user is a member of the chat.
         * @param restrictedUntilDate Point in time (Unix timestamp) when restrictions will be lifted from the user; 0 if never. If the user is restricted for more than 366 days or for less than 30 seconds from the current time, the user is considered to be restricted forever.
         * @param permissions User permissions in the chat.
         */
        public ChatMemberStatusRestricted(boolean isMember, int restrictedUntilDate, ChatPermissions permissions) {
            this.isMember = isMember;
            this.restrictedUntilDate = restrictedUntilDate;
            this.permissions = permissions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1661432998;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user or the chat is not a chat member.
     */
    public static class ChatMemberStatusLeft extends ChatMemberStatus {

        /**
         * The user or the chat is not a chat member.
         */
        public ChatMemberStatusLeft() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -5815259;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user or the chat was banned (and hence is not a member of the chat). Implies the user can't return to the chat, view messages, or be used as a participant identifier to join a video chat of the chat.
     */
    public static class ChatMemberStatusBanned extends ChatMemberStatus {
        /**
         * Point in time (Unix timestamp) when the user will be unbanned; 0 if never. If the user is banned for more than 366 days or for less than 30 seconds from the current time, the user is considered to be banned forever. Always 0 in basic groups.
         */
        public int bannedUntilDate;

        /**
         * The user or the chat was banned (and hence is not a member of the chat). Implies the user can't return to the chat, view messages, or be used as a participant identifier to join a video chat of the chat.
         */
        public ChatMemberStatusBanned() {
        }

        /**
         * The user or the chat was banned (and hence is not a member of the chat). Implies the user can't return to the chat, view messages, or be used as a participant identifier to join a video chat of the chat.
         *
         * @param bannedUntilDate Point in time (Unix timestamp) when the user will be unbanned; 0 if never. If the user is banned for more than 366 days or for less than 30 seconds from the current time, the user is considered to be banned forever. Always 0 in basic groups.
         */
        public ChatMemberStatusBanned(int bannedUntilDate) {
            this.bannedUntilDate = bannedUntilDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1653518666;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of chat members.
     */
    public static class ChatMembers extends Object {
        /**
         * Approximate total number of chat members found.
         */
        public int totalCount;
        /**
         * A list of chat members.
         */
        public ChatMember[] members;

        /**
         * Contains a list of chat members.
         */
        public ChatMembers() {
        }

        /**
         * Contains a list of chat members.
         *
         * @param totalCount Approximate total number of chat members found.
         * @param members A list of chat members.
         */
        public ChatMembers(int totalCount, ChatMember[] members) {
            this.totalCount = totalCount;
            this.members = members;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -497558622;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Specifies the kind of chat members to return in searchChatMembers.
     */
    public abstract static class ChatMembersFilter extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ChatMembersFilterContacts.CONSTRUCTOR,
            ChatMembersFilterAdministrators.CONSTRUCTOR,
            ChatMembersFilterMembers.CONSTRUCTOR,
            ChatMembersFilterMention.CONSTRUCTOR,
            ChatMembersFilterRestricted.CONSTRUCTOR,
            ChatMembersFilterBanned.CONSTRUCTOR,
            ChatMembersFilterBots.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ChatMembersFilter() {
        }
    }

    /**
     * Returns contacts of the user.
     */
    public static class ChatMembersFilterContacts extends ChatMembersFilter {

        /**
         * Returns contacts of the user.
         */
        public ChatMembersFilterContacts() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1774485671;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the owner and administrators.
     */
    public static class ChatMembersFilterAdministrators extends ChatMembersFilter {

        /**
         * Returns the owner and administrators.
         */
        public ChatMembersFilterAdministrators() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1266893796;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns all chat members, including restricted chat members.
     */
    public static class ChatMembersFilterMembers extends ChatMembersFilter {

        /**
         * Returns all chat members, including restricted chat members.
         */
        public ChatMembersFilterMembers() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 670504342;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns users which can be mentioned in the chat.
     */
    public static class ChatMembersFilterMention extends ChatMembersFilter {
        /**
         * Identifier of the topic in which the users will be mentioned; pass null if none.
         */
        public MessageTopic topicId;

        /**
         * Returns users which can be mentioned in the chat.
         */
        public ChatMembersFilterMention() {
        }

        /**
         * Returns users which can be mentioned in the chat.
         *
         * @param topicId Identifier of the topic in which the users will be mentioned; pass null if none.
         */
        public ChatMembersFilterMention(MessageTopic topicId) {
            this.topicId = topicId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1932296772;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns users under certain restrictions in the chat; can be used only by administrators in a supergroup.
     */
    public static class ChatMembersFilterRestricted extends ChatMembersFilter {

        /**
         * Returns users under certain restrictions in the chat; can be used only by administrators in a supergroup.
         */
        public ChatMembersFilterRestricted() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1256282813;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns users banned from the chat; can be used only by administrators in a supergroup or in a channel.
     */
    public static class ChatMembersFilterBanned extends ChatMembersFilter {

        /**
         * Returns users banned from the chat; can be used only by administrators in a supergroup or in a channel.
         */
        public ChatMembersFilterBanned() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1863102648;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns bot members of the chat.
     */
    public static class ChatMembersFilterBots extends ChatMembersFilter {

        /**
         * Returns bot members of the chat.
         */
        public ChatMembersFilterBots() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1422567288;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a message sender, which can be used to send messages in a chat.
     */
    public static class ChatMessageSender extends Object {
        /**
         * The message sender.
         */
        public MessageSender sender;
        /**
         * True, if Telegram Premium is needed to use the message sender.
         */
        public boolean needsPremium;

        /**
         * Represents a message sender, which can be used to send messages in a chat.
         */
        public ChatMessageSender() {
        }

        /**
         * Represents a message sender, which can be used to send messages in a chat.
         *
         * @param sender The message sender.
         * @param needsPremium True, if Telegram Premium is needed to use the message sender.
         */
        public ChatMessageSender(MessageSender sender, boolean needsPremium) {
            this.sender = sender;
            this.needsPremium = needsPremium;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 760590010;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of message senders, which can be used to send messages in a chat.
     */
    public static class ChatMessageSenders extends Object {
        /**
         * List of available message senders.
         */
        public ChatMessageSender[] senders;

        /**
         * Represents a list of message senders, which can be used to send messages in a chat.
         */
        public ChatMessageSenders() {
        }

        /**
         * Represents a list of message senders, which can be used to send messages in a chat.
         *
         * @param senders List of available message senders.
         */
        public ChatMessageSenders(ChatMessageSender[] senders) {
            this.senders = senders;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1866230970;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about notification settings for a chat or a forum topic.
     */
    public static class ChatNotificationSettings extends Object {
        /**
         * If true, the value for the relevant type of chat or the forum chat is used instead of muteFor.
         */
        public boolean useDefaultMuteFor;
        /**
         * Time left before notifications will be unmuted, in seconds.
         */
        public int muteFor;
        /**
         * If true, the value for the relevant type of chat or the forum chat is used instead of soundId.
         */
        public boolean useDefaultSound;
        /**
         * Identifier of the notification sound to be played for messages; 0 if sound is disabled.
         */
        public long soundId;
        /**
         * If true, the value for the relevant type of chat or the forum chat is used instead of showPreview.
         */
        public boolean useDefaultShowPreview;
        /**
         * True, if message content must be displayed in notifications.
         */
        public boolean showPreview;
        /**
         * If true, the value for the relevant type of chat is used instead of muteStories.
         */
        public boolean useDefaultMuteStories;
        /**
         * True, if story notifications are disabled for the chat.
         */
        public boolean muteStories;
        /**
         * If true, the value for the relevant type of chat is used instead of storySoundId.
         */
        public boolean useDefaultStorySound;
        /**
         * Identifier of the notification sound to be played for stories; 0 if sound is disabled.
         */
        public long storySoundId;
        /**
         * If true, the value for the relevant type of chat is used instead of showStoryPoster.
         */
        public boolean useDefaultShowStoryPoster;
        /**
         * True, if the chat that posted a story must be displayed in notifications.
         */
        public boolean showStoryPoster;
        /**
         * If true, the value for the relevant type of chat or the forum chat is used instead of disablePinnedMessageNotifications.
         */
        public boolean useDefaultDisablePinnedMessageNotifications;
        /**
         * If true, notifications for incoming pinned messages will be created as for an ordinary unread message.
         */
        public boolean disablePinnedMessageNotifications;
        /**
         * If true, the value for the relevant type of chat or the forum chat is used instead of disableMentionNotifications.
         */
        public boolean useDefaultDisableMentionNotifications;
        /**
         * If true, notifications for messages with mentions will be created as for an ordinary unread message.
         */
        public boolean disableMentionNotifications;

        /**
         * Contains information about notification settings for a chat or a forum topic.
         */
        public ChatNotificationSettings() {
        }

        /**
         * Contains information about notification settings for a chat or a forum topic.
         *
         * @param useDefaultMuteFor If true, the value for the relevant type of chat or the forum chat is used instead of muteFor.
         * @param muteFor Time left before notifications will be unmuted, in seconds.
         * @param useDefaultSound If true, the value for the relevant type of chat or the forum chat is used instead of soundId.
         * @param soundId Identifier of the notification sound to be played for messages; 0 if sound is disabled.
         * @param useDefaultShowPreview If true, the value for the relevant type of chat or the forum chat is used instead of showPreview.
         * @param showPreview True, if message content must be displayed in notifications.
         * @param useDefaultMuteStories If true, the value for the relevant type of chat is used instead of muteStories.
         * @param muteStories True, if story notifications are disabled for the chat.
         * @param useDefaultStorySound If true, the value for the relevant type of chat is used instead of storySoundId.
         * @param storySoundId Identifier of the notification sound to be played for stories; 0 if sound is disabled.
         * @param useDefaultShowStoryPoster If true, the value for the relevant type of chat is used instead of showStoryPoster.
         * @param showStoryPoster True, if the chat that posted a story must be displayed in notifications.
         * @param useDefaultDisablePinnedMessageNotifications If true, the value for the relevant type of chat or the forum chat is used instead of disablePinnedMessageNotifications.
         * @param disablePinnedMessageNotifications If true, notifications for incoming pinned messages will be created as for an ordinary unread message.
         * @param useDefaultDisableMentionNotifications If true, the value for the relevant type of chat or the forum chat is used instead of disableMentionNotifications.
         * @param disableMentionNotifications If true, notifications for messages with mentions will be created as for an ordinary unread message.
         */
        public ChatNotificationSettings(boolean useDefaultMuteFor, int muteFor, boolean useDefaultSound, long soundId, boolean useDefaultShowPreview, boolean showPreview, boolean useDefaultMuteStories, boolean muteStories, boolean useDefaultStorySound, long storySoundId, boolean useDefaultShowStoryPoster, boolean showStoryPoster, boolean useDefaultDisablePinnedMessageNotifications, boolean disablePinnedMessageNotifications, boolean useDefaultDisableMentionNotifications, boolean disableMentionNotifications) {
            this.useDefaultMuteFor = useDefaultMuteFor;
            this.muteFor = muteFor;
            this.useDefaultSound = useDefaultSound;
            this.soundId = soundId;
            this.useDefaultShowPreview = useDefaultShowPreview;
            this.showPreview = showPreview;
            this.useDefaultMuteStories = useDefaultMuteStories;
            this.muteStories = muteStories;
            this.useDefaultStorySound = useDefaultStorySound;
            this.storySoundId = storySoundId;
            this.useDefaultShowStoryPoster = useDefaultShowStoryPoster;
            this.showStoryPoster = showStoryPoster;
            this.useDefaultDisablePinnedMessageNotifications = useDefaultDisablePinnedMessageNotifications;
            this.disablePinnedMessageNotifications = disablePinnedMessageNotifications;
            this.useDefaultDisableMentionNotifications = useDefaultDisableMentionNotifications;
            this.disableMentionNotifications = disableMentionNotifications;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1459533846;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes actions that a user is allowed to take in a chat.
     */
    public static class ChatPermissions extends Object {
        /**
         * True, if the user can send text messages, contacts, giveaways, giveaway winners, invoices, locations, and venues.
         */
        public boolean canSendBasicMessages;
        /**
         * True, if the user can send music files.
         */
        public boolean canSendAudios;
        /**
         * True, if the user can send documents.
         */
        public boolean canSendDocuments;
        /**
         * True, if the user can send photos.
         */
        public boolean canSendPhotos;
        /**
         * True, if the user can send videos.
         */
        public boolean canSendVideos;
        /**
         * True, if the user can send video notes.
         */
        public boolean canSendVideoNotes;
        /**
         * True, if the user can send voice notes.
         */
        public boolean canSendVoiceNotes;
        /**
         * True, if the user can send polls and checklists.
         */
        public boolean canSendPolls;
        /**
         * True, if the user can send animations, games, stickers, and dice and use inline bots.
         */
        public boolean canSendOtherMessages;
        /**
         * True, if the user may add a link preview to their messages.
         */
        public boolean canAddLinkPreviews;
        /**
         * True, if the user can react to messages.
         */
        public boolean canReactToMessages;
        /**
         * True, if the user may change the tag of self.
         */
        public boolean canEditTag;
        /**
         * True, if the user can change the chat title, photo, and other settings.
         */
        public boolean canChangeInfo;
        /**
         * True, if the user can invite new users to the chat.
         */
        public boolean canInviteUsers;
        /**
         * True, if the user can pin messages.
         */
        public boolean canPinMessages;
        /**
         * True, if the user can create topics.
         */
        public boolean canCreateTopics;

        /**
         * Describes actions that a user is allowed to take in a chat.
         */
        public ChatPermissions() {
        }

        /**
         * Describes actions that a user is allowed to take in a chat.
         *
         * @param canSendBasicMessages True, if the user can send text messages, contacts, giveaways, giveaway winners, invoices, locations, and venues.
         * @param canSendAudios True, if the user can send music files.
         * @param canSendDocuments True, if the user can send documents.
         * @param canSendPhotos True, if the user can send photos.
         * @param canSendVideos True, if the user can send videos.
         * @param canSendVideoNotes True, if the user can send video notes.
         * @param canSendVoiceNotes True, if the user can send voice notes.
         * @param canSendPolls True, if the user can send polls and checklists.
         * @param canSendOtherMessages True, if the user can send animations, games, stickers, and dice and use inline bots.
         * @param canAddLinkPreviews True, if the user may add a link preview to their messages.
         * @param canReactToMessages True, if the user can react to messages.
         * @param canEditTag True, if the user may change the tag of self.
         * @param canChangeInfo True, if the user can change the chat title, photo, and other settings.
         * @param canInviteUsers True, if the user can invite new users to the chat.
         * @param canPinMessages True, if the user can pin messages.
         * @param canCreateTopics True, if the user can create topics.
         */
        public ChatPermissions(boolean canSendBasicMessages, boolean canSendAudios, boolean canSendDocuments, boolean canSendPhotos, boolean canSendVideos, boolean canSendVideoNotes, boolean canSendVoiceNotes, boolean canSendPolls, boolean canSendOtherMessages, boolean canAddLinkPreviews, boolean canReactToMessages, boolean canEditTag, boolean canChangeInfo, boolean canInviteUsers, boolean canPinMessages, boolean canCreateTopics) {
            this.canSendBasicMessages = canSendBasicMessages;
            this.canSendAudios = canSendAudios;
            this.canSendDocuments = canSendDocuments;
            this.canSendPhotos = canSendPhotos;
            this.canSendVideos = canSendVideos;
            this.canSendVideoNotes = canSendVideoNotes;
            this.canSendVoiceNotes = canSendVoiceNotes;
            this.canSendPolls = canSendPolls;
            this.canSendOtherMessages = canSendOtherMessages;
            this.canAddLinkPreviews = canAddLinkPreviews;
            this.canReactToMessages = canReactToMessages;
            this.canEditTag = canEditTag;
            this.canChangeInfo = canChangeInfo;
            this.canInviteUsers = canInviteUsers;
            this.canPinMessages = canPinMessages;
            this.canCreateTopics = canCreateTopics;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2007710412;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a chat or user profile photo.
     */
    public static class ChatPhoto extends Object {
        /**
         * Unique photo identifier.
         */
        public long id;
        /**
         * Point in time (Unix timestamp) when the photo has been added.
         */
        public int addedDate;
        /**
         * Photo minithumbnail; may be null.
         */
        @Nullable public Minithumbnail minithumbnail;
        /**
         * Available variants of the photo in JPEG format, in different size.
         */
        public PhotoSize[] sizes;
        /**
         * A big (up to 1280x1280) animated variant of the photo in MPEG4 format; may be null.
         */
        @Nullable public AnimatedChatPhoto animation;
        /**
         * A small (160x160) animated variant of the photo in MPEG4 format; may be null even if the big animation is available.
         */
        @Nullable public AnimatedChatPhoto smallAnimation;
        /**
         * Sticker-based version of the chat photo; may be null.
         */
        @Nullable public ChatPhotoSticker sticker;

        /**
         * Describes a chat or user profile photo.
         */
        public ChatPhoto() {
        }

        /**
         * Describes a chat or user profile photo.
         *
         * @param id Unique photo identifier.
         * @param addedDate Point in time (Unix timestamp) when the photo has been added.
         * @param minithumbnail Photo minithumbnail; may be null.
         * @param sizes Available variants of the photo in JPEG format, in different size.
         * @param animation A big (up to 1280x1280) animated variant of the photo in MPEG4 format; may be null.
         * @param smallAnimation A small (160x160) animated variant of the photo in MPEG4 format; may be null even if the big animation is available.
         * @param sticker Sticker-based version of the chat photo; may be null.
         */
        public ChatPhoto(long id, int addedDate, Minithumbnail minithumbnail, PhotoSize[] sizes, AnimatedChatPhoto animation, AnimatedChatPhoto smallAnimation, ChatPhotoSticker sticker) {
            this.id = id;
            this.addedDate = addedDate;
            this.minithumbnail = minithumbnail;
            this.sizes = sizes;
            this.animation = animation;
            this.smallAnimation = smallAnimation;
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1430870201;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains basic information about the photo of a chat.
     */
    public static class ChatPhotoInfo extends Object {
        /**
         * A small (160x160) chat photo variant in JPEG format. The file can be downloaded only before the photo is changed.
         */
        public File small;
        /**
         * A big (640x640) chat photo variant in JPEG format. The file can be downloaded only before the photo is changed.
         */
        public File big;
        /**
         * Chat photo minithumbnail; may be null.
         */
        @Nullable public Minithumbnail minithumbnail;
        /**
         * True, if the photo has animated variant.
         */
        public boolean hasAnimation;
        /**
         * True, if the photo is visible only for the current user.
         */
        public boolean isPersonal;

        /**
         * Contains basic information about the photo of a chat.
         */
        public ChatPhotoInfo() {
        }

        /**
         * Contains basic information about the photo of a chat.
         *
         * @param small A small (160x160) chat photo variant in JPEG format. The file can be downloaded only before the photo is changed.
         * @param big A big (640x640) chat photo variant in JPEG format. The file can be downloaded only before the photo is changed.
         * @param minithumbnail Chat photo minithumbnail; may be null.
         * @param hasAnimation True, if the photo has animated variant.
         * @param isPersonal True, if the photo is visible only for the current user.
         */
        public ChatPhotoInfo(File small, File big, Minithumbnail minithumbnail, boolean hasAnimation, boolean isPersonal) {
            this.small = small;
            this.big = big;
            this.minithumbnail = minithumbnail;
            this.hasAnimation = hasAnimation;
            this.isPersonal = isPersonal;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 281195686;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Information about the sticker, which was used to create the chat photo. The sticker is shown at the center of the photo and occupies at most 67% of it.
     */
    public static class ChatPhotoSticker extends Object {
        /**
         * Type of the sticker.
         */
        public ChatPhotoStickerType type;
        /**
         * The fill to be used as background for the sticker; rotation angle in backgroundFillGradient isn't supported.
         */
        public BackgroundFill backgroundFill;

        /**
         * Information about the sticker, which was used to create the chat photo. The sticker is shown at the center of the photo and occupies at most 67% of it.
         */
        public ChatPhotoSticker() {
        }

        /**
         * Information about the sticker, which was used to create the chat photo. The sticker is shown at the center of the photo and occupies at most 67% of it.
         *
         * @param type Type of the sticker.
         * @param backgroundFill The fill to be used as background for the sticker; rotation angle in backgroundFillGradient isn't supported.
         */
        public ChatPhotoSticker(ChatPhotoStickerType type, BackgroundFill backgroundFill) {
            this.type = type;
            this.backgroundFill = backgroundFill;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1459387485;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes type of sticker, which was used to create a chat photo.
     */
    public abstract static class ChatPhotoStickerType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ChatPhotoStickerTypeRegularOrMask.CONSTRUCTOR,
            ChatPhotoStickerTypeCustomEmoji.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ChatPhotoStickerType() {
        }
    }

    /**
     * Information about the sticker, which was used to create the chat photo.
     */
    public static class ChatPhotoStickerTypeRegularOrMask extends ChatPhotoStickerType {
        /**
         * Sticker set identifier.
         */
        public long stickerSetId;
        /**
         * Identifier of the sticker in the set.
         */
        public long stickerId;

        /**
         * Information about the sticker, which was used to create the chat photo.
         */
        public ChatPhotoStickerTypeRegularOrMask() {
        }

        /**
         * Information about the sticker, which was used to create the chat photo.
         *
         * @param stickerSetId Sticker set identifier.
         * @param stickerId Identifier of the sticker in the set.
         */
        public ChatPhotoStickerTypeRegularOrMask(long stickerSetId, long stickerId) {
            this.stickerSetId = stickerSetId;
            this.stickerId = stickerId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -415147620;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Information about the custom emoji, which was used to create the chat photo.
     */
    public static class ChatPhotoStickerTypeCustomEmoji extends ChatPhotoStickerType {
        /**
         * Identifier of the custom emoji.
         */
        public long customEmojiId;

        /**
         * Information about the custom emoji, which was used to create the chat photo.
         */
        public ChatPhotoStickerTypeCustomEmoji() {
        }

        /**
         * Information about the custom emoji, which was used to create the chat photo.
         *
         * @param customEmojiId Identifier of the custom emoji.
         */
        public ChatPhotoStickerTypeCustomEmoji(long customEmojiId) {
            this.customEmojiId = customEmojiId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -266224943;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of chat or user profile photos.
     */
    public static class ChatPhotos extends Object {
        /**
         * Total number of photos.
         */
        public int totalCount;
        /**
         * List of photos.
         */
        public ChatPhoto[] photos;

        /**
         * Contains a list of chat or user profile photos.
         */
        public ChatPhotos() {
        }

        /**
         * Contains a list of chat or user profile photos.
         *
         * @param totalCount Total number of photos.
         * @param photos List of photos.
         */
        public ChatPhotos(int totalCount, ChatPhoto[] photos) {
            this.totalCount = totalCount;
            this.photos = photos;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1510699180;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a position of a chat in a chat list.
     */
    public static class ChatPosition extends Object {
        /**
         * The chat list.
         */
        public ChatList list;
        /**
         * A parameter used to determine order of the chat in the chat list. Chats must be sorted by the pair (order, chat.id) in descending order.
         */
        public long order;
        /**
         * True, if the chat is pinned in the chat list.
         */
        public boolean isPinned;
        /**
         * Source of the chat in the chat list; may be null.
         */
        @Nullable public ChatSource source;

        /**
         * Describes a position of a chat in a chat list.
         */
        public ChatPosition() {
        }

        /**
         * Describes a position of a chat in a chat list.
         *
         * @param list The chat list.
         * @param order A parameter used to determine order of the chat in the chat list. Chats must be sorted by the pair (order, chat.id) in descending order.
         * @param isPinned True, if the chat is pinned in the chat list.
         * @param source Source of the chat in the chat list; may be null.
         */
        public ChatPosition(ChatList list, long order, boolean isPinned, ChatSource source) {
            this.list = list;
            this.order = order;
            this.isPinned = isPinned;
            this.source = source;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -622557355;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about revenue earned from sponsored messages in a chat.
     */
    public static class ChatRevenueAmount extends Object {
        /**
         * Cryptocurrency in which revenue is calculated.
         */
        public String cryptocurrency;
        /**
         * Total amount of the cryptocurrency earned, in the smallest units of the cryptocurrency.
         */
        public long totalAmount;
        /**
         * Amount of the cryptocurrency that isn't withdrawn yet, in the smallest units of the cryptocurrency.
         */
        public long balanceAmount;
        /**
         * Amount of the cryptocurrency available for withdrawal, in the smallest units of the cryptocurrency.
         */
        public long availableAmount;
        /**
         * True, if Telegram Stars can be withdrawn now or later.
         */
        public boolean withdrawalEnabled;

        /**
         * Contains information about revenue earned from sponsored messages in a chat.
         */
        public ChatRevenueAmount() {
        }

        /**
         * Contains information about revenue earned from sponsored messages in a chat.
         *
         * @param cryptocurrency Cryptocurrency in which revenue is calculated.
         * @param totalAmount Total amount of the cryptocurrency earned, in the smallest units of the cryptocurrency.
         * @param balanceAmount Amount of the cryptocurrency that isn't withdrawn yet, in the smallest units of the cryptocurrency.
         * @param availableAmount Amount of the cryptocurrency available for withdrawal, in the smallest units of the cryptocurrency.
         * @param withdrawalEnabled True, if Telegram Stars can be withdrawn now or later.
         */
        public ChatRevenueAmount(String cryptocurrency, long totalAmount, long balanceAmount, long availableAmount, boolean withdrawalEnabled) {
            this.cryptocurrency = cryptocurrency;
            this.totalAmount = totalAmount;
            this.balanceAmount = balanceAmount;
            this.availableAmount = availableAmount;
            this.withdrawalEnabled = withdrawalEnabled;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1505178024;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A detailed statistics about revenue earned from sponsored messages in a chat.
     */
    public static class ChatRevenueStatistics extends Object {
        /**
         * A graph containing amount of revenue in a given hour.
         */
        public StatisticalGraph revenueByHourGraph;
        /**
         * A graph containing amount of revenue.
         */
        public StatisticalGraph revenueGraph;
        /**
         * Amount of earned revenue.
         */
        public ChatRevenueAmount revenueAmount;
        /**
         * Current conversion rate of the cryptocurrency in which revenue is calculated to USD.
         */
        public double usdRate;

        /**
         * A detailed statistics about revenue earned from sponsored messages in a chat.
         */
        public ChatRevenueStatistics() {
        }

        /**
         * A detailed statistics about revenue earned from sponsored messages in a chat.
         *
         * @param revenueByHourGraph A graph containing amount of revenue in a given hour.
         * @param revenueGraph A graph containing amount of revenue.
         * @param revenueAmount Amount of earned revenue.
         * @param usdRate Current conversion rate of the cryptocurrency in which revenue is calculated to USD.
         */
        public ChatRevenueStatistics(StatisticalGraph revenueByHourGraph, StatisticalGraph revenueGraph, ChatRevenueAmount revenueAmount, double usdRate) {
            this.revenueByHourGraph = revenueByHourGraph;
            this.revenueGraph = revenueGraph;
            this.revenueAmount = revenueAmount;
            this.usdRate = usdRate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1667438779;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a chat revenue transactions.
     */
    public static class ChatRevenueTransaction extends Object {
        /**
         * Cryptocurrency in which revenue is calculated.
         */
        public String cryptocurrency;
        /**
         * The withdrawn amount, in the smallest units of the cryptocurrency.
         */
        public long cryptocurrencyAmount;
        /**
         * Type of the transaction.
         */
        public ChatRevenueTransactionType type;

        /**
         * Contains a chat revenue transactions.
         */
        public ChatRevenueTransaction() {
        }

        /**
         * Contains a chat revenue transactions.
         *
         * @param cryptocurrency Cryptocurrency in which revenue is calculated.
         * @param cryptocurrencyAmount The withdrawn amount, in the smallest units of the cryptocurrency.
         * @param type Type of the transaction.
         */
        public ChatRevenueTransaction(String cryptocurrency, long cryptocurrencyAmount, ChatRevenueTransactionType type) {
            this.cryptocurrency = cryptocurrency;
            this.cryptocurrencyAmount = cryptocurrencyAmount;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 80192767;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes type of transaction for revenue earned from sponsored messages in a chat.
     */
    public abstract static class ChatRevenueTransactionType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ChatRevenueTransactionTypeUnsupported.CONSTRUCTOR,
            ChatRevenueTransactionTypeSponsoredMessageEarnings.CONSTRUCTOR,
            ChatRevenueTransactionTypeSuggestedPostEarnings.CONSTRUCTOR,
            ChatRevenueTransactionTypeFragmentWithdrawal.CONSTRUCTOR,
            ChatRevenueTransactionTypeFragmentRefund.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ChatRevenueTransactionType() {
        }
    }

    /**
     * Describes an unsupported transaction.
     */
    public static class ChatRevenueTransactionTypeUnsupported extends ChatRevenueTransactionType {

        /**
         * Describes an unsupported transaction.
         */
        public ChatRevenueTransactionTypeUnsupported() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -27518756;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes earnings from sponsored messages in a chat in some time frame.
     */
    public static class ChatRevenueTransactionTypeSponsoredMessageEarnings extends ChatRevenueTransactionType {
        /**
         * Point in time (Unix timestamp) when the earnings started.
         */
        public int startDate;
        /**
         * Point in time (Unix timestamp) when the earnings ended.
         */
        public int endDate;

        /**
         * Describes earnings from sponsored messages in a chat in some time frame.
         */
        public ChatRevenueTransactionTypeSponsoredMessageEarnings() {
        }

        /**
         * Describes earnings from sponsored messages in a chat in some time frame.
         *
         * @param startDate Point in time (Unix timestamp) when the earnings started.
         * @param endDate Point in time (Unix timestamp) when the earnings ended.
         */
        public ChatRevenueTransactionTypeSponsoredMessageEarnings(int startDate, int endDate) {
            this.startDate = startDate;
            this.endDate = endDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1907391317;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes earnings from a published suggested post.
     */
    public static class ChatRevenueTransactionTypeSuggestedPostEarnings extends ChatRevenueTransactionType {
        /**
         * Identifier of the user who paid for the suggested post.
         */
        public long userId;

        /**
         * Describes earnings from a published suggested post.
         */
        public ChatRevenueTransactionTypeSuggestedPostEarnings() {
        }

        /**
         * Describes earnings from a published suggested post.
         *
         * @param userId Identifier of the user who paid for the suggested post.
         */
        public ChatRevenueTransactionTypeSuggestedPostEarnings(long userId) {
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1252049103;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a withdrawal of earnings through Fragment.
     */
    public static class ChatRevenueTransactionTypeFragmentWithdrawal extends ChatRevenueTransactionType {
        /**
         * Point in time (Unix timestamp) when the earnings withdrawal started.
         */
        public int withdrawalDate;
        /**
         * State of the withdrawal.
         */
        public RevenueWithdrawalState state;

        /**
         * Describes a withdrawal of earnings through Fragment.
         */
        public ChatRevenueTransactionTypeFragmentWithdrawal() {
        }

        /**
         * Describes a withdrawal of earnings through Fragment.
         *
         * @param withdrawalDate Point in time (Unix timestamp) when the earnings withdrawal started.
         * @param state State of the withdrawal.
         */
        public ChatRevenueTransactionTypeFragmentWithdrawal(int withdrawalDate, RevenueWithdrawalState state) {
            this.withdrawalDate = withdrawalDate;
            this.state = state;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 327153867;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a refund for failed withdrawal of earnings through Fragment.
     */
    public static class ChatRevenueTransactionTypeFragmentRefund extends ChatRevenueTransactionType {
        /**
         * Point in time (Unix timestamp) when the transaction was refunded.
         */
        public int refundDate;

        /**
         * Describes a refund for failed withdrawal of earnings through Fragment.
         */
        public ChatRevenueTransactionTypeFragmentRefund() {
        }

        /**
         * Describes a refund for failed withdrawal of earnings through Fragment.
         *
         * @param refundDate Point in time (Unix timestamp) when the transaction was refunded.
         */
        public ChatRevenueTransactionTypeFragmentRefund(int refundDate) {
            this.refundDate = refundDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1488694273;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of chat revenue transactions.
     */
    public static class ChatRevenueTransactions extends Object {
        /**
         * The amount of owned Toncoins; in the smallest units of the cryptocurrency.
         */
        public long tonAmount;
        /**
         * List of transactions.
         */
        public ChatRevenueTransaction[] transactions;
        /**
         * The offset for the next request. If empty, then there are no more results.
         */
        public String nextOffset;

        /**
         * Contains a list of chat revenue transactions.
         */
        public ChatRevenueTransactions() {
        }

        /**
         * Contains a list of chat revenue transactions.
         *
         * @param tonAmount The amount of owned Toncoins; in the smallest units of the cryptocurrency.
         * @param transactions List of transactions.
         * @param nextOffset The offset for the next request. If empty, then there are no more results.
         */
        public ChatRevenueTransactions(long tonAmount, ChatRevenueTransaction[] transactions, String nextOffset) {
            this.tonAmount = tonAmount;
            this.transactions = transactions;
            this.nextOffset = nextOffset;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2017122771;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a reason why an external chat is shown in a chat list.
     */
    public abstract static class ChatSource extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ChatSourceMtprotoProxy.CONSTRUCTOR,
            ChatSourcePublicServiceAnnouncement.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ChatSource() {
        }
    }

    /**
     * The chat is sponsored by the user's MTProxy server.
     */
    public static class ChatSourceMtprotoProxy extends ChatSource {

        /**
         * The chat is sponsored by the user's MTProxy server.
         */
        public ChatSourceMtprotoProxy() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 394074115;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat contains a public service announcement.
     */
    public static class ChatSourcePublicServiceAnnouncement extends ChatSource {
        /**
         * The type of the announcement.
         */
        public String type;
        /**
         * The text of the announcement.
         */
        public String text;

        /**
         * The chat contains a public service announcement.
         */
        public ChatSourcePublicServiceAnnouncement() {
        }

        /**
         * The chat contains a public service announcement.
         *
         * @param type The type of the announcement.
         * @param text The text of the announcement.
         */
        public ChatSourcePublicServiceAnnouncement(String type, String text) {
            this.type = type;
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -328571244;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains a detailed statistics about a chat.
     */
    public abstract static class ChatStatistics extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ChatStatisticsSupergroup.CONSTRUCTOR,
            ChatStatisticsChannel.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ChatStatistics() {
        }
    }

    /**
     * A detailed statistics about a supergroup chat.
     */
    public static class ChatStatisticsSupergroup extends ChatStatistics {
        /**
         * A period to which the statistics applies.
         */
        public DateRange period;
        /**
         * Number of members in the chat.
         */
        public StatisticalValue memberCount;
        /**
         * Number of messages sent to the chat.
         */
        public StatisticalValue messageCount;
        /**
         * Number of users who viewed messages in the chat.
         */
        public StatisticalValue viewerCount;
        /**
         * Number of users who sent messages to the chat.
         */
        public StatisticalValue senderCount;
        /**
         * A graph containing number of members in the chat.
         */
        public StatisticalGraph memberCountGraph;
        /**
         * A graph containing number of members joined and left the chat.
         */
        public StatisticalGraph joinGraph;
        /**
         * A graph containing number of new member joins per source.
         */
        public StatisticalGraph joinBySourceGraph;
        /**
         * A graph containing distribution of active users per language.
         */
        public StatisticalGraph languageGraph;
        /**
         * A graph containing distribution of sent messages by content type.
         */
        public StatisticalGraph messageContentGraph;
        /**
         * A graph containing number of different actions in the chat.
         */
        public StatisticalGraph actionGraph;
        /**
         * A graph containing distribution of message views per hour.
         */
        public StatisticalGraph dayGraph;
        /**
         * A graph containing distribution of message views per day of week.
         */
        public StatisticalGraph weekGraph;
        /**
         * List of users sent most messages in the last week.
         */
        public ChatStatisticsMessageSenderInfo[] topSenders;
        /**
         * List of most active administrators in the last week.
         */
        public ChatStatisticsAdministratorActionsInfo[] topAdministrators;
        /**
         * List of most active inviters of new members in the last week.
         */
        public ChatStatisticsInviterInfo[] topInviters;

        /**
         * A detailed statistics about a supergroup chat.
         */
        public ChatStatisticsSupergroup() {
        }

        /**
         * A detailed statistics about a supergroup chat.
         *
         * @param period A period to which the statistics applies.
         * @param memberCount Number of members in the chat.
         * @param messageCount Number of messages sent to the chat.
         * @param viewerCount Number of users who viewed messages in the chat.
         * @param senderCount Number of users who sent messages to the chat.
         * @param memberCountGraph A graph containing number of members in the chat.
         * @param joinGraph A graph containing number of members joined and left the chat.
         * @param joinBySourceGraph A graph containing number of new member joins per source.
         * @param languageGraph A graph containing distribution of active users per language.
         * @param messageContentGraph A graph containing distribution of sent messages by content type.
         * @param actionGraph A graph containing number of different actions in the chat.
         * @param dayGraph A graph containing distribution of message views per hour.
         * @param weekGraph A graph containing distribution of message views per day of week.
         * @param topSenders List of users sent most messages in the last week.
         * @param topAdministrators List of most active administrators in the last week.
         * @param topInviters List of most active inviters of new members in the last week.
         */
        public ChatStatisticsSupergroup(DateRange period, StatisticalValue memberCount, StatisticalValue messageCount, StatisticalValue viewerCount, StatisticalValue senderCount, StatisticalGraph memberCountGraph, StatisticalGraph joinGraph, StatisticalGraph joinBySourceGraph, StatisticalGraph languageGraph, StatisticalGraph messageContentGraph, StatisticalGraph actionGraph, StatisticalGraph dayGraph, StatisticalGraph weekGraph, ChatStatisticsMessageSenderInfo[] topSenders, ChatStatisticsAdministratorActionsInfo[] topAdministrators, ChatStatisticsInviterInfo[] topInviters) {
            this.period = period;
            this.memberCount = memberCount;
            this.messageCount = messageCount;
            this.viewerCount = viewerCount;
            this.senderCount = senderCount;
            this.memberCountGraph = memberCountGraph;
            this.joinGraph = joinGraph;
            this.joinBySourceGraph = joinBySourceGraph;
            this.languageGraph = languageGraph;
            this.messageContentGraph = messageContentGraph;
            this.actionGraph = actionGraph;
            this.dayGraph = dayGraph;
            this.weekGraph = weekGraph;
            this.topSenders = topSenders;
            this.topAdministrators = topAdministrators;
            this.topInviters = topInviters;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -17244633;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A detailed statistics about a channel chat.
     */
    public static class ChatStatisticsChannel extends ChatStatistics {
        /**
         * A period to which the statistics applies.
         */
        public DateRange period;
        /**
         * Number of members in the chat.
         */
        public StatisticalValue memberCount;
        /**
         * Mean number of times the recently sent messages were viewed.
         */
        public StatisticalValue meanMessageViewCount;
        /**
         * Mean number of times the recently sent messages were shared.
         */
        public StatisticalValue meanMessageShareCount;
        /**
         * Mean number of times reactions were added to the recently sent messages.
         */
        public StatisticalValue meanMessageReactionCount;
        /**
         * Mean number of times the recently posted stories were viewed.
         */
        public StatisticalValue meanStoryViewCount;
        /**
         * Mean number of times the recently posted stories were shared.
         */
        public StatisticalValue meanStoryShareCount;
        /**
         * Mean number of times reactions were added to the recently posted stories.
         */
        public StatisticalValue meanStoryReactionCount;
        /**
         * A percentage of users with enabled notifications for the chat; 0-100.
         */
        public double enabledNotificationsPercentage;
        /**
         * A graph containing number of members in the chat.
         */
        public StatisticalGraph memberCountGraph;
        /**
         * A graph containing number of members joined and left the chat.
         */
        public StatisticalGraph joinGraph;
        /**
         * A graph containing number of members muted and unmuted the chat.
         */
        public StatisticalGraph muteGraph;
        /**
         * A graph containing number of message views in a given hour in the last two weeks.
         */
        public StatisticalGraph viewCountByHourGraph;
        /**
         * A graph containing number of message views per source.
         */
        public StatisticalGraph viewCountBySourceGraph;
        /**
         * A graph containing number of new member joins per source.
         */
        public StatisticalGraph joinBySourceGraph;
        /**
         * A graph containing number of users viewed chat messages per language.
         */
        public StatisticalGraph languageGraph;
        /**
         * A graph containing number of chat message views and shares.
         */
        public StatisticalGraph messageInteractionGraph;
        /**
         * A graph containing number of reactions on messages.
         */
        public StatisticalGraph messageReactionGraph;
        /**
         * A graph containing number of story views and shares.
         */
        public StatisticalGraph storyInteractionGraph;
        /**
         * A graph containing number of reactions on stories.
         */
        public StatisticalGraph storyReactionGraph;
        /**
         * A graph containing number of views of associated with the chat instant views.
         */
        public StatisticalGraph instantViewInteractionGraph;
        /**
         * Detailed statistics about number of views and shares of recently sent messages and posted stories.
         */
        public ChatStatisticsInteractionInfo[] recentInteractions;

        /**
         * A detailed statistics about a channel chat.
         */
        public ChatStatisticsChannel() {
        }

        /**
         * A detailed statistics about a channel chat.
         *
         * @param period A period to which the statistics applies.
         * @param memberCount Number of members in the chat.
         * @param meanMessageViewCount Mean number of times the recently sent messages were viewed.
         * @param meanMessageShareCount Mean number of times the recently sent messages were shared.
         * @param meanMessageReactionCount Mean number of times reactions were added to the recently sent messages.
         * @param meanStoryViewCount Mean number of times the recently posted stories were viewed.
         * @param meanStoryShareCount Mean number of times the recently posted stories were shared.
         * @param meanStoryReactionCount Mean number of times reactions were added to the recently posted stories.
         * @param enabledNotificationsPercentage A percentage of users with enabled notifications for the chat; 0-100.
         * @param memberCountGraph A graph containing number of members in the chat.
         * @param joinGraph A graph containing number of members joined and left the chat.
         * @param muteGraph A graph containing number of members muted and unmuted the chat.
         * @param viewCountByHourGraph A graph containing number of message views in a given hour in the last two weeks.
         * @param viewCountBySourceGraph A graph containing number of message views per source.
         * @param joinBySourceGraph A graph containing number of new member joins per source.
         * @param languageGraph A graph containing number of users viewed chat messages per language.
         * @param messageInteractionGraph A graph containing number of chat message views and shares.
         * @param messageReactionGraph A graph containing number of reactions on messages.
         * @param storyInteractionGraph A graph containing number of story views and shares.
         * @param storyReactionGraph A graph containing number of reactions on stories.
         * @param instantViewInteractionGraph A graph containing number of views of associated with the chat instant views.
         * @param recentInteractions Detailed statistics about number of views and shares of recently sent messages and posted stories.
         */
        public ChatStatisticsChannel(DateRange period, StatisticalValue memberCount, StatisticalValue meanMessageViewCount, StatisticalValue meanMessageShareCount, StatisticalValue meanMessageReactionCount, StatisticalValue meanStoryViewCount, StatisticalValue meanStoryShareCount, StatisticalValue meanStoryReactionCount, double enabledNotificationsPercentage, StatisticalGraph memberCountGraph, StatisticalGraph joinGraph, StatisticalGraph muteGraph, StatisticalGraph viewCountByHourGraph, StatisticalGraph viewCountBySourceGraph, StatisticalGraph joinBySourceGraph, StatisticalGraph languageGraph, StatisticalGraph messageInteractionGraph, StatisticalGraph messageReactionGraph, StatisticalGraph storyInteractionGraph, StatisticalGraph storyReactionGraph, StatisticalGraph instantViewInteractionGraph, ChatStatisticsInteractionInfo[] recentInteractions) {
            this.period = period;
            this.memberCount = memberCount;
            this.meanMessageViewCount = meanMessageViewCount;
            this.meanMessageShareCount = meanMessageShareCount;
            this.meanMessageReactionCount = meanMessageReactionCount;
            this.meanStoryViewCount = meanStoryViewCount;
            this.meanStoryShareCount = meanStoryShareCount;
            this.meanStoryReactionCount = meanStoryReactionCount;
            this.enabledNotificationsPercentage = enabledNotificationsPercentage;
            this.memberCountGraph = memberCountGraph;
            this.joinGraph = joinGraph;
            this.muteGraph = muteGraph;
            this.viewCountByHourGraph = viewCountByHourGraph;
            this.viewCountBySourceGraph = viewCountBySourceGraph;
            this.joinBySourceGraph = joinBySourceGraph;
            this.languageGraph = languageGraph;
            this.messageInteractionGraph = messageInteractionGraph;
            this.messageReactionGraph = messageReactionGraph;
            this.storyInteractionGraph = storyInteractionGraph;
            this.storyReactionGraph = storyReactionGraph;
            this.instantViewInteractionGraph = instantViewInteractionGraph;
            this.recentInteractions = recentInteractions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1375151660;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains statistics about administrator actions done by a user.
     */
    public static class ChatStatisticsAdministratorActionsInfo extends Object {
        /**
         * Administrator user identifier.
         */
        public long userId;
        /**
         * Number of messages deleted by the administrator.
         */
        public int deletedMessageCount;
        /**
         * Number of users banned by the administrator.
         */
        public int bannedUserCount;
        /**
         * Number of users restricted by the administrator.
         */
        public int restrictedUserCount;

        /**
         * Contains statistics about administrator actions done by a user.
         */
        public ChatStatisticsAdministratorActionsInfo() {
        }

        /**
         * Contains statistics about administrator actions done by a user.
         *
         * @param userId Administrator user identifier.
         * @param deletedMessageCount Number of messages deleted by the administrator.
         * @param bannedUserCount Number of users banned by the administrator.
         * @param restrictedUserCount Number of users restricted by the administrator.
         */
        public ChatStatisticsAdministratorActionsInfo(long userId, int deletedMessageCount, int bannedUserCount, int restrictedUserCount) {
            this.userId = userId;
            this.deletedMessageCount = deletedMessageCount;
            this.bannedUserCount = bannedUserCount;
            this.restrictedUserCount = restrictedUserCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -406467202;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains statistics about interactions with a message sent in the chat or a story posted on behalf of the chat.
     */
    public static class ChatStatisticsInteractionInfo extends Object {
        /**
         * Type of the object.
         */
        public ChatStatisticsObjectType objectType;
        /**
         * Number of times the object was viewed.
         */
        public int viewCount;
        /**
         * Number of times the object was forwarded.
         */
        public int forwardCount;
        /**
         * Number of times reactions were added to the object.
         */
        public int reactionCount;

        /**
         * Contains statistics about interactions with a message sent in the chat or a story posted on behalf of the chat.
         */
        public ChatStatisticsInteractionInfo() {
        }

        /**
         * Contains statistics about interactions with a message sent in the chat or a story posted on behalf of the chat.
         *
         * @param objectType Type of the object.
         * @param viewCount Number of times the object was viewed.
         * @param forwardCount Number of times the object was forwarded.
         * @param reactionCount Number of times reactions were added to the object.
         */
        public ChatStatisticsInteractionInfo(ChatStatisticsObjectType objectType, int viewCount, int forwardCount, int reactionCount) {
            this.objectType = objectType;
            this.viewCount = viewCount;
            this.forwardCount = forwardCount;
            this.reactionCount = reactionCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1766496909;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains statistics about number of new members invited by a user.
     */
    public static class ChatStatisticsInviterInfo extends Object {
        /**
         * User identifier.
         */
        public long userId;
        /**
         * Number of new members invited by the user.
         */
        public int addedMemberCount;

        /**
         * Contains statistics about number of new members invited by a user.
         */
        public ChatStatisticsInviterInfo() {
        }

        /**
         * Contains statistics about number of new members invited by a user.
         *
         * @param userId User identifier.
         * @param addedMemberCount Number of new members invited by the user.
         */
        public ChatStatisticsInviterInfo(long userId, int addedMemberCount) {
            this.userId = userId;
            this.addedMemberCount = addedMemberCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 629396619;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains statistics about messages sent by a user.
     */
    public static class ChatStatisticsMessageSenderInfo extends Object {
        /**
         * User identifier.
         */
        public long userId;
        /**
         * Number of sent messages.
         */
        public int sentMessageCount;
        /**
         * Average number of characters in sent messages; 0 if unknown.
         */
        public int averageCharacterCount;

        /**
         * Contains statistics about messages sent by a user.
         */
        public ChatStatisticsMessageSenderInfo() {
        }

        /**
         * Contains statistics about messages sent by a user.
         *
         * @param userId User identifier.
         * @param sentMessageCount Number of sent messages.
         * @param averageCharacterCount Average number of characters in sent messages; 0 if unknown.
         */
        public ChatStatisticsMessageSenderInfo(long userId, int sentMessageCount, int averageCharacterCount) {
            this.userId = userId;
            this.sentMessageCount = sentMessageCount;
            this.averageCharacterCount = averageCharacterCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1762295371;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes type of object, for which statistics are provided.
     */
    public abstract static class ChatStatisticsObjectType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ChatStatisticsObjectTypeMessage.CONSTRUCTOR,
            ChatStatisticsObjectTypeStory.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ChatStatisticsObjectType() {
        }
    }

    /**
     * Describes a message sent in the chat.
     */
    public static class ChatStatisticsObjectTypeMessage extends ChatStatisticsObjectType {
        /**
         * Message identifier.
         */
        public long messageId;

        /**
         * Describes a message sent in the chat.
         */
        public ChatStatisticsObjectTypeMessage() {
        }

        /**
         * Describes a message sent in the chat.
         *
         * @param messageId Message identifier.
         */
        public ChatStatisticsObjectTypeMessage(long messageId) {
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1872700662;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a story posted on behalf of the chat.
     */
    public static class ChatStatisticsObjectTypeStory extends ChatStatisticsObjectType {
        /**
         * Story identifier.
         */
        public int storyId;

        /**
         * Describes a story posted on behalf of the chat.
         */
        public ChatStatisticsObjectTypeStory() {
        }

        /**
         * Describes a story posted on behalf of the chat.
         *
         * @param storyId Story identifier.
         */
        public ChatStatisticsObjectTypeStory(int storyId) {
            this.storyId = storyId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 364575152;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a chat theme.
     */
    public abstract static class ChatTheme extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ChatThemeEmoji.CONSTRUCTOR,
            ChatThemeGift.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ChatTheme() {
        }
    }

    /**
     * A chat theme based on an emoji.
     */
    public static class ChatThemeEmoji extends ChatTheme {
        /**
         * Name of the theme; full theme description is received through updateEmojiChatThemes.
         */
        public String name;

        /**
         * A chat theme based on an emoji.
         */
        public ChatThemeEmoji() {
        }

        /**
         * A chat theme based on an emoji.
         *
         * @param name Name of the theme; full theme description is received through updateEmojiChatThemes.
         */
        public ChatThemeEmoji(String name) {
            this.name = name;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1863920197;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat theme based on an upgraded gift.
     */
    public static class ChatThemeGift extends ChatTheme {
        /**
         * The chat theme.
         */
        public GiftChatTheme giftTheme;

        /**
         * A chat theme based on an upgraded gift.
         */
        public ChatThemeGift() {
        }

        /**
         * A chat theme based on an upgraded gift.
         *
         * @param giftTheme The chat theme.
         */
        public ChatThemeGift(GiftChatTheme giftTheme) {
            this.giftTheme = giftTheme;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 19728441;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the type of chat.
     */
    public abstract static class ChatType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ChatTypePrivate.CONSTRUCTOR,
            ChatTypeBasicGroup.CONSTRUCTOR,
            ChatTypeSupergroup.CONSTRUCTOR,
            ChatTypeSecret.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ChatType() {
        }
    }

    /**
     * An ordinary chat with a user.
     */
    public static class ChatTypePrivate extends ChatType {
        /**
         * User identifier.
         */
        public long userId;

        /**
         * An ordinary chat with a user.
         */
        public ChatTypePrivate() {
        }

        /**
         * An ordinary chat with a user.
         *
         * @param userId User identifier.
         */
        public ChatTypePrivate(long userId) {
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1579049844;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A basic group (a chat with 0-200 other users).
     */
    public static class ChatTypeBasicGroup extends ChatType {
        /**
         * Basic group identifier.
         */
        public long basicGroupId;

        /**
         * A basic group (a chat with 0-200 other users).
         */
        public ChatTypeBasicGroup() {
        }

        /**
         * A basic group (a chat with 0-200 other users).
         *
         * @param basicGroupId Basic group identifier.
         */
        public ChatTypeBasicGroup(long basicGroupId) {
            this.basicGroupId = basicGroupId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 973884508;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A supergroup or channel (with unlimited members).
     */
    public static class ChatTypeSupergroup extends ChatType {
        /**
         * Supergroup or channel identifier.
         */
        public long supergroupId;
        /**
         * True, if the supergroup is a channel.
         */
        public boolean isChannel;

        /**
         * A supergroup or channel (with unlimited members).
         */
        public ChatTypeSupergroup() {
        }

        /**
         * A supergroup or channel (with unlimited members).
         *
         * @param supergroupId Supergroup or channel identifier.
         * @param isChannel True, if the supergroup is a channel.
         */
        public ChatTypeSupergroup(long supergroupId, boolean isChannel) {
            this.supergroupId = supergroupId;
            this.isChannel = isChannel;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1472570774;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A secret chat with a user.
     */
    public static class ChatTypeSecret extends ChatType {
        /**
         * Secret chat identifier.
         */
        public int secretChatId;
        /**
         * User identifier of the other user in the secret chat.
         */
        public long userId;

        /**
         * A secret chat with a user.
         */
        public ChatTypeSecret() {
        }

        /**
         * A secret chat with a user.
         *
         * @param secretChatId Secret chat identifier.
         * @param userId User identifier of the other user in the secret chat.
         */
        public ChatTypeSecret(int secretChatId, long userId) {
            this.secretChatId = secretChatId;
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 862366513;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of chats.
     */
    public static class Chats extends Object {
        /**
         * Approximate total number of chats found.
         */
        public int totalCount;
        /**
         * List of chat identifiers.
         */
        public long[] chatIds;

        /**
         * Represents a list of chats.
         */
        public Chats() {
        }

        /**
         * Represents a list of chats.
         *
         * @param totalCount Approximate total number of chats found.
         * @param chatIds List of chat identifiers.
         */
        public Chats(int totalCount, long[] chatIds) {
            this.totalCount = totalCount;
            this.chatIds = chatIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1809654812;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents result of checking whether a username can be set for a chat.
     */
    public abstract static class CheckChatUsernameResult extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            CheckChatUsernameResultOk.CONSTRUCTOR,
            CheckChatUsernameResultUsernameInvalid.CONSTRUCTOR,
            CheckChatUsernameResultUsernameOccupied.CONSTRUCTOR,
            CheckChatUsernameResultUsernamePurchasable.CONSTRUCTOR,
            CheckChatUsernameResultPublicChatsTooMany.CONSTRUCTOR,
            CheckChatUsernameResultPublicGroupsUnavailable.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public CheckChatUsernameResult() {
        }
    }

    /**
     * The username can be set.
     */
    public static class CheckChatUsernameResultOk extends CheckChatUsernameResult {

        /**
         * The username can be set.
         */
        public CheckChatUsernameResultOk() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1498956964;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The username is invalid.
     */
    public static class CheckChatUsernameResultUsernameInvalid extends CheckChatUsernameResult {

        /**
         * The username is invalid.
         */
        public CheckChatUsernameResultUsernameInvalid() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -636979370;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The username is occupied.
     */
    public static class CheckChatUsernameResultUsernameOccupied extends CheckChatUsernameResult {

        /**
         * The username is occupied.
         */
        public CheckChatUsernameResultUsernameOccupied() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1320892201;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The username can be purchased at https://fragment.com. Information about the username can be received using getCollectibleItemInfo.
     */
    public static class CheckChatUsernameResultUsernamePurchasable extends CheckChatUsernameResult {

        /**
         * The username can be purchased at https://fragment.com. Information about the username can be received using getCollectibleItemInfo.
         */
        public CheckChatUsernameResultUsernamePurchasable() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 5885529;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user has too many chats with username, one of them must be made private first.
     */
    public static class CheckChatUsernameResultPublicChatsTooMany extends CheckChatUsernameResult {

        /**
         * The user has too many chats with username, one of them must be made private first.
         */
        public CheckChatUsernameResultPublicChatsTooMany() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -659264388;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user can't be a member of a public supergroup.
     */
    public static class CheckChatUsernameResultPublicGroupsUnavailable extends CheckChatUsernameResult {

        /**
         * The user can't be a member of a public supergroup.
         */
        public CheckChatUsernameResultPublicGroupsUnavailable() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -51833641;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents result of checking whether a name can be used for a new sticker set.
     */
    public abstract static class CheckStickerSetNameResult extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            CheckStickerSetNameResultOk.CONSTRUCTOR,
            CheckStickerSetNameResultNameInvalid.CONSTRUCTOR,
            CheckStickerSetNameResultNameOccupied.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public CheckStickerSetNameResult() {
        }
    }

    /**
     * The name can be set.
     */
    public static class CheckStickerSetNameResultOk extends CheckStickerSetNameResult {

        /**
         * The name can be set.
         */
        public CheckStickerSetNameResultOk() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1404308904;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The name is invalid.
     */
    public static class CheckStickerSetNameResultNameInvalid extends CheckStickerSetNameResult {

        /**
         * The name is invalid.
         */
        public CheckStickerSetNameResultNameInvalid() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 177992244;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The name is occupied.
     */
    public static class CheckStickerSetNameResultNameOccupied extends CheckStickerSetNameResult {

        /**
         * The name is occupied.
         */
        public CheckStickerSetNameResultNameOccupied() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1012980872;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a checklist.
     */
    public static class Checklist extends Object {
        /**
         * Title of the checklist; may contain only Bold, Italic, Underline, Strikethrough, Spoiler, CustomEmoji, and DateTime entities.
         */
        public FormattedText title;
        /**
         * List of tasks in the checklist.
         */
        public ChecklistTask[] tasks;
        /**
         * True, if users other than creator of the list can add tasks to the list.
         */
        public boolean othersCanAddTasks;
        /**
         * True, if the current user can add tasks to the list if they have Telegram Premium subscription.
         */
        public boolean canAddTasks;
        /**
         * True, if users other than creator of the list can mark tasks as done or not done. If true, then the checklist is called &quot;group checklist&quot;.
         */
        public boolean othersCanMarkTasksAsDone;
        /**
         * True, if the current user can mark tasks as done or not done if they have Telegram Premium subscription.
         */
        public boolean canMarkTasksAsDone;

        /**
         * Describes a checklist.
         */
        public Checklist() {
        }

        /**
         * Describes a checklist.
         *
         * @param title Title of the checklist; may contain only Bold, Italic, Underline, Strikethrough, Spoiler, CustomEmoji, and DateTime entities.
         * @param tasks List of tasks in the checklist.
         * @param othersCanAddTasks True, if users other than creator of the list can add tasks to the list.
         * @param canAddTasks True, if the current user can add tasks to the list if they have Telegram Premium subscription.
         * @param othersCanMarkTasksAsDone True, if users other than creator of the list can mark tasks as done or not done. If true, then the checklist is called &quot;group checklist&quot;.
         * @param canMarkTasksAsDone True, if the current user can mark tasks as done or not done if they have Telegram Premium subscription.
         */
        public Checklist(FormattedText title, ChecklistTask[] tasks, boolean othersCanAddTasks, boolean canAddTasks, boolean othersCanMarkTasksAsDone, boolean canMarkTasksAsDone) {
            this.title = title;
            this.tasks = tasks;
            this.othersCanAddTasks = othersCanAddTasks;
            this.canAddTasks = canAddTasks;
            this.othersCanMarkTasksAsDone = othersCanMarkTasksAsDone;
            this.canMarkTasksAsDone = canMarkTasksAsDone;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -987598247;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a task in a checklist.
     */
    public static class ChecklistTask extends Object {
        /**
         * Unique identifier of the task.
         */
        public int id;
        /**
         * Text of the task; may contain only Bold, Italic, Underline, Strikethrough, Spoiler, CustomEmoji, DateTime and automatically found entities.
         */
        public FormattedText text;
        /**
         * Identifier of the user or chat that completed the task; may be null if the task isn't completed yet.
         */
        @Nullable public MessageSender completedBy;
        /**
         * Point in time (Unix timestamp) when the task was completed; 0 if the task isn't completed.
         */
        public int completionDate;

        /**
         * Describes a task in a checklist.
         */
        public ChecklistTask() {
        }

        /**
         * Describes a task in a checklist.
         *
         * @param id Unique identifier of the task.
         * @param text Text of the task; may contain only Bold, Italic, Underline, Strikethrough, Spoiler, CustomEmoji, DateTime and automatically found entities.
         * @param completedBy Identifier of the user or chat that completed the task; may be null if the task isn't completed yet.
         * @param completionDate Point in time (Unix timestamp) when the task was completed; 0 if the task isn't completed.
         */
        public ChecklistTask(int id, FormattedText text, MessageSender completedBy, int completionDate) {
            this.id = id;
            this.text = text;
            this.completedBy = completedBy;
            this.completionDate = completionDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 464950512;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a user who had or will have a birthday soon.
     */
    public static class CloseBirthdayUser extends Object {
        /**
         * User identifier.
         */
        public long userId;
        /**
         * Birthdate of the user.
         */
        public Birthdate birthdate;

        /**
         * Describes a user who had or will have a birthday soon.
         */
        public CloseBirthdayUser() {
        }

        /**
         * Describes a user who had or will have a birthday soon.
         *
         * @param userId User identifier.
         * @param birthdate Birthdate of the user.
         */
        public CloseBirthdayUser(long userId, Birthdate birthdate) {
            this.userId = userId;
            this.birthdate = birthdate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2147067410;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a closed vector path. The path begins at the end point of the last command. The coordinate system origin is in the upper-left corner.
     */
    public static class ClosedVectorPath extends Object {
        /**
         * List of vector path commands.
         */
        public VectorPathCommand[] commands;

        /**
         * Represents a closed vector path. The path begins at the end point of the last command. The coordinate system origin is in the upper-left corner.
         */
        public ClosedVectorPath() {
        }

        /**
         * Represents a closed vector path. The path begins at the end point of the last command. The coordinate system origin is in the upper-left corner.
         *
         * @param commands List of vector path commands.
         */
        public ClosedVectorPath(VectorPathCommand[] commands) {
            this.commands = commands;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 589951657;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a collectible item and its last purchase.
     */
    public static class CollectibleItemInfo extends Object {
        /**
         * Point in time (Unix timestamp) when the item was purchased.
         */
        public int purchaseDate;
        /**
         * Currency for the paid amount.
         */
        public String currency;
        /**
         * The paid amount, in the smallest units of the currency.
         */
        public long amount;
        /**
         * Cryptocurrency used to pay for the item.
         */
        public String cryptocurrency;
        /**
         * The paid amount, in the smallest units of the cryptocurrency.
         */
        public long cryptocurrencyAmount;
        /**
         * Individual URL for the item on https://fragment.com.
         */
        public String url;

        /**
         * Contains information about a collectible item and its last purchase.
         */
        public CollectibleItemInfo() {
        }

        /**
         * Contains information about a collectible item and its last purchase.
         *
         * @param purchaseDate Point in time (Unix timestamp) when the item was purchased.
         * @param currency Currency for the paid amount.
         * @param amount The paid amount, in the smallest units of the currency.
         * @param cryptocurrency Cryptocurrency used to pay for the item.
         * @param cryptocurrencyAmount The paid amount, in the smallest units of the cryptocurrency.
         * @param url Individual URL for the item on https://fragment.com.
         */
        public CollectibleItemInfo(int purchaseDate, String currency, long amount, String cryptocurrency, long cryptocurrencyAmount, String url) {
            this.purchaseDate = purchaseDate;
            this.currency = currency;
            this.amount = amount;
            this.cryptocurrency = cryptocurrency;
            this.cryptocurrencyAmount = cryptocurrencyAmount;
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1460640717;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a collectible item that can be purchased at https://fragment.com.
     */
    public abstract static class CollectibleItemType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            CollectibleItemTypeUsername.CONSTRUCTOR,
            CollectibleItemTypePhoneNumber.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public CollectibleItemType() {
        }
    }

    /**
     * A username.
     */
    public static class CollectibleItemTypeUsername extends CollectibleItemType {
        /**
         * The username.
         */
        public String username;

        /**
         * A username.
         */
        public CollectibleItemTypeUsername() {
        }

        /**
         * A username.
         *
         * @param username The username.
         */
        public CollectibleItemTypeUsername(String username) {
            this.username = username;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 458680273;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A phone number.
     */
    public static class CollectibleItemTypePhoneNumber extends CollectibleItemType {
        /**
         * The phone number.
         */
        public String phoneNumber;

        /**
         * A phone number.
         */
        public CollectibleItemTypePhoneNumber() {
        }

        /**
         * A phone number.
         *
         * @param phoneNumber The phone number.
         */
        public CollectibleItemTypePhoneNumber(String phoneNumber) {
            this.phoneNumber = phoneNumber;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1256251714;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an affiliate program that was connected to an affiliate.
     */
    public static class ConnectedAffiliateProgram extends Object {
        /**
         * The link that can be used to refer users if the program is still active.
         */
        public String url;
        /**
         * User identifier of the bot created the program.
         */
        public long botUserId;
        /**
         * The parameters of the affiliate program.
         */
        public AffiliateProgramParameters parameters;
        /**
         * Point in time (Unix timestamp) when the affiliate program was connected.
         */
        public int connectionDate;
        /**
         * True, if the program was canceled by the bot, or disconnected by the chat owner and isn't available anymore.
         */
        public boolean isDisconnected;
        /**
         * The number of users that used the affiliate program.
         */
        public long userCount;
        /**
         * The number of Telegram Stars that were earned by the affiliate program.
         */
        public long revenueStarCount;

        /**
         * Describes an affiliate program that was connected to an affiliate.
         */
        public ConnectedAffiliateProgram() {
        }

        /**
         * Describes an affiliate program that was connected to an affiliate.
         *
         * @param url The link that can be used to refer users if the program is still active.
         * @param botUserId User identifier of the bot created the program.
         * @param parameters The parameters of the affiliate program.
         * @param connectionDate Point in time (Unix timestamp) when the affiliate program was connected.
         * @param isDisconnected True, if the program was canceled by the bot, or disconnected by the chat owner and isn't available anymore.
         * @param userCount The number of users that used the affiliate program.
         * @param revenueStarCount The number of Telegram Stars that were earned by the affiliate program.
         */
        public ConnectedAffiliateProgram(String url, long botUserId, AffiliateProgramParameters parameters, int connectionDate, boolean isDisconnected, long userCount, long revenueStarCount) {
            this.url = url;
            this.botUserId = botUserId;
            this.parameters = parameters;
            this.connectionDate = connectionDate;
            this.isDisconnected = isDisconnected;
            this.userCount = userCount;
            this.revenueStarCount = revenueStarCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -294102864;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of affiliate programs that were connected to an affiliate.
     */
    public static class ConnectedAffiliatePrograms extends Object {
        /**
         * The total number of affiliate programs that were connected to the affiliate.
         */
        public int totalCount;
        /**
         * The list of connected affiliate programs.
         */
        public ConnectedAffiliateProgram[] programs;
        /**
         * The offset for the next request. If empty, then there are no more results.
         */
        public String nextOffset;

        /**
         * Represents a list of affiliate programs that were connected to an affiliate.
         */
        public ConnectedAffiliatePrograms() {
        }

        /**
         * Represents a list of affiliate programs that were connected to an affiliate.
         *
         * @param totalCount The total number of affiliate programs that were connected to the affiliate.
         * @param programs The list of connected affiliate programs.
         * @param nextOffset The offset for the next request. If empty, then there are no more results.
         */
        public ConnectedAffiliatePrograms(int totalCount, ConnectedAffiliateProgram[] programs, String nextOffset) {
            this.totalCount = totalCount;
            this.programs = programs;
            this.nextOffset = nextOffset;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1505880847;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about one website the current user is logged in with Telegram.
     */
    public static class ConnectedWebsite extends Object {
        /**
         * Website identifier.
         */
        public long id;
        /**
         * The domain name of the website.
         */
        public String domainName;
        /**
         * User identifier of a bot linked with the website.
         */
        public long botUserId;
        /**
         * The version of a browser used to log in.
         */
        public String browser;
        /**
         * Operating system the browser is running on.
         */
        public String platform;
        /**
         * Point in time (Unix timestamp) when the user was logged in.
         */
        public int logInDate;
        /**
         * Point in time (Unix timestamp) when obtained authorization was last used.
         */
        public int lastActiveDate;
        /**
         * IP address from which the user was logged in, in human-readable format.
         */
        public String ipAddress;
        /**
         * Human-readable description of a country and a region from which the user was logged in, based on the IP address.
         */
        public String location;

        /**
         * Contains information about one website the current user is logged in with Telegram.
         */
        public ConnectedWebsite() {
        }

        /**
         * Contains information about one website the current user is logged in with Telegram.
         *
         * @param id Website identifier.
         * @param domainName The domain name of the website.
         * @param botUserId User identifier of a bot linked with the website.
         * @param browser The version of a browser used to log in.
         * @param platform Operating system the browser is running on.
         * @param logInDate Point in time (Unix timestamp) when the user was logged in.
         * @param lastActiveDate Point in time (Unix timestamp) when obtained authorization was last used.
         * @param ipAddress IP address from which the user was logged in, in human-readable format.
         * @param location Human-readable description of a country and a region from which the user was logged in, based on the IP address.
         */
        public ConnectedWebsite(long id, String domainName, long botUserId, String browser, String platform, int logInDate, int lastActiveDate, String ipAddress, String location) {
            this.id = id;
            this.domainName = domainName;
            this.botUserId = botUserId;
            this.browser = browser;
            this.platform = platform;
            this.logInDate = logInDate;
            this.lastActiveDate = lastActiveDate;
            this.ipAddress = ipAddress;
            this.location = location;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1978115978;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of websites the current user is logged in with Telegram.
     */
    public static class ConnectedWebsites extends Object {
        /**
         * List of connected websites.
         */
        public ConnectedWebsite[] websites;

        /**
         * Contains a list of websites the current user is logged in with Telegram.
         */
        public ConnectedWebsites() {
        }

        /**
         * Contains a list of websites the current user is logged in with Telegram.
         *
         * @param websites List of connected websites.
         */
        public ConnectedWebsites(ConnectedWebsite[] websites) {
            this.websites = websites;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1727949694;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the current state of the connection to Telegram servers.
     */
    public abstract static class ConnectionState extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ConnectionStateWaitingForNetwork.CONSTRUCTOR,
            ConnectionStateConnectingToProxy.CONSTRUCTOR,
            ConnectionStateConnecting.CONSTRUCTOR,
            ConnectionStateUpdating.CONSTRUCTOR,
            ConnectionStateReady.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ConnectionState() {
        }
    }

    /**
     * Waiting for the network to become available. Use setNetworkType to change the available network type.
     */
    public static class ConnectionStateWaitingForNetwork extends ConnectionState {

        /**
         * Waiting for the network to become available. Use setNetworkType to change the available network type.
         */
        public ConnectionStateWaitingForNetwork() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1695405912;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Establishing a connection with a proxy server.
     */
    public static class ConnectionStateConnectingToProxy extends ConnectionState {

        /**
         * Establishing a connection with a proxy server.
         */
        public ConnectionStateConnectingToProxy() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -93187239;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Establishing a connection to the Telegram servers.
     */
    public static class ConnectionStateConnecting extends ConnectionState {

        /**
         * Establishing a connection to the Telegram servers.
         */
        public ConnectionStateConnecting() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1298400670;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Downloading data expected to be received while the application was offline.
     */
    public static class ConnectionStateUpdating extends ConnectionState {

        /**
         * Downloading data expected to be received while the application was offline.
         */
        public ConnectionStateUpdating() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -188104009;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * There is a working connection to the Telegram servers.
     */
    public static class ConnectionStateReady extends ConnectionState {

        /**
         * There is a working connection to the Telegram servers.
         */
        public ConnectionStateReady() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 48608492;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a contact of a user.
     */
    public static class Contact extends Object {
        /**
         * Phone number of the user.
         */
        public String phoneNumber;
        /**
         * First name of the user; 1-64 characters.
         */
        public String firstName;
        /**
         * Last name of the user; 0-64 characters.
         */
        public String lastName;
        /**
         * Additional data about the user in a form of vCard; 0-2048 bytes in length.
         */
        public String vcard;
        /**
         * Identifier of the user, if known; 0 otherwise.
         */
        public long userId;

        /**
         * Describes a contact of a user.
         */
        public Contact() {
        }

        /**
         * Describes a contact of a user.
         *
         * @param phoneNumber Phone number of the user.
         * @param firstName First name of the user; 1-64 characters.
         * @param lastName Last name of the user; 0-64 characters.
         * @param vcard Additional data about the user in a form of vCard; 0-2048 bytes in length.
         * @param userId Identifier of the user, if known; 0 otherwise.
         */
        public Contact(String phoneNumber, String firstName, String lastName, String vcard, long userId) {
            this.phoneNumber = phoneNumber;
            this.firstName = firstName;
            this.lastName = lastName;
            this.vcard = vcard;
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1993844876;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a counter.
     */
    public static class Count extends Object {
        /**
         * Count.
         */
        public int count;

        /**
         * Contains a counter.
         */
        public Count() {
        }

        /**
         * Contains a counter.
         *
         * @param count Count.
         */
        public Count(int count) {
            this.count = count;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1295577348;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about countries.
     */
    public static class Countries extends Object {
        /**
         * The list of countries.
         */
        public CountryInfo[] countries;

        /**
         * Contains information about countries.
         */
        public Countries() {
        }

        /**
         * Contains information about countries.
         *
         * @param countries The list of countries.
         */
        public Countries(CountryInfo[] countries) {
            this.countries = countries;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1854211813;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a country.
     */
    public static class CountryInfo extends Object {
        /**
         * A two-letter ISO 3166-1 alpha-2 country code.
         */
        public String countryCode;
        /**
         * Native name of the country.
         */
        public String name;
        /**
         * English name of the country.
         */
        public String englishName;
        /**
         * True, if the country must be hidden from the list of all countries.
         */
        public boolean isHidden;
        /**
         * List of country calling codes.
         */
        public String[] callingCodes;

        /**
         * Contains information about a country.
         */
        public CountryInfo() {
        }

        /**
         * Contains information about a country.
         *
         * @param countryCode A two-letter ISO 3166-1 alpha-2 country code.
         * @param name Native name of the country.
         * @param englishName English name of the country.
         * @param isHidden True, if the country must be hidden from the list of all countries.
         * @param callingCodes List of country calling codes.
         */
        public CountryInfo(String countryCode, String name, String englishName, boolean isHidden, String[] callingCodes) {
            this.countryCode = countryCode;
            this.name = name;
            this.englishName = englishName;
            this.isHidden = isHidden;
            this.callingCodes = callingCodes;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1617195722;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains result of gift crafting.
     */
    public abstract static class CraftGiftResult extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            CraftGiftResultSuccess.CONSTRUCTOR,
            CraftGiftResultTooEarly.CONSTRUCTOR,
            CraftGiftResultInvalidGift.CONSTRUCTOR,
            CraftGiftResultFail.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public CraftGiftResult() {
        }
    }

    /**
     * Crafting was successful.
     */
    public static class CraftGiftResultSuccess extends CraftGiftResult {
        /**
         * The created gift.
         */
        public UpgradedGift gift;
        /**
         * Unique identifier of the received gift for the current user.
         */
        public String receivedGiftId;

        /**
         * Crafting was successful.
         */
        public CraftGiftResultSuccess() {
        }

        /**
         * Crafting was successful.
         *
         * @param gift The created gift.
         * @param receivedGiftId Unique identifier of the received gift for the current user.
         */
        public CraftGiftResultSuccess(UpgradedGift gift, String receivedGiftId) {
            this.gift = gift;
            this.receivedGiftId = receivedGiftId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1790823778;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Crafting isn't possible because one of the gifts can't be used for crafting yet.
     */
    public static class CraftGiftResultTooEarly extends CraftGiftResult {
        /**
         * Time left before the gift can be used for crafting.
         */
        public int retryAfter;

        /**
         * Crafting isn't possible because one of the gifts can't be used for crafting yet.
         */
        public CraftGiftResultTooEarly() {
        }

        /**
         * Crafting isn't possible because one of the gifts can't be used for crafting yet.
         *
         * @param retryAfter Time left before the gift can be used for crafting.
         */
        public CraftGiftResultTooEarly(int retryAfter) {
            this.retryAfter = retryAfter;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1383697767;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Crafting isn't possible because one of the gifts isn't suitable for crafting.
     */
    public static class CraftGiftResultInvalidGift extends CraftGiftResult {

        /**
         * Crafting isn't possible because one of the gifts isn't suitable for crafting.
         */
        public CraftGiftResultInvalidGift() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -667740645;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Crafting has failed.
     */
    public static class CraftGiftResultFail extends CraftGiftResult {

        /**
         * Crafting has failed.
         */
        public CraftGiftResultFail() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1394001631;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a newly created basic group chat.
     */
    public static class CreatedBasicGroupChat extends Object {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Information about failed to add members.
         */
        public FailedToAddMembers failedToAddMembers;

        /**
         * Contains information about a newly created basic group chat.
         */
        public CreatedBasicGroupChat() {
        }

        /**
         * Contains information about a newly created basic group chat.
         *
         * @param chatId Chat identifier.
         * @param failedToAddMembers Information about failed to add members.
         */
        public CreatedBasicGroupChat(long chatId, FailedToAddMembers failedToAddMembers) {
            this.chatId = chatId;
            this.failedToAddMembers = failedToAddMembers;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -20417068;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes the current weather.
     */
    public static class CurrentWeather extends Object {
        /**
         * Temperature, in degree Celsius.
         */
        public double temperature;
        /**
         * Emoji representing the weather.
         */
        public String emoji;

        /**
         * Describes the current weather.
         */
        public CurrentWeather() {
        }

        /**
         * Describes the current weather.
         *
         * @param temperature Temperature, in degree Celsius.
         * @param emoji Emoji representing the weather.
         */
        public CurrentWeather(double temperature, String emoji) {
            this.temperature = temperature;
            this.emoji = emoji;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -355555136;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains the result of a custom request.
     */
    public static class CustomRequestResult extends Object {
        /**
         * A JSON-serialized result.
         */
        public String result;

        /**
         * Contains the result of a custom request.
         */
        public CustomRequestResult() {
        }

        /**
         * Contains the result of a custom request.
         *
         * @param result A JSON-serialized result.
         */
        public CustomRequestResult(String result) {
            this.result = result;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2009960452;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains some binary data.
     */
    public static class Data extends Object {
        /**
         * Data.
         */
        public byte[] data;

        /**
         * Contains some binary data.
         */
        public Data() {
        }

        /**
         * Contains some binary data.
         *
         * @param data Data.
         */
        public Data(byte[] data) {
            this.data = data;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 221197337;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains database statistics.
     */
    public static class DatabaseStatistics extends Object {
        /**
         * Database statistics in an unspecified human-readable format.
         */
        public String statistics;

        /**
         * Contains database statistics.
         */
        public DatabaseStatistics() {
        }

        /**
         * Contains database statistics.
         *
         * @param statistics Database statistics in an unspecified human-readable format.
         */
        public DatabaseStatistics(String statistics) {
            this.statistics = statistics;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1123912880;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a date according to the Gregorian calendar.
     */
    public static class Date extends Object {
        /**
         * Day of the month; 1-31.
         */
        public int day;
        /**
         * Month; 1-12.
         */
        public int month;
        /**
         * Year; 1-9999.
         */
        public int year;

        /**
         * Represents a date according to the Gregorian calendar.
         */
        public Date() {
        }

        /**
         * Represents a date according to the Gregorian calendar.
         *
         * @param day Day of the month; 1-31.
         * @param month Month; 1-12.
         * @param year Year; 1-9999.
         */
        public Date(int day, int month, int year) {
            this.day = day;
            this.month = month;
            this.year = year;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -277956960;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a date range.
     */
    public static class DateRange extends Object {
        /**
         * Point in time (Unix timestamp) at which the date range begins.
         */
        public int startDate;
        /**
         * Point in time (Unix timestamp) at which the date range ends.
         */
        public int endDate;

        /**
         * Represents a date range.
         */
        public DateRange() {
        }

        /**
         * Represents a date range.
         *
         * @param startDate Point in time (Unix timestamp) at which the date range begins.
         * @param endDate Point in time (Unix timestamp) at which the date range ends.
         */
        public DateRange(int startDate, int endDate) {
            this.startDate = startDate;
            this.endDate = endDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1360333926;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes date and time formatting.
     */
    public abstract static class DateTimeFormattingType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            DateTimeFormattingTypeRelative.CONSTRUCTOR,
            DateTimeFormattingTypeAbsolute.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public DateTimeFormattingType() {
        }
    }

    /**
     * The time must be shown relative to the current time ([in ] X seconds, minutes, hours, days, months, years [ago]).
     */
    public static class DateTimeFormattingTypeRelative extends DateTimeFormattingType {

        /**
         * The time must be shown relative to the current time ([in ] X seconds, minutes, hours, days, months, years [ago]).
         */
        public DateTimeFormattingTypeRelative() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -648483424;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The date and time must be shown as absolute timestamps.
     */
    public static class DateTimeFormattingTypeAbsolute extends DateTimeFormattingType {
        /**
         * The precision with which hours, minutes and seconds are shown.
         */
        public DateTimePartPrecision timePrecision;
        /**
         * The precision with which the date is shown.
         */
        public DateTimePartPrecision datePrecision;
        /**
         * True, if the day of week must be shown.
         */
        public boolean showDayOfWeek;

        /**
         * The date and time must be shown as absolute timestamps.
         */
        public DateTimeFormattingTypeAbsolute() {
        }

        /**
         * The date and time must be shown as absolute timestamps.
         *
         * @param timePrecision The precision with which hours, minutes and seconds are shown.
         * @param datePrecision The precision with which the date is shown.
         * @param showDayOfWeek True, if the day of week must be shown.
         */
        public DateTimeFormattingTypeAbsolute(DateTimePartPrecision timePrecision, DateTimePartPrecision datePrecision, boolean showDayOfWeek) {
            this.timePrecision = timePrecision;
            this.datePrecision = datePrecision;
            this.showDayOfWeek = showDayOfWeek;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 47463317;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes precision with which to show a date or a time.
     */
    public abstract static class DateTimePartPrecision extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            DateTimePartPrecisionNone.CONSTRUCTOR,
            DateTimePartPrecisionShort.CONSTRUCTOR,
            DateTimePartPrecisionLong.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public DateTimePartPrecision() {
        }
    }

    /**
     * Don't show the date or time.
     */
    public static class DateTimePartPrecisionNone extends DateTimePartPrecision {

        /**
         * Don't show the date or time.
         */
        public DateTimePartPrecisionNone() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1790302111;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Show the date or time in a short way (17.03.22 or 22:45).
     */
    public static class DateTimePartPrecisionShort extends DateTimePartPrecision {

        /**
         * Show the date or time in a short way (17.03.22 or 22:45).
         */
        public DateTimePartPrecisionShort() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1290158159;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Show the date or time in a long way (March 17, 2022 or 22:45:00.)
     */
    public static class DateTimePartPrecisionLong extends DateTimePartPrecision {

        /**
         * Show the date or time in a long way (March 17, 2022 or 22:45:00.)
         */
        public DateTimePartPrecisionLong() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -105378824;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * File with the date it was uploaded.
     */
    public static class DatedFile extends Object {
        /**
         * The file.
         */
        public File file;
        /**
         * Point in time (Unix timestamp) when the file was uploaded.
         */
        public int date;

        /**
         * File with the date it was uploaded.
         */
        public DatedFile() {
        }

        /**
         * File with the date it was uploaded.
         *
         * @param file The file.
         * @param date Point in time (Unix timestamp) when the file was uploaded.
         */
        public DatedFile(File file, int date) {
            this.file = file;
            this.date = date;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1840795491;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a tg: deep link.
     */
    public static class DeepLinkInfo extends Object {
        /**
         * Text to be shown to the user.
         */
        public FormattedText text;
        /**
         * True, if the user must be asked to update the application.
         */
        public boolean needUpdateApplication;

        /**
         * Contains information about a tg: deep link.
         */
        public DeepLinkInfo() {
        }

        /**
         * Contains information about a tg: deep link.
         *
         * @param text Text to be shown to the user.
         * @param needUpdateApplication True, if the user must be asked to update the application.
         */
        public DeepLinkInfo(FormattedText text, boolean needUpdateApplication) {
            this.text = text;
            this.needUpdateApplication = needUpdateApplication;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1864081662;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents a data needed to subscribe for push notifications through registerDevice method. To use specific push notification service, the correct application platform must be specified and a valid server authentication data must be uploaded at https://my.telegram.org.
     */
    public abstract static class DeviceToken extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            DeviceTokenFirebaseCloudMessaging.CONSTRUCTOR,
            DeviceTokenApplePush.CONSTRUCTOR,
            DeviceTokenApplePushVoIP.CONSTRUCTOR,
            DeviceTokenWindowsPush.CONSTRUCTOR,
            DeviceTokenMicrosoftPush.CONSTRUCTOR,
            DeviceTokenMicrosoftPushVoIP.CONSTRUCTOR,
            DeviceTokenWebPush.CONSTRUCTOR,
            DeviceTokenSimplePush.CONSTRUCTOR,
            DeviceTokenUbuntuPush.CONSTRUCTOR,
            DeviceTokenBlackBerryPush.CONSTRUCTOR,
            DeviceTokenTizenPush.CONSTRUCTOR,
            DeviceTokenHuaweiPush.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public DeviceToken() {
        }
    }

    /**
     * A token for Firebase Cloud Messaging.
     */
    public static class DeviceTokenFirebaseCloudMessaging extends DeviceToken {
        /**
         * Device registration token; may be empty to deregister a device.
         */
        public String token;
        /**
         * True, if push notifications must be additionally encrypted.
         */
        public boolean encrypt;

        /**
         * A token for Firebase Cloud Messaging.
         */
        public DeviceTokenFirebaseCloudMessaging() {
        }

        /**
         * A token for Firebase Cloud Messaging.
         *
         * @param token Device registration token; may be empty to deregister a device.
         * @param encrypt True, if push notifications must be additionally encrypted.
         */
        public DeviceTokenFirebaseCloudMessaging(String token, boolean encrypt) {
            this.token = token;
            this.encrypt = encrypt;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -797881849;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A token for Apple Push Notification service.
     */
    public static class DeviceTokenApplePush extends DeviceToken {
        /**
         * Device token; may be empty to deregister a device.
         */
        public String deviceToken;
        /**
         * True, if App Sandbox is enabled.
         */
        public boolean isAppSandbox;

        /**
         * A token for Apple Push Notification service.
         */
        public DeviceTokenApplePush() {
        }

        /**
         * A token for Apple Push Notification service.
         *
         * @param deviceToken Device token; may be empty to deregister a device.
         * @param isAppSandbox True, if App Sandbox is enabled.
         */
        public DeviceTokenApplePush(String deviceToken, boolean isAppSandbox) {
            this.deviceToken = deviceToken;
            this.isAppSandbox = isAppSandbox;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 387541955;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A token for Apple Push Notification service VoIP notifications.
     */
    public static class DeviceTokenApplePushVoIP extends DeviceToken {
        /**
         * Device token; may be empty to deregister a device.
         */
        public String deviceToken;
        /**
         * True, if App Sandbox is enabled.
         */
        public boolean isAppSandbox;
        /**
         * True, if push notifications must be additionally encrypted.
         */
        public boolean encrypt;

        /**
         * A token for Apple Push Notification service VoIP notifications.
         */
        public DeviceTokenApplePushVoIP() {
        }

        /**
         * A token for Apple Push Notification service VoIP notifications.
         *
         * @param deviceToken Device token; may be empty to deregister a device.
         * @param isAppSandbox True, if App Sandbox is enabled.
         * @param encrypt True, if push notifications must be additionally encrypted.
         */
        public DeviceTokenApplePushVoIP(String deviceToken, boolean isAppSandbox, boolean encrypt) {
            this.deviceToken = deviceToken;
            this.isAppSandbox = isAppSandbox;
            this.encrypt = encrypt;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 804275689;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A token for Windows Push Notification Services.
     */
    public static class DeviceTokenWindowsPush extends DeviceToken {
        /**
         * The access token that will be used to send notifications; may be empty to deregister a device.
         */
        public String accessToken;

        /**
         * A token for Windows Push Notification Services.
         */
        public DeviceTokenWindowsPush() {
        }

        /**
         * A token for Windows Push Notification Services.
         *
         * @param accessToken The access token that will be used to send notifications; may be empty to deregister a device.
         */
        public DeviceTokenWindowsPush(String accessToken) {
            this.accessToken = accessToken;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1410514289;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A token for Microsoft Push Notification Service.
     */
    public static class DeviceTokenMicrosoftPush extends DeviceToken {
        /**
         * Push notification channel URI; may be empty to deregister a device.
         */
        public String channelUri;

        /**
         * A token for Microsoft Push Notification Service.
         */
        public DeviceTokenMicrosoftPush() {
        }

        /**
         * A token for Microsoft Push Notification Service.
         *
         * @param channelUri Push notification channel URI; may be empty to deregister a device.
         */
        public DeviceTokenMicrosoftPush(String channelUri) {
            this.channelUri = channelUri;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1224269900;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A token for Microsoft Push Notification Service VoIP channel.
     */
    public static class DeviceTokenMicrosoftPushVoIP extends DeviceToken {
        /**
         * Push notification channel URI; may be empty to deregister a device.
         */
        public String channelUri;

        /**
         * A token for Microsoft Push Notification Service VoIP channel.
         */
        public DeviceTokenMicrosoftPushVoIP() {
        }

        /**
         * A token for Microsoft Push Notification Service VoIP channel.
         *
         * @param channelUri Push notification channel URI; may be empty to deregister a device.
         */
        public DeviceTokenMicrosoftPushVoIP(String channelUri) {
            this.channelUri = channelUri;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -785603759;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A token for web Push API.
     */
    public static class DeviceTokenWebPush extends DeviceToken {
        /**
         * Absolute URL exposed by the push service where the application server can send push messages; may be empty to deregister a device.
         */
        public String endpoint;
        /**
         * Base64url-encoded P-256 elliptic curve Diffie-Hellman public key.
         */
        public String p256dhBase64url;
        /**
         * Base64url-encoded authentication secret.
         */
        public String authBase64url;

        /**
         * A token for web Push API.
         */
        public DeviceTokenWebPush() {
        }

        /**
         * A token for web Push API.
         *
         * @param endpoint Absolute URL exposed by the push service where the application server can send push messages; may be empty to deregister a device.
         * @param p256dhBase64url Base64url-encoded P-256 elliptic curve Diffie-Hellman public key.
         * @param authBase64url Base64url-encoded authentication secret.
         */
        public DeviceTokenWebPush(String endpoint, String p256dhBase64url, String authBase64url) {
            this.endpoint = endpoint;
            this.p256dhBase64url = p256dhBase64url;
            this.authBase64url = authBase64url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1694507273;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A token for Simple Push API for Firefox OS.
     */
    public static class DeviceTokenSimplePush extends DeviceToken {
        /**
         * Absolute URL exposed by the push service where the application server can send push messages; may be empty to deregister a device.
         */
        public String endpoint;

        /**
         * A token for Simple Push API for Firefox OS.
         */
        public DeviceTokenSimplePush() {
        }

        /**
         * A token for Simple Push API for Firefox OS.
         *
         * @param endpoint Absolute URL exposed by the push service where the application server can send push messages; may be empty to deregister a device.
         */
        public DeviceTokenSimplePush(String endpoint) {
            this.endpoint = endpoint;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 49584736;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A token for Ubuntu Push Client service.
     */
    public static class DeviceTokenUbuntuPush extends DeviceToken {
        /**
         * Token; may be empty to deregister a device.
         */
        public String token;

        /**
         * A token for Ubuntu Push Client service.
         */
        public DeviceTokenUbuntuPush() {
        }

        /**
         * A token for Ubuntu Push Client service.
         *
         * @param token Token; may be empty to deregister a device.
         */
        public DeviceTokenUbuntuPush(String token) {
            this.token = token;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1782320422;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A token for BlackBerry Push Service.
     */
    public static class DeviceTokenBlackBerryPush extends DeviceToken {
        /**
         * Token; may be empty to deregister a device.
         */
        public String token;

        /**
         * A token for BlackBerry Push Service.
         */
        public DeviceTokenBlackBerryPush() {
        }

        /**
         * A token for BlackBerry Push Service.
         *
         * @param token Token; may be empty to deregister a device.
         */
        public DeviceTokenBlackBerryPush(String token) {
            this.token = token;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1559167234;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A token for Tizen Push Service.
     */
    public static class DeviceTokenTizenPush extends DeviceToken {
        /**
         * Push service registration identifier; may be empty to deregister a device.
         */
        public String regId;

        /**
         * A token for Tizen Push Service.
         */
        public DeviceTokenTizenPush() {
        }

        /**
         * A token for Tizen Push Service.
         *
         * @param regId Push service registration identifier; may be empty to deregister a device.
         */
        public DeviceTokenTizenPush(String regId) {
            this.regId = regId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1359947213;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A token for HUAWEI Push Service.
     */
    public static class DeviceTokenHuaweiPush extends DeviceToken {
        /**
         * Device registration token; may be empty to deregister a device.
         */
        public String token;
        /**
         * True, if push notifications must be additionally encrypted.
         */
        public boolean encrypt;

        /**
         * A token for HUAWEI Push Service.
         */
        public DeviceTokenHuaweiPush() {
        }

        /**
         * A token for HUAWEI Push Service.
         *
         * @param token Device registration token; may be empty to deregister a device.
         * @param encrypt True, if push notifications must be additionally encrypted.
         */
        public DeviceTokenHuaweiPush(String token, boolean encrypt) {
            this.token = token;
            this.encrypt = encrypt;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1989103142;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains animated stickers which must be used for dice animation rendering.
     */
    public abstract static class DiceStickers extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            DiceStickersRegular.CONSTRUCTOR,
            DiceStickersSlotMachine.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public DiceStickers() {
        }
    }

    /**
     * A regular animated sticker.
     */
    public static class DiceStickersRegular extends DiceStickers {
        /**
         * The animated sticker with the dice animation.
         */
        public Sticker sticker;

        /**
         * A regular animated sticker.
         */
        public DiceStickersRegular() {
        }

        /**
         * A regular animated sticker.
         *
         * @param sticker The animated sticker with the dice animation.
         */
        public DiceStickersRegular(Sticker sticker) {
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -740299570;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Animated stickers to be combined into a slot machine.
     */
    public static class DiceStickersSlotMachine extends DiceStickers {
        /**
         * The animated sticker with the slot machine background. The background animation must start playing after all reel animations finish.
         */
        public Sticker background;
        /**
         * The animated sticker with the lever animation. The lever animation must play once in the initial dice state.
         */
        public Sticker lever;
        /**
         * The animated sticker with the left reel.
         */
        public Sticker leftReel;
        /**
         * The animated sticker with the center reel.
         */
        public Sticker centerReel;
        /**
         * The animated sticker with the right reel.
         */
        public Sticker rightReel;

        /**
         * Animated stickers to be combined into a slot machine.
         */
        public DiceStickersSlotMachine() {
        }

        /**
         * Animated stickers to be combined into a slot machine.
         *
         * @param background The animated sticker with the slot machine background. The background animation must start playing after all reel animations finish.
         * @param lever The animated sticker with the lever animation. The lever animation must play once in the initial dice state.
         * @param leftReel The animated sticker with the left reel.
         * @param centerReel The animated sticker with the center reel.
         * @param rightReel The animated sticker with the right reel.
         */
        public DiceStickersSlotMachine(Sticker background, Sticker lever, Sticker leftReel, Sticker centerReel, Sticker rightReel) {
            this.background = background;
            this.lever = lever;
            this.leftReel = leftReel;
            this.centerReel = centerReel;
            this.rightReel = rightReel;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -375223124;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a change of a text.
     */
    public static class DiffEntity extends Object {
        /**
         * Offset of the entity, in UTF-16 code units.
         */
        public int offset;
        /**
         * Length of the entity, in UTF-16 code units.
         */
        public int length;
        /**
         * Type of the entity.
         */
        public DiffEntityType type;

        /**
         * Represents a change of a text.
         */
        public DiffEntity() {
        }

        /**
         * Represents a change of a text.
         *
         * @param offset Offset of the entity, in UTF-16 code units.
         * @param length Length of the entity, in UTF-16 code units.
         * @param type Type of the entity.
         */
        public DiffEntity(int offset, int length, DiffEntityType type) {
            this.offset = offset;
            this.length = length;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -509020080;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents a change of a text.
     */
    public abstract static class DiffEntityType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            DiffEntityTypeInsert.CONSTRUCTOR,
            DiffEntityTypeReplace.CONSTRUCTOR,
            DiffEntityTypeDelete.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public DiffEntityType() {
        }
    }

    /**
     * Addition of some text.
     */
    public static class DiffEntityTypeInsert extends DiffEntityType {

        /**
         * Addition of some text.
         */
        public DiffEntityTypeInsert() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 119434282;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Change of some text.
     */
    public static class DiffEntityTypeReplace extends DiffEntityType {
        /**
         * The old text.
         */
        public String oldText;

        /**
         * Change of some text.
         */
        public DiffEntityTypeReplace() {
        }

        /**
         * Change of some text.
         *
         * @param oldText The old text.
         */
        public DiffEntityTypeReplace(String oldText) {
            this.oldText = oldText;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1951790397;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removal of some text.
     */
    public static class DiffEntityTypeDelete extends DiffEntityType {

        /**
         * Removal of some text.
         */
        public DiffEntityTypeDelete() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1198494499;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A text with some changes highlighted.
     */
    public static class DiffText extends Object {
        /**
         * The text.
         */
        public String text;
        /**
         * Entities describing changes in the text. Entities don't mutually intersect with each other.
         */
        public DiffEntity[] entities;

        /**
         * A text with some changes highlighted.
         */
        public DiffText() {
        }

        /**
         * A text with some changes highlighted.
         *
         * @param text The text.
         * @param entities Entities describing changes in the text. Entities don't mutually intersect with each other.
         */
        public DiffText(String text, DiffEntity[] entities) {
            this.text = text;
            this.entities = entities;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1328070684;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a topic in a channel direct messages chat administered by the current user.
     */
    public static class DirectMessagesChatTopic extends Object {
        /**
         * Identifier of the chat to which the topic belongs.
         */
        public long chatId;
        /**
         * Unique topic identifier.
         */
        public long id;
        /**
         * Identifier of the user or chat that sends the messages to the topic.
         */
        public MessageSender senderId;
        /**
         * A parameter used to determine order of the topic in the topic list. Topics must be sorted by the order in descending order.
         */
        public long order;
        /**
         * True, if the other party can send unpaid messages even if the chat has paid messages enabled.
         */
        public boolean canSendUnpaidMessages;
        /**
         * True, if the topic is marked as unread.
         */
        public boolean isMarkedAsUnread;
        /**
         * Number of unread messages in the chat.
         */
        public long unreadCount;
        /**
         * Identifier of the last read incoming message.
         */
        public long lastReadInboxMessageId;
        /**
         * Identifier of the last read outgoing message.
         */
        public long lastReadOutboxMessageId;
        /**
         * Number of messages with unread reactions in the chat.
         */
        public long unreadReactionCount;
        /**
         * Last message in the topic; may be null if none or unknown.
         */
        @Nullable public Message lastMessage;
        /**
         * A draft of a message in the topic; may be null if none.
         */
        @Nullable public DraftMessage draftMessage;

        /**
         * Contains information about a topic in a channel direct messages chat administered by the current user.
         */
        public DirectMessagesChatTopic() {
        }

        /**
         * Contains information about a topic in a channel direct messages chat administered by the current user.
         *
         * @param chatId Identifier of the chat to which the topic belongs.
         * @param id Unique topic identifier.
         * @param senderId Identifier of the user or chat that sends the messages to the topic.
         * @param order A parameter used to determine order of the topic in the topic list. Topics must be sorted by the order in descending order.
         * @param canSendUnpaidMessages True, if the other party can send unpaid messages even if the chat has paid messages enabled.
         * @param isMarkedAsUnread True, if the topic is marked as unread.
         * @param unreadCount Number of unread messages in the chat.
         * @param lastReadInboxMessageId Identifier of the last read incoming message.
         * @param lastReadOutboxMessageId Identifier of the last read outgoing message.
         * @param unreadReactionCount Number of messages with unread reactions in the chat.
         * @param lastMessage Last message in the topic; may be null if none or unknown.
         * @param draftMessage A draft of a message in the topic; may be null if none.
         */
        public DirectMessagesChatTopic(long chatId, long id, MessageSender senderId, long order, boolean canSendUnpaidMessages, boolean isMarkedAsUnread, long unreadCount, long lastReadInboxMessageId, long lastReadOutboxMessageId, long unreadReactionCount, Message lastMessage, DraftMessage draftMessage) {
            this.chatId = chatId;
            this.id = id;
            this.senderId = senderId;
            this.order = order;
            this.canSendUnpaidMessages = canSendUnpaidMessages;
            this.isMarkedAsUnread = isMarkedAsUnread;
            this.unreadCount = unreadCount;
            this.lastReadInboxMessageId = lastReadInboxMessageId;
            this.lastReadOutboxMessageId = lastReadOutboxMessageId;
            this.unreadReactionCount = unreadReactionCount;
            this.lastMessage = lastMessage;
            this.draftMessage = draftMessage;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1778377757;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a document of any type.
     */
    public static class Document extends Object {
        /**
         * Original name of the file; as defined by the sender.
         */
        public String fileName;
        /**
         * MIME type of the file; as defined by the sender.
         */
        public String mimeType;
        /**
         * Document minithumbnail; may be null.
         */
        @Nullable public Minithumbnail minithumbnail;
        /**
         * Document thumbnail in JPEG or PNG format (PNG will be used only for background patterns); as defined by the sender; may be null.
         */
        @Nullable public Thumbnail thumbnail;
        /**
         * File containing the document.
         */
        public File document;

        /**
         * Describes a document of any type.
         */
        public Document() {
        }

        /**
         * Describes a document of any type.
         *
         * @param fileName Original name of the file; as defined by the sender.
         * @param mimeType MIME type of the file; as defined by the sender.
         * @param minithumbnail Document minithumbnail; may be null.
         * @param thumbnail Document thumbnail in JPEG or PNG format (PNG will be used only for background patterns); as defined by the sender; may be null.
         * @param document File containing the document.
         */
        public Document(String fileName, String mimeType, Minithumbnail minithumbnail, Thumbnail thumbnail, File document) {
            this.fileName = fileName;
            this.mimeType = mimeType;
            this.minithumbnail = minithumbnail;
            this.thumbnail = thumbnail;
            this.document = document;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1357271080;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains number of being downloaded and recently downloaded files found.
     */
    public static class DownloadedFileCounts extends Object {
        /**
         * Number of active file downloads found, including paused.
         */
        public int activeCount;
        /**
         * Number of paused file downloads found.
         */
        public int pausedCount;
        /**
         * Number of completed file downloads found.
         */
        public int completedCount;

        /**
         * Contains number of being downloaded and recently downloaded files found.
         */
        public DownloadedFileCounts() {
        }

        /**
         * Contains number of being downloaded and recently downloaded files found.
         *
         * @param activeCount Number of active file downloads found, including paused.
         * @param pausedCount Number of paused file downloads found.
         * @param completedCount Number of completed file downloads found.
         */
        public DownloadedFileCounts(int activeCount, int pausedCount, int completedCount) {
            this.activeCount = activeCount;
            this.pausedCount = pausedCount;
            this.completedCount = completedCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1973999550;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a message draft.
     */
    public static class DraftMessage extends Object {
        /**
         * Information about the message to be replied; inputMessageReplyToStory is unsupported; may be null if none.
         */
        @Nullable public InputMessageReplyTo replyTo;
        /**
         * Point in time (Unix timestamp) when the draft was created.
         */
        public int date;
        /**
         * Content of the message draft; must be of the type inputMessageText, inputMessageVideoNote, or inputMessageVoiceNote.
         */
        public InputMessageContent inputMessageText;
        /**
         * Identifier of the effect to apply to the message when it is sent; 0 if none.
         */
        public long effectId;
        /**
         * Information about the suggested post; may be null if none.
         */
        @Nullable public InputSuggestedPostInfo suggestedPostInfo;

        /**
         * Contains information about a message draft.
         */
        public DraftMessage() {
        }

        /**
         * Contains information about a message draft.
         *
         * @param replyTo Information about the message to be replied; inputMessageReplyToStory is unsupported; may be null if none.
         * @param date Point in time (Unix timestamp) when the draft was created.
         * @param inputMessageText Content of the message draft; must be of the type inputMessageText, inputMessageVideoNote, or inputMessageVoiceNote.
         * @param effectId Identifier of the effect to apply to the message when it is sent; 0 if none.
         * @param suggestedPostInfo Information about the suggested post; may be null if none.
         */
        public DraftMessage(InputMessageReplyTo replyTo, int date, InputMessageContent inputMessageText, long effectId, InputSuggestedPostInfo suggestedPostInfo) {
            this.replyTo = replyTo;
            this.date = date;
            this.inputMessageText = inputMessageText;
            this.effectId = effectId;
            this.suggestedPostInfo = suggestedPostInfo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1165040650;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains authentication data for an email address.
     */
    public abstract static class EmailAddressAuthentication extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            EmailAddressAuthenticationCode.CONSTRUCTOR,
            EmailAddressAuthenticationAppleId.CONSTRUCTOR,
            EmailAddressAuthenticationGoogleId.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public EmailAddressAuthentication() {
        }
    }

    /**
     * An authentication code delivered to a user's email address.
     */
    public static class EmailAddressAuthenticationCode extends EmailAddressAuthentication {
        /**
         * The code.
         */
        public String code;

        /**
         * An authentication code delivered to a user's email address.
         */
        public EmailAddressAuthenticationCode() {
        }

        /**
         * An authentication code delivered to a user's email address.
         *
         * @param code The code.
         */
        public EmailAddressAuthenticationCode(String code) {
            this.code = code;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -993257022;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An authentication token received through Apple ID.
     */
    public static class EmailAddressAuthenticationAppleId extends EmailAddressAuthentication {
        /**
         * The token.
         */
        public String token;

        /**
         * An authentication token received through Apple ID.
         */
        public EmailAddressAuthenticationAppleId() {
        }

        /**
         * An authentication token received through Apple ID.
         *
         * @param token The token.
         */
        public EmailAddressAuthenticationAppleId(String token) {
            this.token = token;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 633948265;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An authentication token received through Google ID.
     */
    public static class EmailAddressAuthenticationGoogleId extends EmailAddressAuthentication {
        /**
         * The token.
         */
        public String token;

        /**
         * An authentication token received through Google ID.
         */
        public EmailAddressAuthenticationGoogleId() {
        }

        /**
         * An authentication token received through Google ID.
         *
         * @param token The token.
         */
        public EmailAddressAuthenticationGoogleId(String token) {
            this.token = token;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -19142846;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Information about the email address authentication code that was sent.
     */
    public static class EmailAddressAuthenticationCodeInfo extends Object {
        /**
         * Pattern of the email address to which an authentication code was sent.
         */
        public String emailAddressPattern;
        /**
         * Length of the code; 0 if unknown.
         */
        public int length;

        /**
         * Information about the email address authentication code that was sent.
         */
        public EmailAddressAuthenticationCodeInfo() {
        }

        /**
         * Information about the email address authentication code that was sent.
         *
         * @param emailAddressPattern Pattern of the email address to which an authentication code was sent.
         * @param length Length of the code; 0 if unknown.
         */
        public EmailAddressAuthenticationCodeInfo(String emailAddressPattern, int length) {
            this.emailAddressPattern = emailAddressPattern;
            this.length = length;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1151066659;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes reset state of an email address.
     */
    public abstract static class EmailAddressResetState extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            EmailAddressResetStateAvailable.CONSTRUCTOR,
            EmailAddressResetStatePending.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public EmailAddressResetState() {
        }
    }

    /**
     * Email address can be reset after the given period. Call resetAuthenticationEmailAddress to reset it and allow the user to authorize with a code sent to the user's phone number.
     */
    public static class EmailAddressResetStateAvailable extends EmailAddressResetState {
        /**
         * Time required to wait before the email address can be reset; 0 if the user is subscribed to Telegram Premium.
         */
        public int waitPeriod;

        /**
         * Email address can be reset after the given period. Call resetAuthenticationEmailAddress to reset it and allow the user to authorize with a code sent to the user's phone number.
         */
        public EmailAddressResetStateAvailable() {
        }

        /**
         * Email address can be reset after the given period. Call resetAuthenticationEmailAddress to reset it and allow the user to authorize with a code sent to the user's phone number.
         *
         * @param waitPeriod Time required to wait before the email address can be reset; 0 if the user is subscribed to Telegram Premium.
         */
        public EmailAddressResetStateAvailable(int waitPeriod) {
            this.waitPeriod = waitPeriod;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1917177600;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Email address reset has already been requested. Call resetAuthenticationEmailAddress to check whether immediate reset is possible.
     */
    public static class EmailAddressResetStatePending extends EmailAddressResetState {
        /**
         * Left time before the email address will be reset, in seconds. updateAuthorizationState is not sent when this field changes.
         */
        public int resetIn;

        /**
         * Email address reset has already been requested. Call resetAuthenticationEmailAddress to check whether immediate reset is possible.
         */
        public EmailAddressResetStatePending() {
        }

        /**
         * Email address reset has already been requested. Call resetAuthenticationEmailAddress to check whether immediate reset is possible.
         *
         * @param resetIn Left time before the email address will be reset, in seconds. updateAuthorizationState is not sent when this field changes.
         */
        public EmailAddressResetStatePending(int resetIn) {
            this.resetIn = resetIn;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1885966805;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of emoji categories.
     */
    public static class EmojiCategories extends Object {
        /**
         * List of categories.
         */
        public EmojiCategory[] categories;

        /**
         * Represents a list of emoji categories.
         */
        public EmojiCategories() {
        }

        /**
         * Represents a list of emoji categories.
         *
         * @param categories List of categories.
         */
        public EmojiCategories(EmojiCategory[] categories) {
            this.categories = categories;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1455387824;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an emoji category.
     */
    public static class EmojiCategory extends Object {
        /**
         * Name of the category.
         */
        public String name;
        /**
         * Custom emoji sticker, which represents icon of the category.
         */
        public Sticker icon;
        /**
         * Source of stickers for the emoji category.
         */
        public EmojiCategorySource source;
        /**
         * True, if the category must be shown first when choosing a sticker for the start page.
         */
        public boolean isGreeting;

        /**
         * Describes an emoji category.
         */
        public EmojiCategory() {
        }

        /**
         * Describes an emoji category.
         *
         * @param name Name of the category.
         * @param icon Custom emoji sticker, which represents icon of the category.
         * @param source Source of stickers for the emoji category.
         * @param isGreeting True, if the category must be shown first when choosing a sticker for the start page.
         */
        public EmojiCategory(String name, Sticker icon, EmojiCategorySource source, boolean isGreeting) {
            this.name = name;
            this.icon = icon;
            this.source = source;
            this.isGreeting = isGreeting;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 571335919;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes source of stickers for an emoji category.
     */
    public abstract static class EmojiCategorySource extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            EmojiCategorySourceSearch.CONSTRUCTOR,
            EmojiCategorySourcePremium.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public EmojiCategorySource() {
        }
    }

    /**
     * The category contains a list of similar emoji to search for in getStickers and searchStickers for stickers, or getInlineQueryResults with the bot getOption(&quot;animation_search_bot_username&quot;) for animations.
     */
    public static class EmojiCategorySourceSearch extends EmojiCategorySource {
        /**
         * List of emojis to search for.
         */
        public String[] emojis;

        /**
         * The category contains a list of similar emoji to search for in getStickers and searchStickers for stickers, or getInlineQueryResults with the bot getOption(&quot;animation_search_bot_username&quot;) for animations.
         */
        public EmojiCategorySourceSearch() {
        }

        /**
         * The category contains a list of similar emoji to search for in getStickers and searchStickers for stickers, or getInlineQueryResults with the bot getOption(&quot;animation_search_bot_username&quot;) for animations.
         *
         * @param emojis List of emojis to search for.
         */
        public EmojiCategorySourceSearch(String[] emojis) {
            this.emojis = emojis;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -453260262;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The category contains premium stickers that must be found by getPremiumStickers.
     */
    public static class EmojiCategorySourcePremium extends EmojiCategorySource {

        /**
         * The category contains premium stickers that must be found by getPremiumStickers.
         */
        public EmojiCategorySourcePremium() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1932358388;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes type of emoji category.
     */
    public abstract static class EmojiCategoryType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            EmojiCategoryTypeDefault.CONSTRUCTOR,
            EmojiCategoryTypeRegularStickers.CONSTRUCTOR,
            EmojiCategoryTypeEmojiStatus.CONSTRUCTOR,
            EmojiCategoryTypeChatPhoto.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public EmojiCategoryType() {
        }
    }

    /**
     * The category must be used by default (e.g., for custom emoji or animation search).
     */
    public static class EmojiCategoryTypeDefault extends EmojiCategoryType {

        /**
         * The category must be used by default (e.g., for custom emoji or animation search).
         */
        public EmojiCategoryTypeDefault() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1188782699;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The category must be used by default for regular sticker selection. It may contain greeting emoji category and premium stickers.
     */
    public static class EmojiCategoryTypeRegularStickers extends EmojiCategoryType {

        /**
         * The category must be used by default for regular sticker selection. It may contain greeting emoji category and premium stickers.
         */
        public EmojiCategoryTypeRegularStickers() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1337484846;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The category must be used for emoji status selection.
     */
    public static class EmojiCategoryTypeEmojiStatus extends EmojiCategoryType {

        /**
         * The category must be used for emoji status selection.
         */
        public EmojiCategoryTypeEmojiStatus() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1381282631;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The category must be used for chat photo emoji selection.
     */
    public static class EmojiCategoryTypeChatPhoto extends EmojiCategoryType {

        /**
         * The category must be used for chat photo emoji selection.
         */
        public EmojiCategoryTypeChatPhoto() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1059063081;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a chat theme based on an emoji.
     */
    public static class EmojiChatTheme extends Object {
        /**
         * Theme name.
         */
        public String name;
        /**
         * Theme settings for a light chat theme.
         */
        public ThemeSettings lightSettings;
        /**
         * Theme settings for a dark chat theme.
         */
        public ThemeSettings darkSettings;

        /**
         * Describes a chat theme based on an emoji.
         */
        public EmojiChatTheme() {
        }

        /**
         * Describes a chat theme based on an emoji.
         *
         * @param name Theme name.
         * @param lightSettings Theme settings for a light chat theme.
         * @param darkSettings Theme settings for a dark chat theme.
         */
        public EmojiChatTheme(String name, ThemeSettings lightSettings, ThemeSettings darkSettings) {
            this.name = name;
            this.lightSettings = lightSettings;
            this.darkSettings = darkSettings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -329422882;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents an emoji with its keyword.
     */
    public static class EmojiKeyword extends Object {
        /**
         * The emoji.
         */
        public String emoji;
        /**
         * The keyword.
         */
        public String keyword;

        /**
         * Represents an emoji with its keyword.
         */
        public EmojiKeyword() {
        }

        /**
         * Represents an emoji with its keyword.
         *
         * @param emoji The emoji.
         * @param keyword The keyword.
         */
        public EmojiKeyword(String emoji, String keyword) {
            this.emoji = emoji;
            this.keyword = keyword;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2112285985;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of emojis with their keywords.
     */
    public static class EmojiKeywords extends Object {
        /**
         * List of emojis with their keywords.
         */
        public EmojiKeyword[] emojiKeywords;

        /**
         * Represents a list of emojis with their keywords.
         */
        public EmojiKeywords() {
        }

        /**
         * Represents a list of emojis with their keywords.
         *
         * @param emojiKeywords List of emojis with their keywords.
         */
        public EmojiKeywords(EmojiKeyword[] emojiKeywords) {
            this.emojiKeywords = emojiKeywords;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 689723339;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about an emoji reaction.
     */
    public static class EmojiReaction extends Object {
        /**
         * Text representation of the reaction.
         */
        public String emoji;
        /**
         * Reaction title.
         */
        public String title;
        /**
         * True, if the reaction can be added to new messages and enabled in chats.
         */
        public boolean isActive;
        /**
         * Static icon for the reaction.
         */
        public Sticker staticIcon;
        /**
         * Appear animation for the reaction.
         */
        public Sticker appearAnimation;
        /**
         * Select animation for the reaction.
         */
        public Sticker selectAnimation;
        /**
         * Activate animation for the reaction.
         */
        public Sticker activateAnimation;
        /**
         * Effect animation for the reaction.
         */
        public Sticker effectAnimation;
        /**
         * Around animation for the reaction; may be null.
         */
        @Nullable public Sticker aroundAnimation;
        /**
         * Center animation for the reaction; may be null.
         */
        @Nullable public Sticker centerAnimation;

        /**
         * Contains information about an emoji reaction.
         */
        public EmojiReaction() {
        }

        /**
         * Contains information about an emoji reaction.
         *
         * @param emoji Text representation of the reaction.
         * @param title Reaction title.
         * @param isActive True, if the reaction can be added to new messages and enabled in chats.
         * @param staticIcon Static icon for the reaction.
         * @param appearAnimation Appear animation for the reaction.
         * @param selectAnimation Select animation for the reaction.
         * @param activateAnimation Activate animation for the reaction.
         * @param effectAnimation Effect animation for the reaction.
         * @param aroundAnimation Around animation for the reaction; may be null.
         * @param centerAnimation Center animation for the reaction; may be null.
         */
        public EmojiReaction(String emoji, String title, boolean isActive, Sticker staticIcon, Sticker appearAnimation, Sticker selectAnimation, Sticker activateAnimation, Sticker effectAnimation, Sticker aroundAnimation, Sticker centerAnimation) {
            this.emoji = emoji;
            this.title = title;
            this.isActive = isActive;
            this.staticIcon = staticIcon;
            this.appearAnimation = appearAnimation;
            this.selectAnimation = selectAnimation;
            this.activateAnimation = activateAnimation;
            this.effectAnimation = effectAnimation;
            this.aroundAnimation = aroundAnimation;
            this.centerAnimation = centerAnimation;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1616063583;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an emoji to be shown instead of the Telegram Premium badge.
     */
    public static class EmojiStatus extends Object {
        /**
         * Type of the emoji status.
         */
        public EmojiStatusType type;
        /**
         * Point in time (Unix timestamp) when the status will expire; 0 if never.
         */
        public int expirationDate;

        /**
         * Describes an emoji to be shown instead of the Telegram Premium badge.
         */
        public EmojiStatus() {
        }

        /**
         * Describes an emoji to be shown instead of the Telegram Premium badge.
         *
         * @param type Type of the emoji status.
         * @param expirationDate Point in time (Unix timestamp) when the status will expire; 0 if never.
         */
        public EmojiStatus(EmojiStatusType type, int expirationDate) {
            this.type = type;
            this.expirationDate = expirationDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 973424912;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of custom emoji identifiers for emoji statuses.
     */
    public static class EmojiStatusCustomEmojis extends Object {
        /**
         * The list of custom emoji identifiers.
         */
        public long[] customEmojiIds;

        /**
         * Contains a list of custom emoji identifiers for emoji statuses.
         */
        public EmojiStatusCustomEmojis() {
        }

        /**
         * Contains a list of custom emoji identifiers for emoji statuses.
         *
         * @param customEmojiIds The list of custom emoji identifiers.
         */
        public EmojiStatusCustomEmojis(long[] customEmojiIds) {
            this.customEmojiIds = customEmojiIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 917123337;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes type of emoji status.
     */
    public abstract static class EmojiStatusType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            EmojiStatusTypeCustomEmoji.CONSTRUCTOR,
            EmojiStatusTypeUpgradedGift.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public EmojiStatusType() {
        }
    }

    /**
     * A custom emoji set as emoji status.
     */
    public static class EmojiStatusTypeCustomEmoji extends EmojiStatusType {
        /**
         * Identifier of the custom emoji in stickerFormatTgs format.
         */
        public long customEmojiId;

        /**
         * A custom emoji set as emoji status.
         */
        public EmojiStatusTypeCustomEmoji() {
        }

        /**
         * A custom emoji set as emoji status.
         *
         * @param customEmojiId Identifier of the custom emoji in stickerFormatTgs format.
         */
        public EmojiStatusTypeCustomEmoji(long customEmojiId) {
            this.customEmojiId = customEmojiId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1666780939;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An upgraded gift set as emoji status.
     */
    public static class EmojiStatusTypeUpgradedGift extends EmojiStatusType {
        /**
         * Identifier of the upgraded gift.
         */
        public long upgradedGiftId;
        /**
         * The title of the upgraded gift.
         */
        public String giftTitle;
        /**
         * Unique name of the upgraded gift that can be used with internalLinkTypeUpgradedGift.
         */
        public String giftName;
        /**
         * Custom emoji identifier of the model of the upgraded gift.
         */
        public long modelCustomEmojiId;
        /**
         * Custom emoji identifier of the symbol of the upgraded gift.
         */
        public long symbolCustomEmojiId;
        /**
         * Colors of the backdrop of the upgraded gift.
         */
        public UpgradedGiftBackdropColors backdropColors;

        /**
         * An upgraded gift set as emoji status.
         */
        public EmojiStatusTypeUpgradedGift() {
        }

        /**
         * An upgraded gift set as emoji status.
         *
         * @param upgradedGiftId Identifier of the upgraded gift.
         * @param giftTitle The title of the upgraded gift.
         * @param giftName Unique name of the upgraded gift that can be used with internalLinkTypeUpgradedGift.
         * @param modelCustomEmojiId Custom emoji identifier of the model of the upgraded gift.
         * @param symbolCustomEmojiId Custom emoji identifier of the symbol of the upgraded gift.
         * @param backdropColors Colors of the backdrop of the upgraded gift.
         */
        public EmojiStatusTypeUpgradedGift(long upgradedGiftId, String giftTitle, String giftName, long modelCustomEmojiId, long symbolCustomEmojiId, UpgradedGiftBackdropColors backdropColors) {
            this.upgradedGiftId = upgradedGiftId;
            this.giftTitle = giftTitle;
            this.giftName = giftName;
            this.modelCustomEmojiId = modelCustomEmojiId;
            this.symbolCustomEmojiId = symbolCustomEmojiId;
            this.backdropColors = backdropColors;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -837921804;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of emoji statuses.
     */
    public static class EmojiStatuses extends Object {
        /**
         * The list of emoji statuses identifiers.
         */
        public EmojiStatus[] emojiStatuses;

        /**
         * Contains a list of emoji statuses.
         */
        public EmojiStatuses() {
        }

        /**
         * Contains a list of emoji statuses.
         *
         * @param emojiStatuses The list of emoji statuses identifiers.
         */
        public EmojiStatuses(EmojiStatus[] emojiStatuses) {
            this.emojiStatuses = emojiStatuses;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1186104146;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of emojis.
     */
    public static class Emojis extends Object {
        /**
         * List of emojis.
         */
        public String[] emojis;

        /**
         * Represents a list of emojis.
         */
        public Emojis() {
        }

        /**
         * Represents a list of emojis.
         *
         * @param emojis List of emojis.
         */
        public Emojis(String[] emojis) {
            this.emojis = emojis;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 950339552;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains encrypted Telegram Passport data credentials.
     */
    public static class EncryptedCredentials extends Object {
        /**
         * The encrypted credentials.
         */
        public byte[] data;
        /**
         * The decrypted data hash.
         */
        public byte[] hash;
        /**
         * Secret for data decryption, encrypted with the service's public key.
         */
        public byte[] secret;

        /**
         * Contains encrypted Telegram Passport data credentials.
         */
        public EncryptedCredentials() {
        }

        /**
         * Contains encrypted Telegram Passport data credentials.
         *
         * @param data The encrypted credentials.
         * @param hash The decrypted data hash.
         * @param secret Secret for data decryption, encrypted with the service's public key.
         */
        public EncryptedCredentials(byte[] data, byte[] hash, byte[] secret) {
            this.data = data;
            this.hash = hash;
            this.secret = secret;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1331106766;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about an encrypted Telegram Passport element; for bots only.
     */
    public static class EncryptedPassportElement extends Object {
        /**
         * Type of Telegram Passport element.
         */
        public PassportElementType type;
        /**
         * Encrypted JSON-encoded data about the user.
         */
        public byte[] data;
        /**
         * The front side of an identity document.
         */
        public DatedFile frontSide;
        /**
         * The reverse side of an identity document; may be null.
         */
        @Nullable public DatedFile reverseSide;
        /**
         * Selfie with the document; may be null.
         */
        @Nullable public DatedFile selfie;
        /**
         * List of files containing a certified English translation of the document.
         */
        public DatedFile[] translation;
        /**
         * List of attached files.
         */
        public DatedFile[] files;
        /**
         * Unencrypted data, phone number or email address.
         */
        public String value;
        /**
         * Hash of the entire element.
         */
        public String hash;

        /**
         * Contains information about an encrypted Telegram Passport element; for bots only.
         */
        public EncryptedPassportElement() {
        }

        /**
         * Contains information about an encrypted Telegram Passport element; for bots only.
         *
         * @param type Type of Telegram Passport element.
         * @param data Encrypted JSON-encoded data about the user.
         * @param frontSide The front side of an identity document.
         * @param reverseSide The reverse side of an identity document; may be null.
         * @param selfie Selfie with the document; may be null.
         * @param translation List of files containing a certified English translation of the document.
         * @param files List of attached files.
         * @param value Unencrypted data, phone number or email address.
         * @param hash Hash of the entire element.
         */
        public EncryptedPassportElement(PassportElementType type, byte[] data, DatedFile frontSide, DatedFile reverseSide, DatedFile selfie, DatedFile[] translation, DatedFile[] files, String value, String hash) {
            this.type = type;
            this.data = data;
            this.frontSide = frontSide;
            this.reverseSide = reverseSide;
            this.selfie = selfie;
            this.translation = translation;
            this.files = files;
            this.value = value;
            this.hash = hash;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2002386193;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An object of this type can be returned on every function call, in case of an error.
     */
    public static class Error extends Object {
        /**
         * Error code; subject to future changes. If the error code is 406, the error message must not be processed in any way and must not be displayed to the user.
         */
        public int code;
        /**
         * Error message; subject to future changes.
         */
        public String message;

        /**
         * An object of this type can be returned on every function call, in case of an error.
         */
        public Error() {
        }

        /**
         * An object of this type can be returned on every function call, in case of an error.
         *
         * @param code Error code; subject to future changes. If the error code is 406, the error message must not be processed in any way and must not be displayed to the user.
         * @param message Error message; subject to future changes.
         */
        public Error(int code, String message) {
            this.code = code;
            this.message = message;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1679978726;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a fact-check added to the message by an independent checker.
     */
    public static class FactCheck extends Object {
        /**
         * Text of the fact-check.
         */
        public FormattedText text;
        /**
         * A two-letter ISO 3166-1 alpha-2 country code of the country for which the fact-check is shown.
         */
        public String countryCode;

        /**
         * Describes a fact-check added to the message by an independent checker.
         */
        public FactCheck() {
        }

        /**
         * Describes a fact-check added to the message by an independent checker.
         *
         * @param text Text of the fact-check.
         * @param countryCode A two-letter ISO 3166-1 alpha-2 country code of the country for which the fact-check is shown.
         */
        public FactCheck(FormattedText text, String countryCode) {
            this.text = text;
            this.countryCode = countryCode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1048184552;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a user who has failed to be added to a chat.
     */
    public static class FailedToAddMember extends Object {
        /**
         * User identifier.
         */
        public long userId;
        /**
         * True, if subscription to Telegram Premium would have allowed to add the user to the chat.
         */
        public boolean premiumWouldAllowInvite;
        /**
         * True, if subscription to Telegram Premium is required to send the user chat invite link.
         */
        public boolean premiumRequiredToSendMessages;

        /**
         * Contains information about a user who has failed to be added to a chat.
         */
        public FailedToAddMember() {
        }

        /**
         * Contains information about a user who has failed to be added to a chat.
         *
         * @param userId User identifier.
         * @param premiumWouldAllowInvite True, if subscription to Telegram Premium would have allowed to add the user to the chat.
         * @param premiumRequiredToSendMessages True, if subscription to Telegram Premium is required to send the user chat invite link.
         */
        public FailedToAddMember(long userId, boolean premiumWouldAllowInvite, boolean premiumRequiredToSendMessages) {
            this.userId = userId;
            this.premiumWouldAllowInvite = premiumWouldAllowInvite;
            this.premiumRequiredToSendMessages = premiumRequiredToSendMessages;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -282891070;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of users that has failed to be added to a chat.
     */
    public static class FailedToAddMembers extends Object {
        /**
         * Information about users that weren't added to the chat.
         */
        public FailedToAddMember[] failedToAddMembers;

        /**
         * Represents a list of users that has failed to be added to a chat.
         */
        public FailedToAddMembers() {
        }

        /**
         * Represents a list of users that has failed to be added to a chat.
         *
         * @param failedToAddMembers Information about users that weren't added to the chat.
         */
        public FailedToAddMembers(FailedToAddMember[] failedToAddMembers) {
            this.failedToAddMembers = failedToAddMembers;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -272587152;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a file.
     */
    public static class File extends Object {
        /**
         * Unique file identifier.
         */
        public int id;
        /**
         * File size, in bytes; 0 if unknown.
         */
        public long size;
        /**
         * Approximate file size in bytes in case the exact file size is unknown. Can be used to show download/upload progress.
         */
        public long expectedSize;
        /**
         * Information about the local copy of the file.
         */
        public LocalFile local;
        /**
         * Information about the remote copy of the file.
         */
        public RemoteFile remote;

        /**
         * Represents a file.
         */
        public File() {
        }

        /**
         * Represents a file.
         *
         * @param id Unique file identifier.
         * @param size File size, in bytes; 0 if unknown.
         * @param expectedSize Approximate file size in bytes in case the exact file size is unknown. Can be used to show download/upload progress.
         * @param local Information about the local copy of the file.
         * @param remote Information about the remote copy of the file.
         */
        public File(int id, long size, long expectedSize, LocalFile local, RemoteFile remote) {
            this.id = id;
            this.size = size;
            this.expectedSize = expectedSize;
            this.local = local;
            this.remote = remote;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1263291956;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a file added to file download list.
     */
    public static class FileDownload extends Object {
        /**
         * File identifier.
         */
        public int fileId;
        /**
         * The message with the file.
         */
        public Message message;
        /**
         * Point in time (Unix timestamp) when the file was added to the download list.
         */
        public int addDate;
        /**
         * Point in time (Unix timestamp) when the file downloading was completed; 0 if the file downloading isn't completed.
         */
        public int completeDate;
        /**
         * True, if downloading of the file is paused.
         */
        public boolean isPaused;

        /**
         * Describes a file added to file download list.
         */
        public FileDownload() {
        }

        /**
         * Describes a file added to file download list.
         *
         * @param fileId File identifier.
         * @param message The message with the file.
         * @param addDate Point in time (Unix timestamp) when the file was added to the download list.
         * @param completeDate Point in time (Unix timestamp) when the file downloading was completed; 0 if the file downloading isn't completed.
         * @param isPaused True, if downloading of the file is paused.
         */
        public FileDownload(int fileId, Message message, int addDate, int completeDate, boolean isPaused) {
            this.fileId = fileId;
            this.message = message;
            this.addDate = addDate;
            this.completeDate = completeDate;
            this.isPaused = isPaused;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2092100780;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains size of downloaded prefix of a file.
     */
    public static class FileDownloadedPrefixSize extends Object {
        /**
         * The prefix size, in bytes.
         */
        public long size;

        /**
         * Contains size of downloaded prefix of a file.
         */
        public FileDownloadedPrefixSize() {
        }

        /**
         * Contains size of downloaded prefix of a file.
         *
         * @param size The prefix size, in bytes.
         */
        public FileDownloadedPrefixSize(long size) {
            this.size = size;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2015205381;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents the type of file.
     */
    public abstract static class FileType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            FileTypeNone.CONSTRUCTOR,
            FileTypeAnimation.CONSTRUCTOR,
            FileTypeAudio.CONSTRUCTOR,
            FileTypeDocument.CONSTRUCTOR,
            FileTypeLivePhotoVideo.CONSTRUCTOR,
            FileTypeNotificationSound.CONSTRUCTOR,
            FileTypePhoto.CONSTRUCTOR,
            FileTypePhotoStory.CONSTRUCTOR,
            FileTypeProfilePhoto.CONSTRUCTOR,
            FileTypeSecret.CONSTRUCTOR,
            FileTypeSecretThumbnail.CONSTRUCTOR,
            FileTypeSecure.CONSTRUCTOR,
            FileTypeSelfDestructingLivePhotoVideo.CONSTRUCTOR,
            FileTypeSelfDestructingPhoto.CONSTRUCTOR,
            FileTypeSelfDestructingVideo.CONSTRUCTOR,
            FileTypeSelfDestructingVideoNote.CONSTRUCTOR,
            FileTypeSelfDestructingVoiceNote.CONSTRUCTOR,
            FileTypeSticker.CONSTRUCTOR,
            FileTypeThumbnail.CONSTRUCTOR,
            FileTypeUnknown.CONSTRUCTOR,
            FileTypeVideo.CONSTRUCTOR,
            FileTypeVideoNote.CONSTRUCTOR,
            FileTypeVideoStory.CONSTRUCTOR,
            FileTypeVoiceNote.CONSTRUCTOR,
            FileTypeWallpaper.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public FileType() {
        }
    }

    /**
     * The data is not a file.
     */
    public static class FileTypeNone extends FileType {

        /**
         * The data is not a file.
         */
        public FileTypeNone() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2003009189;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file is an animation.
     */
    public static class FileTypeAnimation extends FileType {

        /**
         * The file is an animation.
         */
        public FileTypeAnimation() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -290816582;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file is an audio file.
     */
    public static class FileTypeAudio extends FileType {

        /**
         * The file is an audio file.
         */
        public FileTypeAudio() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -709112160;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file is a document.
     */
    public static class FileTypeDocument extends FileType {

        /**
         * The file is a document.
         */
        public FileTypeDocument() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -564722929;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file is a video for a live photo.
     */
    public static class FileTypeLivePhotoVideo extends FileType {

        /**
         * The file is a video for a live photo.
         */
        public FileTypeLivePhotoVideo() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 444610924;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file is a notification sound.
     */
    public static class FileTypeNotificationSound extends FileType {

        /**
         * The file is a notification sound.
         */
        public FileTypeNotificationSound() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1020289271;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file is a photo.
     */
    public static class FileTypePhoto extends FileType {

        /**
         * The file is a photo.
         */
        public FileTypePhoto() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1718914651;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file is a photo published as a story.
     */
    public static class FileTypePhotoStory extends FileType {

        /**
         * The file is a photo published as a story.
         */
        public FileTypePhotoStory() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2018995956;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file is a profile photo.
     */
    public static class FileTypeProfilePhoto extends FileType {

        /**
         * The file is a profile photo.
         */
        public FileTypeProfilePhoto() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1795089315;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file was sent to a secret chat (the file type is not known to the server).
     */
    public static class FileTypeSecret extends FileType {

        /**
         * The file was sent to a secret chat (the file type is not known to the server).
         */
        public FileTypeSecret() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1871899401;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file is a thumbnail of a file from a secret chat.
     */
    public static class FileTypeSecretThumbnail extends FileType {

        /**
         * The file is a thumbnail of a file from a secret chat.
         */
        public FileTypeSecretThumbnail() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1401326026;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file is a file from Secure storage used for storing Telegram Passport files.
     */
    public static class FileTypeSecure extends FileType {

        /**
         * The file is a file from Secure storage used for storing Telegram Passport files.
         */
        public FileTypeSecure() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1419133146;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file is a self-destructing video for a live photo in a private chat.
     */
    public static class FileTypeSelfDestructingLivePhotoVideo extends FileType {

        /**
         * The file is a self-destructing video for a live photo in a private chat.
         */
        public FileTypeSelfDestructingLivePhotoVideo() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1331098431;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file is a self-destructing photo in a private chat.
     */
    public static class FileTypeSelfDestructingPhoto extends FileType {

        /**
         * The file is a self-destructing photo in a private chat.
         */
        public FileTypeSelfDestructingPhoto() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2077176475;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file is a self-destructing video in a private chat.
     */
    public static class FileTypeSelfDestructingVideo extends FileType {

        /**
         * The file is a self-destructing video in a private chat.
         */
        public FileTypeSelfDestructingVideo() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1223900123;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file is a self-destructing video note in a private chat.
     */
    public static class FileTypeSelfDestructingVideoNote extends FileType {

        /**
         * The file is a self-destructing video note in a private chat.
         */
        public FileTypeSelfDestructingVideoNote() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1495274177;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file is a self-destructing voice note in a private chat.
     */
    public static class FileTypeSelfDestructingVoiceNote extends FileType {

        /**
         * The file is a self-destructing voice note in a private chat.
         */
        public FileTypeSelfDestructingVoiceNote() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1691409181;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file is a sticker.
     */
    public static class FileTypeSticker extends FileType {

        /**
         * The file is a sticker.
         */
        public FileTypeSticker() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 475233385;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file is a thumbnail of another file.
     */
    public static class FileTypeThumbnail extends FileType {

        /**
         * The file is a thumbnail of another file.
         */
        public FileTypeThumbnail() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -12443298;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file type is not yet known.
     */
    public static class FileTypeUnknown extends FileType {

        /**
         * The file type is not yet known.
         */
        public FileTypeUnknown() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2011566768;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file is a video.
     */
    public static class FileTypeVideo extends FileType {

        /**
         * The file is a video.
         */
        public FileTypeVideo() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1430816539;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file is a video note.
     */
    public static class FileTypeVideoNote extends FileType {

        /**
         * The file is a video note.
         */
        public FileTypeVideoNote() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -518412385;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file is a video published as a story.
     */
    public static class FileTypeVideoStory extends FileType {

        /**
         * The file is a video published as a story.
         */
        public FileTypeVideoStory() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2146754143;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file is a voice note.
     */
    public static class FileTypeVoiceNote extends FileType {

        /**
         * The file is a voice note.
         */
        public FileTypeVoiceNote() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -588681661;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file is a wallpaper or a background pattern.
     */
    public static class FileTypeWallpaper extends FileType {

        /**
         * The file is a wallpaper or a background pattern.
         */
        public FileTypeWallpaper() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1854930076;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains settings for Firebase Authentication in the official applications.
     */
    public abstract static class FirebaseAuthenticationSettings extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            FirebaseAuthenticationSettingsAndroid.CONSTRUCTOR,
            FirebaseAuthenticationSettingsIos.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public FirebaseAuthenticationSettings() {
        }
    }

    /**
     * Settings for Firebase Authentication in the official Android application.
     */
    public static class FirebaseAuthenticationSettingsAndroid extends FirebaseAuthenticationSettings {

        /**
         * Settings for Firebase Authentication in the official Android application.
         */
        public FirebaseAuthenticationSettingsAndroid() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1771112932;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Settings for Firebase Authentication in the official iOS application.
     */
    public static class FirebaseAuthenticationSettingsIos extends FirebaseAuthenticationSettings {
        /**
         * Device token from Apple Push Notification service.
         */
        public String deviceToken;
        /**
         * True, if App Sandbox is enabled.
         */
        public boolean isAppSandbox;

        /**
         * Settings for Firebase Authentication in the official iOS application.
         */
        public FirebaseAuthenticationSettingsIos() {
        }

        /**
         * Settings for Firebase Authentication in the official iOS application.
         *
         * @param deviceToken Device token from Apple Push Notification service.
         * @param isAppSandbox True, if App Sandbox is enabled.
         */
        public FirebaseAuthenticationSettingsIos(String deviceToken, boolean isAppSandbox) {
            this.deviceToken = deviceToken;
            this.isAppSandbox = isAppSandbox;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 222930116;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes parameters to be used for device verification.
     */
    public abstract static class FirebaseDeviceVerificationParameters extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            FirebaseDeviceVerificationParametersSafetyNet.CONSTRUCTOR,
            FirebaseDeviceVerificationParametersPlayIntegrity.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public FirebaseDeviceVerificationParameters() {
        }
    }

    /**
     * Device verification must be performed with the SafetyNet Attestation API.
     */
    public static class FirebaseDeviceVerificationParametersSafetyNet extends FirebaseDeviceVerificationParameters {
        /**
         * Nonce to pass to the SafetyNet Attestation API.
         */
        public byte[] nonce;

        /**
         * Device verification must be performed with the SafetyNet Attestation API.
         */
        public FirebaseDeviceVerificationParametersSafetyNet() {
        }

        /**
         * Device verification must be performed with the SafetyNet Attestation API.
         *
         * @param nonce Nonce to pass to the SafetyNet Attestation API.
         */
        public FirebaseDeviceVerificationParametersSafetyNet(byte[] nonce) {
            this.nonce = nonce;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 731296497;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Device verification must be performed with the classic Play Integrity verification (https://developer.android.com/google/play/integrity/classic).
     */
    public static class FirebaseDeviceVerificationParametersPlayIntegrity extends FirebaseDeviceVerificationParameters {
        /**
         * Base64url-encoded nonce to pass to the Play Integrity API.
         */
        public String nonce;
        /**
         * Cloud project number to pass to the Play Integrity API.
         */
        public long cloudProjectNumber;

        /**
         * Device verification must be performed with the classic Play Integrity verification (https://developer.android.com/google/play/integrity/classic).
         */
        public FirebaseDeviceVerificationParametersPlayIntegrity() {
        }

        /**
         * Device verification must be performed with the classic Play Integrity verification (https://developer.android.com/google/play/integrity/classic).
         *
         * @param nonce Base64url-encoded nonce to pass to the Play Integrity API.
         * @param cloudProjectNumber Cloud project number to pass to the Play Integrity API.
         */
        public FirebaseDeviceVerificationParametersPlayIntegrity(String nonce, long cloudProjectNumber) {
            this.nonce = nonce;
            this.cloudProjectNumber = cloudProjectNumber;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -889936502;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A text fixed using fixTextWithAi.
     */
    public static class FixedText extends Object {
        /**
         * The resulting text.
         */
        public FormattedText text;
        /**
         * Changes made to the original text.
         */
        public DiffText diffText;

        /**
         * A text fixed using fixTextWithAi.
         */
        public FixedText() {
        }

        /**
         * A text fixed using fixTextWithAi.
         *
         * @param text The resulting text.
         * @param diffText Changes made to the original text.
         */
        public FixedText(FormattedText text, DiffText diffText) {
            this.text = text;
            this.diffText = diffText;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1714470508;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A text with some entities.
     */
    public static class FormattedText extends Object {
        /**
         * The text.
         */
        public String text;
        /**
         * Entities contained in the text. Entities can be nested, but must not mutually intersect with each other. Pre, Code, PreCode, and DateTime entities can't contain other entities. BlockQuote entities can't contain other BlockQuote entities. Bold, Italic, Underline, Strikethrough, and Spoiler entities can contain and can be part of any other entities. All other entities can't contain each other.
         */
        public TextEntity[] entities;

        /**
         * A text with some entities.
         */
        public FormattedText() {
        }

        /**
         * A text with some entities.
         *
         * @param text The text.
         * @param entities Entities contained in the text. Entities can be nested, but must not mutually intersect with each other. Pre, Code, PreCode, and DateTime entities can't contain other entities. BlockQuote entities can't contain other BlockQuote entities. Bold, Italic, Underline, Strikethrough, and Spoiler entities can contain and can be part of any other entities. All other entities can't contain each other.
         */
        public FormattedText(String text, TextEntity[] entities) {
            this.text = text;
            this.entities = entities;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -252624564;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a forum topic.
     */
    public static class ForumTopic extends Object {
        /**
         * Basic information about the topic.
         */
        public ForumTopicInfo info;
        /**
         * Last message in the topic; may be null if unknown.
         */
        @Nullable public Message lastMessage;
        /**
         * A parameter used to determine order of the topic in the topic list. Topics must be sorted by the order in descending order.
         */
        public long order;
        /**
         * True, if the topic is pinned in the topic list.
         */
        public boolean isPinned;
        /**
         * Number of unread messages in the topic.
         */
        public int unreadCount;
        /**
         * Identifier of the last read incoming message.
         */
        public long lastReadInboxMessageId;
        /**
         * Identifier of the last read outgoing message.
         */
        public long lastReadOutboxMessageId;
        /**
         * Number of unread messages with a mention/reply in the topic.
         */
        public int unreadMentionCount;
        /**
         * Number of messages with unread reactions in the topic.
         */
        public int unreadReactionCount;
        /**
         * Number of messages with unread poll votes in the topic.
         */
        public int unreadPollVoteCount;
        /**
         * Notification settings for the topic.
         */
        public ChatNotificationSettings notificationSettings;
        /**
         * A draft of a message in the topic; may be null if none.
         */
        @Nullable public DraftMessage draftMessage;

        /**
         * Describes a forum topic.
         */
        public ForumTopic() {
        }

        /**
         * Describes a forum topic.
         *
         * @param info Basic information about the topic.
         * @param lastMessage Last message in the topic; may be null if unknown.
         * @param order A parameter used to determine order of the topic in the topic list. Topics must be sorted by the order in descending order.
         * @param isPinned True, if the topic is pinned in the topic list.
         * @param unreadCount Number of unread messages in the topic.
         * @param lastReadInboxMessageId Identifier of the last read incoming message.
         * @param lastReadOutboxMessageId Identifier of the last read outgoing message.
         * @param unreadMentionCount Number of unread messages with a mention/reply in the topic.
         * @param unreadReactionCount Number of messages with unread reactions in the topic.
         * @param unreadPollVoteCount Number of messages with unread poll votes in the topic.
         * @param notificationSettings Notification settings for the topic.
         * @param draftMessage A draft of a message in the topic; may be null if none.
         */
        public ForumTopic(ForumTopicInfo info, Message lastMessage, long order, boolean isPinned, int unreadCount, long lastReadInboxMessageId, long lastReadOutboxMessageId, int unreadMentionCount, int unreadReactionCount, int unreadPollVoteCount, ChatNotificationSettings notificationSettings, DraftMessage draftMessage) {
            this.info = info;
            this.lastMessage = lastMessage;
            this.order = order;
            this.isPinned = isPinned;
            this.unreadCount = unreadCount;
            this.lastReadInboxMessageId = lastReadInboxMessageId;
            this.lastReadOutboxMessageId = lastReadOutboxMessageId;
            this.unreadMentionCount = unreadMentionCount;
            this.unreadReactionCount = unreadReactionCount;
            this.unreadPollVoteCount = unreadPollVoteCount;
            this.notificationSettings = notificationSettings;
            this.draftMessage = draftMessage;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 779443783;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a forum topic icon.
     */
    public static class ForumTopicIcon extends Object {
        /**
         * Color of the topic icon in RGB format.
         */
        public int color;
        /**
         * Unique identifier of the custom emoji shown on the topic icon; 0 if none.
         */
        public long customEmojiId;

        /**
         * Describes a forum topic icon.
         */
        public ForumTopicIcon() {
        }

        /**
         * Describes a forum topic icon.
         *
         * @param color Color of the topic icon in RGB format.
         * @param customEmojiId Unique identifier of the custom emoji shown on the topic icon; 0 if none.
         */
        public ForumTopicIcon(int color, long customEmojiId) {
            this.color = color;
            this.customEmojiId = customEmojiId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -818765421;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains basic information about a forum topic.
     */
    public static class ForumTopicInfo extends Object {
        /**
         * Identifier of a forum supergroup chat or a chat with a bot to which the topic belongs.
         */
        public long chatId;
        /**
         * Forum topic identifier of the topic.
         */
        public int forumTopicId;
        /**
         * Name of the topic.
         */
        public String name;
        /**
         * Icon of the topic.
         */
        public ForumTopicIcon icon;
        /**
         * Point in time (Unix timestamp) when the topic was created.
         */
        public int creationDate;
        /**
         * Identifier of the creator of the topic.
         */
        public MessageSender creatorId;
        /**
         * True, if the topic is the General topic.
         */
        public boolean isGeneral;
        /**
         * True, if the topic was created by the current user.
         */
        public boolean isOutgoing;
        /**
         * True, if the topic is closed. If the topic is closed, then the user must have canManageTopics administrator right in the supergroup or must be the creator of the topic to send messages there.
         */
        public boolean isClosed;
        /**
         * True, if the topic is hidden above the topic list and closed; for General topic only.
         */
        public boolean isHidden;
        /**
         * True, if the name of the topic wasn't added explicitly.
         */
        public boolean isNameImplicit;

        /**
         * Contains basic information about a forum topic.
         */
        public ForumTopicInfo() {
        }

        /**
         * Contains basic information about a forum topic.
         *
         * @param chatId Identifier of a forum supergroup chat or a chat with a bot to which the topic belongs.
         * @param forumTopicId Forum topic identifier of the topic.
         * @param name Name of the topic.
         * @param icon Icon of the topic.
         * @param creationDate Point in time (Unix timestamp) when the topic was created.
         * @param creatorId Identifier of the creator of the topic.
         * @param isGeneral True, if the topic is the General topic.
         * @param isOutgoing True, if the topic was created by the current user.
         * @param isClosed True, if the topic is closed. If the topic is closed, then the user must have canManageTopics administrator right in the supergroup or must be the creator of the topic to send messages there.
         * @param isHidden True, if the topic is hidden above the topic list and closed; for General topic only.
         * @param isNameImplicit True, if the name of the topic wasn't added explicitly.
         */
        public ForumTopicInfo(long chatId, int forumTopicId, String name, ForumTopicIcon icon, int creationDate, MessageSender creatorId, boolean isGeneral, boolean isOutgoing, boolean isClosed, boolean isHidden, boolean isNameImplicit) {
            this.chatId = chatId;
            this.forumTopicId = forumTopicId;
            this.name = name;
            this.icon = icon;
            this.creationDate = creationDate;
            this.creatorId = creatorId;
            this.isGeneral = isGeneral;
            this.isOutgoing = isOutgoing;
            this.isClosed = isClosed;
            this.isHidden = isHidden;
            this.isNameImplicit = isNameImplicit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1951851836;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a list of forum topics.
     */
    public static class ForumTopics extends Object {
        /**
         * Approximate total number of forum topics found.
         */
        public int totalCount;
        /**
         * List of forum topics.
         */
        public ForumTopic[] topics;
        /**
         * Offset date for the next getForumTopics request.
         */
        public int nextOffsetDate;
        /**
         * Offset message identifier for the next getForumTopics request.
         */
        public long nextOffsetMessageId;
        /**
         * Offset forum topic identifier for the next getForumTopics request.
         */
        public int nextOffsetForumTopicId;

        /**
         * Describes a list of forum topics.
         */
        public ForumTopics() {
        }

        /**
         * Describes a list of forum topics.
         *
         * @param totalCount Approximate total number of forum topics found.
         * @param topics List of forum topics.
         * @param nextOffsetDate Offset date for the next getForumTopics request.
         * @param nextOffsetMessageId Offset message identifier for the next getForumTopics request.
         * @param nextOffsetForumTopicId Offset forum topic identifier for the next getForumTopics request.
         */
        public ForumTopics(int totalCount, ForumTopic[] topics, int nextOffsetDate, long nextOffsetMessageId, int nextOffsetForumTopicId) {
            this.totalCount = totalCount;
            this.topics = topics;
            this.nextOffsetDate = nextOffsetDate;
            this.nextOffsetMessageId = nextOffsetMessageId;
            this.nextOffsetForumTopicId = nextOffsetForumTopicId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1877886267;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about the last message from which a new message was forwarded last time.
     */
    public static class ForwardSource extends Object {
        /**
         * Identifier of the chat to which the message that was forwarded belonged; may be 0 if unknown.
         */
        public long chatId;
        /**
         * Identifier of the message; may be 0 if unknown.
         */
        public long messageId;
        /**
         * Identifier of the sender of the message; may be null if unknown or the new message was forwarded not to Saved Messages.
         */
        @Nullable public MessageSender senderId;
        /**
         * Name of the sender of the message if the sender is hidden by their privacy settings.
         */
        public String senderName;
        /**
         * Point in time (Unix timestamp) when the message is sent; 0 if unknown.
         */
        public int date;
        /**
         * True, if the message that was forwarded is outgoing; always false if sender is unknown.
         */
        public boolean isOutgoing;

        /**
         * Contains information about the last message from which a new message was forwarded last time.
         */
        public ForwardSource() {
        }

        /**
         * Contains information about the last message from which a new message was forwarded last time.
         *
         * @param chatId Identifier of the chat to which the message that was forwarded belonged; may be 0 if unknown.
         * @param messageId Identifier of the message; may be 0 if unknown.
         * @param senderId Identifier of the sender of the message; may be null if unknown or the new message was forwarded not to Saved Messages.
         * @param senderName Name of the sender of the message if the sender is hidden by their privacy settings.
         * @param date Point in time (Unix timestamp) when the message is sent; 0 if unknown.
         * @param isOutgoing True, if the message that was forwarded is outgoing; always false if sender is unknown.
         */
        public ForwardSource(long chatId, long messageId, MessageSender senderId, String senderName, int date, boolean isOutgoing) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.senderId = senderId;
            this.senderName = senderName;
            this.date = date;
            this.isOutgoing = isOutgoing;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1795337929;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a found affiliate program.
     */
    public static class FoundAffiliateProgram extends Object {
        /**
         * User identifier of the bot created the program.
         */
        public long botUserId;
        /**
         * Information about the affiliate program.
         */
        public AffiliateProgramInfo info;

        /**
         * Describes a found affiliate program.
         */
        public FoundAffiliateProgram() {
        }

        /**
         * Describes a found affiliate program.
         *
         * @param botUserId User identifier of the bot created the program.
         * @param info Information about the affiliate program.
         */
        public FoundAffiliateProgram(long botUserId, AffiliateProgramInfo info) {
            this.botUserId = botUserId;
            this.info = info;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -966565242;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of found affiliate programs.
     */
    public static class FoundAffiliatePrograms extends Object {
        /**
         * The total number of found affiliate programs.
         */
        public int totalCount;
        /**
         * The list of affiliate programs.
         */
        public FoundAffiliateProgram[] programs;
        /**
         * The offset for the next request. If empty, then there are no more results.
         */
        public String nextOffset;

        /**
         * Represents a list of found affiliate programs.
         */
        public FoundAffiliatePrograms() {
        }

        /**
         * Represents a list of found affiliate programs.
         *
         * @param totalCount The total number of found affiliate programs.
         * @param programs The list of affiliate programs.
         * @param nextOffset The offset for the next request. If empty, then there are no more results.
         */
        public FoundAffiliatePrograms(int totalCount, FoundAffiliateProgram[] programs, String nextOffset) {
            this.totalCount = totalCount;
            this.programs = programs;
            this.nextOffset = nextOffset;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 186317057;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of boosts applied to a chat.
     */
    public static class FoundChatBoosts extends Object {
        /**
         * Total number of boosts applied to the chat.
         */
        public int totalCount;
        /**
         * List of boosts.
         */
        public ChatBoost[] boosts;
        /**
         * The offset for the next request. If empty, then there are no more results.
         */
        public String nextOffset;

        /**
         * Contains a list of boosts applied to a chat.
         */
        public FoundChatBoosts() {
        }

        /**
         * Contains a list of boosts applied to a chat.
         *
         * @param totalCount Total number of boosts applied to the chat.
         * @param boosts List of boosts.
         * @param nextOffset The offset for the next request. If empty, then there are no more results.
         */
        public FoundChatBoosts(int totalCount, ChatBoost[] boosts, String nextOffset) {
            this.totalCount = totalCount;
            this.boosts = boosts;
            this.nextOffset = nextOffset;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 51457680;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of messages found by a search in a given chat.
     */
    public static class FoundChatMessages extends Object {
        /**
         * Approximate total number of messages found; -1 if unknown.
         */
        public int totalCount;
        /**
         * List of messages.
         */
        public Message[] messages;
        /**
         * The offset for the next request. If 0, there are no more results.
         */
        public long nextFromMessageId;

        /**
         * Contains a list of messages found by a search in a given chat.
         */
        public FoundChatMessages() {
        }

        /**
         * Contains a list of messages found by a search in a given chat.
         *
         * @param totalCount Approximate total number of messages found; -1 if unknown.
         * @param messages List of messages.
         * @param nextFromMessageId The offset for the next request. If 0, there are no more results.
         */
        public FoundChatMessages(int totalCount, Message[] messages, long nextFromMessageId) {
            this.totalCount = totalCount;
            this.messages = messages;
            this.nextFromMessageId = nextFromMessageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 427484196;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of downloaded files, found by a search.
     */
    public static class FoundFileDownloads extends Object {
        /**
         * Total number of suitable files, ignoring offset.
         */
        public DownloadedFileCounts totalCounts;
        /**
         * The list of files.
         */
        public FileDownload[] files;
        /**
         * The offset for the next request. If empty, then there are no more results.
         */
        public String nextOffset;

        /**
         * Contains a list of downloaded files, found by a search.
         */
        public FoundFileDownloads() {
        }

        /**
         * Contains a list of downloaded files, found by a search.
         *
         * @param totalCounts Total number of suitable files, ignoring offset.
         * @param files The list of files.
         * @param nextOffset The offset for the next request. If empty, then there are no more results.
         */
        public FoundFileDownloads(DownloadedFileCounts totalCounts, FileDownload[] files, String nextOffset) {
            this.totalCounts = totalCounts;
            this.files = files;
            this.nextOffset = nextOffset;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1395890392;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of messages found by a search.
     */
    public static class FoundMessages extends Object {
        /**
         * Approximate total number of messages found; -1 if unknown.
         */
        public int totalCount;
        /**
         * List of messages.
         */
        public Message[] messages;
        /**
         * The offset for the next request. If empty, then there are no more results.
         */
        public String nextOffset;

        /**
         * Contains a list of messages found by a search.
         */
        public FoundMessages() {
        }

        /**
         * Contains a list of messages found by a search.
         *
         * @param totalCount Approximate total number of messages found; -1 if unknown.
         * @param messages List of messages.
         * @param nextOffset The offset for the next request. If empty, then there are no more results.
         */
        public FoundMessages(int totalCount, Message[] messages, String nextOffset) {
            this.totalCount = totalCount;
            this.messages = messages;
            this.nextOffset = nextOffset;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -529809608;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains 0-based match position.
     */
    public static class FoundPosition extends Object {
        /**
         * The position of the match.
         */
        public int position;

        /**
         * Contains 0-based match position.
         */
        public FoundPosition() {
        }

        /**
         * Contains 0-based match position.
         *
         * @param position The position of the match.
         */
        public FoundPosition(int position) {
            this.position = position;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1886724216;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains 0-based positions of matched objects.
     */
    public static class FoundPositions extends Object {
        /**
         * Total number of matched objects.
         */
        public int totalCount;
        /**
         * The positions of the matched objects.
         */
        public int[] positions;

        /**
         * Contains 0-based positions of matched objects.
         */
        public FoundPositions() {
        }

        /**
         * Contains 0-based positions of matched objects.
         *
         * @param totalCount Total number of matched objects.
         * @param positions The positions of the matched objects.
         */
        public FoundPositions(int totalCount, int[] positions) {
            this.totalCount = totalCount;
            this.positions = positions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -80518368;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of messages found by a public post search.
     */
    public static class FoundPublicPosts extends Object {
        /**
         * List of found public posts.
         */
        public Message[] messages;
        /**
         * The offset for the next request. If empty, then there are no more results.
         */
        public String nextOffset;
        /**
         * Updated public post search limits after the query; repeated requests with the same query will be free; may be null if they didn't change.
         */
        @Nullable public PublicPostSearchLimits searchLimits;
        /**
         * True, if the query has failed because search limits are exceeded. In this case searchLimits.dailyFreeQueryCount will be equal to 0.
         */
        public boolean areLimitsExceeded;

        /**
         * Contains a list of messages found by a public post search.
         */
        public FoundPublicPosts() {
        }

        /**
         * Contains a list of messages found by a public post search.
         *
         * @param messages List of found public posts.
         * @param nextOffset The offset for the next request. If empty, then there are no more results.
         * @param searchLimits Updated public post search limits after the query; repeated requests with the same query will be free; may be null if they didn't change.
         * @param areLimitsExceeded True, if the query has failed because search limits are exceeded. In this case searchLimits.dailyFreeQueryCount will be equal to 0.
         */
        public FoundPublicPosts(Message[] messages, String nextOffset, PublicPostSearchLimits searchLimits, boolean areLimitsExceeded) {
            this.messages = messages;
            this.nextOffset = nextOffset;
            this.searchLimits = searchLimits;
            this.areLimitsExceeded = areLimitsExceeded;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1231347940;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of stories found by a search.
     */
    public static class FoundStories extends Object {
        /**
         * Approximate total number of stories found.
         */
        public int totalCount;
        /**
         * List of stories.
         */
        public Story[] stories;
        /**
         * The offset for the next request. If empty, then there are no more results.
         */
        public String nextOffset;

        /**
         * Contains a list of stories found by a search.
         */
        public FoundStories() {
        }

        /**
         * Contains a list of stories found by a search.
         *
         * @param totalCount Approximate total number of stories found.
         * @param stories List of stories.
         * @param nextOffset The offset for the next request. If empty, then there are no more results.
         */
        public FoundStories(int totalCount, Story[] stories, String nextOffset) {
            this.totalCount = totalCount;
            this.stories = stories;
            this.nextOffset = nextOffset;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1678513512;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of found users.
     */
    public static class FoundUsers extends Object {
        /**
         * Identifiers of the found users.
         */
        public long[] userIds;
        /**
         * The offset for the next request. If empty, then there are no more results.
         */
        public String nextOffset;

        /**
         * Represents a list of found users.
         */
        public FoundUsers() {
        }

        /**
         * Represents a list of found users.
         *
         * @param userIds Identifiers of the found users.
         * @param nextOffset The offset for the next request. If empty, then there are no more results.
         */
        public FoundUsers(long[] userIds, String nextOffset) {
            this.userIds = userIds;
            this.nextOffset = nextOffset;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1150570075;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a Web App found by its short name.
     */
    public static class FoundWebApp extends Object {
        /**
         * The Web App.
         */
        public WebApp webApp;
        /**
         * True, if the user must be asked for the permission to the bot to send them messages.
         */
        public boolean requestWriteAccess;
        /**
         * True, if there is no need to show an ordinary open URL confirmation before opening the Web App. The field must be ignored and confirmation must be shown anyway if the Web App link was hidden.
         */
        public boolean skipConfirmation;

        /**
         * Contains information about a Web App found by its short name.
         */
        public FoundWebApp() {
        }

        /**
         * Contains information about a Web App found by its short name.
         *
         * @param webApp The Web App.
         * @param requestWriteAccess True, if the user must be asked for the permission to the bot to send them messages.
         * @param skipConfirmation True, if there is no need to show an ordinary open URL confirmation before opening the Web App. The field must be ignored and confirmation must be shown anyway if the Web App link was hidden.
         */
        public FoundWebApp(WebApp webApp, boolean requestWriteAccess, boolean skipConfirmation) {
            this.webApp = webApp;
            this.requestWriteAccess = requestWriteAccess;
            this.skipConfirmation = skipConfirmation;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -290926562;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a game. Use getInternalLink with internalLinkTypeGame to share the game.
     */
    public static class Game extends Object {
        /**
         * Unique game identifier.
         */
        public long id;
        /**
         * Game short name.
         */
        public String shortName;
        /**
         * Game title.
         */
        public String title;
        /**
         * Game text, usually containing scoreboards for a game.
         */
        public FormattedText text;
        /**
         * Game description.
         */
        public String description;
        /**
         * Game photo.
         */
        public Photo photo;
        /**
         * Game animation; may be null.
         */
        @Nullable public Animation animation;

        /**
         * Describes a game. Use getInternalLink with internalLinkTypeGame to share the game.
         */
        public Game() {
        }

        /**
         * Describes a game. Use getInternalLink with internalLinkTypeGame to share the game.
         *
         * @param id Unique game identifier.
         * @param shortName Game short name.
         * @param title Game title.
         * @param text Game text, usually containing scoreboards for a game.
         * @param description Game description.
         * @param photo Game photo.
         * @param animation Game animation; may be null.
         */
        public Game(long id, String shortName, String title, FormattedText text, String description, Photo photo, Animation animation) {
            this.id = id;
            this.shortName = shortName;
            this.title = title;
            this.text = text;
            this.description = description;
            this.photo = photo;
            this.animation = animation;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1565597752;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains one row of the game high score table.
     */
    public static class GameHighScore extends Object {
        /**
         * Position in the high score table.
         */
        public int position;
        /**
         * User identifier.
         */
        public long userId;
        /**
         * User score.
         */
        public int score;

        /**
         * Contains one row of the game high score table.
         */
        public GameHighScore() {
        }

        /**
         * Contains one row of the game high score table.
         *
         * @param position Position in the high score table.
         * @param userId User identifier.
         * @param score User score.
         */
        public GameHighScore(int position, long userId, int score) {
            this.position = position;
            this.userId = userId;
            this.score = score;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 342871838;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of game high scores.
     */
    public static class GameHighScores extends Object {
        /**
         * A list of game high scores.
         */
        public GameHighScore[] scores;

        /**
         * Contains a list of game high scores.
         */
        public GameHighScores() {
        }

        /**
         * Contains a list of game high scores.
         *
         * @param scores A list of game high scores.
         */
        public GameHighScores(GameHighScore[] scores) {
            this.scores = scores;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -725770727;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a gift that can be sent to another user or channel chat.
     */
    public static class Gift extends Object {
        /**
         * Unique identifier of the gift.
         */
        public long id;
        /**
         * Identifier of the chat that published the gift; 0 if none.
         */
        public long publisherChatId;
        /**
         * The sticker representing the gift.
         */
        public Sticker sticker;
        /**
         * Number of Telegram Stars that must be paid for the gift.
         */
        public long starCount;
        /**
         * Number of Telegram Stars that can be claimed by the receiver instead of the regular gift by default. If the gift was paid with just bought Telegram Stars, then full value can be claimed.
         */
        public long defaultSellStarCount;
        /**
         * Number of Telegram Stars that must be paid to upgrade the gift; 0 if upgrade isn't possible.
         */
        public long upgradeStarCount;
        /**
         * Number of unique gift variants that are available for the upgraded gift; 0 if unknown.
         */
        public int upgradeVariantCount;
        /**
         * True, if the gift can be used to customize the user's name, and backgrounds of profile photo, reply header, and link preview.
         */
        public boolean hasColors;
        /**
         * True, if the gift is a birthday gift.
         */
        public boolean isForBirthday;
        /**
         * True, if the gift can be bought only by Telegram Premium subscribers.
         */
        public boolean isPremium;
        /**
         * Information about the auction on which the gift can be purchased; may be null if the gift can be purchased directly.
         */
        @Nullable public GiftAuction auctionInfo;
        /**
         * Point in time (Unix timestamp) when the gift can be sent next time by the current user; may be 0 or a date in the past. If the date is in the future, then call canSendGift to get the reason, why the gift can't be sent now.
         */
        public int nextSendDate;
        /**
         * Number of times the gift can be purchased by the current user; may be null if not limited.
         */
        @Nullable public GiftPurchaseLimits userLimits;
        /**
         * Number of times the gift can be purchased all users; may be null if not limited.
         */
        @Nullable public GiftPurchaseLimits overallLimits;
        /**
         * Background of the gift.
         */
        public GiftBackground background;
        /**
         * Point in time (Unix timestamp) when the gift was send for the first time; for sold out gifts only.
         */
        public int firstSendDate;
        /**
         * Point in time (Unix timestamp) when the gift was send for the last time; for sold out gifts only.
         */
        public int lastSendDate;

        /**
         * Describes a gift that can be sent to another user or channel chat.
         */
        public Gift() {
        }

        /**
         * Describes a gift that can be sent to another user or channel chat.
         *
         * @param id Unique identifier of the gift.
         * @param publisherChatId Identifier of the chat that published the gift; 0 if none.
         * @param sticker The sticker representing the gift.
         * @param starCount Number of Telegram Stars that must be paid for the gift.
         * @param defaultSellStarCount Number of Telegram Stars that can be claimed by the receiver instead of the regular gift by default. If the gift was paid with just bought Telegram Stars, then full value can be claimed.
         * @param upgradeStarCount Number of Telegram Stars that must be paid to upgrade the gift; 0 if upgrade isn't possible.
         * @param upgradeVariantCount Number of unique gift variants that are available for the upgraded gift; 0 if unknown.
         * @param hasColors True, if the gift can be used to customize the user's name, and backgrounds of profile photo, reply header, and link preview.
         * @param isForBirthday True, if the gift is a birthday gift.
         * @param isPremium True, if the gift can be bought only by Telegram Premium subscribers.
         * @param auctionInfo Information about the auction on which the gift can be purchased; may be null if the gift can be purchased directly.
         * @param nextSendDate Point in time (Unix timestamp) when the gift can be sent next time by the current user; may be 0 or a date in the past. If the date is in the future, then call canSendGift to get the reason, why the gift can't be sent now.
         * @param userLimits Number of times the gift can be purchased by the current user; may be null if not limited.
         * @param overallLimits Number of times the gift can be purchased all users; may be null if not limited.
         * @param background Background of the gift.
         * @param firstSendDate Point in time (Unix timestamp) when the gift was send for the first time; for sold out gifts only.
         * @param lastSendDate Point in time (Unix timestamp) when the gift was send for the last time; for sold out gifts only.
         */
        public Gift(long id, long publisherChatId, Sticker sticker, long starCount, long defaultSellStarCount, long upgradeStarCount, int upgradeVariantCount, boolean hasColors, boolean isForBirthday, boolean isPremium, GiftAuction auctionInfo, int nextSendDate, GiftPurchaseLimits userLimits, GiftPurchaseLimits overallLimits, GiftBackground background, int firstSendDate, int lastSendDate) {
            this.id = id;
            this.publisherChatId = publisherChatId;
            this.sticker = sticker;
            this.starCount = starCount;
            this.defaultSellStarCount = defaultSellStarCount;
            this.upgradeStarCount = upgradeStarCount;
            this.upgradeVariantCount = upgradeVariantCount;
            this.hasColors = hasColors;
            this.isForBirthday = isForBirthday;
            this.isPremium = isPremium;
            this.auctionInfo = auctionInfo;
            this.nextSendDate = nextSendDate;
            this.userLimits = userLimits;
            this.overallLimits = overallLimits;
            this.background = background;
            this.firstSendDate = firstSendDate;
            this.lastSendDate = lastSendDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1567244615;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an auction on which a gift can be purchased.
     */
    public static class GiftAuction extends Object {
        /**
         * Identifier of the auction.
         */
        public String id;
        /**
         * Number of gifts distributed in each round.
         */
        public int giftsPerRound;
        /**
         * Point in time (Unix timestamp) when the auction will start.
         */
        public int startDate;

        /**
         * Describes an auction on which a gift can be purchased.
         */
        public GiftAuction() {
        }

        /**
         * Describes an auction on which a gift can be purchased.
         *
         * @param id Identifier of the auction.
         * @param giftsPerRound Number of gifts distributed in each round.
         * @param startDate Point in time (Unix timestamp) when the auction will start.
         */
        public GiftAuction(String id, int giftsPerRound, int startDate) {
            this.id = id;
            this.giftsPerRound = giftsPerRound;
            this.startDate = startDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -907929982;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a gift that was acquired by the current user on an auction.
     */
    public static class GiftAuctionAcquiredGift extends Object {
        /**
         * Receiver of the gift.
         */
        public MessageSender receiverId;
        /**
         * Point in time (Unix timestamp) when the gift was acquired.
         */
        public int date;
        /**
         * The number of Telegram Stars that were paid for the gift.
         */
        public long starCount;
        /**
         * Identifier of the auction round in which the gift was acquired.
         */
        public int auctionRoundNumber;
        /**
         * Position of the user in the round among all auction participants.
         */
        public int auctionRoundPosition;
        /**
         * Unique number of the gift among gifts upgraded from the same gift after upgrade; 0 if yet unassigned.
         */
        public int uniqueGiftNumber;
        /**
         * Message added to the gift.
         */
        public FormattedText text;
        /**
         * True, if the sender and gift text are shown only to the gift receiver; otherwise, everyone will be able to see them.
         */
        public boolean isPrivate;

        /**
         * Represents a gift that was acquired by the current user on an auction.
         */
        public GiftAuctionAcquiredGift() {
        }

        /**
         * Represents a gift that was acquired by the current user on an auction.
         *
         * @param receiverId Receiver of the gift.
         * @param date Point in time (Unix timestamp) when the gift was acquired.
         * @param starCount The number of Telegram Stars that were paid for the gift.
         * @param auctionRoundNumber Identifier of the auction round in which the gift was acquired.
         * @param auctionRoundPosition Position of the user in the round among all auction participants.
         * @param uniqueGiftNumber Unique number of the gift among gifts upgraded from the same gift after upgrade; 0 if yet unassigned.
         * @param text Message added to the gift.
         * @param isPrivate True, if the sender and gift text are shown only to the gift receiver; otherwise, everyone will be able to see them.
         */
        public GiftAuctionAcquiredGift(MessageSender receiverId, int date, long starCount, int auctionRoundNumber, int auctionRoundPosition, int uniqueGiftNumber, FormattedText text, boolean isPrivate) {
            this.receiverId = receiverId;
            this.date = date;
            this.starCount = starCount;
            this.auctionRoundNumber = auctionRoundNumber;
            this.auctionRoundPosition = auctionRoundPosition;
            this.uniqueGiftNumber = uniqueGiftNumber;
            this.text = text;
            this.isPrivate = isPrivate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1109930332;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of gifts that were acquired by the current user on an auction.
     */
    public static class GiftAuctionAcquiredGifts extends Object {
        /**
         * The list of acquired gifts.
         */
        public GiftAuctionAcquiredGift[] gifts;

        /**
         * Represents a list of gifts that were acquired by the current user on an auction.
         */
        public GiftAuctionAcquiredGifts() {
        }

        /**
         * Represents a list of gifts that were acquired by the current user on an auction.
         *
         * @param gifts The list of acquired gifts.
         */
        public GiftAuctionAcquiredGifts(GiftAuctionAcquiredGift[] gifts) {
            this.gifts = gifts;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1203777214;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represent auction state of a gift.
     */
    public static class GiftAuctionState extends Object {
        /**
         * The gift.
         */
        public Gift gift;
        /**
         * Auction state of the gift.
         */
        public AuctionState state;

        /**
         * Represent auction state of a gift.
         */
        public GiftAuctionState() {
        }

        /**
         * Represent auction state of a gift.
         *
         * @param gift The gift.
         * @param state Auction state of the gift.
         */
        public GiftAuctionState(Gift gift, AuctionState state) {
            this.gift = gift;
            this.state = state;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1691485529;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes background of a gift.
     */
    public static class GiftBackground extends Object {
        /**
         * Center color in RGB format.
         */
        public int centerColor;
        /**
         * Edge color in RGB format.
         */
        public int edgeColor;
        /**
         * Text color in RGB format.
         */
        public int textColor;

        /**
         * Describes background of a gift.
         */
        public GiftBackground() {
        }

        /**
         * Describes background of a gift.
         *
         * @param centerColor Center color in RGB format.
         * @param edgeColor Edge color in RGB format.
         * @param textColor Text color in RGB format.
         */
        public GiftBackground(int centerColor, int edgeColor, int textColor) {
            this.centerColor = centerColor;
            this.edgeColor = edgeColor;
            this.textColor = textColor;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 269232091;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a chat theme based on an upgraded gift.
     */
    public static class GiftChatTheme extends Object {
        /**
         * The gift.
         */
        public UpgradedGift gift;
        /**
         * Theme settings for a light chat theme.
         */
        public ThemeSettings lightSettings;
        /**
         * Theme settings for a dark chat theme.
         */
        public ThemeSettings darkSettings;

        /**
         * Describes a chat theme based on an upgraded gift.
         */
        public GiftChatTheme() {
        }

        /**
         * Describes a chat theme based on an upgraded gift.
         *
         * @param gift The gift.
         * @param lightSettings Theme settings for a light chat theme.
         * @param darkSettings Theme settings for a dark chat theme.
         */
        public GiftChatTheme(UpgradedGift gift, ThemeSettings lightSettings, ThemeSettings darkSettings) {
            this.gift = gift;
            this.lightSettings = lightSettings;
            this.darkSettings = darkSettings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 631944675;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of chat themes based on upgraded gifts.
     */
    public static class GiftChatThemes extends Object {
        /**
         * A list of chat themes.
         */
        public GiftChatTheme[] themes;
        /**
         * The offset for the next request. If empty, then there are no more results.
         */
        public String nextOffset;

        /**
         * Contains a list of chat themes based on upgraded gifts.
         */
        public GiftChatThemes() {
        }

        /**
         * Contains a list of chat themes based on upgraded gifts.
         *
         * @param themes A list of chat themes.
         * @param nextOffset The offset for the next request. If empty, then there are no more results.
         */
        public GiftChatThemes(GiftChatTheme[] themes, String nextOffset) {
            this.themes = themes;
            this.nextOffset = nextOffset;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2032762331;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes collection of gifts.
     */
    public static class GiftCollection extends Object {
        /**
         * Unique identifier of the collection.
         */
        public int id;
        /**
         * Name of the collection.
         */
        public String name;
        /**
         * Icon of the collection; may be null if none.
         */
        @Nullable public Sticker icon;
        /**
         * Total number of gifts in the collection.
         */
        public int giftCount;

        /**
         * Describes collection of gifts.
         */
        public GiftCollection() {
        }

        /**
         * Describes collection of gifts.
         *
         * @param id Unique identifier of the collection.
         * @param name Name of the collection.
         * @param icon Icon of the collection; may be null if none.
         * @param giftCount Total number of gifts in the collection.
         */
        public GiftCollection(int id, String name, Sticker icon, int giftCount) {
            this.id = id;
            this.name = name;
            this.icon = icon;
            this.giftCount = giftCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -974976984;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of gift collections.
     */
    public static class GiftCollections extends Object {
        /**
         * List of gift collections.
         */
        public GiftCollection[] collections;

        /**
         * Contains a list of gift collections.
         */
        public GiftCollections() {
        }

        /**
         * Contains a list of gift collections.
         *
         * @param collections List of gift collections.
         */
        public GiftCollections(GiftCollection[] collections) {
            this.collections = collections;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2061353335;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a gift available for resale.
     */
    public static class GiftForResale extends Object {
        /**
         * The gift.
         */
        public UpgradedGift gift;
        /**
         * Unique identifier of the received gift for the current user; only for the gifts owned by the current user.
         */
        public String receivedGiftId;

        /**
         * Describes a gift available for resale.
         */
        public GiftForResale() {
        }

        /**
         * Describes a gift available for resale.
         *
         * @param gift The gift.
         * @param receivedGiftId Unique identifier of the received gift for the current user; only for the gifts owned by the current user.
         */
        public GiftForResale(UpgradedGift gift, String receivedGiftId) {
            this.gift = gift;
            this.receivedGiftId = receivedGiftId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1130990515;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes order in which upgraded gifts for resale will be sorted.
     */
    public abstract static class GiftForResaleOrder extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            GiftForResaleOrderPrice.CONSTRUCTOR,
            GiftForResaleOrderPriceChangeDate.CONSTRUCTOR,
            GiftForResaleOrderNumber.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public GiftForResaleOrder() {
        }
    }

    /**
     * The gifts will be sorted by their price from the lowest to the highest.
     */
    public static class GiftForResaleOrderPrice extends GiftForResaleOrder {

        /**
         * The gifts will be sorted by their price from the lowest to the highest.
         */
        public GiftForResaleOrderPrice() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1371740258;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The gifts will be sorted by the last date when their price was changed from the newest to the oldest.
     */
    public static class GiftForResaleOrderPriceChangeDate extends GiftForResaleOrder {

        /**
         * The gifts will be sorted by the last date when their price was changed from the newest to the oldest.
         */
        public GiftForResaleOrderPriceChangeDate() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1694144054;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The gifts will be sorted by their number from the smallest to the largest.
     */
    public static class GiftForResaleOrderNumber extends GiftForResaleOrder {

        /**
         * The gifts will be sorted by their number from the smallest to the largest.
         */
        public GiftForResaleOrderNumber() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1301157632;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes the maximum number of times that a specific gift can be purchased.
     */
    public static class GiftPurchaseLimits extends Object {
        /**
         * The maximum number of times the gifts can be purchased.
         */
        public int totalCount;
        /**
         * Number of remaining times the gift can be purchased.
         */
        public int remainingCount;

        /**
         * Describes the maximum number of times that a specific gift can be purchased.
         */
        public GiftPurchaseLimits() {
        }

        /**
         * Describes the maximum number of times that a specific gift can be purchased.
         *
         * @param totalCount The maximum number of times the gifts can be purchased.
         * @param remainingCount Number of remaining times the gift can be purchased.
         */
        public GiftPurchaseLimits(int totalCount, int remainingCount) {
            this.totalCount = totalCount;
            this.remainingCount = remainingCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1628985177;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes state of a gift purchase offer.
     */
    public abstract static class GiftPurchaseOfferState extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            GiftPurchaseOfferStatePending.CONSTRUCTOR,
            GiftPurchaseOfferStateAccepted.CONSTRUCTOR,
            GiftPurchaseOfferStateRejected.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public GiftPurchaseOfferState() {
        }
    }

    /**
     * The offer must be accepted or rejected.
     */
    public static class GiftPurchaseOfferStatePending extends GiftPurchaseOfferState {

        /**
         * The offer must be accepted or rejected.
         */
        public GiftPurchaseOfferStatePending() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 568086522;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The offer was accepted.
     */
    public static class GiftPurchaseOfferStateAccepted extends GiftPurchaseOfferState {

        /**
         * The offer was accepted.
         */
        public GiftPurchaseOfferStateAccepted() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 267078794;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The offer was rejected.
     */
    public static class GiftPurchaseOfferStateRejected extends GiftPurchaseOfferState {

        /**
         * The offer was rejected.
         */
        public GiftPurchaseOfferStateRejected() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1637834462;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes parameters of a unique gift available for resale.
     */
    public static class GiftResaleParameters extends Object {
        /**
         * Resale price of the gift in Telegram Stars.
         */
        public long starCount;
        /**
         * Resale price of the gift in 1/100 of Toncoin.
         */
        public long toncoinCentCount;
        /**
         * True, if the gift can be bought only using Toncoins.
         */
        public boolean toncoinOnly;

        /**
         * Describes parameters of a unique gift available for resale.
         */
        public GiftResaleParameters() {
        }

        /**
         * Describes parameters of a unique gift available for resale.
         *
         * @param starCount Resale price of the gift in Telegram Stars.
         * @param toncoinCentCount Resale price of the gift in 1/100 of Toncoin.
         * @param toncoinOnly True, if the gift can be bought only using Toncoins.
         */
        public GiftResaleParameters(long starCount, long toncoinCentCount, boolean toncoinOnly) {
            this.starCount = starCount;
            this.toncoinCentCount = toncoinCentCount;
            this.toncoinOnly = toncoinOnly;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2144380890;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes price of a resold gift.
     */
    public abstract static class GiftResalePrice extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            GiftResalePriceStar.CONSTRUCTOR,
            GiftResalePriceTon.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public GiftResalePrice() {
        }
    }

    /**
     * Describes price of a resold gift in Telegram Stars.
     */
    public static class GiftResalePriceStar extends GiftResalePrice {
        /**
         * The Telegram Star amount expected to be paid for the gift. Must be in the range getOption(&quot;gift_resale_star_count_min&quot;)-getOption(&quot;gift_resale_star_count_max&quot;) for gifts put for resale.
         */
        public long starCount;

        /**
         * Describes price of a resold gift in Telegram Stars.
         */
        public GiftResalePriceStar() {
        }

        /**
         * Describes price of a resold gift in Telegram Stars.
         *
         * @param starCount The Telegram Star amount expected to be paid for the gift. Must be in the range getOption(&quot;gift_resale_star_count_min&quot;)-getOption(&quot;gift_resale_star_count_max&quot;) for gifts put for resale.
         */
        public GiftResalePriceStar(long starCount) {
            this.starCount = starCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1184402054;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes price of a resold gift in Toncoins.
     */
    public static class GiftResalePriceTon extends GiftResalePrice {
        /**
         * The amount of 1/100 of Toncoin expected to be paid for the gift. Must be in the range getOption(&quot;gift_resale_toncoin_cent_count_min&quot;)-getOption(&quot;gift_resale_toncoin_cent_count_max&quot;).
         */
        public long toncoinCentCount;

        /**
         * Describes price of a resold gift in Toncoins.
         */
        public GiftResalePriceTon() {
        }

        /**
         * Describes price of a resold gift in Toncoins.
         *
         * @param toncoinCentCount The amount of 1/100 of Toncoin expected to be paid for the gift. Must be in the range getOption(&quot;gift_resale_toncoin_cent_count_min&quot;)-getOption(&quot;gift_resale_toncoin_cent_count_max&quot;).
         */
        public GiftResalePriceTon(long toncoinCentCount) {
            this.toncoinCentCount = toncoinCentCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -415435950;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes result of sending a resold gift.
     */
    public abstract static class GiftResaleResult extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            GiftResaleResultOk.CONSTRUCTOR,
            GiftResaleResultPriceIncreased.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public GiftResaleResult() {
        }
    }

    /**
     * Operation was successfully completed.
     */
    public static class GiftResaleResultOk extends GiftResaleResult {
        /**
         * Unique identifier of the received gift; only for the gifts sent to the current user.
         */
        public String receivedGiftId;

        /**
         * Operation was successfully completed.
         */
        public GiftResaleResultOk() {
        }

        /**
         * Operation was successfully completed.
         *
         * @param receivedGiftId Unique identifier of the received gift; only for the gifts sent to the current user.
         */
        public GiftResaleResultOk(String receivedGiftId) {
            this.receivedGiftId = receivedGiftId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -778580572;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Operation has failed, because price has increased. If the price has decreased, then the buying will succeed anyway.
     */
    public static class GiftResaleResultPriceIncreased extends GiftResaleResult {
        /**
         * New price for the gift.
         */
        public GiftResalePrice price;

        /**
         * Operation has failed, because price has increased. If the price has decreased, then the buying will succeed anyway.
         */
        public GiftResaleResultPriceIncreased() {
        }

        /**
         * Operation has failed, because price has increased. If the price has decreased, then the buying will succeed anyway.
         *
         * @param price New price for the gift.
         */
        public GiftResaleResultPriceIncreased(GiftResalePrice price) {
            this.price = price;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1954623859;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains settings for gift receiving for a user.
     */
    public static class GiftSettings extends Object {
        /**
         * True, if a button for sending a gift to the user or by the user must always be shown in the input field.
         */
        public boolean showGiftButton;
        /**
         * Types of gifts accepted by the user; for Telegram Premium users only.
         */
        public AcceptedGiftTypes acceptedGiftTypes;

        /**
         * Contains settings for gift receiving for a user.
         */
        public GiftSettings() {
        }

        /**
         * Contains settings for gift receiving for a user.
         *
         * @param showGiftButton True, if a button for sending a gift to the user or by the user must always be shown in the input field.
         * @param acceptedGiftTypes Types of gifts accepted by the user; for Telegram Premium users only.
         */
        public GiftSettings(boolean showGiftButton, AcceptedGiftTypes acceptedGiftTypes) {
            this.showGiftButton = showGiftButton;
            this.acceptedGiftTypes = acceptedGiftTypes;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 45783168;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains examples of possible upgraded gifts for the given regular gift.
     */
    public static class GiftUpgradePreview extends Object {
        /**
         * Examples of possible models that can be chosen for the gift after upgrade.
         */
        public UpgradedGiftModel[] models;
        /**
         * Examples of possible symbols that can be chosen for the gift after upgrade.
         */
        public UpgradedGiftSymbol[] symbols;
        /**
         * Examples of possible backdrops that can be chosen for the gift after upgrade.
         */
        public UpgradedGiftBackdrop[] backdrops;
        /**
         * Examples of price for gift upgrade from the maximum price to the minimum price.
         */
        public GiftUpgradePrice[] prices;
        /**
         * Next changes for the price for gift upgrade with more granularity than in prices.
         */
        public GiftUpgradePrice[] nextPrices;

        /**
         * Contains examples of possible upgraded gifts for the given regular gift.
         */
        public GiftUpgradePreview() {
        }

        /**
         * Contains examples of possible upgraded gifts for the given regular gift.
         *
         * @param models Examples of possible models that can be chosen for the gift after upgrade.
         * @param symbols Examples of possible symbols that can be chosen for the gift after upgrade.
         * @param backdrops Examples of possible backdrops that can be chosen for the gift after upgrade.
         * @param prices Examples of price for gift upgrade from the maximum price to the minimum price.
         * @param nextPrices Next changes for the price for gift upgrade with more granularity than in prices.
         */
        public GiftUpgradePreview(UpgradedGiftModel[] models, UpgradedGiftSymbol[] symbols, UpgradedGiftBackdrop[] backdrops, GiftUpgradePrice[] prices, GiftUpgradePrice[] nextPrices) {
            this.models = models;
            this.symbols = symbols;
            this.backdrops = backdrops;
            this.prices = prices;
            this.nextPrices = nextPrices;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -330012073;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a price required to pay to upgrade a gift.
     */
    public static class GiftUpgradePrice extends Object {
        /**
         * Point in time (Unix timestamp) when the price will be in effect.
         */
        public int date;
        /**
         * The Telegram Star amount required to pay to upgrade the gift.
         */
        public long starCount;

        /**
         * Describes a price required to pay to upgrade a gift.
         */
        public GiftUpgradePrice() {
        }

        /**
         * Describes a price required to pay to upgrade a gift.
         *
         * @param date Point in time (Unix timestamp) when the price will be in effect.
         * @param starCount The Telegram Star amount required to pay to upgrade the gift.
         */
        public GiftUpgradePrice(int date, long starCount) {
            this.date = date;
            this.starCount = starCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -914121900;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains all possible variants of upgraded gifts for the given regular gift.
     */
    public static class GiftUpgradeVariants extends Object {
        /**
         * Models that can be chosen for the gift after upgrade.
         */
        public UpgradedGiftModel[] models;
        /**
         * Symbols that can be chosen for the gift after upgrade.
         */
        public UpgradedGiftSymbol[] symbols;
        /**
         * Backdrops that can be chosen for the gift after upgrade.
         */
        public UpgradedGiftBackdrop[] backdrops;

        /**
         * Contains all possible variants of upgraded gifts for the given regular gift.
         */
        public GiftUpgradeVariants() {
        }

        /**
         * Contains all possible variants of upgraded gifts for the given regular gift.
         *
         * @param models Models that can be chosen for the gift after upgrade.
         * @param symbols Symbols that can be chosen for the gift after upgrade.
         * @param backdrops Backdrops that can be chosen for the gift after upgrade.
         */
        public GiftUpgradeVariants(UpgradedGiftModel[] models, UpgradedGiftSymbol[] symbols, UpgradedGiftBackdrop[] backdrops) {
            this.models = models;
            this.symbols = symbols;
            this.backdrops = backdrops;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -797379063;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of gifts received by a user or a chat.
     */
    public static class GiftsForCrafting extends Object {
        /**
         * The total number of received gifts.
         */
        public int totalCount;
        /**
         * The list of gifts.
         */
        public ReceivedGift[] gifts;
        /**
         * The 4 objects that describe probabilities of the crafted gift to have the backdrop or symbol of one of the original gifts for the cases when 1, 2, 3 or 4 gifts are used in the craft correspondingly.
         */
        public AttributeCraftPersistenceProbability[] attributePersistenceProbabilities;
        /**
         * The offset for the next request. If empty, then there are no more results.
         */
        public String nextOffset;

        /**
         * Represents a list of gifts received by a user or a chat.
         */
        public GiftsForCrafting() {
        }

        /**
         * Represents a list of gifts received by a user or a chat.
         *
         * @param totalCount The total number of received gifts.
         * @param gifts The list of gifts.
         * @param attributePersistenceProbabilities The 4 objects that describe probabilities of the crafted gift to have the backdrop or symbol of one of the original gifts for the cases when 1, 2, 3 or 4 gifts are used in the craft correspondingly.
         * @param nextOffset The offset for the next request. If empty, then there are no more results.
         */
        public GiftsForCrafting(int totalCount, ReceivedGift[] gifts, AttributeCraftPersistenceProbability[] attributePersistenceProbabilities, String nextOffset) {
            this.totalCount = totalCount;
            this.gifts = gifts;
            this.attributePersistenceProbabilities = attributePersistenceProbabilities;
            this.nextOffset = nextOffset;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -474640200;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes gifts available for resale.
     */
    public static class GiftsForResale extends Object {
        /**
         * Total number of gifts found.
         */
        public int totalCount;
        /**
         * The gifts.
         */
        public GiftForResale[] gifts;
        /**
         * Available models; for searchGiftsForResale requests without offset and attributes only.
         */
        public UpgradedGiftModelCount[] models;
        /**
         * Available symbols; for searchGiftsForResale requests without offset and attributes only.
         */
        public UpgradedGiftSymbolCount[] symbols;
        /**
         * Available backdrops; for searchGiftsForResale requests without offset and attributes only.
         */
        public UpgradedGiftBackdropCount[] backdrops;
        /**
         * The offset for the next request. If empty, then there are no more results.
         */
        public String nextOffset;

        /**
         * Describes gifts available for resale.
         */
        public GiftsForResale() {
        }

        /**
         * Describes gifts available for resale.
         *
         * @param totalCount Total number of gifts found.
         * @param gifts The gifts.
         * @param models Available models; for searchGiftsForResale requests without offset and attributes only.
         * @param symbols Available symbols; for searchGiftsForResale requests without offset and attributes only.
         * @param backdrops Available backdrops; for searchGiftsForResale requests without offset and attributes only.
         * @param nextOffset The offset for the next request. If empty, then there are no more results.
         */
        public GiftsForResale(int totalCount, GiftForResale[] gifts, UpgradedGiftModelCount[] models, UpgradedGiftSymbolCount[] symbols, UpgradedGiftBackdropCount[] backdrops, String nextOffset) {
            this.totalCount = totalCount;
            this.gifts = gifts;
            this.models = models;
            this.symbols = symbols;
            this.backdrops = backdrops;
            this.nextOffset = nextOffset;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 35082425;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains information about a giveaway.
     */
    public abstract static class GiveawayInfo extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            GiveawayInfoOngoing.CONSTRUCTOR,
            GiveawayInfoCompleted.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public GiveawayInfo() {
        }
    }

    /**
     * Describes an ongoing giveaway.
     */
    public static class GiveawayInfoOngoing extends GiveawayInfo {
        /**
         * Point in time (Unix timestamp) when the giveaway was created.
         */
        public int creationDate;
        /**
         * Status of the current user in the giveaway.
         */
        public GiveawayParticipantStatus status;
        /**
         * True, if the giveaway has ended and results are being prepared.
         */
        public boolean isEnded;

        /**
         * Describes an ongoing giveaway.
         */
        public GiveawayInfoOngoing() {
        }

        /**
         * Describes an ongoing giveaway.
         *
         * @param creationDate Point in time (Unix timestamp) when the giveaway was created.
         * @param status Status of the current user in the giveaway.
         * @param isEnded True, if the giveaway has ended and results are being prepared.
         */
        public GiveawayInfoOngoing(int creationDate, GiveawayParticipantStatus status, boolean isEnded) {
            this.creationDate = creationDate;
            this.status = status;
            this.isEnded = isEnded;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1649336400;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a completed giveaway.
     */
    public static class GiveawayInfoCompleted extends GiveawayInfo {
        /**
         * Point in time (Unix timestamp) when the giveaway was created.
         */
        public int creationDate;
        /**
         * Point in time (Unix timestamp) when the winners were selected. May be bigger than winners selection date specified in parameters of the giveaway.
         */
        public int actualWinnersSelectionDate;
        /**
         * True, if the giveaway was canceled and was fully refunded.
         */
        public boolean wasRefunded;
        /**
         * True, if the current user is a winner of the giveaway.
         */
        public boolean isWinner;
        /**
         * Number of winners in the giveaway.
         */
        public int winnerCount;
        /**
         * Number of winners, which activated their gift codes; for Telegram Premium giveaways only.
         */
        public int activationCount;
        /**
         * Telegram Premium gift code that was received by the current user; empty if the user isn't a winner in the giveaway or the giveaway isn't a Telegram Premium giveaway.
         */
        public String giftCode;
        /**
         * The Telegram Star amount won by the current user; 0 if the user isn't a winner in the giveaway or the giveaway isn't a Telegram Star giveaway.
         */
        public long wonStarCount;

        /**
         * Describes a completed giveaway.
         */
        public GiveawayInfoCompleted() {
        }

        /**
         * Describes a completed giveaway.
         *
         * @param creationDate Point in time (Unix timestamp) when the giveaway was created.
         * @param actualWinnersSelectionDate Point in time (Unix timestamp) when the winners were selected. May be bigger than winners selection date specified in parameters of the giveaway.
         * @param wasRefunded True, if the giveaway was canceled and was fully refunded.
         * @param isWinner True, if the current user is a winner of the giveaway.
         * @param winnerCount Number of winners in the giveaway.
         * @param activationCount Number of winners, which activated their gift codes; for Telegram Premium giveaways only.
         * @param giftCode Telegram Premium gift code that was received by the current user; empty if the user isn't a winner in the giveaway or the giveaway isn't a Telegram Premium giveaway.
         * @param wonStarCount The Telegram Star amount won by the current user; 0 if the user isn't a winner in the giveaway or the giveaway isn't a Telegram Star giveaway.
         */
        public GiveawayInfoCompleted(int creationDate, int actualWinnersSelectionDate, boolean wasRefunded, boolean isWinner, int winnerCount, int activationCount, String giftCode, long wonStarCount) {
            this.creationDate = creationDate;
            this.actualWinnersSelectionDate = actualWinnersSelectionDate;
            this.wasRefunded = wasRefunded;
            this.isWinner = isWinner;
            this.winnerCount = winnerCount;
            this.activationCount = activationCount;
            this.giftCode = giftCode;
            this.wonStarCount = wonStarCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 848085852;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes parameters of a giveaway.
     */
    public static class GiveawayParameters extends Object {
        /**
         * Identifier of the supergroup or channel chat, which will be automatically boosted by the winners of the giveaway for duration of the Telegram Premium subscription, or for the specified time. If the chat is a channel, then canPostMessages administrator right is required in the channel, otherwise, the user must be an administrator in the supergroup.
         */
        public long boostedChatId;
        /**
         * Identifiers of other supergroup or channel chats that must be subscribed by the users to be eligible for the giveaway. There can be up to getOption(&quot;giveaway_additional_chat_count_max&quot;) additional chats.
         */
        public long[] additionalChatIds;
        /**
         * Point in time (Unix timestamp) when the giveaway is expected to be performed; must be 60-getOption(&quot;giveaway_duration_max&quot;) seconds in the future in scheduled giveaways.
         */
        public int winnersSelectionDate;
        /**
         * True, if only new members of the chats will be eligible for the giveaway.
         */
        public boolean onlyNewMembers;
        /**
         * True, if the list of winners of the giveaway will be available to everyone.
         */
        public boolean hasPublicWinners;
        /**
         * The list of two-letter ISO 3166-1 alpha-2 codes of countries, users from which will be eligible for the giveaway. If empty, then all users can participate in the giveaway. There can be up to getOption(&quot;giveaway_country_count_max&quot;) chosen countries. Users with phone number that was bought at https://fragment.com can participate in any giveaway and the country code &quot;FT&quot; must not be specified in the list.
         */
        public String[] countryCodes;
        /**
         * Additional description of the giveaway prize; 0-128 characters.
         */
        public String prizeDescription;

        /**
         * Describes parameters of a giveaway.
         */
        public GiveawayParameters() {
        }

        /**
         * Describes parameters of a giveaway.
         *
         * @param boostedChatId Identifier of the supergroup or channel chat, which will be automatically boosted by the winners of the giveaway for duration of the Telegram Premium subscription, or for the specified time. If the chat is a channel, then canPostMessages administrator right is required in the channel, otherwise, the user must be an administrator in the supergroup.
         * @param additionalChatIds Identifiers of other supergroup or channel chats that must be subscribed by the users to be eligible for the giveaway. There can be up to getOption(&quot;giveaway_additional_chat_count_max&quot;) additional chats.
         * @param winnersSelectionDate Point in time (Unix timestamp) when the giveaway is expected to be performed; must be 60-getOption(&quot;giveaway_duration_max&quot;) seconds in the future in scheduled giveaways.
         * @param onlyNewMembers True, if only new members of the chats will be eligible for the giveaway.
         * @param hasPublicWinners True, if the list of winners of the giveaway will be available to everyone.
         * @param countryCodes The list of two-letter ISO 3166-1 alpha-2 codes of countries, users from which will be eligible for the giveaway. If empty, then all users can participate in the giveaway. There can be up to getOption(&quot;giveaway_country_count_max&quot;) chosen countries. Users with phone number that was bought at https://fragment.com can participate in any giveaway and the country code &quot;FT&quot; must not be specified in the list.
         * @param prizeDescription Additional description of the giveaway prize; 0-128 characters.
         */
        public GiveawayParameters(long boostedChatId, long[] additionalChatIds, int winnersSelectionDate, boolean onlyNewMembers, boolean hasPublicWinners, String[] countryCodes, String prizeDescription) {
            this.boostedChatId = boostedChatId;
            this.additionalChatIds = additionalChatIds;
            this.winnersSelectionDate = winnersSelectionDate;
            this.onlyNewMembers = onlyNewMembers;
            this.hasPublicWinners = hasPublicWinners;
            this.countryCodes = countryCodes;
            this.prizeDescription = prizeDescription;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1171549354;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains information about status of a user in a giveaway.
     */
    public abstract static class GiveawayParticipantStatus extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            GiveawayParticipantStatusEligible.CONSTRUCTOR,
            GiveawayParticipantStatusParticipating.CONSTRUCTOR,
            GiveawayParticipantStatusAlreadyWasMember.CONSTRUCTOR,
            GiveawayParticipantStatusAdministrator.CONSTRUCTOR,
            GiveawayParticipantStatusDisallowedCountry.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public GiveawayParticipantStatus() {
        }
    }

    /**
     * The user is eligible for the giveaway.
     */
    public static class GiveawayParticipantStatusEligible extends GiveawayParticipantStatus {

        /**
         * The user is eligible for the giveaway.
         */
        public GiveawayParticipantStatusEligible() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 304799383;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user participates in the giveaway.
     */
    public static class GiveawayParticipantStatusParticipating extends GiveawayParticipantStatus {

        /**
         * The user participates in the giveaway.
         */
        public GiveawayParticipantStatusParticipating() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 492036975;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user can't participate in the giveaway, because they have already been member of the chat.
     */
    public static class GiveawayParticipantStatusAlreadyWasMember extends GiveawayParticipantStatus {
        /**
         * Point in time (Unix timestamp) when the user joined the chat.
         */
        public int joinedChatDate;

        /**
         * The user can't participate in the giveaway, because they have already been member of the chat.
         */
        public GiveawayParticipantStatusAlreadyWasMember() {
        }

        /**
         * The user can't participate in the giveaway, because they have already been member of the chat.
         *
         * @param joinedChatDate Point in time (Unix timestamp) when the user joined the chat.
         */
        public GiveawayParticipantStatusAlreadyWasMember(int joinedChatDate) {
            this.joinedChatDate = joinedChatDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 301577632;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user can't participate in the giveaway, because they are an administrator in one of the chats that created the giveaway.
     */
    public static class GiveawayParticipantStatusAdministrator extends GiveawayParticipantStatus {
        /**
         * Identifier of the chat administered by the user.
         */
        public long chatId;

        /**
         * The user can't participate in the giveaway, because they are an administrator in one of the chats that created the giveaway.
         */
        public GiveawayParticipantStatusAdministrator() {
        }

        /**
         * The user can't participate in the giveaway, because they are an administrator in one of the chats that created the giveaway.
         *
         * @param chatId Identifier of the chat administered by the user.
         */
        public GiveawayParticipantStatusAdministrator(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -934593931;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user can't participate in the giveaway, because they phone number is from a disallowed country.
     */
    public static class GiveawayParticipantStatusDisallowedCountry extends GiveawayParticipantStatus {
        /**
         * A two-letter ISO 3166-1 alpha-2 country code of the user's country.
         */
        public String userCountryCode;

        /**
         * The user can't participate in the giveaway, because they phone number is from a disallowed country.
         */
        public GiveawayParticipantStatusDisallowedCountry() {
        }

        /**
         * The user can't participate in the giveaway, because they phone number is from a disallowed country.
         *
         * @param userCountryCode A two-letter ISO 3166-1 alpha-2 country code of the user's country.
         */
        public GiveawayParticipantStatusDisallowedCountry(String userCountryCode) {
            this.userCountryCode = userCountryCode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1879794779;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains information about a giveaway prize.
     */
    public abstract static class GiveawayPrize extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            GiveawayPrizePremium.CONSTRUCTOR,
            GiveawayPrizeStars.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public GiveawayPrize() {
        }
    }

    /**
     * The giveaway sends Telegram Premium subscriptions to the winners.
     */
    public static class GiveawayPrizePremium extends GiveawayPrize {
        /**
         * Number of months the Telegram Premium subscription will be active after code activation.
         */
        public int monthCount;

        /**
         * The giveaway sends Telegram Premium subscriptions to the winners.
         */
        public GiveawayPrizePremium() {
        }

        /**
         * The giveaway sends Telegram Premium subscriptions to the winners.
         *
         * @param monthCount Number of months the Telegram Premium subscription will be active after code activation.
         */
        public GiveawayPrizePremium(int monthCount) {
            this.monthCount = monthCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 454224248;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The giveaway sends Telegram Stars to the winners.
     */
    public static class GiveawayPrizeStars extends GiveawayPrize {
        /**
         * Number of Telegram Stars that will be shared by all winners.
         */
        public long starCount;

        /**
         * The giveaway sends Telegram Stars to the winners.
         */
        public GiveawayPrizeStars() {
        }

        /**
         * The giveaway sends Telegram Stars to the winners.
         *
         * @param starCount Number of Telegram Stars that will be shared by all winners.
         */
        public GiveawayPrizeStars(long starCount) {
            this.starCount = starCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1790173276;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a group call.
     */
    public static class GroupCall extends Object {
        /**
         * Group call identifier.
         */
        public int id;
        /**
         * Persistent unique group call identifier.
         */
        public long uniqueId;
        /**
         * Group call title; for video chats only.
         */
        public String title;
        /**
         * Invite link for the group call; for group calls that aren't bound to a chat. For video chats call getVideoChatInviteLink to get the link. For live stories in chats with username call getInternalLink with internalLinkTypeLiveStory.
         */
        public String inviteLink;
        /**
         * The minimum number of Telegram Stars that must be paid by general participant for each sent message to the call; for live stories only.
         */
        public long paidMessageStarCount;
        /**
         * Point in time (Unix timestamp) when the group call is expected to be started by an administrator; 0 if it is already active or was ended; for video chats only.
         */
        public int scheduledStartDate;
        /**
         * True, if the group call is scheduled and the current user will receive a notification when the group call starts; for video chats only.
         */
        public boolean enabledStartNotification;
        /**
         * True, if the call is active.
         */
        public boolean isActive;
        /**
         * True, if the call is bound to a chat.
         */
        public boolean isVideoChat;
        /**
         * True, if the call is a live story of a chat.
         */
        public boolean isLiveStory;
        /**
         * True, if the call is an RTMP stream instead of an ordinary video chat; for video chats and live stories only.
         */
        public boolean isRtmpStream;
        /**
         * True, if the call is joined.
         */
        public boolean isJoined;
        /**
         * True, if user was kicked from the call because of network loss and the call needs to be rejoined.
         */
        public boolean needRejoin;
        /**
         * True, if the user is the owner of the call and can end the call, change volume level of other users, or ban users there; for group calls that aren't bound to a chat.
         */
        public boolean isOwned;
        /**
         * True, if the current user can manage the group call; for video chats and live stories only.
         */
        public boolean canBeManaged;
        /**
         * Number of participants in the group call.
         */
        public int participantCount;
        /**
         * True, if group call participants, which are muted, aren't returned in participant list; for video chats only.
         */
        public boolean hasHiddenListeners;
        /**
         * True, if all group call participants are loaded.
         */
        public boolean loadedAllParticipants;
        /**
         * Message sender chosen to send messages to the group call; for live stories only; may be null if the call isn't a live story.
         */
        @Nullable public MessageSender messageSenderId;
        /**
         * At most 3 recently speaking users in the group call.
         */
        public GroupCallRecentSpeaker[] recentSpeakers;
        /**
         * True, if the current user's video is enabled.
         */
        public boolean isMyVideoEnabled;
        /**
         * True, if the current user's video is paused.
         */
        public boolean isMyVideoPaused;
        /**
         * True, if the current user can broadcast video or share screen.
         */
        public boolean canEnableVideo;
        /**
         * True, if only group call administrators can unmute new participants; for video chats only.
         */
        public boolean muteNewParticipants;
        /**
         * True, if the current user can enable or disable muteNewParticipants setting; for video chats only.
         */
        public boolean canToggleMuteNewParticipants;
        /**
         * True, if the current user can send messages to the group call.
         */
        public boolean canSendMessages;
        /**
         * True, if sending of messages is allowed in the group call.
         */
        public boolean areMessagesAllowed;
        /**
         * True, if the current user can enable or disable sending of messages in the group call.
         */
        public boolean canToggleAreMessagesAllowed;
        /**
         * True, if the user can delete messages in the group call.
         */
        public boolean canDeleteMessages;
        /**
         * Duration of the ongoing group call recording, in seconds; 0 if none. An updateGroupCall update is not triggered when value of this field changes, but the same recording goes on.
         */
        public int recordDuration;
        /**
         * True, if a video file is being recorded for the call.
         */
        public boolean isVideoRecorded;
        /**
         * Call duration, in seconds; for ended calls only.
         */
        public int duration;

        /**
         * Describes a group call.
         */
        public GroupCall() {
        }

        /**
         * Describes a group call.
         *
         * @param id Group call identifier.
         * @param uniqueId Persistent unique group call identifier.
         * @param title Group call title; for video chats only.
         * @param inviteLink Invite link for the group call; for group calls that aren't bound to a chat. For video chats call getVideoChatInviteLink to get the link. For live stories in chats with username call getInternalLink with internalLinkTypeLiveStory.
         * @param paidMessageStarCount The minimum number of Telegram Stars that must be paid by general participant for each sent message to the call; for live stories only.
         * @param scheduledStartDate Point in time (Unix timestamp) when the group call is expected to be started by an administrator; 0 if it is already active or was ended; for video chats only.
         * @param enabledStartNotification True, if the group call is scheduled and the current user will receive a notification when the group call starts; for video chats only.
         * @param isActive True, if the call is active.
         * @param isVideoChat True, if the call is bound to a chat.
         * @param isLiveStory True, if the call is a live story of a chat.
         * @param isRtmpStream True, if the call is an RTMP stream instead of an ordinary video chat; for video chats and live stories only.
         * @param isJoined True, if the call is joined.
         * @param needRejoin True, if user was kicked from the call because of network loss and the call needs to be rejoined.
         * @param isOwned True, if the user is the owner of the call and can end the call, change volume level of other users, or ban users there; for group calls that aren't bound to a chat.
         * @param canBeManaged True, if the current user can manage the group call; for video chats and live stories only.
         * @param participantCount Number of participants in the group call.
         * @param hasHiddenListeners True, if group call participants, which are muted, aren't returned in participant list; for video chats only.
         * @param loadedAllParticipants True, if all group call participants are loaded.
         * @param messageSenderId Message sender chosen to send messages to the group call; for live stories only; may be null if the call isn't a live story.
         * @param recentSpeakers At most 3 recently speaking users in the group call.
         * @param isMyVideoEnabled True, if the current user's video is enabled.
         * @param isMyVideoPaused True, if the current user's video is paused.
         * @param canEnableVideo True, if the current user can broadcast video or share screen.
         * @param muteNewParticipants True, if only group call administrators can unmute new participants; for video chats only.
         * @param canToggleMuteNewParticipants True, if the current user can enable or disable muteNewParticipants setting; for video chats only.
         * @param canSendMessages True, if the current user can send messages to the group call.
         * @param areMessagesAllowed True, if sending of messages is allowed in the group call.
         * @param canToggleAreMessagesAllowed True, if the current user can enable or disable sending of messages in the group call.
         * @param canDeleteMessages True, if the user can delete messages in the group call.
         * @param recordDuration Duration of the ongoing group call recording, in seconds; 0 if none. An updateGroupCall update is not triggered when value of this field changes, but the same recording goes on.
         * @param isVideoRecorded True, if a video file is being recorded for the call.
         * @param duration Call duration, in seconds; for ended calls only.
         */
        public GroupCall(int id, long uniqueId, String title, String inviteLink, long paidMessageStarCount, int scheduledStartDate, boolean enabledStartNotification, boolean isActive, boolean isVideoChat, boolean isLiveStory, boolean isRtmpStream, boolean isJoined, boolean needRejoin, boolean isOwned, boolean canBeManaged, int participantCount, boolean hasHiddenListeners, boolean loadedAllParticipants, MessageSender messageSenderId, GroupCallRecentSpeaker[] recentSpeakers, boolean isMyVideoEnabled, boolean isMyVideoPaused, boolean canEnableVideo, boolean muteNewParticipants, boolean canToggleMuteNewParticipants, boolean canSendMessages, boolean areMessagesAllowed, boolean canToggleAreMessagesAllowed, boolean canDeleteMessages, int recordDuration, boolean isVideoRecorded, int duration) {
            this.id = id;
            this.uniqueId = uniqueId;
            this.title = title;
            this.inviteLink = inviteLink;
            this.paidMessageStarCount = paidMessageStarCount;
            this.scheduledStartDate = scheduledStartDate;
            this.enabledStartNotification = enabledStartNotification;
            this.isActive = isActive;
            this.isVideoChat = isVideoChat;
            this.isLiveStory = isLiveStory;
            this.isRtmpStream = isRtmpStream;
            this.isJoined = isJoined;
            this.needRejoin = needRejoin;
            this.isOwned = isOwned;
            this.canBeManaged = canBeManaged;
            this.participantCount = participantCount;
            this.hasHiddenListeners = hasHiddenListeners;
            this.loadedAllParticipants = loadedAllParticipants;
            this.messageSenderId = messageSenderId;
            this.recentSpeakers = recentSpeakers;
            this.isMyVideoEnabled = isMyVideoEnabled;
            this.isMyVideoPaused = isMyVideoPaused;
            this.canEnableVideo = canEnableVideo;
            this.muteNewParticipants = muteNewParticipants;
            this.canToggleMuteNewParticipants = canToggleMuteNewParticipants;
            this.canSendMessages = canSendMessages;
            this.areMessagesAllowed = areMessagesAllowed;
            this.canToggleAreMessagesAllowed = canToggleAreMessagesAllowed;
            this.canDeleteMessages = canDeleteMessages;
            this.recordDuration = recordDuration;
            this.isVideoRecorded = isVideoRecorded;
            this.duration = duration;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1673382770;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes data channel for a group call.
     */
    public abstract static class GroupCallDataChannel extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            GroupCallDataChannelMain.CONSTRUCTOR,
            GroupCallDataChannelScreenSharing.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public GroupCallDataChannel() {
        }
    }

    /**
     * The main data channel for audio and video data.
     */
    public static class GroupCallDataChannelMain extends GroupCallDataChannel {

        /**
         * The main data channel for audio and video data.
         */
        public GroupCallDataChannelMain() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -32177779;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The data channel for screen sharing.
     */
    public static class GroupCallDataChannelScreenSharing extends GroupCallDataChannel {

        /**
         * The data channel for screen sharing.
         */
        public GroupCallDataChannelScreenSharing() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -601649103;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains the group call identifier.
     */
    public static class GroupCallId extends Object {
        /**
         * Group call identifier.
         */
        public int id;

        /**
         * Contains the group call identifier.
         */
        public GroupCallId() {
        }

        /**
         * Contains the group call identifier.
         *
         * @param id Group call identifier.
         */
        public GroupCallId(int id) {
            this.id = id;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 350534469;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a just created or just joined group call.
     */
    public static class GroupCallInfo extends Object {
        /**
         * Identifier of the group call.
         */
        public int groupCallId;
        /**
         * Join response payload for tgcalls; empty if the call isn't joined.
         */
        public String joinPayload;

        /**
         * Contains information about a just created or just joined group call.
         */
        public GroupCallInfo() {
        }

        /**
         * Contains information about a just created or just joined group call.
         *
         * @param groupCallId Identifier of the group call.
         * @param joinPayload Join response payload for tgcalls; empty if the call isn't joined.
         */
        public GroupCallInfo(int groupCallId, String joinPayload) {
            this.groupCallId = groupCallId;
            this.joinPayload = joinPayload;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 892575956;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes parameters used to join a group call.
     */
    public static class GroupCallJoinParameters extends Object {
        /**
         * Audio channel synchronization source identifier; received from tgcalls.
         */
        public int audioSourceId;
        /**
         * Group call join payload; received from tgcalls.
         */
        public String payload;
        /**
         * Pass true to join the call with muted microphone.
         */
        public boolean isMuted;
        /**
         * Pass true if the user's video is enabled.
         */
        public boolean isMyVideoEnabled;

        /**
         * Describes parameters used to join a group call.
         */
        public GroupCallJoinParameters() {
        }

        /**
         * Describes parameters used to join a group call.
         *
         * @param audioSourceId Audio channel synchronization source identifier; received from tgcalls.
         * @param payload Group call join payload; received from tgcalls.
         * @param isMuted Pass true to join the call with muted microphone.
         * @param isMyVideoEnabled Pass true if the user's video is enabled.
         */
        public GroupCallJoinParameters(int audioSourceId, String payload, boolean isMuted, boolean isMyVideoEnabled) {
            this.audioSourceId = audioSourceId;
            this.payload = payload;
            this.isMuted = isMuted;
            this.isMyVideoEnabled = isMyVideoEnabled;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1763438054;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a message sent in a group call.
     */
    public static class GroupCallMessage extends Object {
        /**
         * Unique message identifier within the group call.
         */
        public int messageId;
        /**
         * Identifier of the sender of the message.
         */
        public MessageSender senderId;
        /**
         * Point in time (Unix timestamp) when the message was sent.
         */
        public int date;
        /**
         * Text of the message. If empty, then the message is a paid reaction in a live story.
         */
        public FormattedText text;
        /**
         * The number of Telegram Stars that were paid to send the message; for live stories only.
         */
        public long paidMessageStarCount;
        /**
         * True, if the message is sent by the owner of the call and must be treated as a message of the maximum level; for live stories only.
         */
        public boolean isFromOwner;
        /**
         * True, if the message can be deleted by the current user; for live stories only.
         */
        public boolean canBeDeleted;

        /**
         * Represents a message sent in a group call.
         */
        public GroupCallMessage() {
        }

        /**
         * Represents a message sent in a group call.
         *
         * @param messageId Unique message identifier within the group call.
         * @param senderId Identifier of the sender of the message.
         * @param date Point in time (Unix timestamp) when the message was sent.
         * @param text Text of the message. If empty, then the message is a paid reaction in a live story.
         * @param paidMessageStarCount The number of Telegram Stars that were paid to send the message; for live stories only.
         * @param isFromOwner True, if the message is sent by the owner of the call and must be treated as a message of the maximum level; for live stories only.
         * @param canBeDeleted True, if the message can be deleted by the current user; for live stories only.
         */
        public GroupCallMessage(int messageId, MessageSender senderId, int date, FormattedText text, long paidMessageStarCount, boolean isFromOwner, boolean canBeDeleted) {
            this.messageId = messageId;
            this.senderId = senderId;
            this.date = date;
            this.text = text;
            this.paidMessageStarCount = paidMessageStarCount;
            this.isFromOwner = isFromOwner;
            this.canBeDeleted = canBeDeleted;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 216155597;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a level of features for a message sent in a live story group call.
     */
    public static class GroupCallMessageLevel extends Object {
        /**
         * The minimum number of Telegram Stars required to get features of the level.
         */
        public long minStarCount;
        /**
         * The amount of time the message of this level will be pinned, in seconds.
         */
        public int pinDuration;
        /**
         * The maximum allowed length of the message text.
         */
        public int maxTextLength;
        /**
         * The maximum allowed number of custom emoji in the message text.
         */
        public int maxCustomEmojiCount;
        /**
         * The first color used to show the message text in the RGB format.
         */
        public int firstColor;
        /**
         * The second color used to show the message text in the RGB format.
         */
        public int secondColor;
        /**
         * Background color for the message the RGB format.
         */
        public int backgroundColor;

        /**
         * Represents a level of features for a message sent in a live story group call.
         */
        public GroupCallMessageLevel() {
        }

        /**
         * Represents a level of features for a message sent in a live story group call.
         *
         * @param minStarCount The minimum number of Telegram Stars required to get features of the level.
         * @param pinDuration The amount of time the message of this level will be pinned, in seconds.
         * @param maxTextLength The maximum allowed length of the message text.
         * @param maxCustomEmojiCount The maximum allowed number of custom emoji in the message text.
         * @param firstColor The first color used to show the message text in the RGB format.
         * @param secondColor The second color used to show the message text in the RGB format.
         * @param backgroundColor Background color for the message the RGB format.
         */
        public GroupCallMessageLevel(long minStarCount, int pinDuration, int maxTextLength, int maxCustomEmojiCount, int firstColor, int secondColor, int backgroundColor) {
            this.minStarCount = minStarCount;
            this.pinDuration = pinDuration;
            this.maxTextLength = maxTextLength;
            this.maxCustomEmojiCount = maxCustomEmojiCount;
            this.firstColor = firstColor;
            this.secondColor = secondColor;
            this.backgroundColor = backgroundColor;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 994685918;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a group call participant.
     */
    public static class GroupCallParticipant extends Object {
        /**
         * Identifier of the group call participant.
         */
        public MessageSender participantId;
        /**
         * User's audio channel synchronization source identifier.
         */
        public int audioSourceId;
        /**
         * User's screen sharing audio channel synchronization source identifier.
         */
        public int screenSharingAudioSourceId;
        /**
         * Information about user's video channel; may be null if there is no active video.
         */
        @Nullable public GroupCallParticipantVideoInfo videoInfo;
        /**
         * Information about user's screen sharing video channel; may be null if there is no active screen sharing video.
         */
        @Nullable public GroupCallParticipantVideoInfo screenSharingVideoInfo;
        /**
         * The participant user's bio or the participant chat's description.
         */
        public String bio;
        /**
         * True, if the participant is the current user.
         */
        public boolean isCurrentUser;
        /**
         * True, if the participant is speaking as set by setGroupCallParticipantIsSpeaking.
         */
        public boolean isSpeaking;
        /**
         * True, if the participant hand is raised.
         */
        public boolean isHandRaised;
        /**
         * True, if the current user can mute the participant for all other group call participants.
         */
        public boolean canBeMutedForAllUsers;
        /**
         * True, if the current user can allow the participant to unmute themselves or unmute the participant (if the participant is the current user).
         */
        public boolean canBeUnmutedForAllUsers;
        /**
         * True, if the current user can mute the participant only for self.
         */
        public boolean canBeMutedForCurrentUser;
        /**
         * True, if the current user can unmute the participant for self.
         */
        public boolean canBeUnmutedForCurrentUser;
        /**
         * True, if the participant is muted for all users.
         */
        public boolean isMutedForAllUsers;
        /**
         * True, if the participant is muted for the current user.
         */
        public boolean isMutedForCurrentUser;
        /**
         * True, if the participant is muted for all users, but can unmute themselves.
         */
        public boolean canUnmuteSelf;
        /**
         * Participant's volume level; 1-20000 in hundreds of percents.
         */
        public int volumeLevel;
        /**
         * User's order in the group call participant list. Orders must be compared lexicographically. The bigger is order, the higher is user in the list. If order is empty, the user must be removed from the participant list.
         */
        public String order;

        /**
         * Represents a group call participant.
         */
        public GroupCallParticipant() {
        }

        /**
         * Represents a group call participant.
         *
         * @param participantId Identifier of the group call participant.
         * @param audioSourceId User's audio channel synchronization source identifier.
         * @param screenSharingAudioSourceId User's screen sharing audio channel synchronization source identifier.
         * @param videoInfo Information about user's video channel; may be null if there is no active video.
         * @param screenSharingVideoInfo Information about user's screen sharing video channel; may be null if there is no active screen sharing video.
         * @param bio The participant user's bio or the participant chat's description.
         * @param isCurrentUser True, if the participant is the current user.
         * @param isSpeaking True, if the participant is speaking as set by setGroupCallParticipantIsSpeaking.
         * @param isHandRaised True, if the participant hand is raised.
         * @param canBeMutedForAllUsers True, if the current user can mute the participant for all other group call participants.
         * @param canBeUnmutedForAllUsers True, if the current user can allow the participant to unmute themselves or unmute the participant (if the participant is the current user).
         * @param canBeMutedForCurrentUser True, if the current user can mute the participant only for self.
         * @param canBeUnmutedForCurrentUser True, if the current user can unmute the participant for self.
         * @param isMutedForAllUsers True, if the participant is muted for all users.
         * @param isMutedForCurrentUser True, if the participant is muted for the current user.
         * @param canUnmuteSelf True, if the participant is muted for all users, but can unmute themselves.
         * @param volumeLevel Participant's volume level; 1-20000 in hundreds of percents.
         * @param order User's order in the group call participant list. Orders must be compared lexicographically. The bigger is order, the higher is user in the list. If order is empty, the user must be removed from the participant list.
         */
        public GroupCallParticipant(MessageSender participantId, int audioSourceId, int screenSharingAudioSourceId, GroupCallParticipantVideoInfo videoInfo, GroupCallParticipantVideoInfo screenSharingVideoInfo, String bio, boolean isCurrentUser, boolean isSpeaking, boolean isHandRaised, boolean canBeMutedForAllUsers, boolean canBeUnmutedForAllUsers, boolean canBeMutedForCurrentUser, boolean canBeUnmutedForCurrentUser, boolean isMutedForAllUsers, boolean isMutedForCurrentUser, boolean canUnmuteSelf, int volumeLevel, String order) {
            this.participantId = participantId;
            this.audioSourceId = audioSourceId;
            this.screenSharingAudioSourceId = screenSharingAudioSourceId;
            this.videoInfo = videoInfo;
            this.screenSharingVideoInfo = screenSharingVideoInfo;
            this.bio = bio;
            this.isCurrentUser = isCurrentUser;
            this.isSpeaking = isSpeaking;
            this.isHandRaised = isHandRaised;
            this.canBeMutedForAllUsers = canBeMutedForAllUsers;
            this.canBeUnmutedForAllUsers = canBeUnmutedForAllUsers;
            this.canBeMutedForCurrentUser = canBeMutedForCurrentUser;
            this.canBeUnmutedForCurrentUser = canBeUnmutedForCurrentUser;
            this.isMutedForAllUsers = isMutedForAllUsers;
            this.isMutedForCurrentUser = isMutedForCurrentUser;
            this.canUnmuteSelf = canUnmuteSelf;
            this.volumeLevel = volumeLevel;
            this.order = order;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2059182571;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a group call participant's video channel.
     */
    public static class GroupCallParticipantVideoInfo extends Object {
        /**
         * List of synchronization source groups of the video.
         */
        public GroupCallVideoSourceGroup[] sourceGroups;
        /**
         * Video channel endpoint identifier.
         */
        public String endpointId;
        /**
         * True, if the video is paused. This flag needs to be ignored, if new video frames are received.
         */
        public boolean isPaused;

        /**
         * Contains information about a group call participant's video channel.
         */
        public GroupCallParticipantVideoInfo() {
        }

        /**
         * Contains information about a group call participant's video channel.
         *
         * @param sourceGroups List of synchronization source groups of the video.
         * @param endpointId Video channel endpoint identifier.
         * @param isPaused True, if the video is paused. This flag needs to be ignored, if new video frames are received.
         */
        public GroupCallParticipantVideoInfo(GroupCallVideoSourceGroup[] sourceGroups, String endpointId, boolean isPaused) {
            this.sourceGroups = sourceGroups;
            this.endpointId = endpointId;
            this.isPaused = isPaused;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -14294645;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains identifiers of group call participants.
     */
    public static class GroupCallParticipants extends Object {
        /**
         * Total number of group call participants.
         */
        public int totalCount;
        /**
         * Identifiers of the participants.
         */
        public MessageSender[] participantIds;

        /**
         * Contains identifiers of group call participants.
         */
        public GroupCallParticipants() {
        }

        /**
         * Contains identifiers of group call participants.
         *
         * @param totalCount Total number of group call participants.
         * @param participantIds Identifiers of the participants.
         */
        public GroupCallParticipants(int totalCount, MessageSender[] participantIds) {
            this.totalCount = totalCount;
            this.participantIds = participantIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1042491570;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a recently speaking participant in a group call.
     */
    public static class GroupCallRecentSpeaker extends Object {
        /**
         * Group call participant identifier.
         */
        public MessageSender participantId;
        /**
         * True, is the user has spoken recently.
         */
        public boolean isSpeaking;

        /**
         * Describes a recently speaking participant in a group call.
         */
        public GroupCallRecentSpeaker() {
        }

        /**
         * Describes a recently speaking participant in a group call.
         *
         * @param participantId Group call participant identifier.
         * @param isSpeaking True, is the user has spoken recently.
         */
        public GroupCallRecentSpeaker(MessageSender participantId, boolean isSpeaking) {
            this.participantId = participantId;
            this.isSpeaking = isSpeaking;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1819519436;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an available stream in a video chat or a live story.
     */
    public static class GroupCallStream extends Object {
        /**
         * Identifier of an audio/video channel.
         */
        public int channelId;
        /**
         * Scale of segment durations in the stream. The duration is 1000/(2**scale) milliseconds.
         */
        public int scale;
        /**
         * Point in time when the stream currently ends; Unix timestamp in milliseconds.
         */
        public long timeOffset;

        /**
         * Describes an available stream in a video chat or a live story.
         */
        public GroupCallStream() {
        }

        /**
         * Describes an available stream in a video chat or a live story.
         *
         * @param channelId Identifier of an audio/video channel.
         * @param scale Scale of segment durations in the stream. The duration is 1000/(2**scale) milliseconds.
         * @param timeOffset Point in time when the stream currently ends; Unix timestamp in milliseconds.
         */
        public GroupCallStream(int channelId, int scale, long timeOffset) {
            this.channelId = channelId;
            this.scale = scale;
            this.timeOffset = timeOffset;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -264564795;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of group call streams.
     */
    public static class GroupCallStreams extends Object {
        /**
         * A list of group call streams.
         */
        public GroupCallStream[] streams;

        /**
         * Represents a list of group call streams.
         */
        public GroupCallStreams() {
        }

        /**
         * Represents a list of group call streams.
         *
         * @param streams A list of group call streams.
         */
        public GroupCallStreams(GroupCallStream[] streams) {
            this.streams = streams;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1032959578;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the quality of a group call video.
     */
    public abstract static class GroupCallVideoQuality extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            GroupCallVideoQualityThumbnail.CONSTRUCTOR,
            GroupCallVideoQualityMedium.CONSTRUCTOR,
            GroupCallVideoQualityFull.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public GroupCallVideoQuality() {
        }
    }

    /**
     * The worst available video quality.
     */
    public static class GroupCallVideoQualityThumbnail extends GroupCallVideoQuality {

        /**
         * The worst available video quality.
         */
        public GroupCallVideoQualityThumbnail() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -379186304;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The medium video quality.
     */
    public static class GroupCallVideoQualityMedium extends GroupCallVideoQuality {

        /**
         * The medium video quality.
         */
        public GroupCallVideoQualityMedium() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 394968234;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The best available video quality.
     */
    public static class GroupCallVideoQualityFull extends GroupCallVideoQuality {

        /**
         * The best available video quality.
         */
        public GroupCallVideoQualityFull() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2125916617;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a group of video synchronization source identifiers.
     */
    public static class GroupCallVideoSourceGroup extends Object {
        /**
         * The semantics of sources, one of &quot;SIM&quot; or &quot;FID&quot;.
         */
        public String semantics;
        /**
         * The list of synchronization source identifiers.
         */
        public int[] sourceIds;

        /**
         * Describes a group of video synchronization source identifiers.
         */
        public GroupCallVideoSourceGroup() {
        }

        /**
         * Describes a group of video synchronization source identifiers.
         *
         * @param semantics The semantics of sources, one of &quot;SIM&quot; or &quot;FID&quot;.
         * @param sourceIds The list of synchronization source identifiers.
         */
        public GroupCallVideoSourceGroup(String semantics, int[] sourceIds) {
            this.semantics = semantics;
            this.sourceIds = sourceIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1190900785;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of hashtags.
     */
    public static class Hashtags extends Object {
        /**
         * A list of hashtags.
         */
        public String[] hashtags;

        /**
         * Contains a list of hashtags.
         */
        public Hashtags() {
        }

        /**
         * Contains a list of hashtags.
         *
         * @param hashtags A list of hashtags.
         */
        public Hashtags(String[] hashtags) {
            this.hashtags = hashtags;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 676798885;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains an HTTP URL.
     */
    public static class HttpUrl extends Object {
        /**
         * The URL.
         */
        public String url;

        /**
         * Contains an HTTP URL.
         */
        public HttpUrl() {
        }

        /**
         * Contains an HTTP URL.
         *
         * @param url The URL.
         */
        public HttpUrl(String url) {
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2018019930;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An identity document.
     */
    public static class IdentityDocument extends Object {
        /**
         * Document number; 1-24 characters.
         */
        public String number;
        /**
         * Document expiration date; may be null if not applicable.
         */
        @Nullable public Date expirationDate;
        /**
         * Front side of the document.
         */
        public DatedFile frontSide;
        /**
         * Reverse side of the document; only for driver license and identity card; may be null.
         */
        @Nullable public DatedFile reverseSide;
        /**
         * Selfie with the document; may be null.
         */
        @Nullable public DatedFile selfie;
        /**
         * List of files containing a certified English translation of the document.
         */
        public DatedFile[] translation;

        /**
         * An identity document.
         */
        public IdentityDocument() {
        }

        /**
         * An identity document.
         *
         * @param number Document number; 1-24 characters.
         * @param expirationDate Document expiration date; may be null if not applicable.
         * @param frontSide Front side of the document.
         * @param reverseSide Reverse side of the document; only for driver license and identity card; may be null.
         * @param selfie Selfie with the document; may be null.
         * @param translation List of files containing a certified English translation of the document.
         */
        public IdentityDocument(String number, Date expirationDate, DatedFile frontSide, DatedFile reverseSide, DatedFile selfie, DatedFile[] translation) {
            this.number = number;
            this.expirationDate = expirationDate;
            this.frontSide = frontSide;
            this.reverseSide = reverseSide;
            this.selfie = selfie;
            this.translation = translation;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1001703606;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a contact to import.
     */
    public static class ImportedContact extends Object {
        /**
         * Phone number of the user.
         */
        public String phoneNumber;
        /**
         * First name of the user; 1-64 characters.
         */
        public String firstName;
        /**
         * Last name of the user; 0-64 characters.
         */
        public String lastName;
        /**
         * Note to add about the user; 0-getOption(&quot;user_note_text_length_max&quot;) characters. Only Bold, Italic, Underline, Strikethrough, Spoiler, CustomEmoji, and DateTime entities are allowed; pass null to keep the current user's note.
         */
        public FormattedText note;

        /**
         * Describes a contact to import.
         */
        public ImportedContact() {
        }

        /**
         * Describes a contact to import.
         *
         * @param phoneNumber Phone number of the user.
         * @param firstName First name of the user; 1-64 characters.
         * @param lastName Last name of the user; 0-64 characters.
         * @param note Note to add about the user; 0-getOption(&quot;user_note_text_length_max&quot;) characters. Only Bold, Italic, Underline, Strikethrough, Spoiler, CustomEmoji, and DateTime entities are allowed; pass null to keep the current user's note.
         */
        public ImportedContact(String phoneNumber, String firstName, String lastName, FormattedText note) {
            this.phoneNumber = phoneNumber;
            this.firstName = firstName;
            this.lastName = lastName;
            this.note = note;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1818209156;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents the result of an importContacts request.
     */
    public static class ImportedContacts extends Object {
        /**
         * User identifiers of the imported contacts in the same order as they were specified in the request; 0 if the contact is not yet a registered user.
         */
        public long[] userIds;
        /**
         * The number of users that imported the corresponding contact; 0 for already registered users or if unavailable.
         */
        public int[] importerCount;

        /**
         * Represents the result of an importContacts request.
         */
        public ImportedContacts() {
        }

        /**
         * Represents the result of an importContacts request.
         *
         * @param userIds User identifiers of the imported contacts in the same order as they were specified in the request; 0 if the contact is not yet a registered user.
         * @param importerCount The number of users that imported the corresponding contact; 0 for already registered users or if unavailable.
         */
        public ImportedContacts(long[] userIds, int[] importerCount) {
            this.userIds = userIds;
            this.importerCount = importerCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2068432290;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a single button in an inline keyboard.
     */
    public static class InlineKeyboardButton extends Object {
        /**
         * Text of the button.
         */
        public String text;
        /**
         * Identifier of the custom emoji that must be shown on the button; 0 if none.
         */
        public long iconCustomEmojiId;
        /**
         * Style of the button.
         */
        public ButtonStyle style;
        /**
         * Type of the button.
         */
        public InlineKeyboardButtonType type;

        /**
         * Represents a single button in an inline keyboard.
         */
        public InlineKeyboardButton() {
        }

        /**
         * Represents a single button in an inline keyboard.
         *
         * @param text Text of the button.
         * @param iconCustomEmojiId Identifier of the custom emoji that must be shown on the button; 0 if none.
         * @param style Style of the button.
         * @param type Type of the button.
         */
        public InlineKeyboardButton(String text, long iconCustomEmojiId, ButtonStyle style, InlineKeyboardButtonType type) {
            this.text = text;
            this.iconCustomEmojiId = iconCustomEmojiId;
            this.style = style;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1457530830;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the type of inline keyboard button.
     */
    public abstract static class InlineKeyboardButtonType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            InlineKeyboardButtonTypeUrl.CONSTRUCTOR,
            InlineKeyboardButtonTypeLoginUrl.CONSTRUCTOR,
            InlineKeyboardButtonTypeWebApp.CONSTRUCTOR,
            InlineKeyboardButtonTypeCallback.CONSTRUCTOR,
            InlineKeyboardButtonTypeCallbackWithPassword.CONSTRUCTOR,
            InlineKeyboardButtonTypeCallbackGame.CONSTRUCTOR,
            InlineKeyboardButtonTypeSwitchInline.CONSTRUCTOR,
            InlineKeyboardButtonTypeBuy.CONSTRUCTOR,
            InlineKeyboardButtonTypeUser.CONSTRUCTOR,
            InlineKeyboardButtonTypeCopyText.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public InlineKeyboardButtonType() {
        }
    }

    /**
     * A button that opens a specified URL.
     */
    public static class InlineKeyboardButtonTypeUrl extends InlineKeyboardButtonType {
        /**
         * HTTP or tg:// URL to open. If the link is of the type internalLinkTypeWebApp, then the button must be marked as a Web App button.
         */
        public String url;

        /**
         * A button that opens a specified URL.
         */
        public InlineKeyboardButtonTypeUrl() {
        }

        /**
         * A button that opens a specified URL.
         *
         * @param url HTTP or tg:// URL to open. If the link is of the type internalLinkTypeWebApp, then the button must be marked as a Web App button.
         */
        public InlineKeyboardButtonTypeUrl(String url) {
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1130741420;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A button that opens a specified URL and automatically authorize the current user by calling getLoginUrlInfo.
     */
    public static class InlineKeyboardButtonTypeLoginUrl extends InlineKeyboardButtonType {
        /**
         * An HTTP URL to pass to getLoginUrlInfo.
         */
        public String url;
        /**
         * Unique button identifier.
         */
        public long id;
        /**
         * If non-empty, new text of the button in forwarded messages.
         */
        public String forwardText;

        /**
         * A button that opens a specified URL and automatically authorize the current user by calling getLoginUrlInfo.
         */
        public InlineKeyboardButtonTypeLoginUrl() {
        }

        /**
         * A button that opens a specified URL and automatically authorize the current user by calling getLoginUrlInfo.
         *
         * @param url An HTTP URL to pass to getLoginUrlInfo.
         * @param id Unique button identifier.
         * @param forwardText If non-empty, new text of the button in forwarded messages.
         */
        public InlineKeyboardButtonTypeLoginUrl(String url, long id, String forwardText) {
            this.url = url;
            this.id = id;
            this.forwardText = forwardText;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1203413081;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A button that opens a Web App by calling openWebApp.
     */
    public static class InlineKeyboardButtonTypeWebApp extends InlineKeyboardButtonType {
        /**
         * An HTTP URL to pass to openWebApp.
         */
        public String url;

        /**
         * A button that opens a Web App by calling openWebApp.
         */
        public InlineKeyboardButtonTypeWebApp() {
        }

        /**
         * A button that opens a Web App by calling openWebApp.
         *
         * @param url An HTTP URL to pass to openWebApp.
         */
        public InlineKeyboardButtonTypeWebApp(String url) {
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1767471672;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A button that sends a callback query to a bot.
     */
    public static class InlineKeyboardButtonTypeCallback extends InlineKeyboardButtonType {
        /**
         * Data to be sent to the bot via a callback query.
         */
        public byte[] data;

        /**
         * A button that sends a callback query to a bot.
         */
        public InlineKeyboardButtonTypeCallback() {
        }

        /**
         * A button that sends a callback query to a bot.
         *
         * @param data Data to be sent to the bot via a callback query.
         */
        public InlineKeyboardButtonTypeCallback(byte[] data) {
            this.data = data;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1127515139;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A button that asks for the 2-step verification password of the current user and then sends a callback query to a bot.
     */
    public static class InlineKeyboardButtonTypeCallbackWithPassword extends InlineKeyboardButtonType {
        /**
         * Data to be sent to the bot via a callback query.
         */
        public byte[] data;

        /**
         * A button that asks for the 2-step verification password of the current user and then sends a callback query to a bot.
         */
        public InlineKeyboardButtonTypeCallbackWithPassword() {
        }

        /**
         * A button that asks for the 2-step verification password of the current user and then sends a callback query to a bot.
         *
         * @param data Data to be sent to the bot via a callback query.
         */
        public InlineKeyboardButtonTypeCallbackWithPassword(byte[] data) {
            this.data = data;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 908018248;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A button with a game that sends a callback query to a bot. This button must be in the first column and row of the keyboard and can be attached only to a message with content of the type messageGame.
     */
    public static class InlineKeyboardButtonTypeCallbackGame extends InlineKeyboardButtonType {

        /**
         * A button with a game that sends a callback query to a bot. This button must be in the first column and row of the keyboard and can be attached only to a message with content of the type messageGame.
         */
        public InlineKeyboardButtonTypeCallbackGame() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -383429528;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A button that forces an inline query to the bot to be inserted in the input field.
     */
    public static class InlineKeyboardButtonTypeSwitchInline extends InlineKeyboardButtonType {
        /**
         * Inline query to be sent to the bot.
         */
        public String query;
        /**
         * Target chat from which to send the inline query.
         */
        public TargetChat targetChat;

        /**
         * A button that forces an inline query to the bot to be inserted in the input field.
         */
        public InlineKeyboardButtonTypeSwitchInline() {
        }

        /**
         * A button that forces an inline query to the bot to be inserted in the input field.
         *
         * @param query Inline query to be sent to the bot.
         * @param targetChat Target chat from which to send the inline query.
         */
        public InlineKeyboardButtonTypeSwitchInline(String query, TargetChat targetChat) {
            this.query = query;
            this.targetChat = targetChat;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 544906485;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A button to buy something. This button must be in the first column and row of the keyboard and can be attached only to a message with content of the type messageInvoice.
     */
    public static class InlineKeyboardButtonTypeBuy extends InlineKeyboardButtonType {

        /**
         * A button to buy something. This button must be in the first column and row of the keyboard and can be attached only to a message with content of the type messageInvoice.
         */
        public InlineKeyboardButtonTypeBuy() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1360739440;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A button with a user reference to be handled in the same way as textEntityTypeMentionName entities.
     */
    public static class InlineKeyboardButtonTypeUser extends InlineKeyboardButtonType {
        /**
         * User identifier.
         */
        public long userId;

        /**
         * A button with a user reference to be handled in the same way as textEntityTypeMentionName entities.
         */
        public InlineKeyboardButtonTypeUser() {
        }

        /**
         * A button with a user reference to be handled in the same way as textEntityTypeMentionName entities.
         *
         * @param userId User identifier.
         */
        public InlineKeyboardButtonTypeUser(long userId) {
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1836574114;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A button that copies specified text to clipboard.
     */
    public static class InlineKeyboardButtonTypeCopyText extends InlineKeyboardButtonType {
        /**
         * The text to copy to clipboard.
         */
        public String text;

        /**
         * A button that copies specified text to clipboard.
         */
        public InlineKeyboardButtonTypeCopyText() {
        }

        /**
         * A button that copies specified text to clipboard.
         *
         * @param text The text to copy to clipboard.
         */
        public InlineKeyboardButtonTypeCopyText(String text) {
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 68883206;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains identifier of a sent guest message.
     */
    public static class InlineMessageId extends Object {
        /**
         * Unique identifier for the message.
         */
        public String id;

        /**
         * Contains identifier of a sent guest message.
         */
        public InlineMessageId() {
        }

        /**
         * Contains identifier of a sent guest message.
         *
         * @param id Unique identifier for the message.
         */
        public InlineMessageId(String id) {
            this.id = id;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1908477921;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents a single result of an inline query.
     */
    public abstract static class InlineQueryResult extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            InlineQueryResultArticle.CONSTRUCTOR,
            InlineQueryResultContact.CONSTRUCTOR,
            InlineQueryResultLocation.CONSTRUCTOR,
            InlineQueryResultVenue.CONSTRUCTOR,
            InlineQueryResultGame.CONSTRUCTOR,
            InlineQueryResultAnimation.CONSTRUCTOR,
            InlineQueryResultAudio.CONSTRUCTOR,
            InlineQueryResultDocument.CONSTRUCTOR,
            InlineQueryResultPhoto.CONSTRUCTOR,
            InlineQueryResultSticker.CONSTRUCTOR,
            InlineQueryResultVideo.CONSTRUCTOR,
            InlineQueryResultVoiceNote.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public InlineQueryResult() {
        }
    }

    /**
     * Represents a link to an article or web page.
     */
    public static class InlineQueryResultArticle extends InlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * URL of the result, if it exists.
         */
        public String url;
        /**
         * Title of the result.
         */
        public String title;
        /**
         * A short description of the result.
         */
        public String description;
        /**
         * Result thumbnail in JPEG format; may be null.
         */
        @Nullable public Thumbnail thumbnail;

        /**
         * Represents a link to an article or web page.
         */
        public InlineQueryResultArticle() {
        }

        /**
         * Represents a link to an article or web page.
         *
         * @param id Unique identifier of the query result.
         * @param url URL of the result, if it exists.
         * @param title Title of the result.
         * @param description A short description of the result.
         * @param thumbnail Result thumbnail in JPEG format; may be null.
         */
        public InlineQueryResultArticle(String id, String url, String title, String description, Thumbnail thumbnail) {
            this.id = id;
            this.url = url;
            this.title = title;
            this.description = description;
            this.thumbnail = thumbnail;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 269930522;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a user contact.
     */
    public static class InlineQueryResultContact extends InlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * A user contact.
         */
        public Contact contact;
        /**
         * Result thumbnail in JPEG format; may be null.
         */
        @Nullable public Thumbnail thumbnail;

        /**
         * Represents a user contact.
         */
        public InlineQueryResultContact() {
        }

        /**
         * Represents a user contact.
         *
         * @param id Unique identifier of the query result.
         * @param contact A user contact.
         * @param thumbnail Result thumbnail in JPEG format; may be null.
         */
        public InlineQueryResultContact(String id, Contact contact, Thumbnail thumbnail) {
            this.id = id;
            this.contact = contact;
            this.thumbnail = thumbnail;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -181960174;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a point on the map.
     */
    public static class InlineQueryResultLocation extends InlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * Location result.
         */
        public Location location;
        /**
         * Title of the result.
         */
        public String title;
        /**
         * Result thumbnail in JPEG format; may be null.
         */
        @Nullable public Thumbnail thumbnail;

        /**
         * Represents a point on the map.
         */
        public InlineQueryResultLocation() {
        }

        /**
         * Represents a point on the map.
         *
         * @param id Unique identifier of the query result.
         * @param location Location result.
         * @param title Title of the result.
         * @param thumbnail Result thumbnail in JPEG format; may be null.
         */
        public InlineQueryResultLocation(String id, Location location, String title, Thumbnail thumbnail) {
            this.id = id;
            this.location = location;
            this.title = title;
            this.thumbnail = thumbnail;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 466004752;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents information about a venue.
     */
    public static class InlineQueryResultVenue extends InlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * Venue result.
         */
        public Venue venue;
        /**
         * Result thumbnail in JPEG format; may be null.
         */
        @Nullable public Thumbnail thumbnail;

        /**
         * Represents information about a venue.
         */
        public InlineQueryResultVenue() {
        }

        /**
         * Represents information about a venue.
         *
         * @param id Unique identifier of the query result.
         * @param venue Venue result.
         * @param thumbnail Result thumbnail in JPEG format; may be null.
         */
        public InlineQueryResultVenue(String id, Venue venue, Thumbnail thumbnail) {
            this.id = id;
            this.venue = venue;
            this.thumbnail = thumbnail;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1281036382;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents information about a game.
     */
    public static class InlineQueryResultGame extends InlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * Game result.
         */
        public Game game;

        /**
         * Represents information about a game.
         */
        public InlineQueryResultGame() {
        }

        /**
         * Represents information about a game.
         *
         * @param id Unique identifier of the query result.
         * @param game Game result.
         */
        public InlineQueryResultGame(String id, Game game) {
            this.id = id;
            this.game = game;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1706916987;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents an animation file.
     */
    public static class InlineQueryResultAnimation extends InlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * Animation file.
         */
        public Animation animation;
        /**
         * Animation title.
         */
        public String title;

        /**
         * Represents an animation file.
         */
        public InlineQueryResultAnimation() {
        }

        /**
         * Represents an animation file.
         *
         * @param id Unique identifier of the query result.
         * @param animation Animation file.
         * @param title Animation title.
         */
        public InlineQueryResultAnimation(String id, Animation animation, String title) {
            this.id = id;
            this.animation = animation;
            this.title = title;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2009984267;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents an audio file.
     */
    public static class InlineQueryResultAudio extends InlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * Audio file.
         */
        public Audio audio;

        /**
         * Represents an audio file.
         */
        public InlineQueryResultAudio() {
        }

        /**
         * Represents an audio file.
         *
         * @param id Unique identifier of the query result.
         * @param audio Audio file.
         */
        public InlineQueryResultAudio(String id, Audio audio) {
            this.id = id;
            this.audio = audio;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 842650360;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a document.
     */
    public static class InlineQueryResultDocument extends InlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * Document.
         */
        public Document document;
        /**
         * Document title.
         */
        public String title;
        /**
         * Document description.
         */
        public String description;

        /**
         * Represents a document.
         */
        public InlineQueryResultDocument() {
        }

        /**
         * Represents a document.
         *
         * @param id Unique identifier of the query result.
         * @param document Document.
         * @param title Document title.
         * @param description Document description.
         */
        public InlineQueryResultDocument(String id, Document document, String title, String description) {
            this.id = id;
            this.document = document;
            this.title = title;
            this.description = description;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1491268539;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a photo.
     */
    public static class InlineQueryResultPhoto extends InlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * Photo.
         */
        public Photo photo;
        /**
         * Title of the result, if known.
         */
        public String title;
        /**
         * A short description of the result, if known.
         */
        public String description;

        /**
         * Represents a photo.
         */
        public InlineQueryResultPhoto() {
        }

        /**
         * Represents a photo.
         *
         * @param id Unique identifier of the query result.
         * @param photo Photo.
         * @param title Title of the result, if known.
         * @param description A short description of the result, if known.
         */
        public InlineQueryResultPhoto(String id, Photo photo, String title, String description) {
            this.id = id;
            this.photo = photo;
            this.title = title;
            this.description = description;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1848319440;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a sticker.
     */
    public static class InlineQueryResultSticker extends InlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * Sticker.
         */
        public Sticker sticker;

        /**
         * Represents a sticker.
         */
        public InlineQueryResultSticker() {
        }

        /**
         * Represents a sticker.
         *
         * @param id Unique identifier of the query result.
         * @param sticker Sticker.
         */
        public InlineQueryResultSticker(String id, Sticker sticker) {
            this.id = id;
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1848224245;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a video.
     */
    public static class InlineQueryResultVideo extends InlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * Video.
         */
        public Video video;
        /**
         * Title of the video.
         */
        public String title;
        /**
         * Description of the video.
         */
        public String description;

        /**
         * Represents a video.
         */
        public InlineQueryResultVideo() {
        }

        /**
         * Represents a video.
         *
         * @param id Unique identifier of the query result.
         * @param video Video.
         * @param title Title of the video.
         * @param description Description of the video.
         */
        public InlineQueryResultVideo(String id, Video video, String title, String description) {
            this.id = id;
            this.video = video;
            this.title = title;
            this.description = description;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1373158683;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a voice note.
     */
    public static class InlineQueryResultVoiceNote extends InlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * Voice note.
         */
        public VoiceNote voiceNote;
        /**
         * Title of the voice note.
         */
        public String title;

        /**
         * Represents a voice note.
         */
        public InlineQueryResultVoiceNote() {
        }

        /**
         * Represents a voice note.
         *
         * @param id Unique identifier of the query result.
         * @param voiceNote Voice note.
         * @param title Title of the voice note.
         */
        public InlineQueryResultVoiceNote(String id, VoiceNote voiceNote, String title) {
            this.id = id;
            this.voiceNote = voiceNote;
            this.title = title;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1897393105;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents the results of the inline query. Use sendInlineQueryResultMessage to send the result of the query.
     */
    public static class InlineQueryResults extends Object {
        /**
         * Unique identifier of the inline query.
         */
        public long inlineQueryId;
        /**
         * Button to be shown above inline query results; may be null.
         */
        @Nullable public InlineQueryResultsButton button;
        /**
         * Results of the query.
         */
        public InlineQueryResult[] results;
        /**
         * The offset for the next request. If empty, then there are no more results.
         */
        public String nextOffset;

        /**
         * Represents the results of the inline query. Use sendInlineQueryResultMessage to send the result of the query.
         */
        public InlineQueryResults() {
        }

        /**
         * Represents the results of the inline query. Use sendInlineQueryResultMessage to send the result of the query.
         *
         * @param inlineQueryId Unique identifier of the inline query.
         * @param button Button to be shown above inline query results; may be null.
         * @param results Results of the query.
         * @param nextOffset The offset for the next request. If empty, then there are no more results.
         */
        public InlineQueryResults(long inlineQueryId, InlineQueryResultsButton button, InlineQueryResult[] results, String nextOffset) {
            this.inlineQueryId = inlineQueryId;
            this.button = button;
            this.results = results;
            this.nextOffset = nextOffset;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1830685615;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a button to be shown above inline query results.
     */
    public static class InlineQueryResultsButton extends Object {
        /**
         * The text of the button.
         */
        public String text;
        /**
         * Type of the button.
         */
        public InlineQueryResultsButtonType type;

        /**
         * Represents a button to be shown above inline query results.
         */
        public InlineQueryResultsButton() {
        }

        /**
         * Represents a button to be shown above inline query results.
         *
         * @param text The text of the button.
         * @param type Type of the button.
         */
        public InlineQueryResultsButton(String text, InlineQueryResultsButtonType type) {
            this.text = text;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -790689618;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents type of button in results of inline query.
     */
    public abstract static class InlineQueryResultsButtonType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            InlineQueryResultsButtonTypeStartBot.CONSTRUCTOR,
            InlineQueryResultsButtonTypeWebApp.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public InlineQueryResultsButtonType() {
        }
    }

    /**
     * Describes the button that opens a private chat with the bot and sends a start message to the bot with the given parameter.
     */
    public static class InlineQueryResultsButtonTypeStartBot extends InlineQueryResultsButtonType {
        /**
         * The parameter for the bot start message.
         */
        public String parameter;

        /**
         * Describes the button that opens a private chat with the bot and sends a start message to the bot with the given parameter.
         */
        public InlineQueryResultsButtonTypeStartBot() {
        }

        /**
         * Describes the button that opens a private chat with the bot and sends a start message to the bot with the given parameter.
         *
         * @param parameter The parameter for the bot start message.
         */
        public InlineQueryResultsButtonTypeStartBot(String parameter) {
            this.parameter = parameter;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -23400235;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes the button that opens a Web App by calling getWebAppUrl.
     */
    public static class InlineQueryResultsButtonTypeWebApp extends InlineQueryResultsButtonType {
        /**
         * An HTTP URL to pass to getWebAppUrl.
         */
        public String url;

        /**
         * Describes the button that opens a Web App by calling getWebAppUrl.
         */
        public InlineQueryResultsButtonTypeWebApp() {
        }

        /**
         * Describes the button that opens a Web App by calling getWebAppUrl.
         *
         * @param url An HTTP URL to pass to getWebAppUrl.
         */
        public InlineQueryResultsButtonTypeWebApp(String url) {
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1197382814;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains information about background to set.
     */
    public abstract static class InputBackground extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            InputBackgroundLocal.CONSTRUCTOR,
            InputBackgroundRemote.CONSTRUCTOR,
            InputBackgroundPrevious.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public InputBackground() {
        }
    }

    /**
     * A background from a local file.
     */
    public static class InputBackgroundLocal extends InputBackground {
        /**
         * Background file to use. Only inputFileLocal and inputFileGenerated are supported. The file must be in JPEG format for wallpapers and in PNG format for patterns.
         */
        public InputFile background;

        /**
         * A background from a local file.
         */
        public InputBackgroundLocal() {
        }

        /**
         * A background from a local file.
         *
         * @param background Background file to use. Only inputFileLocal and inputFileGenerated are supported. The file must be in JPEG format for wallpapers and in PNG format for patterns.
         */
        public InputBackgroundLocal(InputFile background) {
            this.background = background;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1747094364;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A background from the server.
     */
    public static class InputBackgroundRemote extends InputBackground {
        /**
         * The background identifier.
         */
        public long backgroundId;

        /**
         * A background from the server.
         */
        public InputBackgroundRemote() {
        }

        /**
         * A background from the server.
         *
         * @param backgroundId The background identifier.
         */
        public InputBackgroundRemote(long backgroundId) {
            this.backgroundId = backgroundId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -274976231;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A background previously set in the chat; for chat backgrounds only.
     */
    public static class InputBackgroundPrevious extends InputBackground {
        /**
         * Identifier of the message with the background.
         */
        public long messageId;

        /**
         * A background previously set in the chat; for chat backgrounds only.
         */
        public InputBackgroundPrevious() {
        }

        /**
         * A background previously set in the chat; for chat backgrounds only.
         *
         * @param messageId Identifier of the message with the background.
         */
        public InputBackgroundPrevious(long messageId) {
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -351905954;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a business chat link to create or edit.
     */
    public static class InputBusinessChatLink extends Object {
        /**
         * Message draft text that will be added to the input field.
         */
        public FormattedText text;
        /**
         * Link title.
         */
        public String title;

        /**
         * Describes a business chat link to create or edit.
         */
        public InputBusinessChatLink() {
        }

        /**
         * Describes a business chat link to create or edit.
         *
         * @param text Message draft text that will be added to the input field.
         * @param title Link title.
         */
        public InputBusinessChatLink(FormattedText text, String title) {
            this.text = text;
            this.title = title;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 237858296;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes settings for a business account start page to set.
     */
    public static class InputBusinessStartPage extends Object {
        /**
         * Title text of the start page; 0-getOption(&quot;business_start_page_title_length_max&quot;) characters.
         */
        public String title;
        /**
         * Message text of the start page; 0-getOption(&quot;business_start_page_message_length_max&quot;) characters.
         */
        public String message;
        /**
         * Greeting sticker of the start page; pass null if none. The sticker must belong to a sticker set and must not be a custom emoji.
         */
        public InputFile sticker;

        /**
         * Describes settings for a business account start page to set.
         */
        public InputBusinessStartPage() {
        }

        /**
         * Describes settings for a business account start page to set.
         *
         * @param title Title text of the start page; 0-getOption(&quot;business_start_page_title_length_max&quot;) characters.
         * @param message Message text of the start page; 0-getOption(&quot;business_start_page_message_length_max&quot;) characters.
         * @param sticker Greeting sticker of the start page; pass null if none. The sticker must belong to a sticker set and must not be a custom emoji.
         */
        public InputBusinessStartPage(String title, String message, InputFile sticker) {
            this.title = title;
            this.message = message;
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -327383072;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a call.
     */
    public abstract static class InputCall extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            InputCallDiscarded.CONSTRUCTOR,
            InputCallFromMessage.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public InputCall() {
        }
    }

    /**
     * A just ended call.
     */
    public static class InputCallDiscarded extends InputCall {
        /**
         * Identifier of the call.
         */
        public int callId;

        /**
         * A just ended call.
         */
        public InputCallDiscarded() {
        }

        /**
         * A just ended call.
         *
         * @param callId Identifier of the call.
         */
        public InputCallDiscarded(int callId) {
            this.callId = callId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1956569937;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A call from a message of the type messageCall with non-zero messageCall.uniqueId.
     */
    public static class InputCallFromMessage extends InputCall {
        /**
         * Chat identifier of the message.
         */
        public long chatId;
        /**
         * Message identifier.
         */
        public long messageId;

        /**
         * A call from a message of the type messageCall with non-zero messageCall.uniqueId.
         */
        public InputCallFromMessage() {
        }

        /**
         * A call from a message of the type messageCall with non-zero messageCall.uniqueId.
         *
         * @param chatId Chat identifier of the message.
         * @param messageId Message identifier.
         */
        public InputCallFromMessage(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 980874855;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a photo to be set as a user profile or chat photo.
     */
    public abstract static class InputChatPhoto extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            InputChatPhotoPrevious.CONSTRUCTOR,
            InputChatPhotoStatic.CONSTRUCTOR,
            InputChatPhotoAnimation.CONSTRUCTOR,
            InputChatPhotoSticker.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public InputChatPhoto() {
        }
    }

    /**
     * A previously used profile photo of the current user.
     */
    public static class InputChatPhotoPrevious extends InputChatPhoto {
        /**
         * Identifier of the current user's profile photo to reuse.
         */
        public long chatPhotoId;

        /**
         * A previously used profile photo of the current user.
         */
        public InputChatPhotoPrevious() {
        }

        /**
         * A previously used profile photo of the current user.
         *
         * @param chatPhotoId Identifier of the current user's profile photo to reuse.
         */
        public InputChatPhotoPrevious(long chatPhotoId) {
            this.chatPhotoId = chatPhotoId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 23128529;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A static photo in JPEG format.
     */
    public static class InputChatPhotoStatic extends InputChatPhoto {
        /**
         * Photo to be set as profile photo. Only inputFileLocal and inputFileGenerated are allowed.
         */
        public InputFile photo;

        /**
         * A static photo in JPEG format.
         */
        public InputChatPhotoStatic() {
        }

        /**
         * A static photo in JPEG format.
         *
         * @param photo Photo to be set as profile photo. Only inputFileLocal and inputFileGenerated are allowed.
         */
        public InputChatPhotoStatic(InputFile photo) {
            this.photo = photo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1979179699;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An animation in MPEG4 format; must be square, at most 10 seconds long, have width between 160 and 1280 and be at most 2MB in size.
     */
    public static class InputChatPhotoAnimation extends InputChatPhoto {
        /**
         * Animation to be set as profile photo. Only inputFileLocal and inputFileGenerated are allowed.
         */
        public InputFile animation;
        /**
         * Timestamp of the frame, which will be used as static chat photo.
         */
        public double mainFrameTimestamp;

        /**
         * An animation in MPEG4 format; must be square, at most 10 seconds long, have width between 160 and 1280 and be at most 2MB in size.
         */
        public InputChatPhotoAnimation() {
        }

        /**
         * An animation in MPEG4 format; must be square, at most 10 seconds long, have width between 160 and 1280 and be at most 2MB in size.
         *
         * @param animation Animation to be set as profile photo. Only inputFileLocal and inputFileGenerated are allowed.
         * @param mainFrameTimestamp Timestamp of the frame, which will be used as static chat photo.
         */
        public InputChatPhotoAnimation(InputFile animation, double mainFrameTimestamp) {
            this.animation = animation;
            this.mainFrameTimestamp = mainFrameTimestamp;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 90846242;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A sticker on a custom background.
     */
    public static class InputChatPhotoSticker extends InputChatPhoto {
        /**
         * Information about the sticker.
         */
        public ChatPhotoSticker sticker;

        /**
         * A sticker on a custom background.
         */
        public InputChatPhotoSticker() {
        }

        /**
         * A sticker on a custom background.
         *
         * @param sticker Information about the sticker.
         */
        public InputChatPhotoSticker(ChatPhotoSticker sticker) {
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1315861341;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a chat theme to set.
     */
    public abstract static class InputChatTheme extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            InputChatThemeEmoji.CONSTRUCTOR,
            InputChatThemeGift.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public InputChatTheme() {
        }
    }

    /**
     * A theme based on an emoji.
     */
    public static class InputChatThemeEmoji extends InputChatTheme {
        /**
         * Name of the theme.
         */
        public String name;

        /**
         * A theme based on an emoji.
         */
        public InputChatThemeEmoji() {
        }

        /**
         * A theme based on an emoji.
         *
         * @param name Name of the theme.
         */
        public InputChatThemeEmoji(String name) {
            this.name = name;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1461787199;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A theme based on an upgraded gift.
     */
    public static class InputChatThemeGift extends InputChatTheme {
        /**
         * Name of the upgraded gift. A gift can be used only in one chat in a time. When the same gift is used in another chat, theme in the previous chat is reset to default.
         */
        public String name;

        /**
         * A theme based on an upgraded gift.
         */
        public InputChatThemeGift() {
        }

        /**
         * A theme based on an upgraded gift.
         *
         * @param name Name of the upgraded gift. A gift can be used only in one chat in a time. When the same gift is used in another chat, theme in the previous chat is reset to default.
         */
        public InputChatThemeGift(String name) {
            this.name = name;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2026976301;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a checklist to be sent.
     */
    public static class InputChecklist extends Object {
        /**
         * Title of the checklist; 1-getOption(&quot;checklist_title_length_max&quot;) characters. May contain only Bold, Italic, Underline, Strikethrough, Spoiler, CustomEmoji, and DateTime entities.
         */
        public FormattedText title;
        /**
         * List of tasks in the checklist; 1-getOption(&quot;checklist_task_count_max&quot;) tasks.
         */
        public InputChecklistTask[] tasks;
        /**
         * True, if other users can add tasks to the list.
         */
        public boolean othersCanAddTasks;
        /**
         * True, if other users can mark tasks as done or not done.
         */
        public boolean othersCanMarkTasksAsDone;

        /**
         * Describes a checklist to be sent.
         */
        public InputChecklist() {
        }

        /**
         * Describes a checklist to be sent.
         *
         * @param title Title of the checklist; 1-getOption(&quot;checklist_title_length_max&quot;) characters. May contain only Bold, Italic, Underline, Strikethrough, Spoiler, CustomEmoji, and DateTime entities.
         * @param tasks List of tasks in the checklist; 1-getOption(&quot;checklist_task_count_max&quot;) tasks.
         * @param othersCanAddTasks True, if other users can add tasks to the list.
         * @param othersCanMarkTasksAsDone True, if other users can mark tasks as done or not done.
         */
        public InputChecklist(FormattedText title, InputChecklistTask[] tasks, boolean othersCanAddTasks, boolean othersCanMarkTasksAsDone) {
            this.title = title;
            this.tasks = tasks;
            this.othersCanAddTasks = othersCanAddTasks;
            this.othersCanMarkTasksAsDone = othersCanMarkTasksAsDone;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -145125739;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a task in a checklist to be sent.
     */
    public static class InputChecklistTask extends Object {
        /**
         * Unique identifier of the task; must be positive.
         */
        public int id;
        /**
         * Text of the task; 1-getOption(&quot;checklist_task_text_length_max&quot;) characters without line feeds. May contain only Bold, Italic, Underline, Strikethrough, Spoiler, CustomEmoji, and DateTime entities.
         */
        public FormattedText text;

        /**
         * Describes a task in a checklist to be sent.
         */
        public InputChecklistTask() {
        }

        /**
         * Describes a task in a checklist to be sent.
         *
         * @param id Unique identifier of the task; must be positive.
         * @param text Text of the task; 1-getOption(&quot;checklist_task_text_length_max&quot;) characters without line feeds. May contain only Bold, Italic, Underline, Strikethrough, Spoiler, CustomEmoji, and DateTime entities.
         */
        public InputChecklistTask(int id, FormattedText text) {
            this.id = id;
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1633462225;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains information about the payment method chosen by the user.
     */
    public abstract static class InputCredentials extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            InputCredentialsSaved.CONSTRUCTOR,
            InputCredentialsNew.CONSTRUCTOR,
            InputCredentialsApplePay.CONSTRUCTOR,
            InputCredentialsGooglePay.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public InputCredentials() {
        }
    }

    /**
     * Applies if a user chooses some previously saved payment credentials. To use their previously saved credentials, the user must have a valid temporary password.
     */
    public static class InputCredentialsSaved extends InputCredentials {
        /**
         * Identifier of the saved credentials.
         */
        public String savedCredentialsId;

        /**
         * Applies if a user chooses some previously saved payment credentials. To use their previously saved credentials, the user must have a valid temporary password.
         */
        public InputCredentialsSaved() {
        }

        /**
         * Applies if a user chooses some previously saved payment credentials. To use their previously saved credentials, the user must have a valid temporary password.
         *
         * @param savedCredentialsId Identifier of the saved credentials.
         */
        public InputCredentialsSaved(String savedCredentialsId) {
            this.savedCredentialsId = savedCredentialsId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2034385364;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Applies if a user enters new credentials on a payment provider website.
     */
    public static class InputCredentialsNew extends InputCredentials {
        /**
         * JSON-encoded data with the credential identifier from the payment provider.
         */
        public String data;
        /**
         * True, if the credential identifier can be saved on the server side.
         */
        public boolean allowSave;

        /**
         * Applies if a user enters new credentials on a payment provider website.
         */
        public InputCredentialsNew() {
        }

        /**
         * Applies if a user enters new credentials on a payment provider website.
         *
         * @param data JSON-encoded data with the credential identifier from the payment provider.
         * @param allowSave True, if the credential identifier can be saved on the server side.
         */
        public InputCredentialsNew(String data, boolean allowSave) {
            this.data = data;
            this.allowSave = allowSave;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -829689558;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Applies if a user enters new credentials using Apple Pay.
     */
    public static class InputCredentialsApplePay extends InputCredentials {
        /**
         * JSON-encoded data with the credential identifier.
         */
        public String data;

        /**
         * Applies if a user enters new credentials using Apple Pay.
         */
        public InputCredentialsApplePay() {
        }

        /**
         * Applies if a user enters new credentials using Apple Pay.
         *
         * @param data JSON-encoded data with the credential identifier.
         */
        public InputCredentialsApplePay(String data) {
            this.data = data;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1246570799;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Applies if a user enters new credentials using Google Pay.
     */
    public static class InputCredentialsGooglePay extends InputCredentials {
        /**
         * JSON-encoded data with the credential identifier.
         */
        public String data;

        /**
         * Applies if a user enters new credentials using Google Pay.
         */
        public InputCredentialsGooglePay() {
        }

        /**
         * Applies if a user enters new credentials using Google Pay.
         *
         * @param data JSON-encoded data with the credential identifier.
         */
        public InputCredentialsGooglePay(String data) {
            this.data = data;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 844384100;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Points to a file.
     */
    public abstract static class InputFile extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            InputFileId.CONSTRUCTOR,
            InputFileRemote.CONSTRUCTOR,
            InputFileLocal.CONSTRUCTOR,
            InputFileGenerated.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public InputFile() {
        }
    }

    /**
     * A file defined by its unique identifier.
     */
    public static class InputFileId extends InputFile {
        /**
         * Unique file identifier.
         */
        public int id;

        /**
         * A file defined by its unique identifier.
         */
        public InputFileId() {
        }

        /**
         * A file defined by its unique identifier.
         *
         * @param id Unique file identifier.
         */
        public InputFileId(int id) {
            this.id = id;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1788906253;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A file defined by its remote identifier. The remote identifier is guaranteed to be usable only if the corresponding file is still accessible to the user and known to TDLib. For example, if the file is from a message, then the message must be not deleted and accessible to the user. If the file database is disabled, then the corresponding object with the file must be preloaded by the application.
     */
    public static class InputFileRemote extends InputFile {
        /**
         * Remote file identifier.
         */
        public String id;

        /**
         * A file defined by its remote identifier. The remote identifier is guaranteed to be usable only if the corresponding file is still accessible to the user and known to TDLib. For example, if the file is from a message, then the message must be not deleted and accessible to the user. If the file database is disabled, then the corresponding object with the file must be preloaded by the application.
         */
        public InputFileRemote() {
        }

        /**
         * A file defined by its remote identifier. The remote identifier is guaranteed to be usable only if the corresponding file is still accessible to the user and known to TDLib. For example, if the file is from a message, then the message must be not deleted and accessible to the user. If the file database is disabled, then the corresponding object with the file must be preloaded by the application.
         *
         * @param id Remote file identifier.
         */
        public InputFileRemote(String id) {
            this.id = id;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -107574466;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A file defined by a local path.
     */
    public static class InputFileLocal extends InputFile {
        /**
         * Local path to the file.
         */
        public String path;

        /**
         * A file defined by a local path.
         */
        public InputFileLocal() {
        }

        /**
         * A file defined by a local path.
         *
         * @param path Local path to the file.
         */
        public InputFileLocal(String path) {
            this.path = path;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2056030919;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A file generated by the application. The application must handle updates updateFileGenerationStart and updateFileGenerationStop to generate the file when asked by TDLib.
     */
    public static class InputFileGenerated extends InputFile {
        /**
         * Local path to a file from which the file is generated. The path doesn't have to be a valid path and is used by TDLib only to detect name and MIME type of the generated file.
         */
        public String originalPath;
        /**
         * String specifying the conversion applied to the original file; must be persistent across application restarts. Conversions beginning with '#' are reserved for internal TDLib usage.
         */
        public String conversion;
        /**
         * Expected size of the generated file, in bytes; pass 0 if unknown.
         */
        public long expectedSize;

        /**
         * A file generated by the application. The application must handle updates updateFileGenerationStart and updateFileGenerationStop to generate the file when asked by TDLib.
         */
        public InputFileGenerated() {
        }

        /**
         * A file generated by the application. The application must handle updates updateFileGenerationStart and updateFileGenerationStop to generate the file when asked by TDLib.
         *
         * @param originalPath Local path to a file from which the file is generated. The path doesn't have to be a valid path and is used by TDLib only to detect name and MIME type of the generated file.
         * @param conversion String specifying the conversion applied to the original file; must be persistent across application restarts. Conversions beginning with '#' are reserved for internal TDLib usage.
         * @param expectedSize Expected size of the generated file, in bytes; pass 0 if unknown.
         */
        public InputFileGenerated(String originalPath, String conversion, long expectedSize) {
            this.originalPath = originalPath;
            this.conversion = conversion;
            this.expectedSize = expectedSize;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1333385216;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a non-joined group call that isn't bound to a chat.
     */
    public abstract static class InputGroupCall extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            InputGroupCallLink.CONSTRUCTOR,
            InputGroupCallMessage.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public InputGroupCall() {
        }
    }

    /**
     * The group call is accessible through a link.
     */
    public static class InputGroupCallLink extends InputGroupCall {
        /**
         * The link for the group call.
         */
        public String link;

        /**
         * The group call is accessible through a link.
         */
        public InputGroupCallLink() {
        }

        /**
         * The group call is accessible through a link.
         *
         * @param link The link for the group call.
         */
        public InputGroupCallLink(String link) {
            this.link = link;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -812157480;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The group call is accessible through a message of the type messageGroupCall.
     */
    public static class InputGroupCallMessage extends InputGroupCall {
        /**
         * Identifier of the chat with the message.
         */
        public long chatId;
        /**
         * Identifier of the message of the type messageGroupCall.
         */
        public long messageId;

        /**
         * The group call is accessible through a message of the type messageGroupCall.
         */
        public InputGroupCallMessage() {
        }

        /**
         * The group call is accessible through a message of the type messageGroupCall.
         *
         * @param chatId Identifier of the chat with the message.
         * @param messageId Identifier of the message of the type messageGroupCall.
         */
        public InputGroupCallMessage(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -341793768;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An identity document to be saved to Telegram Passport.
     */
    public static class InputIdentityDocument extends Object {
        /**
         * Document number; 1-24 characters.
         */
        public String number;
        /**
         * Document expiration date; pass null if not applicable.
         */
        public Date expirationDate;
        /**
         * Front side of the document.
         */
        public InputFile frontSide;
        /**
         * Reverse side of the document; only for driver license and identity card; pass null otherwise.
         */
        public InputFile reverseSide;
        /**
         * Selfie with the document; pass null if unavailable.
         */
        public InputFile selfie;
        /**
         * List of files containing a certified English translation of the document.
         */
        public InputFile[] translation;

        /**
         * An identity document to be saved to Telegram Passport.
         */
        public InputIdentityDocument() {
        }

        /**
         * An identity document to be saved to Telegram Passport.
         *
         * @param number Document number; 1-24 characters.
         * @param expirationDate Document expiration date; pass null if not applicable.
         * @param frontSide Front side of the document.
         * @param reverseSide Reverse side of the document; only for driver license and identity card; pass null otherwise.
         * @param selfie Selfie with the document; pass null if unavailable.
         * @param translation List of files containing a certified English translation of the document.
         */
        public InputIdentityDocument(String number, Date expirationDate, InputFile frontSide, InputFile reverseSide, InputFile selfie, InputFile[] translation) {
            this.number = number;
            this.expirationDate = expirationDate;
            this.frontSide = frontSide;
            this.reverseSide = reverseSide;
            this.selfie = selfie;
            this.translation = translation;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 767353688;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents a single result of an inline query; for bots only.
     */
    public abstract static class InputInlineQueryResult extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            InputInlineQueryResultAnimation.CONSTRUCTOR,
            InputInlineQueryResultArticle.CONSTRUCTOR,
            InputInlineQueryResultAudio.CONSTRUCTOR,
            InputInlineQueryResultContact.CONSTRUCTOR,
            InputInlineQueryResultDocument.CONSTRUCTOR,
            InputInlineQueryResultGame.CONSTRUCTOR,
            InputInlineQueryResultLocation.CONSTRUCTOR,
            InputInlineQueryResultPhoto.CONSTRUCTOR,
            InputInlineQueryResultSticker.CONSTRUCTOR,
            InputInlineQueryResultVenue.CONSTRUCTOR,
            InputInlineQueryResultVideo.CONSTRUCTOR,
            InputInlineQueryResultVoiceNote.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public InputInlineQueryResult() {
        }
    }

    /**
     * Represents a link to an animated GIF or an animated (i.e., without sound) H.264/MPEG-4 AVC video.
     */
    public static class InputInlineQueryResultAnimation extends InputInlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * Title of the query result.
         */
        public String title;
        /**
         * URL of the result thumbnail (JPEG, GIF, or MPEG4), if it exists.
         */
        public String thumbnailUrl;
        /**
         * MIME type of the video thumbnail. If non-empty, must be one of &quot;image/jpeg&quot;, &quot;image/gif&quot; and &quot;video/mp4&quot;.
         */
        public String thumbnailMimeType;
        /**
         * The URL of the video file (file size must not exceed 1MB).
         */
        public String videoUrl;
        /**
         * MIME type of the video file. Must be one of &quot;image/gif&quot; and &quot;video/mp4&quot;.
         */
        public String videoMimeType;
        /**
         * Duration of the video, in seconds.
         */
        public int videoDuration;
        /**
         * Width of the video.
         */
        public int videoWidth;
        /**
         * Height of the video.
         */
        public int videoHeight;
        /**
         * The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         */
        public ReplyMarkup replyMarkup;
        /**
         * The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessageAnimation, inputMessageInvoice, inputMessageLocation, inputMessageVenue or inputMessageContact.
         */
        public InputMessageContent inputMessageContent;

        /**
         * Represents a link to an animated GIF or an animated (i.e., without sound) H.264/MPEG-4 AVC video.
         */
        public InputInlineQueryResultAnimation() {
        }

        /**
         * Represents a link to an animated GIF or an animated (i.e., without sound) H.264/MPEG-4 AVC video.
         *
         * @param id Unique identifier of the query result.
         * @param title Title of the query result.
         * @param thumbnailUrl URL of the result thumbnail (JPEG, GIF, or MPEG4), if it exists.
         * @param thumbnailMimeType MIME type of the video thumbnail. If non-empty, must be one of &quot;image/jpeg&quot;, &quot;image/gif&quot; and &quot;video/mp4&quot;.
         * @param videoUrl The URL of the video file (file size must not exceed 1MB).
         * @param videoMimeType MIME type of the video file. Must be one of &quot;image/gif&quot; and &quot;video/mp4&quot;.
         * @param videoDuration Duration of the video, in seconds.
         * @param videoWidth Width of the video.
         * @param videoHeight Height of the video.
         * @param replyMarkup The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         * @param inputMessageContent The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessageAnimation, inputMessageInvoice, inputMessageLocation, inputMessageVenue or inputMessageContact.
         */
        public InputInlineQueryResultAnimation(String id, String title, String thumbnailUrl, String thumbnailMimeType, String videoUrl, String videoMimeType, int videoDuration, int videoWidth, int videoHeight, ReplyMarkup replyMarkup, InputMessageContent inputMessageContent) {
            this.id = id;
            this.title = title;
            this.thumbnailUrl = thumbnailUrl;
            this.thumbnailMimeType = thumbnailMimeType;
            this.videoUrl = videoUrl;
            this.videoMimeType = videoMimeType;
            this.videoDuration = videoDuration;
            this.videoWidth = videoWidth;
            this.videoHeight = videoHeight;
            this.replyMarkup = replyMarkup;
            this.inputMessageContent = inputMessageContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1489808874;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a link to an article or web page.
     */
    public static class InputInlineQueryResultArticle extends InputInlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * URL of the result, if it exists.
         */
        public String url;
        /**
         * Title of the result.
         */
        public String title;
        /**
         * A short description of the result.
         */
        public String description;
        /**
         * URL of the result thumbnail, if it exists.
         */
        public String thumbnailUrl;
        /**
         * Thumbnail width, if known.
         */
        public int thumbnailWidth;
        /**
         * Thumbnail height, if known.
         */
        public int thumbnailHeight;
        /**
         * The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         */
        public ReplyMarkup replyMarkup;
        /**
         * The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessageInvoice, inputMessageLocation, inputMessageVenue or inputMessageContact.
         */
        public InputMessageContent inputMessageContent;

        /**
         * Represents a link to an article or web page.
         */
        public InputInlineQueryResultArticle() {
        }

        /**
         * Represents a link to an article or web page.
         *
         * @param id Unique identifier of the query result.
         * @param url URL of the result, if it exists.
         * @param title Title of the result.
         * @param description A short description of the result.
         * @param thumbnailUrl URL of the result thumbnail, if it exists.
         * @param thumbnailWidth Thumbnail width, if known.
         * @param thumbnailHeight Thumbnail height, if known.
         * @param replyMarkup The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         * @param inputMessageContent The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessageInvoice, inputMessageLocation, inputMessageVenue or inputMessageContact.
         */
        public InputInlineQueryResultArticle(String id, String url, String title, String description, String thumbnailUrl, int thumbnailWidth, int thumbnailHeight, ReplyMarkup replyMarkup, InputMessageContent inputMessageContent) {
            this.id = id;
            this.url = url;
            this.title = title;
            this.description = description;
            this.thumbnailUrl = thumbnailUrl;
            this.thumbnailWidth = thumbnailWidth;
            this.thumbnailHeight = thumbnailHeight;
            this.replyMarkup = replyMarkup;
            this.inputMessageContent = inputMessageContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1983218620;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a link to an MP3 audio file.
     */
    public static class InputInlineQueryResultAudio extends InputInlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * Title of the audio file.
         */
        public String title;
        /**
         * Performer of the audio file.
         */
        public String performer;
        /**
         * The URL of the audio file.
         */
        public String audioUrl;
        /**
         * Audio file duration, in seconds.
         */
        public int audioDuration;
        /**
         * The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         */
        public ReplyMarkup replyMarkup;
        /**
         * The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessageAudio, inputMessageInvoice, inputMessageLocation, inputMessageVenue or inputMessageContact.
         */
        public InputMessageContent inputMessageContent;

        /**
         * Represents a link to an MP3 audio file.
         */
        public InputInlineQueryResultAudio() {
        }

        /**
         * Represents a link to an MP3 audio file.
         *
         * @param id Unique identifier of the query result.
         * @param title Title of the audio file.
         * @param performer Performer of the audio file.
         * @param audioUrl The URL of the audio file.
         * @param audioDuration Audio file duration, in seconds.
         * @param replyMarkup The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         * @param inputMessageContent The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessageAudio, inputMessageInvoice, inputMessageLocation, inputMessageVenue or inputMessageContact.
         */
        public InputInlineQueryResultAudio(String id, String title, String performer, String audioUrl, int audioDuration, ReplyMarkup replyMarkup, InputMessageContent inputMessageContent) {
            this.id = id;
            this.title = title;
            this.performer = performer;
            this.audioUrl = audioUrl;
            this.audioDuration = audioDuration;
            this.replyMarkup = replyMarkup;
            this.inputMessageContent = inputMessageContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1260139988;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a user contact.
     */
    public static class InputInlineQueryResultContact extends InputInlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * User contact.
         */
        public Contact contact;
        /**
         * URL of the result thumbnail, if it exists.
         */
        public String thumbnailUrl;
        /**
         * Thumbnail width, if known.
         */
        public int thumbnailWidth;
        /**
         * Thumbnail height, if known.
         */
        public int thumbnailHeight;
        /**
         * The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         */
        public ReplyMarkup replyMarkup;
        /**
         * The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessageInvoice, inputMessageLocation, inputMessageVenue or inputMessageContact.
         */
        public InputMessageContent inputMessageContent;

        /**
         * Represents a user contact.
         */
        public InputInlineQueryResultContact() {
        }

        /**
         * Represents a user contact.
         *
         * @param id Unique identifier of the query result.
         * @param contact User contact.
         * @param thumbnailUrl URL of the result thumbnail, if it exists.
         * @param thumbnailWidth Thumbnail width, if known.
         * @param thumbnailHeight Thumbnail height, if known.
         * @param replyMarkup The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         * @param inputMessageContent The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessageInvoice, inputMessageLocation, inputMessageVenue or inputMessageContact.
         */
        public InputInlineQueryResultContact(String id, Contact contact, String thumbnailUrl, int thumbnailWidth, int thumbnailHeight, ReplyMarkup replyMarkup, InputMessageContent inputMessageContent) {
            this.id = id;
            this.contact = contact;
            this.thumbnailUrl = thumbnailUrl;
            this.thumbnailWidth = thumbnailWidth;
            this.thumbnailHeight = thumbnailHeight;
            this.replyMarkup = replyMarkup;
            this.inputMessageContent = inputMessageContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1846064594;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a link to a file.
     */
    public static class InputInlineQueryResultDocument extends InputInlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * Title of the resulting file.
         */
        public String title;
        /**
         * Short description of the result, if known.
         */
        public String description;
        /**
         * URL of the file.
         */
        public String documentUrl;
        /**
         * MIME type of the file content; only &quot;application/pdf&quot; and &quot;application/zip&quot; are currently allowed.
         */
        public String mimeType;
        /**
         * The URL of the file thumbnail, if it exists.
         */
        public String thumbnailUrl;
        /**
         * Width of the thumbnail.
         */
        public int thumbnailWidth;
        /**
         * Height of the thumbnail.
         */
        public int thumbnailHeight;
        /**
         * The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         */
        public ReplyMarkup replyMarkup;
        /**
         * The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessageDocument, inputMessageInvoice, inputMessageLocation, inputMessageVenue or inputMessageContact.
         */
        public InputMessageContent inputMessageContent;

        /**
         * Represents a link to a file.
         */
        public InputInlineQueryResultDocument() {
        }

        /**
         * Represents a link to a file.
         *
         * @param id Unique identifier of the query result.
         * @param title Title of the resulting file.
         * @param description Short description of the result, if known.
         * @param documentUrl URL of the file.
         * @param mimeType MIME type of the file content; only &quot;application/pdf&quot; and &quot;application/zip&quot; are currently allowed.
         * @param thumbnailUrl The URL of the file thumbnail, if it exists.
         * @param thumbnailWidth Width of the thumbnail.
         * @param thumbnailHeight Height of the thumbnail.
         * @param replyMarkup The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         * @param inputMessageContent The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessageDocument, inputMessageInvoice, inputMessageLocation, inputMessageVenue or inputMessageContact.
         */
        public InputInlineQueryResultDocument(String id, String title, String description, String documentUrl, String mimeType, String thumbnailUrl, int thumbnailWidth, int thumbnailHeight, ReplyMarkup replyMarkup, InputMessageContent inputMessageContent) {
            this.id = id;
            this.title = title;
            this.description = description;
            this.documentUrl = documentUrl;
            this.mimeType = mimeType;
            this.thumbnailUrl = thumbnailUrl;
            this.thumbnailWidth = thumbnailWidth;
            this.thumbnailHeight = thumbnailHeight;
            this.replyMarkup = replyMarkup;
            this.inputMessageContent = inputMessageContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 578801869;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a game.
     */
    public static class InputInlineQueryResultGame extends InputInlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * Short name of the game.
         */
        public String gameShortName;
        /**
         * The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         */
        public ReplyMarkup replyMarkup;

        /**
         * Represents a game.
         */
        public InputInlineQueryResultGame() {
        }

        /**
         * Represents a game.
         *
         * @param id Unique identifier of the query result.
         * @param gameShortName Short name of the game.
         * @param replyMarkup The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         */
        public InputInlineQueryResultGame(String id, String gameShortName, ReplyMarkup replyMarkup) {
            this.id = id;
            this.gameShortName = gameShortName;
            this.replyMarkup = replyMarkup;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 966074327;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a point on the map.
     */
    public static class InputInlineQueryResultLocation extends InputInlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * Location result.
         */
        public Location location;
        /**
         * Amount of time relative to the message sent time until the location can be updated, in seconds.
         */
        public int livePeriod;
        /**
         * Title of the result.
         */
        public String title;
        /**
         * URL of the result thumbnail, if it exists.
         */
        public String thumbnailUrl;
        /**
         * Thumbnail width, if known.
         */
        public int thumbnailWidth;
        /**
         * Thumbnail height, if known.
         */
        public int thumbnailHeight;
        /**
         * The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         */
        public ReplyMarkup replyMarkup;
        /**
         * The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessageInvoice, inputMessageLocation, inputMessageVenue or inputMessageContact.
         */
        public InputMessageContent inputMessageContent;

        /**
         * Represents a point on the map.
         */
        public InputInlineQueryResultLocation() {
        }

        /**
         * Represents a point on the map.
         *
         * @param id Unique identifier of the query result.
         * @param location Location result.
         * @param livePeriod Amount of time relative to the message sent time until the location can be updated, in seconds.
         * @param title Title of the result.
         * @param thumbnailUrl URL of the result thumbnail, if it exists.
         * @param thumbnailWidth Thumbnail width, if known.
         * @param thumbnailHeight Thumbnail height, if known.
         * @param replyMarkup The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         * @param inputMessageContent The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessageInvoice, inputMessageLocation, inputMessageVenue or inputMessageContact.
         */
        public InputInlineQueryResultLocation(String id, Location location, int livePeriod, String title, String thumbnailUrl, int thumbnailWidth, int thumbnailHeight, ReplyMarkup replyMarkup, InputMessageContent inputMessageContent) {
            this.id = id;
            this.location = location;
            this.livePeriod = livePeriod;
            this.title = title;
            this.thumbnailUrl = thumbnailUrl;
            this.thumbnailWidth = thumbnailWidth;
            this.thumbnailHeight = thumbnailHeight;
            this.replyMarkup = replyMarkup;
            this.inputMessageContent = inputMessageContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1887650218;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents link to a JPEG image.
     */
    public static class InputInlineQueryResultPhoto extends InputInlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * Title of the result, if known.
         */
        public String title;
        /**
         * A short description of the result, if known.
         */
        public String description;
        /**
         * URL of the photo thumbnail, if it exists.
         */
        public String thumbnailUrl;
        /**
         * The URL of the JPEG photo (photo size must not exceed 5MB).
         */
        public String photoUrl;
        /**
         * Width of the photo.
         */
        public int photoWidth;
        /**
         * Height of the photo.
         */
        public int photoHeight;
        /**
         * The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         */
        public ReplyMarkup replyMarkup;
        /**
         * The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessagePhoto, inputMessageInvoice, inputMessageLocation, inputMessageVenue or inputMessageContact.
         */
        public InputMessageContent inputMessageContent;

        /**
         * Represents link to a JPEG image.
         */
        public InputInlineQueryResultPhoto() {
        }

        /**
         * Represents link to a JPEG image.
         *
         * @param id Unique identifier of the query result.
         * @param title Title of the result, if known.
         * @param description A short description of the result, if known.
         * @param thumbnailUrl URL of the photo thumbnail, if it exists.
         * @param photoUrl The URL of the JPEG photo (photo size must not exceed 5MB).
         * @param photoWidth Width of the photo.
         * @param photoHeight Height of the photo.
         * @param replyMarkup The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         * @param inputMessageContent The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessagePhoto, inputMessageInvoice, inputMessageLocation, inputMessageVenue or inputMessageContact.
         */
        public InputInlineQueryResultPhoto(String id, String title, String description, String thumbnailUrl, String photoUrl, int photoWidth, int photoHeight, ReplyMarkup replyMarkup, InputMessageContent inputMessageContent) {
            this.id = id;
            this.title = title;
            this.description = description;
            this.thumbnailUrl = thumbnailUrl;
            this.photoUrl = photoUrl;
            this.photoWidth = photoWidth;
            this.photoHeight = photoHeight;
            this.replyMarkup = replyMarkup;
            this.inputMessageContent = inputMessageContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1123338721;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a link to a WEBP, TGS, or WEBM sticker.
     */
    public static class InputInlineQueryResultSticker extends InputInlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * URL of the sticker thumbnail, if it exists.
         */
        public String thumbnailUrl;
        /**
         * The URL of the WEBP, TGS, or WEBM sticker (sticker file size must not exceed 5MB).
         */
        public String stickerUrl;
        /**
         * Width of the sticker.
         */
        public int stickerWidth;
        /**
         * Height of the sticker.
         */
        public int stickerHeight;
        /**
         * The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         */
        public ReplyMarkup replyMarkup;
        /**
         * The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessageSticker, inputMessageInvoice, inputMessageLocation, inputMessageVenue or inputMessageContact.
         */
        public InputMessageContent inputMessageContent;

        /**
         * Represents a link to a WEBP, TGS, or WEBM sticker.
         */
        public InputInlineQueryResultSticker() {
        }

        /**
         * Represents a link to a WEBP, TGS, or WEBM sticker.
         *
         * @param id Unique identifier of the query result.
         * @param thumbnailUrl URL of the sticker thumbnail, if it exists.
         * @param stickerUrl The URL of the WEBP, TGS, or WEBM sticker (sticker file size must not exceed 5MB).
         * @param stickerWidth Width of the sticker.
         * @param stickerHeight Height of the sticker.
         * @param replyMarkup The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         * @param inputMessageContent The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessageSticker, inputMessageInvoice, inputMessageLocation, inputMessageVenue or inputMessageContact.
         */
        public InputInlineQueryResultSticker(String id, String thumbnailUrl, String stickerUrl, int stickerWidth, int stickerHeight, ReplyMarkup replyMarkup, InputMessageContent inputMessageContent) {
            this.id = id;
            this.thumbnailUrl = thumbnailUrl;
            this.stickerUrl = stickerUrl;
            this.stickerWidth = stickerWidth;
            this.stickerHeight = stickerHeight;
            this.replyMarkup = replyMarkup;
            this.inputMessageContent = inputMessageContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 274007129;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents information about a venue.
     */
    public static class InputInlineQueryResultVenue extends InputInlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * Venue result.
         */
        public Venue venue;
        /**
         * URL of the result thumbnail, if it exists.
         */
        public String thumbnailUrl;
        /**
         * Thumbnail width, if known.
         */
        public int thumbnailWidth;
        /**
         * Thumbnail height, if known.
         */
        public int thumbnailHeight;
        /**
         * The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         */
        public ReplyMarkup replyMarkup;
        /**
         * The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessageInvoice, inputMessageLocation, inputMessageVenue or inputMessageContact.
         */
        public InputMessageContent inputMessageContent;

        /**
         * Represents information about a venue.
         */
        public InputInlineQueryResultVenue() {
        }

        /**
         * Represents information about a venue.
         *
         * @param id Unique identifier of the query result.
         * @param venue Venue result.
         * @param thumbnailUrl URL of the result thumbnail, if it exists.
         * @param thumbnailWidth Thumbnail width, if known.
         * @param thumbnailHeight Thumbnail height, if known.
         * @param replyMarkup The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         * @param inputMessageContent The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessageInvoice, inputMessageLocation, inputMessageVenue or inputMessageContact.
         */
        public InputInlineQueryResultVenue(String id, Venue venue, String thumbnailUrl, int thumbnailWidth, int thumbnailHeight, ReplyMarkup replyMarkup, InputMessageContent inputMessageContent) {
            this.id = id;
            this.venue = venue;
            this.thumbnailUrl = thumbnailUrl;
            this.thumbnailWidth = thumbnailWidth;
            this.thumbnailHeight = thumbnailHeight;
            this.replyMarkup = replyMarkup;
            this.inputMessageContent = inputMessageContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 541704509;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a link to a page containing an embedded video player or a video file.
     */
    public static class InputInlineQueryResultVideo extends InputInlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * Title of the result.
         */
        public String title;
        /**
         * A short description of the result, if known.
         */
        public String description;
        /**
         * The URL of the video thumbnail (JPEG), if it exists.
         */
        public String thumbnailUrl;
        /**
         * URL of the embedded video player or video file.
         */
        public String videoUrl;
        /**
         * MIME type of the content of the video URL, only &quot;text/html&quot; or &quot;video/mp4&quot; are currently supported.
         */
        public String mimeType;
        /**
         * Width of the video.
         */
        public int videoWidth;
        /**
         * Height of the video.
         */
        public int videoHeight;
        /**
         * Video duration, in seconds.
         */
        public int videoDuration;
        /**
         * The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         */
        public ReplyMarkup replyMarkup;
        /**
         * The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessageVideo, inputMessageInvoice, inputMessageLocation, inputMessageVenue or inputMessageContact.
         */
        public InputMessageContent inputMessageContent;

        /**
         * Represents a link to a page containing an embedded video player or a video file.
         */
        public InputInlineQueryResultVideo() {
        }

        /**
         * Represents a link to a page containing an embedded video player or a video file.
         *
         * @param id Unique identifier of the query result.
         * @param title Title of the result.
         * @param description A short description of the result, if known.
         * @param thumbnailUrl The URL of the video thumbnail (JPEG), if it exists.
         * @param videoUrl URL of the embedded video player or video file.
         * @param mimeType MIME type of the content of the video URL, only &quot;text/html&quot; or &quot;video/mp4&quot; are currently supported.
         * @param videoWidth Width of the video.
         * @param videoHeight Height of the video.
         * @param videoDuration Video duration, in seconds.
         * @param replyMarkup The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         * @param inputMessageContent The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessageVideo, inputMessageInvoice, inputMessageLocation, inputMessageVenue or inputMessageContact.
         */
        public InputInlineQueryResultVideo(String id, String title, String description, String thumbnailUrl, String videoUrl, String mimeType, int videoWidth, int videoHeight, int videoDuration, ReplyMarkup replyMarkup, InputMessageContent inputMessageContent) {
            this.id = id;
            this.title = title;
            this.description = description;
            this.thumbnailUrl = thumbnailUrl;
            this.videoUrl = videoUrl;
            this.mimeType = mimeType;
            this.videoWidth = videoWidth;
            this.videoHeight = videoHeight;
            this.videoDuration = videoDuration;
            this.replyMarkup = replyMarkup;
            this.inputMessageContent = inputMessageContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1724073191;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a link to an opus-encoded audio file within an OGG container, single channel audio.
     */
    public static class InputInlineQueryResultVoiceNote extends InputInlineQueryResult {
        /**
         * Unique identifier of the query result.
         */
        public String id;
        /**
         * Title of the voice note.
         */
        public String title;
        /**
         * The URL of the voice note file.
         */
        public String voiceNoteUrl;
        /**
         * Duration of the voice note, in seconds.
         */
        public int voiceNoteDuration;
        /**
         * The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         */
        public ReplyMarkup replyMarkup;
        /**
         * The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessageVoiceNote, inputMessageInvoice, inputMessageLocation, inputMessageVenue or inputMessageContact.
         */
        public InputMessageContent inputMessageContent;

        /**
         * Represents a link to an opus-encoded audio file within an OGG container, single channel audio.
         */
        public InputInlineQueryResultVoiceNote() {
        }

        /**
         * Represents a link to an opus-encoded audio file within an OGG container, single channel audio.
         *
         * @param id Unique identifier of the query result.
         * @param title Title of the voice note.
         * @param voiceNoteUrl The URL of the voice note file.
         * @param voiceNoteDuration Duration of the voice note, in seconds.
         * @param replyMarkup The message reply markup; pass null if none. Must be of type replyMarkupInlineKeyboard or null.
         * @param inputMessageContent The content of the message to be sent. Must be one of the following types: inputMessageText, inputMessageVoiceNote, inputMessageInvoice, inputMessageLocation, inputMessageVenue or inputMessageContact.
         */
        public InputInlineQueryResultVoiceNote(String id, String title, String voiceNoteUrl, int voiceNoteDuration, ReplyMarkup replyMarkup, InputMessageContent inputMessageContent) {
            this.id = id;
            this.title = title;
            this.voiceNoteUrl = voiceNoteUrl;
            this.voiceNoteDuration = voiceNoteDuration;
            this.replyMarkup = replyMarkup;
            this.inputMessageContent = inputMessageContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1790072503;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes an invoice to process.
     */
    public abstract static class InputInvoice extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            InputInvoiceMessage.CONSTRUCTOR,
            InputInvoiceName.CONSTRUCTOR,
            InputInvoiceTelegram.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public InputInvoice() {
        }
    }

    /**
     * An invoice from a message of the type messageInvoice or paid media purchase from messagePaidMedia.
     */
    public static class InputInvoiceMessage extends InputInvoice {
        /**
         * Chat identifier of the message.
         */
        public long chatId;
        /**
         * Message identifier. Use messageProperties.canBePaid to check whether the message can be used in the method.
         */
        public long messageId;

        /**
         * An invoice from a message of the type messageInvoice or paid media purchase from messagePaidMedia.
         */
        public InputInvoiceMessage() {
        }

        /**
         * An invoice from a message of the type messageInvoice or paid media purchase from messagePaidMedia.
         *
         * @param chatId Chat identifier of the message.
         * @param messageId Message identifier. Use messageProperties.canBePaid to check whether the message can be used in the method.
         */
        public InputInvoiceMessage(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1490872848;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An invoice from a link of the type internalLinkTypeInvoice.
     */
    public static class InputInvoiceName extends InputInvoice {
        /**
         * Name of the invoice.
         */
        public String name;

        /**
         * An invoice from a link of the type internalLinkTypeInvoice.
         */
        public InputInvoiceName() {
        }

        /**
         * An invoice from a link of the type internalLinkTypeInvoice.
         *
         * @param name Name of the invoice.
         */
        public InputInvoiceName(String name) {
            this.name = name;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1312155917;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An invoice for a payment toward Telegram; must not be used in the in-store apps.
     */
    public static class InputInvoiceTelegram extends InputInvoice {
        /**
         * Transaction purpose.
         */
        public TelegramPaymentPurpose purpose;

        /**
         * An invoice for a payment toward Telegram; must not be used in the in-store apps.
         */
        public InputInvoiceTelegram() {
        }

        /**
         * An invoice for a payment toward Telegram; must not be used in the in-store apps.
         *
         * @param purpose Transaction purpose.
         */
        public InputInvoiceTelegram(TelegramPaymentPurpose purpose) {
            this.purpose = purpose;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1762853139;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * The content of a message to send.
     */
    public abstract static class InputMessageContent extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            InputMessageText.CONSTRUCTOR,
            InputMessageAnimation.CONSTRUCTOR,
            InputMessageAudio.CONSTRUCTOR,
            InputMessageDocument.CONSTRUCTOR,
            InputMessagePaidMedia.CONSTRUCTOR,
            InputMessagePhoto.CONSTRUCTOR,
            InputMessageSticker.CONSTRUCTOR,
            InputMessageVideo.CONSTRUCTOR,
            InputMessageVideoNote.CONSTRUCTOR,
            InputMessageVoiceNote.CONSTRUCTOR,
            InputMessageLocation.CONSTRUCTOR,
            InputMessageVenue.CONSTRUCTOR,
            InputMessageContact.CONSTRUCTOR,
            InputMessageDice.CONSTRUCTOR,
            InputMessageGame.CONSTRUCTOR,
            InputMessageInvoice.CONSTRUCTOR,
            InputMessagePoll.CONSTRUCTOR,
            InputMessageStakeDice.CONSTRUCTOR,
            InputMessageStory.CONSTRUCTOR,
            InputMessageChecklist.CONSTRUCTOR,
            InputMessageForwarded.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public InputMessageContent() {
        }
    }

    /**
     * A text message.
     */
    public static class InputMessageText extends InputMessageContent {
        /**
         * Formatted text to be sent; 0-getOption(&quot;message_text_length_max&quot;) characters. Only Bold, Italic, Underline, Strikethrough, Spoiler, CustomEmoji, BlockQuote, ExpandableBlockQuote, Code, Pre, PreCode, TextUrl, MentionName, and DateTime entities are allowed to be specified manually.
         */
        public FormattedText text;
        /**
         * Options to be used for generation of a link preview; may be null if none; pass null to use default link preview options.
         */
        @Nullable public LinkPreviewOptions linkPreviewOptions;
        /**
         * True, if the chat message draft must be deleted.
         */
        public boolean clearDraft;

        /**
         * A text message.
         */
        public InputMessageText() {
        }

        /**
         * A text message.
         *
         * @param text Formatted text to be sent; 0-getOption(&quot;message_text_length_max&quot;) characters. Only Bold, Italic, Underline, Strikethrough, Spoiler, CustomEmoji, BlockQuote, ExpandableBlockQuote, Code, Pre, PreCode, TextUrl, MentionName, and DateTime entities are allowed to be specified manually.
         * @param linkPreviewOptions Options to be used for generation of a link preview; may be null if none; pass null to use default link preview options.
         * @param clearDraft True, if the chat message draft must be deleted.
         */
        public InputMessageText(FormattedText text, LinkPreviewOptions linkPreviewOptions, boolean clearDraft) {
            this.text = text;
            this.linkPreviewOptions = linkPreviewOptions;
            this.clearDraft = clearDraft;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -212805484;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An animation message (GIF-style).
     */
    public static class InputMessageAnimation extends InputMessageContent {
        /**
         * Animation file to be sent.
         */
        public InputFile animation;
        /**
         * Animation thumbnail; pass null to skip thumbnail uploading.
         */
        public InputThumbnail thumbnail;
        /**
         * File identifiers of the stickers added to the animation, if applicable.
         */
        public int[] addedStickerFileIds;
        /**
         * Duration of the animation, in seconds.
         */
        public int duration;
        /**
         * Width of the animation; may be replaced by the server.
         */
        public int width;
        /**
         * Height of the animation; may be replaced by the server.
         */
        public int height;
        /**
         * Animation caption; pass null to use an empty caption; 0-getOption(&quot;message_caption_length_max&quot;) characters.
         */
        public FormattedText caption;
        /**
         * True, if the caption must be shown above the animation; otherwise, the caption must be shown below the animation; not supported in secret chats.
         */
        public boolean showCaptionAboveMedia;
        /**
         * True, if the animation preview must be covered by a spoiler animation; not supported in secret chats.
         */
        public boolean hasSpoiler;

        /**
         * An animation message (GIF-style).
         */
        public InputMessageAnimation() {
        }

        /**
         * An animation message (GIF-style).
         *
         * @param animation Animation file to be sent.
         * @param thumbnail Animation thumbnail; pass null to skip thumbnail uploading.
         * @param addedStickerFileIds File identifiers of the stickers added to the animation, if applicable.
         * @param duration Duration of the animation, in seconds.
         * @param width Width of the animation; may be replaced by the server.
         * @param height Height of the animation; may be replaced by the server.
         * @param caption Animation caption; pass null to use an empty caption; 0-getOption(&quot;message_caption_length_max&quot;) characters.
         * @param showCaptionAboveMedia True, if the caption must be shown above the animation; otherwise, the caption must be shown below the animation; not supported in secret chats.
         * @param hasSpoiler True, if the animation preview must be covered by a spoiler animation; not supported in secret chats.
         */
        public InputMessageAnimation(InputFile animation, InputThumbnail thumbnail, int[] addedStickerFileIds, int duration, int width, int height, FormattedText caption, boolean showCaptionAboveMedia, boolean hasSpoiler) {
            this.animation = animation;
            this.thumbnail = thumbnail;
            this.addedStickerFileIds = addedStickerFileIds;
            this.duration = duration;
            this.width = width;
            this.height = height;
            this.caption = caption;
            this.showCaptionAboveMedia = showCaptionAboveMedia;
            this.hasSpoiler = hasSpoiler;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -210404059;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An audio message.
     */
    public static class InputMessageAudio extends InputMessageContent {
        /**
         * Audio file to be sent.
         */
        public InputFile audio;
        /**
         * Thumbnail of the cover for the album; pass null to skip thumbnail uploading.
         */
        public InputThumbnail albumCoverThumbnail;
        /**
         * Duration of the audio, in seconds; may be replaced by the server.
         */
        public int duration;
        /**
         * Title of the audio; 0-64 characters; may be replaced by the server.
         */
        public String title;
        /**
         * Performer of the audio; 0-64 characters, may be replaced by the server.
         */
        public String performer;
        /**
         * Audio caption; pass null to use an empty caption; 0-getOption(&quot;message_caption_length_max&quot;) characters.
         */
        public FormattedText caption;

        /**
         * An audio message.
         */
        public InputMessageAudio() {
        }

        /**
         * An audio message.
         *
         * @param audio Audio file to be sent.
         * @param albumCoverThumbnail Thumbnail of the cover for the album; pass null to skip thumbnail uploading.
         * @param duration Duration of the audio, in seconds; may be replaced by the server.
         * @param title Title of the audio; 0-64 characters; may be replaced by the server.
         * @param performer Performer of the audio; 0-64 characters, may be replaced by the server.
         * @param caption Audio caption; pass null to use an empty caption; 0-getOption(&quot;message_caption_length_max&quot;) characters.
         */
        public InputMessageAudio(InputFile audio, InputThumbnail albumCoverThumbnail, int duration, String title, String performer, FormattedText caption) {
            this.audio = audio;
            this.albumCoverThumbnail = albumCoverThumbnail;
            this.duration = duration;
            this.title = title;
            this.performer = performer;
            this.caption = caption;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -626786126;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A document message (general file).
     */
    public static class InputMessageDocument extends InputMessageContent {
        /**
         * Document to be sent.
         */
        public InputFile document;
        /**
         * Document thumbnail; pass null to skip thumbnail uploading.
         */
        public InputThumbnail thumbnail;
        /**
         * Pass true to disable automatic file type detection and send the document as a file. Always true for files sent to secret chats.
         */
        public boolean disableContentTypeDetection;
        /**
         * Document caption; pass null to use an empty caption; 0-getOption(&quot;message_caption_length_max&quot;) characters.
         */
        public FormattedText caption;

        /**
         * A document message (general file).
         */
        public InputMessageDocument() {
        }

        /**
         * A document message (general file).
         *
         * @param document Document to be sent.
         * @param thumbnail Document thumbnail; pass null to skip thumbnail uploading.
         * @param disableContentTypeDetection Pass true to disable automatic file type detection and send the document as a file. Always true for files sent to secret chats.
         * @param caption Document caption; pass null to use an empty caption; 0-getOption(&quot;message_caption_length_max&quot;) characters.
         */
        public InputMessageDocument(InputFile document, InputThumbnail thumbnail, boolean disableContentTypeDetection, FormattedText caption) {
            this.document = document;
            this.thumbnail = thumbnail;
            this.disableContentTypeDetection = disableContentTypeDetection;
            this.caption = caption;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1633383097;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with paid media; can be used only in channel chats with supergroupFullInfo.hasPaidMediaAllowed.
     */
    public static class InputMessagePaidMedia extends InputMessageContent {
        /**
         * The number of Telegram Stars that must be paid to see the media; 1-getOption(&quot;paid_media_message_star_count_max&quot;).
         */
        public long starCount;
        /**
         * The content of the paid media.
         */
        public InputPaidMedia[] paidMedia;
        /**
         * Message caption; pass null to use an empty caption; 0-getOption(&quot;message_caption_length_max&quot;) characters.
         */
        public FormattedText caption;
        /**
         * True, if the caption must be shown above the media; otherwise, the caption must be shown below the media; not supported in secret chats.
         */
        public boolean showCaptionAboveMedia;
        /**
         * Bot-provided data for the paid media; bots only.
         */
        public String payload;

        /**
         * A message with paid media; can be used only in channel chats with supergroupFullInfo.hasPaidMediaAllowed.
         */
        public InputMessagePaidMedia() {
        }

        /**
         * A message with paid media; can be used only in channel chats with supergroupFullInfo.hasPaidMediaAllowed.
         *
         * @param starCount The number of Telegram Stars that must be paid to see the media; 1-getOption(&quot;paid_media_message_star_count_max&quot;).
         * @param paidMedia The content of the paid media.
         * @param caption Message caption; pass null to use an empty caption; 0-getOption(&quot;message_caption_length_max&quot;) characters.
         * @param showCaptionAboveMedia True, if the caption must be shown above the media; otherwise, the caption must be shown below the media; not supported in secret chats.
         * @param payload Bot-provided data for the paid media; bots only.
         */
        public InputMessagePaidMedia(long starCount, InputPaidMedia[] paidMedia, FormattedText caption, boolean showCaptionAboveMedia, String payload) {
            this.starCount = starCount;
            this.paidMedia = paidMedia;
            this.caption = caption;
            this.showCaptionAboveMedia = showCaptionAboveMedia;
            this.payload = payload;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1274819374;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A photo message.
     */
    public static class InputMessagePhoto extends InputMessageContent {
        /**
         * Photo to send. The photo must be at most 10 MB in size. The photo's width and height must not exceed 10000 in total. Width and height ratio must be at most 20.
         */
        public InputFile photo;
        /**
         * Photo thumbnail to be sent; pass null to skip thumbnail uploading. The thumbnail is sent to the other party only in secret chats.
         */
        public InputThumbnail thumbnail;
        /**
         * Video of the live photo; not supported in secret chats; pass null if the photo isn't a live photo.
         */
        public InputFile video;
        /**
         * File identifiers of the stickers added to the photo, if applicable.
         */
        public int[] addedStickerFileIds;
        /**
         * Photo width.
         */
        public int width;
        /**
         * Photo height.
         */
        public int height;
        /**
         * Photo caption; pass null to use an empty caption; 0-getOption(&quot;message_caption_length_max&quot;) characters.
         */
        public FormattedText caption;
        /**
         * True, if the caption must be shown above the photo; otherwise, the caption must be shown below the photo; not supported in secret chats.
         */
        public boolean showCaptionAboveMedia;
        /**
         * Photo self-destruct type; pass null if none; private chats only.
         */
        public MessageSelfDestructType selfDestructType;
        /**
         * True, if the photo preview must be covered by a spoiler animation; not supported in secret chats.
         */
        public boolean hasSpoiler;

        /**
         * A photo message.
         */
        public InputMessagePhoto() {
        }

        /**
         * A photo message.
         *
         * @param photo Photo to send. The photo must be at most 10 MB in size. The photo's width and height must not exceed 10000 in total. Width and height ratio must be at most 20.
         * @param thumbnail Photo thumbnail to be sent; pass null to skip thumbnail uploading. The thumbnail is sent to the other party only in secret chats.
         * @param video Video of the live photo; not supported in secret chats; pass null if the photo isn't a live photo.
         * @param addedStickerFileIds File identifiers of the stickers added to the photo, if applicable.
         * @param width Photo width.
         * @param height Photo height.
         * @param caption Photo caption; pass null to use an empty caption; 0-getOption(&quot;message_caption_length_max&quot;) characters.
         * @param showCaptionAboveMedia True, if the caption must be shown above the photo; otherwise, the caption must be shown below the photo; not supported in secret chats.
         * @param selfDestructType Photo self-destruct type; pass null if none; private chats only.
         * @param hasSpoiler True, if the photo preview must be covered by a spoiler animation; not supported in secret chats.
         */
        public InputMessagePhoto(InputFile photo, InputThumbnail thumbnail, InputFile video, int[] addedStickerFileIds, int width, int height, FormattedText caption, boolean showCaptionAboveMedia, MessageSelfDestructType selfDestructType, boolean hasSpoiler) {
            this.photo = photo;
            this.thumbnail = thumbnail;
            this.video = video;
            this.addedStickerFileIds = addedStickerFileIds;
            this.width = width;
            this.height = height;
            this.caption = caption;
            this.showCaptionAboveMedia = showCaptionAboveMedia;
            this.selfDestructType = selfDestructType;
            this.hasSpoiler = hasSpoiler;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 163591772;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A sticker message.
     */
    public static class InputMessageSticker extends InputMessageContent {
        /**
         * Sticker to be sent.
         */
        public InputFile sticker;
        /**
         * Sticker thumbnail; pass null to skip thumbnail uploading.
         */
        public InputThumbnail thumbnail;
        /**
         * Sticker width.
         */
        public int width;
        /**
         * Sticker height.
         */
        public int height;
        /**
         * Emoji used to choose the sticker.
         */
        public String emoji;

        /**
         * A sticker message.
         */
        public InputMessageSticker() {
        }

        /**
         * A sticker message.
         *
         * @param sticker Sticker to be sent.
         * @param thumbnail Sticker thumbnail; pass null to skip thumbnail uploading.
         * @param width Sticker width.
         * @param height Sticker height.
         * @param emoji Emoji used to choose the sticker.
         */
        public InputMessageSticker(InputFile sticker, InputThumbnail thumbnail, int width, int height, String emoji) {
            this.sticker = sticker;
            this.thumbnail = thumbnail;
            this.width = width;
            this.height = height;
            this.emoji = emoji;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1072805625;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A video message.
     */
    public static class InputMessageVideo extends InputMessageContent {
        /**
         * Video to be sent. The video is expected to be re-encoded to MPEG4 format with H.264 codec by the sender.
         */
        public InputFile video;
        /**
         * Video thumbnail; pass null to skip thumbnail uploading.
         */
        public InputThumbnail thumbnail;
        /**
         * Cover of the video; pass null to skip cover uploading; not supported in secret chats and for self-destructing messages.
         */
        public InputFile cover;
        /**
         * Timestamp from which the video playing must start, in seconds.
         */
        public int startTimestamp;
        /**
         * File identifiers of the stickers added to the video, if applicable.
         */
        public int[] addedStickerFileIds;
        /**
         * Duration of the video, in seconds.
         */
        public int duration;
        /**
         * Video width.
         */
        public int width;
        /**
         * Video height.
         */
        public int height;
        /**
         * True, if the video is expected to be streamed.
         */
        public boolean supportsStreaming;
        /**
         * Video caption; pass null to use an empty caption; 0-getOption(&quot;message_caption_length_max&quot;) characters.
         */
        public FormattedText caption;
        /**
         * True, if the caption must be shown above the video; otherwise, the caption must be shown below the video; not supported in secret chats.
         */
        public boolean showCaptionAboveMedia;
        /**
         * Video self-destruct type; pass null if none; private chats only.
         */
        public MessageSelfDestructType selfDestructType;
        /**
         * True, if the video preview must be covered by a spoiler animation; not supported in secret chats.
         */
        public boolean hasSpoiler;

        /**
         * A video message.
         */
        public InputMessageVideo() {
        }

        /**
         * A video message.
         *
         * @param video Video to be sent. The video is expected to be re-encoded to MPEG4 format with H.264 codec by the sender.
         * @param thumbnail Video thumbnail; pass null to skip thumbnail uploading.
         * @param cover Cover of the video; pass null to skip cover uploading; not supported in secret chats and for self-destructing messages.
         * @param startTimestamp Timestamp from which the video playing must start, in seconds.
         * @param addedStickerFileIds File identifiers of the stickers added to the video, if applicable.
         * @param duration Duration of the video, in seconds.
         * @param width Video width.
         * @param height Video height.
         * @param supportsStreaming True, if the video is expected to be streamed.
         * @param caption Video caption; pass null to use an empty caption; 0-getOption(&quot;message_caption_length_max&quot;) characters.
         * @param showCaptionAboveMedia True, if the caption must be shown above the video; otherwise, the caption must be shown below the video; not supported in secret chats.
         * @param selfDestructType Video self-destruct type; pass null if none; private chats only.
         * @param hasSpoiler True, if the video preview must be covered by a spoiler animation; not supported in secret chats.
         */
        public InputMessageVideo(InputFile video, InputThumbnail thumbnail, InputFile cover, int startTimestamp, int[] addedStickerFileIds, int duration, int width, int height, boolean supportsStreaming, FormattedText caption, boolean showCaptionAboveMedia, MessageSelfDestructType selfDestructType, boolean hasSpoiler) {
            this.video = video;
            this.thumbnail = thumbnail;
            this.cover = cover;
            this.startTimestamp = startTimestamp;
            this.addedStickerFileIds = addedStickerFileIds;
            this.duration = duration;
            this.width = width;
            this.height = height;
            this.supportsStreaming = supportsStreaming;
            this.caption = caption;
            this.showCaptionAboveMedia = showCaptionAboveMedia;
            this.selfDestructType = selfDestructType;
            this.hasSpoiler = hasSpoiler;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -605958271;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A video note message.
     */
    public static class InputMessageVideoNote extends InputMessageContent {
        /**
         * Video note to be sent. The video is expected to be encoded to MPEG4 format with H.264 codec and have no data outside of the visible circle.
         */
        public InputFile videoNote;
        /**
         * Video thumbnail; may be null if empty; pass null to skip thumbnail uploading.
         */
        @Nullable public InputThumbnail thumbnail;
        /**
         * Duration of the video, in seconds; 0-60.
         */
        public int duration;
        /**
         * Video width and height; must be positive and not greater than 640.
         */
        public int length;
        /**
         * Video note self-destruct type; may be null if none; pass null if none; private chats only.
         */
        @Nullable public MessageSelfDestructType selfDestructType;

        /**
         * A video note message.
         */
        public InputMessageVideoNote() {
        }

        /**
         * A video note message.
         *
         * @param videoNote Video note to be sent. The video is expected to be encoded to MPEG4 format with H.264 codec and have no data outside of the visible circle.
         * @param thumbnail Video thumbnail; may be null if empty; pass null to skip thumbnail uploading.
         * @param duration Duration of the video, in seconds; 0-60.
         * @param length Video width and height; must be positive and not greater than 640.
         * @param selfDestructType Video note self-destruct type; may be null if none; pass null if none; private chats only.
         */
        public InputMessageVideoNote(InputFile videoNote, InputThumbnail thumbnail, int duration, int length, MessageSelfDestructType selfDestructType) {
            this.videoNote = videoNote;
            this.thumbnail = thumbnail;
            this.duration = duration;
            this.length = length;
            this.selfDestructType = selfDestructType;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -714598691;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A voice note message.
     */
    public static class InputMessageVoiceNote extends InputMessageContent {
        /**
         * Voice note to be sent. The voice note must be encoded with the Opus codec and stored inside an OGG container with a single audio channel, or be in MP3 or M4A format as regular audio.
         */
        public InputFile voiceNote;
        /**
         * Duration of the voice note, in seconds.
         */
        public int duration;
        /**
         * Waveform representation of the voice note in 5-bit format.
         */
        public byte[] waveform;
        /**
         * Voice note caption; may be null if empty; pass null to use an empty caption; 0-getOption(&quot;message_caption_length_max&quot;) characters.
         */
        @Nullable public FormattedText caption;
        /**
         * Voice note self-destruct type; may be null if none; pass null if none; private chats only.
         */
        @Nullable public MessageSelfDestructType selfDestructType;

        /**
         * A voice note message.
         */
        public InputMessageVoiceNote() {
        }

        /**
         * A voice note message.
         *
         * @param voiceNote Voice note to be sent. The voice note must be encoded with the Opus codec and stored inside an OGG container with a single audio channel, or be in MP3 or M4A format as regular audio.
         * @param duration Duration of the voice note, in seconds.
         * @param waveform Waveform representation of the voice note in 5-bit format.
         * @param caption Voice note caption; may be null if empty; pass null to use an empty caption; 0-getOption(&quot;message_caption_length_max&quot;) characters.
         * @param selfDestructType Voice note self-destruct type; may be null if none; pass null if none; private chats only.
         */
        public InputMessageVoiceNote(InputFile voiceNote, int duration, byte[] waveform, FormattedText caption, MessageSelfDestructType selfDestructType) {
            this.voiceNote = voiceNote;
            this.duration = duration;
            this.waveform = waveform;
            this.caption = caption;
            this.selfDestructType = selfDestructType;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1461977004;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with a location.
     */
    public static class InputMessageLocation extends InputMessageContent {
        /**
         * Location to be sent.
         */
        public Location location;
        /**
         * Period for which the location can be updated, in seconds; must be between 60 and 86400 for a temporary live location, 0x7FFFFFFF for permanent live location, and 0 otherwise.
         */
        public int livePeriod;
        /**
         * For live locations, a direction in which the location moves, in degrees; 1-360. Pass 0 if unknown.
         */
        public int heading;
        /**
         * For live locations, a maximum distance to another chat member for proximity alerts, in meters (0-100000). Pass 0 if the notification is disabled. Can't be enabled in channels and Saved Messages.
         */
        public int proximityAlertRadius;

        /**
         * A message with a location.
         */
        public InputMessageLocation() {
        }

        /**
         * A message with a location.
         *
         * @param location Location to be sent.
         * @param livePeriod Period for which the location can be updated, in seconds; must be between 60 and 86400 for a temporary live location, 0x7FFFFFFF for permanent live location, and 0 otherwise.
         * @param heading For live locations, a direction in which the location moves, in degrees; 1-360. Pass 0 if unknown.
         * @param proximityAlertRadius For live locations, a maximum distance to another chat member for proximity alerts, in meters (0-100000). Pass 0 if the notification is disabled. Can't be enabled in channels and Saved Messages.
         */
        public InputMessageLocation(Location location, int livePeriod, int heading, int proximityAlertRadius) {
            this.location = location;
            this.livePeriod = livePeriod;
            this.heading = heading;
            this.proximityAlertRadius = proximityAlertRadius;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 648735088;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with information about a venue.
     */
    public static class InputMessageVenue extends InputMessageContent {
        /**
         * Venue to send.
         */
        public Venue venue;

        /**
         * A message with information about a venue.
         */
        public InputMessageVenue() {
        }

        /**
         * A message with information about a venue.
         *
         * @param venue Venue to send.
         */
        public InputMessageVenue(Venue venue) {
            this.venue = venue;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1447926269;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message containing a user contact.
     */
    public static class InputMessageContact extends InputMessageContent {
        /**
         * Contact to send.
         */
        public Contact contact;

        /**
         * A message containing a user contact.
         */
        public InputMessageContact() {
        }

        /**
         * A message containing a user contact.
         *
         * @param contact Contact to send.
         */
        public InputMessageContact(Contact contact) {
            this.contact = contact;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -982446849;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A dice message.
     */
    public static class InputMessageDice extends InputMessageContent {
        /**
         * Emoji on which the dice throw animation is based.
         */
        public String emoji;
        /**
         * True, if the chat message draft must be deleted.
         */
        public boolean clearDraft;

        /**
         * A dice message.
         */
        public InputMessageDice() {
        }

        /**
         * A dice message.
         *
         * @param emoji Emoji on which the dice throw animation is based.
         * @param clearDraft True, if the chat message draft must be deleted.
         */
        public InputMessageDice(String emoji, boolean clearDraft) {
            this.emoji = emoji;
            this.clearDraft = clearDraft;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 841574313;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with a game; not supported for channels or secret chats.
     */
    public static class InputMessageGame extends InputMessageContent {
        /**
         * User identifier of the bot that owns the game.
         */
        public long botUserId;
        /**
         * Short name of the game.
         */
        public String gameShortName;

        /**
         * A message with a game; not supported for channels or secret chats.
         */
        public InputMessageGame() {
        }

        /**
         * A message with a game; not supported for channels or secret chats.
         *
         * @param botUserId User identifier of the bot that owns the game.
         * @param gameShortName Short name of the game.
         */
        public InputMessageGame(long botUserId, String gameShortName) {
            this.botUserId = botUserId;
            this.gameShortName = gameShortName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1252944610;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with an invoice; can be used only by bots.
     */
    public static class InputMessageInvoice extends InputMessageContent {
        /**
         * Invoice.
         */
        public Invoice invoice;
        /**
         * Product title; 1-32 characters.
         */
        public String title;
        /**
         * Product description; 0-255 characters.
         */
        public String description;
        /**
         * Product photo URL; optional.
         */
        public String photoUrl;
        /**
         * Product photo size.
         */
        public int photoSize;
        /**
         * Product photo width.
         */
        public int photoWidth;
        /**
         * Product photo height.
         */
        public int photoHeight;
        /**
         * The invoice payload.
         */
        public byte[] payload;
        /**
         * Payment provider token; may be empty for payments in Telegram Stars.
         */
        public String providerToken;
        /**
         * JSON-encoded data about the invoice, which will be shared with the payment provider.
         */
        public String providerData;
        /**
         * Unique invoice bot deep link parameter for the generation of this invoice. If empty, it would be possible to pay directly from forwards of the invoice message.
         */
        public String startParameter;
        /**
         * The content of paid media attached to the invoice; pass null if none.
         */
        public InputPaidMedia paidMedia;
        /**
         * Paid media caption; pass null to use an empty caption; 0-getOption(&quot;message_caption_length_max&quot;) characters.
         */
        public FormattedText paidMediaCaption;

        /**
         * A message with an invoice; can be used only by bots.
         */
        public InputMessageInvoice() {
        }

        /**
         * A message with an invoice; can be used only by bots.
         *
         * @param invoice Invoice.
         * @param title Product title; 1-32 characters.
         * @param description Product description; 0-255 characters.
         * @param photoUrl Product photo URL; optional.
         * @param photoSize Product photo size.
         * @param photoWidth Product photo width.
         * @param photoHeight Product photo height.
         * @param payload The invoice payload.
         * @param providerToken Payment provider token; may be empty for payments in Telegram Stars.
         * @param providerData JSON-encoded data about the invoice, which will be shared with the payment provider.
         * @param startParameter Unique invoice bot deep link parameter for the generation of this invoice. If empty, it would be possible to pay directly from forwards of the invoice message.
         * @param paidMedia The content of paid media attached to the invoice; pass null if none.
         * @param paidMediaCaption Paid media caption; pass null to use an empty caption; 0-getOption(&quot;message_caption_length_max&quot;) characters.
         */
        public InputMessageInvoice(Invoice invoice, String title, String description, String photoUrl, int photoSize, int photoWidth, int photoHeight, byte[] payload, String providerToken, String providerData, String startParameter, InputPaidMedia paidMedia, FormattedText paidMediaCaption) {
            this.invoice = invoice;
            this.title = title;
            this.description = description;
            this.photoUrl = photoUrl;
            this.photoSize = photoSize;
            this.photoWidth = photoWidth;
            this.photoHeight = photoHeight;
            this.payload = payload;
            this.providerToken = providerToken;
            this.providerData = providerData;
            this.startParameter = startParameter;
            this.paidMedia = paidMedia;
            this.paidMediaCaption = paidMediaCaption;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1162047631;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with a poll. Polls can't be sent to secret chats and channel direct messages chats. Polls can be sent to a private chat only if the chat is a chat with a bot or the Saved Messages chat.
     */
    public static class InputMessagePoll extends InputMessageContent {
        /**
         * Poll question; 1-255 characters (up to 300 characters for bots). Only custom emoji entities are allowed to be added and only by Premium users.
         */
        public FormattedText question;
        /**
         * List of poll answer options; 1-getOption(&quot;poll_answer_count_max&quot;) options.
         */
        public InputPollOption[] options;
        /**
         * Poll description; pass null to use an empty description; 0-getOption(&quot;message_caption_length_max&quot;) characters.
         */
        public FormattedText description;
        /**
         * Media attached to the poll; pass null if none. Must be one of the following types: inputMessageAnimation, inputMessageAudio, inputMessageDocument, non-live inputMessageLocation, inputMessagePhoto, inputMessageVenue, or inputMessageVideo without caption.
         */
        public InputMessageContent media;
        /**
         * True, if the poll voters are anonymous. Non-anonymous polls can't be sent or forwarded to channels.
         */
        public boolean isAnonymous;
        /**
         * True, if multiple answer options can be chosen simultaneously.
         */
        public boolean allowsMultipleAnswers;
        /**
         * True, if the poll can be answered multiple times.
         */
        public boolean allowsRevoting;
        /**
         * True, if only the users that are members of the chat for more than a day will be able to vote; for channel chats only.
         */
        public boolean membersOnly;
        /**
         * The list of two-letter ISO 3166-1 alpha-2 codes of countries, users from which will be able to vote; for channel chats only. If empty, then all users can participate in the poll. There can be up to getOption(&quot;poll_country_count_max&quot;) chosen countries.
         */
        public String[] countryCodes;
        /**
         * True, if poll options must be shown in a fixed random order.
         */
        public boolean shuffleOptions;
        /**
         * True, if the poll results will appear only after the poll closes.
         */
        public boolean hideResultsUntilCloses;
        /**
         * Type of the poll.
         */
        public InputPollType type;
        /**
         * Amount of time the poll will be active after creation, in seconds; 0-getOption(&quot;poll_open_period_max&quot;); pass 0 if not specified.
         */
        public int openPeriod;
        /**
         * Point in time (Unix timestamp) when the poll will automatically be closed; must be 0-getOption(&quot;poll_open_period_max&quot;) seconds in the future; pass 0 if not specified.
         */
        public int closeDate;
        /**
         * True, if the poll needs to be sent already closed; for bots only.
         */
        public boolean isClosed;

        /**
         * A message with a poll. Polls can't be sent to secret chats and channel direct messages chats. Polls can be sent to a private chat only if the chat is a chat with a bot or the Saved Messages chat.
         */
        public InputMessagePoll() {
        }

        /**
         * A message with a poll. Polls can't be sent to secret chats and channel direct messages chats. Polls can be sent to a private chat only if the chat is a chat with a bot or the Saved Messages chat.
         *
         * @param question Poll question; 1-255 characters (up to 300 characters for bots). Only custom emoji entities are allowed to be added and only by Premium users.
         * @param options List of poll answer options; 1-getOption(&quot;poll_answer_count_max&quot;) options.
         * @param description Poll description; pass null to use an empty description; 0-getOption(&quot;message_caption_length_max&quot;) characters.
         * @param media Media attached to the poll; pass null if none. Must be one of the following types: inputMessageAnimation, inputMessageAudio, inputMessageDocument, non-live inputMessageLocation, inputMessagePhoto, inputMessageVenue, or inputMessageVideo without caption.
         * @param isAnonymous True, if the poll voters are anonymous. Non-anonymous polls can't be sent or forwarded to channels.
         * @param allowsMultipleAnswers True, if multiple answer options can be chosen simultaneously.
         * @param allowsRevoting True, if the poll can be answered multiple times.
         * @param membersOnly True, if only the users that are members of the chat for more than a day will be able to vote; for channel chats only.
         * @param countryCodes The list of two-letter ISO 3166-1 alpha-2 codes of countries, users from which will be able to vote; for channel chats only. If empty, then all users can participate in the poll. There can be up to getOption(&quot;poll_country_count_max&quot;) chosen countries.
         * @param shuffleOptions True, if poll options must be shown in a fixed random order.
         * @param hideResultsUntilCloses True, if the poll results will appear only after the poll closes.
         * @param type Type of the poll.
         * @param openPeriod Amount of time the poll will be active after creation, in seconds; 0-getOption(&quot;poll_open_period_max&quot;); pass 0 if not specified.
         * @param closeDate Point in time (Unix timestamp) when the poll will automatically be closed; must be 0-getOption(&quot;poll_open_period_max&quot;) seconds in the future; pass 0 if not specified.
         * @param isClosed True, if the poll needs to be sent already closed; for bots only.
         */
        public InputMessagePoll(FormattedText question, InputPollOption[] options, FormattedText description, InputMessageContent media, boolean isAnonymous, boolean allowsMultipleAnswers, boolean allowsRevoting, boolean membersOnly, String[] countryCodes, boolean shuffleOptions, boolean hideResultsUntilCloses, InputPollType type, int openPeriod, int closeDate, boolean isClosed) {
            this.question = question;
            this.options = options;
            this.description = description;
            this.media = media;
            this.isAnonymous = isAnonymous;
            this.allowsMultipleAnswers = allowsMultipleAnswers;
            this.allowsRevoting = allowsRevoting;
            this.membersOnly = membersOnly;
            this.countryCodes = countryCodes;
            this.shuffleOptions = shuffleOptions;
            this.hideResultsUntilCloses = hideResultsUntilCloses;
            this.type = type;
            this.openPeriod = openPeriod;
            this.closeDate = closeDate;
            this.isClosed = isClosed;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -808965345;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A stake dice message.
     */
    public static class InputMessageStakeDice extends InputMessageContent {
        /**
         * Hash of the stake dice state. The state hash can be used only if it was received recently enough. Otherwise, a new state must be requested using getStakeDiceState.
         */
        public String stateHash;
        /**
         * The Toncoin amount that will be staked; in the smallest units of the currency. Must be in the range getOption(&quot;stake_dice_stake_amount_min&quot;)-getOption(&quot;stake_dice_stake_amount_max&quot;).
         */
        public long stakeToncoinAmount;
        /**
         * True, if the chat message draft must be deleted.
         */
        public boolean clearDraft;

        /**
         * A stake dice message.
         */
        public InputMessageStakeDice() {
        }

        /**
         * A stake dice message.
         *
         * @param stateHash Hash of the stake dice state. The state hash can be used only if it was received recently enough. Otherwise, a new state must be requested using getStakeDiceState.
         * @param stakeToncoinAmount The Toncoin amount that will be staked; in the smallest units of the currency. Must be in the range getOption(&quot;stake_dice_stake_amount_min&quot;)-getOption(&quot;stake_dice_stake_amount_max&quot;).
         * @param clearDraft True, if the chat message draft must be deleted.
         */
        public InputMessageStakeDice(String stateHash, long stakeToncoinAmount, boolean clearDraft) {
            this.stateHash = stateHash;
            this.stakeToncoinAmount = stakeToncoinAmount;
            this.clearDraft = clearDraft;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1946603673;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with a forwarded story. Stories can't be forwarded to secret chats. A story can be forwarded only if story.canBeForwarded.
     */
    public static class InputMessageStory extends InputMessageContent {
        /**
         * Identifier of the chat that posted the story.
         */
        public long storyPosterChatId;
        /**
         * Story identifier.
         */
        public int storyId;

        /**
         * A message with a forwarded story. Stories can't be forwarded to secret chats. A story can be forwarded only if story.canBeForwarded.
         */
        public InputMessageStory() {
        }

        /**
         * A message with a forwarded story. Stories can't be forwarded to secret chats. A story can be forwarded only if story.canBeForwarded.
         *
         * @param storyPosterChatId Identifier of the chat that posted the story.
         * @param storyId Story identifier.
         */
        public InputMessageStory(long storyPosterChatId, int storyId) {
            this.storyPosterChatId = storyPosterChatId;
            this.storyId = storyId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -370732053;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with a checklist. Checklists can't be sent to secret chats, channel chats and channel direct messages chats; for Telegram Premium users only.
     */
    public static class InputMessageChecklist extends InputMessageContent {
        /**
         * The checklist to send.
         */
        public InputChecklist checklist;

        /**
         * A message with a checklist. Checklists can't be sent to secret chats, channel chats and channel direct messages chats; for Telegram Premium users only.
         */
        public InputMessageChecklist() {
        }

        /**
         * A message with a checklist. Checklists can't be sent to secret chats, channel chats and channel direct messages chats; for Telegram Premium users only.
         *
         * @param checklist The checklist to send.
         */
        public InputMessageChecklist(InputChecklist checklist) {
            this.checklist = checklist;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1722965261;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A forwarded message.
     */
    public static class InputMessageForwarded extends InputMessageContent {
        /**
         * Identifier for the chat this forwarded message came from.
         */
        public long fromChatId;
        /**
         * Identifier of the message to forward. A message can be forwarded only if messageProperties.canBeForwarded.
         */
        public long messageId;
        /**
         * Pass true if a game message is being shared from a launched game; applies only to game messages.
         */
        public boolean inGameShare;
        /**
         * Pass true to replace video start timestamp in the forwarded message.
         */
        public boolean replaceVideoStartTimestamp;
        /**
         * The new video start timestamp; ignored if replaceVideoStartTimestamp == false.
         */
        public int newVideoStartTimestamp;
        /**
         * Options to be used to copy content of the message without reference to the original sender; pass null to forward the message as usual.
         */
        public MessageCopyOptions copyOptions;

        /**
         * A forwarded message.
         */
        public InputMessageForwarded() {
        }

        /**
         * A forwarded message.
         *
         * @param fromChatId Identifier for the chat this forwarded message came from.
         * @param messageId Identifier of the message to forward. A message can be forwarded only if messageProperties.canBeForwarded.
         * @param inGameShare Pass true if a game message is being shared from a launched game; applies only to game messages.
         * @param replaceVideoStartTimestamp Pass true to replace video start timestamp in the forwarded message.
         * @param newVideoStartTimestamp The new video start timestamp; ignored if replaceVideoStartTimestamp == false.
         * @param copyOptions Options to be used to copy content of the message without reference to the original sender; pass null to forward the message as usual.
         */
        public InputMessageForwarded(long fromChatId, long messageId, boolean inGameShare, boolean replaceVideoStartTimestamp, int newVideoStartTimestamp, MessageCopyOptions copyOptions) {
            this.fromChatId = fromChatId;
            this.messageId = messageId;
            this.inGameShare = inGameShare;
            this.replaceVideoStartTimestamp = replaceVideoStartTimestamp;
            this.newVideoStartTimestamp = newVideoStartTimestamp;
            this.copyOptions = copyOptions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1076506316;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains information about the message or the story to be replied.
     */
    public abstract static class InputMessageReplyTo extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            InputMessageReplyToMessage.CONSTRUCTOR,
            InputMessageReplyToExternalMessage.CONSTRUCTOR,
            InputMessageReplyToStory.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public InputMessageReplyTo() {
        }
    }

    /**
     * Describes a message to be replied in the same chat and forum topic.
     */
    public static class InputMessageReplyToMessage extends InputMessageReplyTo {
        /**
         * The identifier of the message to be replied in the same chat and forum topic. A message can be replied in the same chat and forum topic only if messageProperties.canBeReplied.
         */
        public long messageId;
        /**
         * Quote from the message to be replied; pass null if none. Must always be null for replies in secret chats.
         */
        public InputTextQuote quote;
        /**
         * Identifier of the checklist task in the message to be replied; pass 0 to reply to the whole message.
         */
        public int checklistTaskId;
        /**
         * Identifier of the poll option in the message to be replied; pass an empty string if none.
         */
        public String pollOptionId;

        /**
         * Describes a message to be replied in the same chat and forum topic.
         */
        public InputMessageReplyToMessage() {
        }

        /**
         * Describes a message to be replied in the same chat and forum topic.
         *
         * @param messageId The identifier of the message to be replied in the same chat and forum topic. A message can be replied in the same chat and forum topic only if messageProperties.canBeReplied.
         * @param quote Quote from the message to be replied; pass null if none. Must always be null for replies in secret chats.
         * @param checklistTaskId Identifier of the checklist task in the message to be replied; pass 0 to reply to the whole message.
         * @param pollOptionId Identifier of the poll option in the message to be replied; pass an empty string if none.
         */
        public InputMessageReplyToMessage(long messageId, InputTextQuote quote, int checklistTaskId, String pollOptionId) {
            this.messageId = messageId;
            this.quote = quote;
            this.checklistTaskId = checklistTaskId;
            this.pollOptionId = pollOptionId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1117785378;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a message to be replied that is from a different chat or a forum topic; not supported in secret chats.
     */
    public static class InputMessageReplyToExternalMessage extends InputMessageReplyTo {
        /**
         * The identifier of the chat to which the message to be replied belongs.
         */
        public long chatId;
        /**
         * The identifier of the message to be replied in the specified chat. A message can be replied in another chat or forum topic only if messageProperties.canBeRepliedInAnotherChat.
         */
        public long messageId;
        /**
         * Quote from the message to be replied; pass null if none.
         */
        public InputTextQuote quote;
        /**
         * Identifier of the checklist task in the message to be replied; pass 0 to reply to the whole message.
         */
        public int checklistTaskId;
        /**
         * Identifier of the poll option in the message to be replied; pass an empty string if none.
         */
        public String pollOptionId;

        /**
         * Describes a message to be replied that is from a different chat or a forum topic; not supported in secret chats.
         */
        public InputMessageReplyToExternalMessage() {
        }

        /**
         * Describes a message to be replied that is from a different chat or a forum topic; not supported in secret chats.
         *
         * @param chatId The identifier of the chat to which the message to be replied belongs.
         * @param messageId The identifier of the message to be replied in the specified chat. A message can be replied in another chat or forum topic only if messageProperties.canBeRepliedInAnotherChat.
         * @param quote Quote from the message to be replied; pass null if none.
         * @param checklistTaskId Identifier of the checklist task in the message to be replied; pass 0 to reply to the whole message.
         * @param pollOptionId Identifier of the poll option in the message to be replied; pass an empty string if none.
         */
        public InputMessageReplyToExternalMessage(long chatId, long messageId, InputTextQuote quote, int checklistTaskId, String pollOptionId) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.quote = quote;
            this.checklistTaskId = checklistTaskId;
            this.pollOptionId = pollOptionId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1956732638;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a story to be replied.
     */
    public static class InputMessageReplyToStory extends InputMessageReplyTo {
        /**
         * The identifier of the poster of the story. Currently, stories can be replied only in the chat that posted the story; channel stories can't be replied.
         */
        public long storyPosterChatId;
        /**
         * The identifier of the story.
         */
        public int storyId;

        /**
         * Describes a story to be replied.
         */
        public InputMessageReplyToStory() {
        }

        /**
         * Describes a story to be replied.
         *
         * @param storyPosterChatId The identifier of the poster of the story. Currently, stories can be replied only in the chat that posted the story; channel stories can't be replied.
         * @param storyId The identifier of the story.
         */
        public InputMessageReplyToStory(long storyPosterChatId, int storyId) {
            this.storyPosterChatId = storyPosterChatId;
            this.storyId = storyId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1723842320;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a paid media to be sent.
     */
    public static class InputPaidMedia extends Object {
        /**
         * Type of the media.
         */
        public InputPaidMediaType type;
        /**
         * Photo or video to be sent.
         */
        public InputFile media;
        /**
         * Media thumbnail; pass null to skip thumbnail uploading.
         */
        public InputThumbnail thumbnail;
        /**
         * File identifiers of the stickers added to the media, if applicable.
         */
        public int[] addedStickerFileIds;
        /**
         * Media width.
         */
        public int width;
        /**
         * Media height.
         */
        public int height;

        /**
         * Describes a paid media to be sent.
         */
        public InputPaidMedia() {
        }

        /**
         * Describes a paid media to be sent.
         *
         * @param type Type of the media.
         * @param media Photo or video to be sent.
         * @param thumbnail Media thumbnail; pass null to skip thumbnail uploading.
         * @param addedStickerFileIds File identifiers of the stickers added to the media, if applicable.
         * @param width Media width.
         * @param height Media height.
         */
        public InputPaidMedia(InputPaidMediaType type, InputFile media, InputThumbnail thumbnail, int[] addedStickerFileIds, int width, int height) {
            this.type = type;
            this.media = media;
            this.thumbnail = thumbnail;
            this.addedStickerFileIds = addedStickerFileIds;
            this.width = width;
            this.height = height;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 475844035;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes type of paid media to sent.
     */
    public abstract static class InputPaidMediaType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            InputPaidMediaTypePhoto.CONSTRUCTOR,
            InputPaidMediaTypeVideo.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public InputPaidMediaType() {
        }
    }

    /**
     * The media is a photo. The photo must be at most 10 MB in size. The photo's width and height must not exceed 10000 in total. Width and height ratio must be at most 20.
     */
    public static class InputPaidMediaTypePhoto extends InputPaidMediaType {
        /**
         * Video of the live photo; pass null if the photo isn't a live photo.
         */
        public InputFile video;

        /**
         * The media is a photo. The photo must be at most 10 MB in size. The photo's width and height must not exceed 10000 in total. Width and height ratio must be at most 20.
         */
        public InputPaidMediaTypePhoto() {
        }

        /**
         * The media is a photo. The photo must be at most 10 MB in size. The photo's width and height must not exceed 10000 in total. Width and height ratio must be at most 20.
         *
         * @param video Video of the live photo; pass null if the photo isn't a live photo.
         */
        public InputPaidMediaTypePhoto(InputFile video) {
            this.video = video;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 819520113;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The media is a video.
     */
    public static class InputPaidMediaTypeVideo extends InputPaidMediaType {
        /**
         * Cover of the video; pass null to skip cover uploading.
         */
        public InputFile cover;
        /**
         * Timestamp from which the video playing must start, in seconds.
         */
        public int startTimestamp;
        /**
         * Duration of the video, in seconds.
         */
        public int duration;
        /**
         * True, if the video is expected to be streamed.
         */
        public boolean supportsStreaming;

        /**
         * The media is a video.
         */
        public InputPaidMediaTypeVideo() {
        }

        /**
         * The media is a video.
         *
         * @param cover Cover of the video; pass null to skip cover uploading.
         * @param startTimestamp Timestamp from which the video playing must start, in seconds.
         * @param duration Duration of the video, in seconds.
         * @param supportsStreaming True, if the video is expected to be streamed.
         */
        public InputPaidMediaTypeVideo(InputFile cover, int startTimestamp, int duration, boolean supportsStreaming) {
            this.cover = cover;
            this.startTimestamp = startTimestamp;
            this.duration = duration;
            this.supportsStreaming = supportsStreaming;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1793741625;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains information about a Telegram Passport element to be saved.
     */
    public abstract static class InputPassportElement extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            InputPassportElementPersonalDetails.CONSTRUCTOR,
            InputPassportElementPassport.CONSTRUCTOR,
            InputPassportElementDriverLicense.CONSTRUCTOR,
            InputPassportElementIdentityCard.CONSTRUCTOR,
            InputPassportElementInternalPassport.CONSTRUCTOR,
            InputPassportElementAddress.CONSTRUCTOR,
            InputPassportElementUtilityBill.CONSTRUCTOR,
            InputPassportElementBankStatement.CONSTRUCTOR,
            InputPassportElementRentalAgreement.CONSTRUCTOR,
            InputPassportElementPassportRegistration.CONSTRUCTOR,
            InputPassportElementTemporaryRegistration.CONSTRUCTOR,
            InputPassportElementPhoneNumber.CONSTRUCTOR,
            InputPassportElementEmailAddress.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public InputPassportElement() {
        }
    }

    /**
     * A Telegram Passport element to be saved containing the user's personal details.
     */
    public static class InputPassportElementPersonalDetails extends InputPassportElement {
        /**
         * Personal details of the user.
         */
        public PersonalDetails personalDetails;

        /**
         * A Telegram Passport element to be saved containing the user's personal details.
         */
        public InputPassportElementPersonalDetails() {
        }

        /**
         * A Telegram Passport element to be saved containing the user's personal details.
         *
         * @param personalDetails Personal details of the user.
         */
        public InputPassportElementPersonalDetails(PersonalDetails personalDetails) {
            this.personalDetails = personalDetails;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 164791359;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element to be saved containing the user's passport.
     */
    public static class InputPassportElementPassport extends InputPassportElement {
        /**
         * The passport to be saved.
         */
        public InputIdentityDocument passport;

        /**
         * A Telegram Passport element to be saved containing the user's passport.
         */
        public InputPassportElementPassport() {
        }

        /**
         * A Telegram Passport element to be saved containing the user's passport.
         *
         * @param passport The passport to be saved.
         */
        public InputPassportElementPassport(InputIdentityDocument passport) {
            this.passport = passport;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -497011356;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element to be saved containing the user's driver license.
     */
    public static class InputPassportElementDriverLicense extends InputPassportElement {
        /**
         * The driver license to be saved.
         */
        public InputIdentityDocument driverLicense;

        /**
         * A Telegram Passport element to be saved containing the user's driver license.
         */
        public InputPassportElementDriverLicense() {
        }

        /**
         * A Telegram Passport element to be saved containing the user's driver license.
         *
         * @param driverLicense The driver license to be saved.
         */
        public InputPassportElementDriverLicense(InputIdentityDocument driverLicense) {
            this.driverLicense = driverLicense;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 304813264;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element to be saved containing the user's identity card.
     */
    public static class InputPassportElementIdentityCard extends InputPassportElement {
        /**
         * The identity card to be saved.
         */
        public InputIdentityDocument identityCard;

        /**
         * A Telegram Passport element to be saved containing the user's identity card.
         */
        public InputPassportElementIdentityCard() {
        }

        /**
         * A Telegram Passport element to be saved containing the user's identity card.
         *
         * @param identityCard The identity card to be saved.
         */
        public InputPassportElementIdentityCard(InputIdentityDocument identityCard) {
            this.identityCard = identityCard;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -9963390;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element to be saved containing the user's internal passport.
     */
    public static class InputPassportElementInternalPassport extends InputPassportElement {
        /**
         * The internal passport to be saved.
         */
        public InputIdentityDocument internalPassport;

        /**
         * A Telegram Passport element to be saved containing the user's internal passport.
         */
        public InputPassportElementInternalPassport() {
        }

        /**
         * A Telegram Passport element to be saved containing the user's internal passport.
         *
         * @param internalPassport The internal passport to be saved.
         */
        public InputPassportElementInternalPassport(InputIdentityDocument internalPassport) {
            this.internalPassport = internalPassport;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 715360043;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element to be saved containing the user's address.
     */
    public static class InputPassportElementAddress extends InputPassportElement {
        /**
         * The address to be saved.
         */
        public Address address;

        /**
         * A Telegram Passport element to be saved containing the user's address.
         */
        public InputPassportElementAddress() {
        }

        /**
         * A Telegram Passport element to be saved containing the user's address.
         *
         * @param address The address to be saved.
         */
        public InputPassportElementAddress(Address address) {
            this.address = address;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 461630480;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element to be saved containing the user's utility bill.
     */
    public static class InputPassportElementUtilityBill extends InputPassportElement {
        /**
         * The utility bill to be saved.
         */
        public InputPersonalDocument utilityBill;

        /**
         * A Telegram Passport element to be saved containing the user's utility bill.
         */
        public InputPassportElementUtilityBill() {
        }

        /**
         * A Telegram Passport element to be saved containing the user's utility bill.
         *
         * @param utilityBill The utility bill to be saved.
         */
        public InputPassportElementUtilityBill(InputPersonalDocument utilityBill) {
            this.utilityBill = utilityBill;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1389203841;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element to be saved containing the user's bank statement.
     */
    public static class InputPassportElementBankStatement extends InputPassportElement {
        /**
         * The bank statement to be saved.
         */
        public InputPersonalDocument bankStatement;

        /**
         * A Telegram Passport element to be saved containing the user's bank statement.
         */
        public InputPassportElementBankStatement() {
        }

        /**
         * A Telegram Passport element to be saved containing the user's bank statement.
         *
         * @param bankStatement The bank statement to be saved.
         */
        public InputPassportElementBankStatement(InputPersonalDocument bankStatement) {
            this.bankStatement = bankStatement;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -26585208;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element to be saved containing the user's rental agreement.
     */
    public static class InputPassportElementRentalAgreement extends InputPassportElement {
        /**
         * The rental agreement to be saved.
         */
        public InputPersonalDocument rentalAgreement;

        /**
         * A Telegram Passport element to be saved containing the user's rental agreement.
         */
        public InputPassportElementRentalAgreement() {
        }

        /**
         * A Telegram Passport element to be saved containing the user's rental agreement.
         *
         * @param rentalAgreement The rental agreement to be saved.
         */
        public InputPassportElementRentalAgreement(InputPersonalDocument rentalAgreement) {
            this.rentalAgreement = rentalAgreement;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1736154155;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element to be saved containing the user's passport registration.
     */
    public static class InputPassportElementPassportRegistration extends InputPassportElement {
        /**
         * The passport registration page to be saved.
         */
        public InputPersonalDocument passportRegistration;

        /**
         * A Telegram Passport element to be saved containing the user's passport registration.
         */
        public InputPassportElementPassportRegistration() {
        }

        /**
         * A Telegram Passport element to be saved containing the user's passport registration.
         *
         * @param passportRegistration The passport registration page to be saved.
         */
        public InputPassportElementPassportRegistration(InputPersonalDocument passportRegistration) {
            this.passportRegistration = passportRegistration;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1314562128;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element to be saved containing the user's temporary registration.
     */
    public static class InputPassportElementTemporaryRegistration extends InputPassportElement {
        /**
         * The temporary registration document to be saved.
         */
        public InputPersonalDocument temporaryRegistration;

        /**
         * A Telegram Passport element to be saved containing the user's temporary registration.
         */
        public InputPassportElementTemporaryRegistration() {
        }

        /**
         * A Telegram Passport element to be saved containing the user's temporary registration.
         *
         * @param temporaryRegistration The temporary registration document to be saved.
         */
        public InputPassportElementTemporaryRegistration(InputPersonalDocument temporaryRegistration) {
            this.temporaryRegistration = temporaryRegistration;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1913238047;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element to be saved containing the user's phone number.
     */
    public static class InputPassportElementPhoneNumber extends InputPassportElement {
        /**
         * The phone number to be saved.
         */
        public String phoneNumber;

        /**
         * A Telegram Passport element to be saved containing the user's phone number.
         */
        public InputPassportElementPhoneNumber() {
        }

        /**
         * A Telegram Passport element to be saved containing the user's phone number.
         *
         * @param phoneNumber The phone number to be saved.
         */
        public InputPassportElementPhoneNumber(String phoneNumber) {
            this.phoneNumber = phoneNumber;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1319357497;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element to be saved containing the user's email address.
     */
    public static class InputPassportElementEmailAddress extends InputPassportElement {
        /**
         * The email address to be saved.
         */
        public String emailAddress;

        /**
         * A Telegram Passport element to be saved containing the user's email address.
         */
        public InputPassportElementEmailAddress() {
        }

        /**
         * A Telegram Passport element to be saved containing the user's email address.
         *
         * @param emailAddress The email address to be saved.
         */
        public InputPassportElementEmailAddress(String emailAddress) {
            this.emailAddress = emailAddress;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -248605659;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains the description of an error in a Telegram Passport element; for bots only.
     */
    public static class InputPassportElementError extends Object {
        /**
         * Type of Telegram Passport element that has the error.
         */
        public PassportElementType type;
        /**
         * Error message.
         */
        public String message;
        /**
         * Error source.
         */
        public InputPassportElementErrorSource source;

        /**
         * Contains the description of an error in a Telegram Passport element; for bots only.
         */
        public InputPassportElementError() {
        }

        /**
         * Contains the description of an error in a Telegram Passport element; for bots only.
         *
         * @param type Type of Telegram Passport element that has the error.
         * @param message Error message.
         * @param source Error source.
         */
        public InputPassportElementError(PassportElementType type, String message, InputPassportElementErrorSource source) {
            this.type = type;
            this.message = message;
            this.source = source;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 285756898;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains the description of an error in a Telegram Passport element; for bots only.
     */
    public abstract static class InputPassportElementErrorSource extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            InputPassportElementErrorSourceUnspecified.CONSTRUCTOR,
            InputPassportElementErrorSourceDataField.CONSTRUCTOR,
            InputPassportElementErrorSourceFrontSide.CONSTRUCTOR,
            InputPassportElementErrorSourceReverseSide.CONSTRUCTOR,
            InputPassportElementErrorSourceSelfie.CONSTRUCTOR,
            InputPassportElementErrorSourceTranslationFile.CONSTRUCTOR,
            InputPassportElementErrorSourceTranslationFiles.CONSTRUCTOR,
            InputPassportElementErrorSourceFile.CONSTRUCTOR,
            InputPassportElementErrorSourceFiles.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public InputPassportElementErrorSource() {
        }
    }

    /**
     * The element contains an error in an unspecified place. The error will be considered resolved when new data is added.
     */
    public static class InputPassportElementErrorSourceUnspecified extends InputPassportElementErrorSource {
        /**
         * Current hash of the entire element.
         */
        public byte[] elementHash;

        /**
         * The element contains an error in an unspecified place. The error will be considered resolved when new data is added.
         */
        public InputPassportElementErrorSourceUnspecified() {
        }

        /**
         * The element contains an error in an unspecified place. The error will be considered resolved when new data is added.
         *
         * @param elementHash Current hash of the entire element.
         */
        public InputPassportElementErrorSourceUnspecified(byte[] elementHash) {
            this.elementHash = elementHash;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 267230319;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A data field contains an error. The error is considered resolved when the field's value changes.
     */
    public static class InputPassportElementErrorSourceDataField extends InputPassportElementErrorSource {
        /**
         * Field name.
         */
        public String fieldName;
        /**
         * Current data hash.
         */
        public byte[] dataHash;

        /**
         * A data field contains an error. The error is considered resolved when the field's value changes.
         */
        public InputPassportElementErrorSourceDataField() {
        }

        /**
         * A data field contains an error. The error is considered resolved when the field's value changes.
         *
         * @param fieldName Field name.
         * @param dataHash Current data hash.
         */
        public InputPassportElementErrorSourceDataField(String fieldName, byte[] dataHash) {
            this.fieldName = fieldName;
            this.dataHash = dataHash;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -426795002;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The front side of the document contains an error. The error is considered resolved when the file with the front side of the document changes.
     */
    public static class InputPassportElementErrorSourceFrontSide extends InputPassportElementErrorSource {
        /**
         * Current hash of the file containing the front side.
         */
        public byte[] fileHash;

        /**
         * The front side of the document contains an error. The error is considered resolved when the file with the front side of the document changes.
         */
        public InputPassportElementErrorSourceFrontSide() {
        }

        /**
         * The front side of the document contains an error. The error is considered resolved when the file with the front side of the document changes.
         *
         * @param fileHash Current hash of the file containing the front side.
         */
        public InputPassportElementErrorSourceFrontSide(byte[] fileHash) {
            this.fileHash = fileHash;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 588023741;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The reverse side of the document contains an error. The error is considered resolved when the file with the reverse side of the document changes.
     */
    public static class InputPassportElementErrorSourceReverseSide extends InputPassportElementErrorSource {
        /**
         * Current hash of the file containing the reverse side.
         */
        public byte[] fileHash;

        /**
         * The reverse side of the document contains an error. The error is considered resolved when the file with the reverse side of the document changes.
         */
        public InputPassportElementErrorSourceReverseSide() {
        }

        /**
         * The reverse side of the document contains an error. The error is considered resolved when the file with the reverse side of the document changes.
         *
         * @param fileHash Current hash of the file containing the reverse side.
         */
        public InputPassportElementErrorSourceReverseSide(byte[] fileHash) {
            this.fileHash = fileHash;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 413072891;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The selfie contains an error. The error is considered resolved when the file with the selfie changes.
     */
    public static class InputPassportElementErrorSourceSelfie extends InputPassportElementErrorSource {
        /**
         * Current hash of the file containing the selfie.
         */
        public byte[] fileHash;

        /**
         * The selfie contains an error. The error is considered resolved when the file with the selfie changes.
         */
        public InputPassportElementErrorSourceSelfie() {
        }

        /**
         * The selfie contains an error. The error is considered resolved when the file with the selfie changes.
         *
         * @param fileHash Current hash of the file containing the selfie.
         */
        public InputPassportElementErrorSourceSelfie(byte[] fileHash) {
            this.fileHash = fileHash;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -773575528;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * One of the files containing the translation of the document contains an error. The error is considered resolved when the file with the translation changes.
     */
    public static class InputPassportElementErrorSourceTranslationFile extends InputPassportElementErrorSource {
        /**
         * Current hash of the file containing the translation.
         */
        public byte[] fileHash;

        /**
         * One of the files containing the translation of the document contains an error. The error is considered resolved when the file with the translation changes.
         */
        public InputPassportElementErrorSourceTranslationFile() {
        }

        /**
         * One of the files containing the translation of the document contains an error. The error is considered resolved when the file with the translation changes.
         *
         * @param fileHash Current hash of the file containing the translation.
         */
        public InputPassportElementErrorSourceTranslationFile(byte[] fileHash) {
            this.fileHash = fileHash;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 505842299;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The translation of the document contains an error. The error is considered resolved when the list of files changes.
     */
    public static class InputPassportElementErrorSourceTranslationFiles extends InputPassportElementErrorSource {
        /**
         * Current hashes of all files with the translation.
         */
        public byte[][] fileHashes;

        /**
         * The translation of the document contains an error. The error is considered resolved when the list of files changes.
         */
        public InputPassportElementErrorSourceTranslationFiles() {
        }

        /**
         * The translation of the document contains an error. The error is considered resolved when the list of files changes.
         *
         * @param fileHashes Current hashes of all files with the translation.
         */
        public InputPassportElementErrorSourceTranslationFiles(byte[][] fileHashes) {
            this.fileHashes = fileHashes;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -527254048;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file contains an error. The error is considered resolved when the file changes.
     */
    public static class InputPassportElementErrorSourceFile extends InputPassportElementErrorSource {
        /**
         * Current hash of the file which has the error.
         */
        public byte[] fileHash;

        /**
         * The file contains an error. The error is considered resolved when the file changes.
         */
        public InputPassportElementErrorSourceFile() {
        }

        /**
         * The file contains an error. The error is considered resolved when the file changes.
         *
         * @param fileHash Current hash of the file which has the error.
         */
        public InputPassportElementErrorSourceFile(byte[] fileHash) {
            this.fileHash = fileHash;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -298492469;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of attached files contains an error. The error is considered resolved when the file list changes.
     */
    public static class InputPassportElementErrorSourceFiles extends InputPassportElementErrorSource {
        /**
         * Current hashes of all attached files.
         */
        public byte[][] fileHashes;

        /**
         * The list of attached files contains an error. The error is considered resolved when the file list changes.
         */
        public InputPassportElementErrorSourceFiles() {
        }

        /**
         * The list of attached files contains an error. The error is considered resolved when the file list changes.
         *
         * @param fileHashes Current hashes of all attached files.
         */
        public InputPassportElementErrorSourceFiles(byte[][] fileHashes) {
            this.fileHashes = fileHashes;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2008541640;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A personal document to be saved to Telegram Passport.
     */
    public static class InputPersonalDocument extends Object {
        /**
         * List of files containing the pages of the document.
         */
        public InputFile[] files;
        /**
         * List of files containing a certified English translation of the document.
         */
        public InputFile[] translation;

        /**
         * A personal document to be saved to Telegram Passport.
         */
        public InputPersonalDocument() {
        }

        /**
         * A personal document to be saved to Telegram Passport.
         *
         * @param files List of files containing the pages of the document.
         * @param translation List of files containing a certified English translation of the document.
         */
        public InputPersonalDocument(InputFile[] files, InputFile[] translation) {
            this.files = files;
            this.translation = translation;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1676966826;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes one answer option of a poll to be created.
     */
    public static class InputPollOption extends Object {
        /**
         * Option text; 1-100 characters. Only custom emoji entities are allowed to be added and only by Premium users.
         */
        public FormattedText text;
        /**
         * Option media; pass null if none; ignored in addPollOption. Must be one of the following types: inputMessageAnimation, non-live inputMessageLocation, inputMessagePhoto, inputMessageSticker, inputMessageVenue, or inputMessageVideo without caption.
         */
        public InputMessageContent media;

        /**
         * Describes one answer option of a poll to be created.
         */
        public InputPollOption() {
        }

        /**
         * Describes one answer option of a poll to be created.
         *
         * @param text Option text; 1-100 characters. Only custom emoji entities are allowed to be added and only by Premium users.
         * @param media Option media; pass null if none; ignored in addPollOption. Must be one of the following types: inputMessageAnimation, non-live inputMessageLocation, inputMessagePhoto, inputMessageSticker, inputMessageVenue, or inputMessageVideo without caption.
         */
        public InputPollOption(FormattedText text, InputMessageContent media) {
            this.text = text;
            this.media = media;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -559227307;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the type of poll to send.
     */
    public abstract static class InputPollType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            InputPollTypeRegular.CONSTRUCTOR,
            InputPollTypeQuiz.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public InputPollType() {
        }
    }

    /**
     * A regular poll.
     */
    public static class InputPollTypeRegular extends InputPollType {
        /**
         * True, if answer options can be added to the poll after creation; not supported in channel chats and for anonymous polls.
         */
        public boolean allowAddingOptions;

        /**
         * A regular poll.
         */
        public InputPollTypeRegular() {
        }

        /**
         * A regular poll.
         *
         * @param allowAddingOptions True, if answer options can be added to the poll after creation; not supported in channel chats and for anonymous polls.
         */
        public InputPollTypeRegular(boolean allowAddingOptions) {
            this.allowAddingOptions = allowAddingOptions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -236313041;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A poll in quiz mode, which has predefined correct answers.
     */
    public static class InputPollTypeQuiz extends InputPollType {
        /**
         * Increasing list of 0-based identifiers of the correct answer options; must be non-empty.
         */
        public int[] correctOptionIds;
        /**
         * Text that is shown when the user chooses an incorrect answer or taps on the lamp icon; 0-200 characters with at most 2 line feeds.
         */
        public FormattedText explanation;
        /**
         * Media that is shown when the user chooses an incorrect answer or taps on the lamp icon; pass null if none. Must be one of the following types: inputMessageAnimation, inputMessageAudio, inputMessageDocument, non-live inputMessageLocation, inputMessagePhoto, inputMessageVenue, or inputMessageVideo without caption.
         */
        public InputMessageContent explanationMedia;

        /**
         * A poll in quiz mode, which has predefined correct answers.
         */
        public InputPollTypeQuiz() {
        }

        /**
         * A poll in quiz mode, which has predefined correct answers.
         *
         * @param correctOptionIds Increasing list of 0-based identifiers of the correct answer options; must be non-empty.
         * @param explanation Text that is shown when the user chooses an incorrect answer or taps on the lamp icon; 0-200 characters with at most 2 line feeds.
         * @param explanationMedia Media that is shown when the user chooses an incorrect answer or taps on the lamp icon; pass null if none. Must be one of the following types: inputMessageAnimation, inputMessageAudio, inputMessageDocument, non-live inputMessageLocation, inputMessagePhoto, inputMessageVenue, or inputMessageVideo without caption.
         */
        public InputPollTypeQuiz(int[] correctOptionIds, FormattedText explanation, InputMessageContent explanationMedia) {
            this.correctOptionIds = correctOptionIds;
            this.explanation = explanation;
            this.explanationMedia = explanationMedia;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 880659994;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A sticker to be added to a sticker set.
     */
    public static class InputSticker extends Object {
        /**
         * File with the sticker; must fit in a 512x512 square. For WEBP stickers the file must be in WEBP or PNG format, which will be converted to WEBP server-side. See https://core.telegram.org/animated_stickers#technical-requirements for technical requirements.
         */
        public InputFile sticker;
        /**
         * Format of the sticker.
         */
        public StickerFormat format;
        /**
         * String with 1-20 emoji corresponding to the sticker.
         */
        public String emojis;
        /**
         * Position where the mask is placed; pass null if not specified.
         */
        public MaskPosition maskPosition;
        /**
         * List of up to 20 keywords with total length up to 64 characters, which can be used to find the sticker.
         */
        public String[] keywords;

        /**
         * A sticker to be added to a sticker set.
         */
        public InputSticker() {
        }

        /**
         * A sticker to be added to a sticker set.
         *
         * @param sticker File with the sticker; must fit in a 512x512 square. For WEBP stickers the file must be in WEBP or PNG format, which will be converted to WEBP server-side. See https://core.telegram.org/animated_stickers#technical-requirements for technical requirements.
         * @param format Format of the sticker.
         * @param emojis String with 1-20 emoji corresponding to the sticker.
         * @param maskPosition Position where the mask is placed; pass null if not specified.
         * @param keywords List of up to 20 keywords with total length up to 64 characters, which can be used to find the sticker.
         */
        public InputSticker(InputFile sticker, StickerFormat format, String emojis, MaskPosition maskPosition, String[] keywords) {
            this.sticker = sticker;
            this.format = format;
            this.emojis = emojis;
            this.maskPosition = maskPosition;
            this.keywords = keywords;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1589392402;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a clickable rectangle area on a story media to be added.
     */
    public static class InputStoryArea extends Object {
        /**
         * Position of the area.
         */
        public StoryAreaPosition position;
        /**
         * Type of the area.
         */
        public InputStoryAreaType type;

        /**
         * Describes a clickable rectangle area on a story media to be added.
         */
        public InputStoryArea() {
        }

        /**
         * Describes a clickable rectangle area on a story media to be added.
         *
         * @param position Position of the area.
         * @param type Type of the area.
         */
        public InputStoryArea(StoryAreaPosition position, InputStoryAreaType type) {
            this.position = position;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 122859135;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes type of clickable area on a story media to be added.
     */
    public abstract static class InputStoryAreaType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            InputStoryAreaTypeLocation.CONSTRUCTOR,
            InputStoryAreaTypeFoundVenue.CONSTRUCTOR,
            InputStoryAreaTypePreviousVenue.CONSTRUCTOR,
            InputStoryAreaTypeSuggestedReaction.CONSTRUCTOR,
            InputStoryAreaTypeMessage.CONSTRUCTOR,
            InputStoryAreaTypeLink.CONSTRUCTOR,
            InputStoryAreaTypeWeather.CONSTRUCTOR,
            InputStoryAreaTypeUpgradedGift.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public InputStoryAreaType() {
        }
    }

    /**
     * An area pointing to a location.
     */
    public static class InputStoryAreaTypeLocation extends InputStoryAreaType {
        /**
         * The location.
         */
        public Location location;
        /**
         * Address of the location; pass null if unknown.
         */
        public LocationAddress address;

        /**
         * An area pointing to a location.
         */
        public InputStoryAreaTypeLocation() {
        }

        /**
         * An area pointing to a location.
         *
         * @param location The location.
         * @param address Address of the location; pass null if unknown.
         */
        public InputStoryAreaTypeLocation(Location location, LocationAddress address) {
            this.location = location;
            this.address = address;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1433714887;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An area pointing to a venue found by the bot getOption(&quot;venue_search_bot_username&quot;).
     */
    public static class InputStoryAreaTypeFoundVenue extends InputStoryAreaType {
        /**
         * Identifier of the inline query, used to found the venue.
         */
        public long queryId;
        /**
         * Identifier of the inline query result.
         */
        public String resultId;

        /**
         * An area pointing to a venue found by the bot getOption(&quot;venue_search_bot_username&quot;).
         */
        public InputStoryAreaTypeFoundVenue() {
        }

        /**
         * An area pointing to a venue found by the bot getOption(&quot;venue_search_bot_username&quot;).
         *
         * @param queryId Identifier of the inline query, used to found the venue.
         * @param resultId Identifier of the inline query result.
         */
        public InputStoryAreaTypeFoundVenue(long queryId, String resultId) {
            this.queryId = queryId;
            this.resultId = resultId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1395809130;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An area pointing to a venue already added to the story.
     */
    public static class InputStoryAreaTypePreviousVenue extends InputStoryAreaType {
        /**
         * Provider of the venue.
         */
        public String venueProvider;
        /**
         * Identifier of the venue in the provider database.
         */
        public String venueId;

        /**
         * An area pointing to a venue already added to the story.
         */
        public InputStoryAreaTypePreviousVenue() {
        }

        /**
         * An area pointing to a venue already added to the story.
         *
         * @param venueProvider Provider of the venue.
         * @param venueId Identifier of the venue in the provider database.
         */
        public InputStoryAreaTypePreviousVenue(String venueProvider, String venueId) {
            this.venueProvider = venueProvider;
            this.venueId = venueId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1846693388;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An area pointing to a suggested reaction.
     */
    public static class InputStoryAreaTypeSuggestedReaction extends InputStoryAreaType {
        /**
         * Type of the reaction.
         */
        public ReactionType reactionType;
        /**
         * True, if reaction has a dark background.
         */
        public boolean isDark;
        /**
         * True, if reaction corner is flipped.
         */
        public boolean isFlipped;

        /**
         * An area pointing to a suggested reaction.
         */
        public InputStoryAreaTypeSuggestedReaction() {
        }

        /**
         * An area pointing to a suggested reaction.
         *
         * @param reactionType Type of the reaction.
         * @param isDark True, if reaction has a dark background.
         * @param isFlipped True, if reaction corner is flipped.
         */
        public InputStoryAreaTypeSuggestedReaction(ReactionType reactionType, boolean isDark, boolean isFlipped) {
            this.reactionType = reactionType;
            this.isDark = isDark;
            this.isFlipped = isFlipped;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2101826003;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An area pointing to a message.
     */
    public static class InputStoryAreaTypeMessage extends InputStoryAreaType {
        /**
         * Identifier of the chat with the message. Currently, the chat must be a supergroup or a channel chat.
         */
        public long chatId;
        /**
         * Identifier of the message. Use messageProperties.canBeSharedInStory to check whether the message is suitable.
         */
        public long messageId;

        /**
         * An area pointing to a message.
         */
        public InputStoryAreaTypeMessage() {
        }

        /**
         * An area pointing to a message.
         *
         * @param chatId Identifier of the chat with the message. Currently, the chat must be a supergroup or a channel chat.
         * @param messageId Identifier of the message. Use messageProperties.canBeSharedInStory to check whether the message is suitable.
         */
        public InputStoryAreaTypeMessage(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -266607529;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An area pointing to a HTTP or tg:// link.
     */
    public static class InputStoryAreaTypeLink extends InputStoryAreaType {
        /**
         * HTTP or tg:// URL to be opened when the area is clicked.
         */
        public String url;

        /**
         * An area pointing to a HTTP or tg:// link.
         */
        public InputStoryAreaTypeLink() {
        }

        /**
         * An area pointing to a HTTP or tg:// link.
         *
         * @param url HTTP or tg:// URL to be opened when the area is clicked.
         */
        public InputStoryAreaTypeLink(String url) {
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1408441160;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An area with information about weather.
     */
    public static class InputStoryAreaTypeWeather extends InputStoryAreaType {
        /**
         * Temperature, in degree Celsius.
         */
        public double temperature;
        /**
         * Emoji representing the weather.
         */
        public String emoji;
        /**
         * A color of the area background in the ARGB format.
         */
        public int backgroundColor;

        /**
         * An area with information about weather.
         */
        public InputStoryAreaTypeWeather() {
        }

        /**
         * An area with information about weather.
         *
         * @param temperature Temperature, in degree Celsius.
         * @param emoji Emoji representing the weather.
         * @param backgroundColor A color of the area background in the ARGB format.
         */
        public InputStoryAreaTypeWeather(double temperature, String emoji, int backgroundColor) {
            this.temperature = temperature;
            this.emoji = emoji;
            this.backgroundColor = backgroundColor;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1212686691;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An area with an upgraded gift.
     */
    public static class InputStoryAreaTypeUpgradedGift extends InputStoryAreaType {
        /**
         * Unique name of the upgraded gift.
         */
        public String giftName;

        /**
         * An area with an upgraded gift.
         */
        public InputStoryAreaTypeUpgradedGift() {
        }

        /**
         * An area with an upgraded gift.
         *
         * @param giftName Unique name of the upgraded gift.
         */
        public InputStoryAreaTypeUpgradedGift(String giftName) {
            this.giftName = giftName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 793059694;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of story areas to be added.
     */
    public static class InputStoryAreas extends Object {
        /**
         * List of input story areas. Currently, a story can have up to 10 inputStoryAreaTypeLocation, inputStoryAreaTypeFoundVenue, and inputStoryAreaTypePreviousVenue areas, up to getOption(&quot;story_suggested_reaction_area_count_max&quot;) inputStoryAreaTypeSuggestedReaction areas, up to 1 inputStoryAreaTypeMessage area, up to getOption(&quot;story_link_area_count_max&quot;) inputStoryAreaTypeLink areas if the current user is a Telegram Premium user, up to 3 inputStoryAreaTypeWeather areas, and up to 1 inputStoryAreaTypeUpgradedGift area.
         */
        public InputStoryArea[] areas;

        /**
         * Contains a list of story areas to be added.
         */
        public InputStoryAreas() {
        }

        /**
         * Contains a list of story areas to be added.
         *
         * @param areas List of input story areas. Currently, a story can have up to 10 inputStoryAreaTypeLocation, inputStoryAreaTypeFoundVenue, and inputStoryAreaTypePreviousVenue areas, up to getOption(&quot;story_suggested_reaction_area_count_max&quot;) inputStoryAreaTypeSuggestedReaction areas, up to 1 inputStoryAreaTypeMessage area, up to getOption(&quot;story_link_area_count_max&quot;) inputStoryAreaTypeLink areas if the current user is a Telegram Premium user, up to 3 inputStoryAreaTypeWeather areas, and up to 1 inputStoryAreaTypeUpgradedGift area.
         */
        public InputStoryAreas(InputStoryArea[] areas) {
            this.areas = areas;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -883247088;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * The content of a story to post.
     */
    public abstract static class InputStoryContent extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            InputStoryContentPhoto.CONSTRUCTOR,
            InputStoryContentVideo.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public InputStoryContent() {
        }
    }

    /**
     * A photo story.
     */
    public static class InputStoryContentPhoto extends InputStoryContent {
        /**
         * Photo to send. The photo must be at most 10 MB in size. The photo size must be 1080x1920.
         */
        public InputFile photo;
        /**
         * File identifiers of the stickers added to the photo, if applicable.
         */
        public int[] addedStickerFileIds;

        /**
         * A photo story.
         */
        public InputStoryContentPhoto() {
        }

        /**
         * A photo story.
         *
         * @param photo Photo to send. The photo must be at most 10 MB in size. The photo size must be 1080x1920.
         * @param addedStickerFileIds File identifiers of the stickers added to the photo, if applicable.
         */
        public InputStoryContentPhoto(InputFile photo, int[] addedStickerFileIds) {
            this.photo = photo;
            this.addedStickerFileIds = addedStickerFileIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -309196727;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A video story.
     */
    public static class InputStoryContentVideo extends InputStoryContent {
        /**
         * Video to be sent. The video size must be 720x1280. The video must be streamable and stored in MPEG4 format, after encoding with H.265 codec and key frames added each second.
         */
        public InputFile video;
        /**
         * File identifiers of the stickers added to the video, if applicable.
         */
        public int[] addedStickerFileIds;
        /**
         * Precise duration of the video, in seconds; 0-60.
         */
        public double duration;
        /**
         * Timestamp of the frame, which will be used as video thumbnail.
         */
        public double coverFrameTimestamp;
        /**
         * True, if the video has no sound.
         */
        public boolean isAnimation;

        /**
         * A video story.
         */
        public InputStoryContentVideo() {
        }

        /**
         * A video story.
         *
         * @param video Video to be sent. The video size must be 720x1280. The video must be streamable and stored in MPEG4 format, after encoding with H.265 codec and key frames added each second.
         * @param addedStickerFileIds File identifiers of the stickers added to the video, if applicable.
         * @param duration Precise duration of the video, in seconds; 0-60.
         * @param coverFrameTimestamp Timestamp of the frame, which will be used as video thumbnail.
         * @param isAnimation True, if the video has no sound.
         */
        public InputStoryContentVideo(InputFile video, int[] addedStickerFileIds, double duration, double coverFrameTimestamp, boolean isAnimation) {
            this.video = video;
            this.addedStickerFileIds = addedStickerFileIds;
            this.duration = duration;
            this.coverFrameTimestamp = coverFrameTimestamp;
            this.isAnimation = isAnimation;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 3809243;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a post to suggest.
     */
    public static class InputSuggestedPostInfo extends Object {
        /**
         * Price of the suggested post; pass null to suggest a post without payment. If the current user isn't an administrator of the channel direct messages chat and has no enough funds to pay for the post, then the error &quot;BALANCE_TOO_LOW&quot; will be returned immediately.
         */
        public SuggestedPostPrice price;
        /**
         * Point in time (Unix timestamp) when the post is expected to be published; pass 0 if the date isn't restricted. If specified, then the date must be getOption(&quot;suggested_post_send_delay_min&quot;)-getOption(&quot;suggested_post_send_delay_max&quot;) seconds in the future.
         */
        public int sendDate;

        /**
         * Contains information about a post to suggest.
         */
        public InputSuggestedPostInfo() {
        }

        /**
         * Contains information about a post to suggest.
         *
         * @param price Price of the suggested post; pass null to suggest a post without payment. If the current user isn't an administrator of the channel direct messages chat and has no enough funds to pay for the post, then the error &quot;BALANCE_TOO_LOW&quot; will be returned immediately.
         * @param sendDate Point in time (Unix timestamp) when the post is expected to be published; pass 0 if the date isn't restricted. If specified, then the date must be getOption(&quot;suggested_post_send_delay_min&quot;)-getOption(&quot;suggested_post_send_delay_max&quot;) seconds in the future.
         */
        public InputSuggestedPostInfo(SuggestedPostPrice price, int sendDate) {
            this.price = price;
            this.sendDate = sendDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1246794382;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes manually chosen quote from another message.
     */
    public static class InputTextQuote extends Object {
        /**
         * Text of the quote; 0-getOption(&quot;message_reply_quote_length_max&quot;) characters. Only Bold, Italic, Underline, Strikethrough, Spoiler, CustomEmoji, and DateTime entities are allowed to be kept and must be kept in the quote.
         */
        public FormattedText text;
        /**
         * Quote position in the original message in UTF-16 code units.
         */
        public int position;

        /**
         * Describes manually chosen quote from another message.
         */
        public InputTextQuote() {
        }

        /**
         * Describes manually chosen quote from another message.
         *
         * @param text Text of the quote; 0-getOption(&quot;message_reply_quote_length_max&quot;) characters. Only Bold, Italic, Underline, Strikethrough, Spoiler, CustomEmoji, and DateTime entities are allowed to be kept and must be kept in the quote.
         * @param position Quote position in the original message in UTF-16 code units.
         */
        public InputTextQuote(FormattedText text, int position) {
            this.text = text;
            this.position = position;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1219859172;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A thumbnail to be sent along with a file; must be in JPEG or WEBP format for stickers, and less than 200 KB in size.
     */
    public static class InputThumbnail extends Object {
        /**
         * Thumbnail file to send. Sending thumbnails by fileId is currently not supported.
         */
        public InputFile thumbnail;
        /**
         * Thumbnail width, usually shouldn't exceed 320. Use 0 if unknown.
         */
        public int width;
        /**
         * Thumbnail height, usually shouldn't exceed 320. Use 0 if unknown.
         */
        public int height;

        /**
         * A thumbnail to be sent along with a file; must be in JPEG or WEBP format for stickers, and less than 200 KB in size.
         */
        public InputThumbnail() {
        }

        /**
         * A thumbnail to be sent along with a file; must be in JPEG or WEBP format for stickers, and less than 200 KB in size.
         *
         * @param thumbnail Thumbnail file to send. Sending thumbnails by fileId is currently not supported.
         * @param width Thumbnail width, usually shouldn't exceed 320. Use 0 if unknown.
         * @param height Thumbnail height, usually shouldn't exceed 320. Use 0 if unknown.
         */
        public InputThumbnail(InputFile thumbnail, int width, int height) {
            this.thumbnail = thumbnail;
            this.width = width;
            this.height = height;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1582387236;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes an internal https://t.me or tg: link, which must be processed by the application in a special way.
     */
    public abstract static class InternalLinkType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            InternalLinkTypeAttachmentMenuBot.CONSTRUCTOR,
            InternalLinkTypeAuthenticationCode.CONSTRUCTOR,
            InternalLinkTypeBackground.CONSTRUCTOR,
            InternalLinkTypeBotAddToChannel.CONSTRUCTOR,
            InternalLinkTypeBotStart.CONSTRUCTOR,
            InternalLinkTypeBotStartInGroup.CONSTRUCTOR,
            InternalLinkTypeBusinessChat.CONSTRUCTOR,
            InternalLinkTypeCallsPage.CONSTRUCTOR,
            InternalLinkTypeChatAffiliateProgram.CONSTRUCTOR,
            InternalLinkTypeChatBoost.CONSTRUCTOR,
            InternalLinkTypeChatFolderInvite.CONSTRUCTOR,
            InternalLinkTypeChatInvite.CONSTRUCTOR,
            InternalLinkTypeChatSelection.CONSTRUCTOR,
            InternalLinkTypeContactsPage.CONSTRUCTOR,
            InternalLinkTypeDirectMessagesChat.CONSTRUCTOR,
            InternalLinkTypeGame.CONSTRUCTOR,
            InternalLinkTypeGiftAuction.CONSTRUCTOR,
            InternalLinkTypeGiftCollection.CONSTRUCTOR,
            InternalLinkTypeGroupCall.CONSTRUCTOR,
            InternalLinkTypeInstantView.CONSTRUCTOR,
            InternalLinkTypeInvoice.CONSTRUCTOR,
            InternalLinkTypeLanguagePack.CONSTRUCTOR,
            InternalLinkTypeLiveStory.CONSTRUCTOR,
            InternalLinkTypeMainWebApp.CONSTRUCTOR,
            InternalLinkTypeMessage.CONSTRUCTOR,
            InternalLinkTypeMessageDraft.CONSTRUCTOR,
            InternalLinkTypeMyProfilePage.CONSTRUCTOR,
            InternalLinkTypeNewChannelChat.CONSTRUCTOR,
            InternalLinkTypeNewGroupChat.CONSTRUCTOR,
            InternalLinkTypeNewPrivateChat.CONSTRUCTOR,
            InternalLinkTypeNewStory.CONSTRUCTOR,
            InternalLinkTypeOauth.CONSTRUCTOR,
            InternalLinkTypePassportDataRequest.CONSTRUCTOR,
            InternalLinkTypePhoneNumberConfirmation.CONSTRUCTOR,
            InternalLinkTypePremiumFeaturesPage.CONSTRUCTOR,
            InternalLinkTypePremiumGiftCode.CONSTRUCTOR,
            InternalLinkTypePremiumGiftPurchase.CONSTRUCTOR,
            InternalLinkTypeProxy.CONSTRUCTOR,
            InternalLinkTypePublicChat.CONSTRUCTOR,
            InternalLinkTypeQrCodeAuthentication.CONSTRUCTOR,
            InternalLinkTypeRequestManagedBot.CONSTRUCTOR,
            InternalLinkTypeRestorePurchases.CONSTRUCTOR,
            InternalLinkTypeSavedMessages.CONSTRUCTOR,
            InternalLinkTypeSearch.CONSTRUCTOR,
            InternalLinkTypeSettings.CONSTRUCTOR,
            InternalLinkTypeStarPurchase.CONSTRUCTOR,
            InternalLinkTypeStickerSet.CONSTRUCTOR,
            InternalLinkTypeStory.CONSTRUCTOR,
            InternalLinkTypeStoryAlbum.CONSTRUCTOR,
            InternalLinkTypeTextCompositionStyle.CONSTRUCTOR,
            InternalLinkTypeTheme.CONSTRUCTOR,
            InternalLinkTypeUnknownDeepLink.CONSTRUCTOR,
            InternalLinkTypeUpgradedGift.CONSTRUCTOR,
            InternalLinkTypeUserPhoneNumber.CONSTRUCTOR,
            InternalLinkTypeUserToken.CONSTRUCTOR,
            InternalLinkTypeVideoChat.CONSTRUCTOR,
            InternalLinkTypeWebApp.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public InternalLinkType() {
        }
    }

    /**
     * The link is a link to an attachment menu bot to be opened in the specified or a chosen chat. Process given targetChat to open the chat. Then, call searchPublicChat with the given bot username, check that the user is a bot and can be added to attachment menu. Then, use getAttachmentMenuBot to receive information about the bot. If the bot isn't added to attachment menu, then show a disclaimer about Mini Apps being third-party applications, ask the user to accept their Terms of service and confirm adding the bot to side and attachment menu. If the user accept the terms and confirms adding, then use toggleBotIsAddedToAttachmentMenu to add the bot. If the attachment menu bot can't be used in the opened chat, show an error to the user. If the bot is added to attachment menu and can be used in the chat, then use openWebApp with the given URL.
     */
    public static class InternalLinkTypeAttachmentMenuBot extends InternalLinkType {
        /**
         * Target chat to be opened.
         */
        public TargetChat targetChat;
        /**
         * Username of the bot.
         */
        public String botUsername;
        /**
         * URL to be passed to openWebApp.
         */
        public String url;

        /**
         * The link is a link to an attachment menu bot to be opened in the specified or a chosen chat. Process given targetChat to open the chat. Then, call searchPublicChat with the given bot username, check that the user is a bot and can be added to attachment menu. Then, use getAttachmentMenuBot to receive information about the bot. If the bot isn't added to attachment menu, then show a disclaimer about Mini Apps being third-party applications, ask the user to accept their Terms of service and confirm adding the bot to side and attachment menu. If the user accept the terms and confirms adding, then use toggleBotIsAddedToAttachmentMenu to add the bot. If the attachment menu bot can't be used in the opened chat, show an error to the user. If the bot is added to attachment menu and can be used in the chat, then use openWebApp with the given URL.
         */
        public InternalLinkTypeAttachmentMenuBot() {
        }

        /**
         * The link is a link to an attachment menu bot to be opened in the specified or a chosen chat. Process given targetChat to open the chat. Then, call searchPublicChat with the given bot username, check that the user is a bot and can be added to attachment menu. Then, use getAttachmentMenuBot to receive information about the bot. If the bot isn't added to attachment menu, then show a disclaimer about Mini Apps being third-party applications, ask the user to accept their Terms of service and confirm adding the bot to side and attachment menu. If the user accept the terms and confirms adding, then use toggleBotIsAddedToAttachmentMenu to add the bot. If the attachment menu bot can't be used in the opened chat, show an error to the user. If the bot is added to attachment menu and can be used in the chat, then use openWebApp with the given URL.
         *
         * @param targetChat Target chat to be opened.
         * @param botUsername Username of the bot.
         * @param url URL to be passed to openWebApp.
         */
        public InternalLinkTypeAttachmentMenuBot(TargetChat targetChat, String botUsername, String url) {
            this.targetChat = targetChat;
            this.botUsername = botUsername;
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1682719269;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link contains an authentication code. Call checkAuthenticationCode with the code if the current authorization state is authorizationStateWaitCode.
     */
    public static class InternalLinkTypeAuthenticationCode extends InternalLinkType {
        /**
         * The authentication code.
         */
        public String code;

        /**
         * The link contains an authentication code. Call checkAuthenticationCode with the code if the current authorization state is authorizationStateWaitCode.
         */
        public InternalLinkTypeAuthenticationCode() {
        }

        /**
         * The link contains an authentication code. Call checkAuthenticationCode with the code if the current authorization state is authorizationStateWaitCode.
         *
         * @param code The authentication code.
         */
        public InternalLinkTypeAuthenticationCode(String code) {
            this.code = code;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -209235982;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a background. Call searchBackground with the given background name to process the link. If background is found and the user wants to apply it, then call setDefaultBackground.
     */
    public static class InternalLinkTypeBackground extends InternalLinkType {
        /**
         * Name of the background.
         */
        public String backgroundName;

        /**
         * The link is a link to a background. Call searchBackground with the given background name to process the link. If background is found and the user wants to apply it, then call setDefaultBackground.
         */
        public InternalLinkTypeBackground() {
        }

        /**
         * The link is a link to a background. Call searchBackground with the given background name to process the link. If background is found and the user wants to apply it, then call setDefaultBackground.
         *
         * @param backgroundName Name of the background.
         */
        public InternalLinkTypeBackground(String backgroundName) {
            this.backgroundName = backgroundName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 185411848;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a Telegram bot, which is expected to be added to a channel chat as an administrator. Call searchPublicChat with the given bot username and check that the user is a bot, ask the current user to select a channel chat to add the bot to as an administrator. Then, call getChatMember to receive the current bot rights in the chat and if the bot already is an administrator, check that the current user can edit its administrator rights and combine received rights with the requested administrator rights. Then, show confirmation box to the user, and call setChatMemberStatus with the chosen chat and confirmed rights.
     */
    public static class InternalLinkTypeBotAddToChannel extends InternalLinkType {
        /**
         * Username of the bot.
         */
        public String botUsername;
        /**
         * Expected administrator rights for the bot.
         */
        public ChatAdministratorRights administratorRights;

        /**
         * The link is a link to a Telegram bot, which is expected to be added to a channel chat as an administrator. Call searchPublicChat with the given bot username and check that the user is a bot, ask the current user to select a channel chat to add the bot to as an administrator. Then, call getChatMember to receive the current bot rights in the chat and if the bot already is an administrator, check that the current user can edit its administrator rights and combine received rights with the requested administrator rights. Then, show confirmation box to the user, and call setChatMemberStatus with the chosen chat and confirmed rights.
         */
        public InternalLinkTypeBotAddToChannel() {
        }

        /**
         * The link is a link to a Telegram bot, which is expected to be added to a channel chat as an administrator. Call searchPublicChat with the given bot username and check that the user is a bot, ask the current user to select a channel chat to add the bot to as an administrator. Then, call getChatMember to receive the current bot rights in the chat and if the bot already is an administrator, check that the current user can edit its administrator rights and combine received rights with the requested administrator rights. Then, show confirmation box to the user, and call setChatMemberStatus with the chosen chat and confirmed rights.
         *
         * @param botUsername Username of the bot.
         * @param administratorRights Expected administrator rights for the bot.
         */
        public InternalLinkTypeBotAddToChannel(String botUsername, ChatAdministratorRights administratorRights) {
            this.botUsername = botUsername;
            this.administratorRights = administratorRights;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1401602752;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a chat with a Telegram bot. Call searchPublicChat with the given bot username, check that the user is a bot, show START button in the chat with the bot, and then call sendBotStartMessage with the given start parameter after the button is pressed.
     */
    public static class InternalLinkTypeBotStart extends InternalLinkType {
        /**
         * Username of the bot.
         */
        public String botUsername;
        /**
         * The parameter to be passed to sendBotStartMessage.
         */
        public String startParameter;
        /**
         * True, if sendBotStartMessage must be called automatically without showing the START button.
         */
        public boolean autostart;

        /**
         * The link is a link to a chat with a Telegram bot. Call searchPublicChat with the given bot username, check that the user is a bot, show START button in the chat with the bot, and then call sendBotStartMessage with the given start parameter after the button is pressed.
         */
        public InternalLinkTypeBotStart() {
        }

        /**
         * The link is a link to a chat with a Telegram bot. Call searchPublicChat with the given bot username, check that the user is a bot, show START button in the chat with the bot, and then call sendBotStartMessage with the given start parameter after the button is pressed.
         *
         * @param botUsername Username of the bot.
         * @param startParameter The parameter to be passed to sendBotStartMessage.
         * @param autostart True, if sendBotStartMessage must be called automatically without showing the START button.
         */
        public InternalLinkTypeBotStart(String botUsername, String startParameter, boolean autostart) {
            this.botUsername = botUsername;
            this.startParameter = startParameter;
            this.autostart = autostart;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1066950637;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a Telegram bot, which is expected to be added to a group chat. Call searchPublicChat with the given bot username, check that the user is a bot and can be added to groups, ask the current user to select a basic group or a supergroup chat to add the bot to, taking into account that bots can be added to a public supergroup only by administrators of the supergroup. If administrator rights are provided by the link, call getChatMember to receive the current bot rights in the chat and if the bot already is an administrator, check that the current user can edit its administrator rights, combine received rights with the requested administrator rights, show confirmation box to the user, and call setChatMemberStatus with the chosen chat and confirmed administrator rights. Before call to setChatMemberStatus it may be required to upgrade the chosen basic group chat to a supergroup chat. Then, if startParameter isn't empty, call sendBotStartMessage with the given start parameter and the chosen chat; otherwise, just send /start message with bot's username added to the chat.
     */
    public static class InternalLinkTypeBotStartInGroup extends InternalLinkType {
        /**
         * Username of the bot.
         */
        public String botUsername;
        /**
         * The parameter to be passed to sendBotStartMessage.
         */
        public String startParameter;
        /**
         * Expected administrator rights for the bot; may be null.
         */
        @Nullable public ChatAdministratorRights administratorRights;

        /**
         * The link is a link to a Telegram bot, which is expected to be added to a group chat. Call searchPublicChat with the given bot username, check that the user is a bot and can be added to groups, ask the current user to select a basic group or a supergroup chat to add the bot to, taking into account that bots can be added to a public supergroup only by administrators of the supergroup. If administrator rights are provided by the link, call getChatMember to receive the current bot rights in the chat and if the bot already is an administrator, check that the current user can edit its administrator rights, combine received rights with the requested administrator rights, show confirmation box to the user, and call setChatMemberStatus with the chosen chat and confirmed administrator rights. Before call to setChatMemberStatus it may be required to upgrade the chosen basic group chat to a supergroup chat. Then, if startParameter isn't empty, call sendBotStartMessage with the given start parameter and the chosen chat; otherwise, just send /start message with bot's username added to the chat.
         */
        public InternalLinkTypeBotStartInGroup() {
        }

        /**
         * The link is a link to a Telegram bot, which is expected to be added to a group chat. Call searchPublicChat with the given bot username, check that the user is a bot and can be added to groups, ask the current user to select a basic group or a supergroup chat to add the bot to, taking into account that bots can be added to a public supergroup only by administrators of the supergroup. If administrator rights are provided by the link, call getChatMember to receive the current bot rights in the chat and if the bot already is an administrator, check that the current user can edit its administrator rights, combine received rights with the requested administrator rights, show confirmation box to the user, and call setChatMemberStatus with the chosen chat and confirmed administrator rights. Before call to setChatMemberStatus it may be required to upgrade the chosen basic group chat to a supergroup chat. Then, if startParameter isn't empty, call sendBotStartMessage with the given start parameter and the chosen chat; otherwise, just send /start message with bot's username added to the chat.
         *
         * @param botUsername Username of the bot.
         * @param startParameter The parameter to be passed to sendBotStartMessage.
         * @param administratorRights Expected administrator rights for the bot; may be null.
         */
        public InternalLinkTypeBotStartInGroup(String botUsername, String startParameter, ChatAdministratorRights administratorRights) {
            this.botUsername = botUsername;
            this.startParameter = startParameter;
            this.administratorRights = administratorRights;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -905081650;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a business chat. Use getBusinessChatLinkInfo with the provided link name to get information about the link, then open received private chat and replace chat draft with the provided text.
     */
    public static class InternalLinkTypeBusinessChat extends InternalLinkType {
        /**
         * Name of the link.
         */
        public String linkName;

        /**
         * The link is a link to a business chat. Use getBusinessChatLinkInfo with the provided link name to get information about the link, then open received private chat and replace chat draft with the provided text.
         */
        public InternalLinkTypeBusinessChat() {
        }

        /**
         * The link is a link to a business chat. Use getBusinessChatLinkInfo with the provided link name to get information about the link, then open received private chat and replace chat draft with the provided text.
         *
         * @param linkName Name of the link.
         */
        public InternalLinkTypeBusinessChat(String linkName) {
            this.linkName = linkName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1606751785;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to the Call tab or page.
     */
    public static class InternalLinkTypeCallsPage extends InternalLinkType {
        /**
         * Section of the page; may be one of &quot;&quot;, &quot;all&quot;, &quot;missed&quot;, &quot;edit&quot;, &quot;show-tab&quot;, &quot;start-call&quot;.
         */
        public String section;

        /**
         * The link is a link to the Call tab or page.
         */
        public InternalLinkTypeCallsPage() {
        }

        /**
         * The link is a link to the Call tab or page.
         *
         * @param section Section of the page; may be one of &quot;&quot;, &quot;all&quot;, &quot;missed&quot;, &quot;edit&quot;, &quot;show-tab&quot;, &quot;start-call&quot;.
         */
        public InternalLinkTypeCallsPage(String section) {
            this.section = section;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -718405184;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is an affiliate program link. Call searchChatAffiliateProgram with the given username and referrer to process the link.
     */
    public static class InternalLinkTypeChatAffiliateProgram extends InternalLinkType {
        /**
         * Username to be passed to searchChatAffiliateProgram.
         */
        public String username;
        /**
         * Referrer to be passed to searchChatAffiliateProgram.
         */
        public String referrer;

        /**
         * The link is an affiliate program link. Call searchChatAffiliateProgram with the given username and referrer to process the link.
         */
        public InternalLinkTypeChatAffiliateProgram() {
        }

        /**
         * The link is an affiliate program link. Call searchChatAffiliateProgram with the given username and referrer to process the link.
         *
         * @param username Username to be passed to searchChatAffiliateProgram.
         * @param referrer Referrer to be passed to searchChatAffiliateProgram.
         */
        public InternalLinkTypeChatAffiliateProgram(String username, String referrer) {
            this.username = username;
            this.referrer = referrer;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 632049700;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to boost a Telegram chat. Call getChatBoostLinkInfo with the given URL to process the link. If the chat is found, then call getChatBoostStatus and getAvailableChatBoostSlots to get the current boost status and check whether the chat can be boosted. If the user wants to boost the chat and the chat can be boosted, then call boostChat.
     */
    public static class InternalLinkTypeChatBoost extends InternalLinkType {
        /**
         * URL to be passed to getChatBoostLinkInfo.
         */
        public String url;

        /**
         * The link is a link to boost a Telegram chat. Call getChatBoostLinkInfo with the given URL to process the link. If the chat is found, then call getChatBoostStatus and getAvailableChatBoostSlots to get the current boost status and check whether the chat can be boosted. If the user wants to boost the chat and the chat can be boosted, then call boostChat.
         */
        public InternalLinkTypeChatBoost() {
        }

        /**
         * The link is a link to boost a Telegram chat. Call getChatBoostLinkInfo with the given URL to process the link. If the chat is found, then call getChatBoostStatus and getAvailableChatBoostSlots to get the current boost status and check whether the chat can be boosted. If the user wants to boost the chat and the chat can be boosted, then call boostChat.
         *
         * @param url URL to be passed to getChatBoostLinkInfo.
         */
        public InternalLinkTypeChatBoost(String url) {
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -716571328;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is an invite link to a chat folder. Call checkChatFolderInviteLink with the given invite link to process the link. If the link is valid and the user wants to join the chat folder, then call addChatFolderByInviteLink.
     */
    public static class InternalLinkTypeChatFolderInvite extends InternalLinkType {
        /**
         * Internal representation of the invite link.
         */
        public String inviteLink;

        /**
         * The link is an invite link to a chat folder. Call checkChatFolderInviteLink with the given invite link to process the link. If the link is valid and the user wants to join the chat folder, then call addChatFolderByInviteLink.
         */
        public InternalLinkTypeChatFolderInvite() {
        }

        /**
         * The link is an invite link to a chat folder. Call checkChatFolderInviteLink with the given invite link to process the link. If the link is valid and the user wants to join the chat folder, then call addChatFolderByInviteLink.
         *
         * @param inviteLink Internal representation of the invite link.
         */
        public InternalLinkTypeChatFolderInvite(String inviteLink) {
            this.inviteLink = inviteLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1984804546;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a chat invite link. Call checkChatInviteLink with the given invite link to process the link. If the link is valid and the user wants to join the chat, then call joinChatByInviteLink.
     */
    public static class InternalLinkTypeChatInvite extends InternalLinkType {
        /**
         * Internal representation of the invite link.
         */
        public String inviteLink;

        /**
         * The link is a chat invite link. Call checkChatInviteLink with the given invite link to process the link. If the link is valid and the user wants to join the chat, then call joinChatByInviteLink.
         */
        public InternalLinkTypeChatInvite() {
        }

        /**
         * The link is a chat invite link. Call checkChatInviteLink with the given invite link to process the link. If the link is valid and the user wants to join the chat, then call joinChatByInviteLink.
         *
         * @param inviteLink Internal representation of the invite link.
         */
        public InternalLinkTypeChatInvite(String inviteLink) {
            this.inviteLink = inviteLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 428621017;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link that allows to select some chats.
     */
    public static class InternalLinkTypeChatSelection extends InternalLinkType {

        /**
         * The link is a link that allows to select some chats.
         */
        public InternalLinkTypeChatSelection() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 621470813;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to the Contacts tab or page.
     */
    public static class InternalLinkTypeContactsPage extends InternalLinkType {
        /**
         * Section of the page; may be one of &quot;&quot;, &quot;search&quot;, &quot;sort&quot;, &quot;new&quot;, &quot;invite&quot;, &quot;manage&quot;.
         */
        public String section;

        /**
         * The link is a link to the Contacts tab or page.
         */
        public InternalLinkTypeContactsPage() {
        }

        /**
         * The link is a link to the Contacts tab or page.
         *
         * @param section Section of the page; may be one of &quot;&quot;, &quot;search&quot;, &quot;sort&quot;, &quot;new&quot;, &quot;invite&quot;, &quot;manage&quot;.
         */
        public InternalLinkTypeContactsPage(String section) {
            this.section = section;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 412195917;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a channel direct messages chat by username of the channel. Call searchPublicChat with the given chat username to process the link. If the chat is found and is channel, open the direct messages chat of the channel.
     */
    public static class InternalLinkTypeDirectMessagesChat extends InternalLinkType {
        /**
         * Username of the channel.
         */
        public String channelUsername;

        /**
         * The link is a link to a channel direct messages chat by username of the channel. Call searchPublicChat with the given chat username to process the link. If the chat is found and is channel, open the direct messages chat of the channel.
         */
        public InternalLinkTypeDirectMessagesChat() {
        }

        /**
         * The link is a link to a channel direct messages chat by username of the channel. Call searchPublicChat with the given chat username to process the link. If the chat is found and is channel, open the direct messages chat of the channel.
         *
         * @param channelUsername Username of the channel.
         */
        public InternalLinkTypeDirectMessagesChat(String channelUsername) {
            this.channelUsername = channelUsername;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1795016752;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a game. Call searchPublicChat with the given bot username, check that the user is a bot, ask the current user to select a chat to send the game, and then call sendMessage with inputMessageGame.
     */
    public static class InternalLinkTypeGame extends InternalLinkType {
        /**
         * Username of the bot that owns the game.
         */
        public String botUsername;
        /**
         * Short name of the game.
         */
        public String gameShortName;

        /**
         * The link is a link to a game. Call searchPublicChat with the given bot username, check that the user is a bot, ask the current user to select a chat to send the game, and then call sendMessage with inputMessageGame.
         */
        public InternalLinkTypeGame() {
        }

        /**
         * The link is a link to a game. Call searchPublicChat with the given bot username, check that the user is a bot, ask the current user to select a chat to send the game, and then call sendMessage with inputMessageGame.
         *
         * @param botUsername Username of the bot that owns the game.
         * @param gameShortName Short name of the game.
         */
        public InternalLinkTypeGame(String botUsername, String gameShortName) {
            this.botUsername = botUsername;
            this.gameShortName = gameShortName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -260788787;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a gift auction. Call getGiftAuctionState with the given auction identifier to process the link.
     */
    public static class InternalLinkTypeGiftAuction extends InternalLinkType {
        /**
         * Unique identifier of the auction.
         */
        public String auctionId;

        /**
         * The link is a link to a gift auction. Call getGiftAuctionState with the given auction identifier to process the link.
         */
        public InternalLinkTypeGiftAuction() {
        }

        /**
         * The link is a link to a gift auction. Call getGiftAuctionState with the given auction identifier to process the link.
         *
         * @param auctionId Unique identifier of the auction.
         */
        public InternalLinkTypeGiftAuction(String auctionId) {
            this.auctionId = auctionId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1724902818;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a gift collection. Call searchPublicChat with the given username, then call getReceivedGifts with the received gift owner identifier and the given collection identifier, then show the collection if received.
     */
    public static class InternalLinkTypeGiftCollection extends InternalLinkType {
        /**
         * Username of the owner of the gift collection.
         */
        public String giftOwnerUsername;
        /**
         * Gift collection identifier.
         */
        public int collectionId;

        /**
         * The link is a link to a gift collection. Call searchPublicChat with the given username, then call getReceivedGifts with the received gift owner identifier and the given collection identifier, then show the collection if received.
         */
        public InternalLinkTypeGiftCollection() {
        }

        /**
         * The link is a link to a gift collection. Call searchPublicChat with the given username, then call getReceivedGifts with the received gift owner identifier and the given collection identifier, then show the collection if received.
         *
         * @param giftOwnerUsername Username of the owner of the gift collection.
         * @param collectionId Gift collection identifier.
         */
        public InternalLinkTypeGiftCollection(String giftOwnerUsername, int collectionId) {
            this.giftOwnerUsername = giftOwnerUsername;
            this.collectionId = collectionId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -812480347;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a group call that isn't bound to a chat. Use getGroupCallParticipants to get the list of group call participants and show them on the join group call screen. Call joinGroupCall with the given inviteLink to join the call.
     */
    public static class InternalLinkTypeGroupCall extends InternalLinkType {
        /**
         * Internal representation of the invite link.
         */
        public String inviteLink;

        /**
         * The link is a link to a group call that isn't bound to a chat. Use getGroupCallParticipants to get the list of group call participants and show them on the join group call screen. Call joinGroupCall with the given inviteLink to join the call.
         */
        public InternalLinkTypeGroupCall() {
        }

        /**
         * The link is a link to a group call that isn't bound to a chat. Use getGroupCallParticipants to get the list of group call participants and show them on the join group call screen. Call joinGroupCall with the given inviteLink to join the call.
         *
         * @param inviteLink Internal representation of the invite link.
         */
        public InternalLinkTypeGroupCall(String inviteLink) {
            this.inviteLink = inviteLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1953084438;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link must be opened in an Instant View. Call getWebPageInstantView with the given URL to process the link. If Instant View is found, then show it, otherwise, open the fallback URL in an external browser.
     */
    public static class InternalLinkTypeInstantView extends InternalLinkType {
        /**
         * URL to be passed to getWebPageInstantView.
         */
        public String url;
        /**
         * An URL to open if getWebPageInstantView fails.
         */
        public String fallbackUrl;

        /**
         * The link must be opened in an Instant View. Call getWebPageInstantView with the given URL to process the link. If Instant View is found, then show it, otherwise, open the fallback URL in an external browser.
         */
        public InternalLinkTypeInstantView() {
        }

        /**
         * The link must be opened in an Instant View. Call getWebPageInstantView with the given URL to process the link. If Instant View is found, then show it, otherwise, open the fallback URL in an external browser.
         *
         * @param url URL to be passed to getWebPageInstantView.
         * @param fallbackUrl An URL to open if getWebPageInstantView fails.
         */
        public InternalLinkTypeInstantView(String url, String fallbackUrl) {
            this.url = url;
            this.fallbackUrl = fallbackUrl;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1776607039;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to an invoice. Call getPaymentForm with the given invoice name to process the link.
     */
    public static class InternalLinkTypeInvoice extends InternalLinkType {
        /**
         * Name of the invoice.
         */
        public String invoiceName;

        /**
         * The link is a link to an invoice. Call getPaymentForm with the given invoice name to process the link.
         */
        public InternalLinkTypeInvoice() {
        }

        /**
         * The link is a link to an invoice. Call getPaymentForm with the given invoice name to process the link.
         *
         * @param invoiceName Name of the invoice.
         */
        public InternalLinkTypeInvoice(String invoiceName) {
            this.invoiceName = invoiceName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -213094996;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a language pack. Call getLanguagePackInfo with the given language pack identifier to process the link. If the language pack is found and the user wants to apply it, then call setOption for the option &quot;language_pack_id&quot;.
     */
    public static class InternalLinkTypeLanguagePack extends InternalLinkType {
        /**
         * Language pack identifier.
         */
        public String languagePackId;

        /**
         * The link is a link to a language pack. Call getLanguagePackInfo with the given language pack identifier to process the link. If the language pack is found and the user wants to apply it, then call setOption for the option &quot;language_pack_id&quot;.
         */
        public InternalLinkTypeLanguagePack() {
        }

        /**
         * The link is a link to a language pack. Call getLanguagePackInfo with the given language pack identifier to process the link. If the language pack is found and the user wants to apply it, then call setOption for the option &quot;language_pack_id&quot;.
         *
         * @param languagePackId Language pack identifier.
         */
        public InternalLinkTypeLanguagePack(String languagePackId) {
            this.languagePackId = languagePackId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1450766996;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a live story. Call searchPublicChat with the given chat username, then getChatActiveStories to get active stories in the chat, then find a live story among active stories of the chat, and then joinLiveStory to join the live story.
     */
    public static class InternalLinkTypeLiveStory extends InternalLinkType {
        /**
         * Username of the poster of the story.
         */
        public String storyPosterUsername;

        /**
         * The link is a link to a live story. Call searchPublicChat with the given chat username, then getChatActiveStories to get active stories in the chat, then find a live story among active stories of the chat, and then joinLiveStory to join the live story.
         */
        public InternalLinkTypeLiveStory() {
        }

        /**
         * The link is a link to a live story. Call searchPublicChat with the given chat username, then getChatActiveStories to get active stories in the chat, then find a live story among active stories of the chat, and then joinLiveStory to join the live story.
         *
         * @param storyPosterUsername Username of the poster of the story.
         */
        public InternalLinkTypeLiveStory(String storyPosterUsername) {
            this.storyPosterUsername = storyPosterUsername;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 665614717;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to the main Web App of a bot. Call searchPublicChat with the given bot username, check that the user is a bot and has the main Web App. If the bot can be added to attachment menu, then use getAttachmentMenuBot to receive information about the bot, then if the bot isn't added to side menu, show a disclaimer about Mini Apps being third-party applications, ask the user to accept their Terms of service and confirm adding the bot to side and attachment menu, then if the user accepts the terms and confirms adding, use toggleBotIsAddedToAttachmentMenu to add the bot. Then, use getMainWebApp with the given start parameter and mode and open the returned URL as a Web App.
     */
    public static class InternalLinkTypeMainWebApp extends InternalLinkType {
        /**
         * Username of the bot.
         */
        public String botUsername;
        /**
         * Start parameter to be passed to getMainWebApp.
         */
        public String startParameter;
        /**
         * The mode to be passed to getMainWebApp.
         */
        public WebAppOpenMode mode;

        /**
         * The link is a link to the main Web App of a bot. Call searchPublicChat with the given bot username, check that the user is a bot and has the main Web App. If the bot can be added to attachment menu, then use getAttachmentMenuBot to receive information about the bot, then if the bot isn't added to side menu, show a disclaimer about Mini Apps being third-party applications, ask the user to accept their Terms of service and confirm adding the bot to side and attachment menu, then if the user accepts the terms and confirms adding, use toggleBotIsAddedToAttachmentMenu to add the bot. Then, use getMainWebApp with the given start parameter and mode and open the returned URL as a Web App.
         */
        public InternalLinkTypeMainWebApp() {
        }

        /**
         * The link is a link to the main Web App of a bot. Call searchPublicChat with the given bot username, check that the user is a bot and has the main Web App. If the bot can be added to attachment menu, then use getAttachmentMenuBot to receive information about the bot, then if the bot isn't added to side menu, show a disclaimer about Mini Apps being third-party applications, ask the user to accept their Terms of service and confirm adding the bot to side and attachment menu, then if the user accepts the terms and confirms adding, use toggleBotIsAddedToAttachmentMenu to add the bot. Then, use getMainWebApp with the given start parameter and mode and open the returned URL as a Web App.
         *
         * @param botUsername Username of the bot.
         * @param startParameter Start parameter to be passed to getMainWebApp.
         * @param mode The mode to be passed to getMainWebApp.
         */
        public InternalLinkTypeMainWebApp(String botUsername, String startParameter, WebAppOpenMode mode) {
            this.botUsername = botUsername;
            this.startParameter = startParameter;
            this.mode = mode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1574925033;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a Telegram message or a forum topic. Call getMessageLinkInfo with the given URL to process the link, and then open received forum topic or chat and show the message there.
     */
    public static class InternalLinkTypeMessage extends InternalLinkType {
        /**
         * URL to be passed to getMessageLinkInfo.
         */
        public String url;

        /**
         * The link is a link to a Telegram message or a forum topic. Call getMessageLinkInfo with the given URL to process the link, and then open received forum topic or chat and show the message there.
         */
        public InternalLinkTypeMessage() {
        }

        /**
         * The link is a link to a Telegram message or a forum topic. Call getMessageLinkInfo with the given URL to process the link, and then open received forum topic or chat and show the message there.
         *
         * @param url URL to be passed to getMessageLinkInfo.
         */
        public InternalLinkTypeMessage(String url) {
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 978541650;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link contains a message draft text. A share screen needs to be shown to the user, then the chosen chat must be opened and the text is added to the input field.
     */
    public static class InternalLinkTypeMessageDraft extends InternalLinkType {
        /**
         * Message draft text.
         */
        public FormattedText text;
        /**
         * True, if the first line of the text contains a link. If true, the input field needs to be focused and the text after the link must be selected.
         */
        public boolean containsLink;

        /**
         * The link contains a message draft text. A share screen needs to be shown to the user, then the chosen chat must be opened and the text is added to the input field.
         */
        public InternalLinkTypeMessageDraft() {
        }

        /**
         * The link contains a message draft text. A share screen needs to be shown to the user, then the chosen chat must be opened and the text is added to the input field.
         *
         * @param text Message draft text.
         * @param containsLink True, if the first line of the text contains a link. If true, the input field needs to be focused and the text after the link must be selected.
         */
        public InternalLinkTypeMessageDraft(FormattedText text, boolean containsLink) {
            this.text = text;
            this.containsLink = containsLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 661633749;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to the My Profile application page.
     */
    public static class InternalLinkTypeMyProfilePage extends InternalLinkType {
        /**
         * Section of the page; may be one of &quot;&quot;, &quot;posts&quot;, &quot;posts/all-stories&quot;, &quot;posts/add-album&quot;, &quot;gifts&quot;, &quot;archived-posts&quot;.
         */
        public String section;

        /**
         * The link is a link to the My Profile application page.
         */
        public InternalLinkTypeMyProfilePage() {
        }

        /**
         * The link is a link to the My Profile application page.
         *
         * @param section Section of the page; may be one of &quot;&quot;, &quot;posts&quot;, &quot;posts/all-stories&quot;, &quot;posts/add-album&quot;, &quot;gifts&quot;, &quot;archived-posts&quot;.
         */
        public InternalLinkTypeMyProfilePage(String section) {
            this.section = section;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1204697133;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to the screen for creating a new channel chat.
     */
    public static class InternalLinkTypeNewChannelChat extends InternalLinkType {

        /**
         * The link is a link to the screen for creating a new channel chat.
         */
        public InternalLinkTypeNewChannelChat() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -660273891;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to the screen for creating a new group chat.
     */
    public static class InternalLinkTypeNewGroupChat extends InternalLinkType {

        /**
         * The link is a link to the screen for creating a new group chat.
         */
        public InternalLinkTypeNewGroupChat() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -353196057;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to the screen for creating a new private chat with a contact.
     */
    public static class InternalLinkTypeNewPrivateChat extends InternalLinkType {

        /**
         * The link is a link to the screen for creating a new private chat with a contact.
         */
        public InternalLinkTypeNewPrivateChat() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1326134340;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to open the story posting interface.
     */
    public static class InternalLinkTypeNewStory extends InternalLinkType {
        /**
         * The type of the content of the story to post; may be null if unspecified.
         */
        @Nullable public StoryContentType contentType;

        /**
         * The link is a link to open the story posting interface.
         */
        public InternalLinkTypeNewStory() {
        }

        /**
         * The link is a link to open the story posting interface.
         *
         * @param contentType The type of the content of the story to post; may be null if unspecified.
         */
        public InternalLinkTypeNewStory(StoryContentType contentType) {
            this.contentType = contentType;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1637792663;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is an OAuth link. Call getOauthLinkInfo with the given URL to process the link if the link was received from outside of the application; otherwise, ignore it. After getOauthLinkInfo, show the user confirmation dialog and process it with checkOauthRequestMatchCode, acceptOauthRequest or declineOauthRequest.
     */
    public static class InternalLinkTypeOauth extends InternalLinkType {
        /**
         * URL to be passed to getOauthLinkInfo.
         */
        public String url;

        /**
         * The link is an OAuth link. Call getOauthLinkInfo with the given URL to process the link if the link was received from outside of the application; otherwise, ignore it. After getOauthLinkInfo, show the user confirmation dialog and process it with checkOauthRequestMatchCode, acceptOauthRequest or declineOauthRequest.
         */
        public InternalLinkTypeOauth() {
        }

        /**
         * The link is an OAuth link. Call getOauthLinkInfo with the given URL to process the link if the link was received from outside of the application; otherwise, ignore it. After getOauthLinkInfo, show the user confirmation dialog and process it with checkOauthRequestMatchCode, acceptOauthRequest or declineOauthRequest.
         *
         * @param url URL to be passed to getOauthLinkInfo.
         */
        public InternalLinkTypeOauth(String url) {
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 263255628;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link contains a request of Telegram passport data. Call getPassportAuthorizationForm with the given parameters to process the link if the link was received from outside of the application; otherwise, ignore it.
     */
    public static class InternalLinkTypePassportDataRequest extends InternalLinkType {
        /**
         * User identifier of the service's bot; the corresponding user may be unknown yet.
         */
        public long botUserId;
        /**
         * Telegram Passport element types requested by the service.
         */
        public String scope;
        /**
         * Service's public key.
         */
        public String publicKey;
        /**
         * Unique request identifier provided by the service.
         */
        public String nonce;
        /**
         * An HTTP URL to open once the request is finished, canceled, or failed with the parameters tgPassport=success, tgPassport=cancel, or tgPassport=error&amp;error=... respectively. If empty, then onActivityResult method must be used to return response on Android, or the link tgbot{botUserId}://passport/success or tgbot{botUserId}://passport/cancel must be opened otherwise.
         */
        public String callbackUrl;

        /**
         * The link contains a request of Telegram passport data. Call getPassportAuthorizationForm with the given parameters to process the link if the link was received from outside of the application; otherwise, ignore it.
         */
        public InternalLinkTypePassportDataRequest() {
        }

        /**
         * The link contains a request of Telegram passport data. Call getPassportAuthorizationForm with the given parameters to process the link if the link was received from outside of the application; otherwise, ignore it.
         *
         * @param botUserId User identifier of the service's bot; the corresponding user may be unknown yet.
         * @param scope Telegram Passport element types requested by the service.
         * @param publicKey Service's public key.
         * @param nonce Unique request identifier provided by the service.
         * @param callbackUrl An HTTP URL to open once the request is finished, canceled, or failed with the parameters tgPassport=success, tgPassport=cancel, or tgPassport=error&amp;error=... respectively. If empty, then onActivityResult method must be used to return response on Android, or the link tgbot{botUserId}://passport/success or tgbot{botUserId}://passport/cancel must be opened otherwise.
         */
        public InternalLinkTypePassportDataRequest(long botUserId, String scope, String publicKey, String nonce, String callbackUrl) {
            this.botUserId = botUserId;
            this.scope = scope;
            this.publicKey = publicKey;
            this.nonce = nonce;
            this.callbackUrl = callbackUrl;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -988819839;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link can be used to confirm ownership of a phone number to prevent account deletion. Call sendPhoneNumberCode with the given phone number and with phoneNumberCodeTypeConfirmOwnership with the given hash to process the link. If succeeded, call checkPhoneNumberCode to check entered by the user code, or resendPhoneNumberCode to resend it.
     */
    public static class InternalLinkTypePhoneNumberConfirmation extends InternalLinkType {
        /**
         * Hash value from the link.
         */
        public String hash;
        /**
         * Phone number value from the link.
         */
        public String phoneNumber;

        /**
         * The link can be used to confirm ownership of a phone number to prevent account deletion. Call sendPhoneNumberCode with the given phone number and with phoneNumberCodeTypeConfirmOwnership with the given hash to process the link. If succeeded, call checkPhoneNumberCode to check entered by the user code, or resendPhoneNumberCode to resend it.
         */
        public InternalLinkTypePhoneNumberConfirmation() {
        }

        /**
         * The link can be used to confirm ownership of a phone number to prevent account deletion. Call sendPhoneNumberCode with the given phone number and with phoneNumberCodeTypeConfirmOwnership with the given hash to process the link. If succeeded, call checkPhoneNumberCode to check entered by the user code, or resendPhoneNumberCode to resend it.
         *
         * @param hash Hash value from the link.
         * @param phoneNumber Phone number value from the link.
         */
        public InternalLinkTypePhoneNumberConfirmation(String hash, String phoneNumber) {
            this.hash = hash;
            this.phoneNumber = phoneNumber;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1757375254;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to the Premium features screen of the application from which the user can subscribe to Telegram Premium. Call getPremiumFeatures with the given referrer to process the link.
     */
    public static class InternalLinkTypePremiumFeaturesPage extends InternalLinkType {
        /**
         * Referrer specified in the link.
         */
        public String referrer;

        /**
         * The link is a link to the Premium features screen of the application from which the user can subscribe to Telegram Premium. Call getPremiumFeatures with the given referrer to process the link.
         */
        public InternalLinkTypePremiumFeaturesPage() {
        }

        /**
         * The link is a link to the Premium features screen of the application from which the user can subscribe to Telegram Premium. Call getPremiumFeatures with the given referrer to process the link.
         *
         * @param referrer Referrer specified in the link.
         */
        public InternalLinkTypePremiumFeaturesPage(String referrer) {
            this.referrer = referrer;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -626346401;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link with a Telegram Premium gift code. Call checkPremiumGiftCode with the given code to process the link. If the code is valid and the user wants to apply it, then call applyPremiumGiftCode.
     */
    public static class InternalLinkTypePremiumGiftCode extends InternalLinkType {
        /**
         * The Telegram Premium gift code.
         */
        public String code;

        /**
         * The link is a link with a Telegram Premium gift code. Call checkPremiumGiftCode with the given code to process the link. If the code is valid and the user wants to apply it, then call applyPremiumGiftCode.
         */
        public InternalLinkTypePremiumGiftCode() {
        }

        /**
         * The link is a link with a Telegram Premium gift code. Call checkPremiumGiftCode with the given code to process the link. If the code is valid and the user wants to apply it, then call applyPremiumGiftCode.
         *
         * @param code The Telegram Premium gift code.
         */
        public InternalLinkTypePremiumGiftCode(String code) {
            this.code = code;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -564356974;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to the screen for gifting Telegram Premium subscriptions to friends via inputInvoiceTelegram with telegramPaymentPurposePremiumGift payments or in-store purchases.
     */
    public static class InternalLinkTypePremiumGiftPurchase extends InternalLinkType {
        /**
         * Referrer specified in the link.
         */
        public String referrer;

        /**
         * The link is a link to the screen for gifting Telegram Premium subscriptions to friends via inputInvoiceTelegram with telegramPaymentPurposePremiumGift payments or in-store purchases.
         */
        public InternalLinkTypePremiumGiftPurchase() {
        }

        /**
         * The link is a link to the screen for gifting Telegram Premium subscriptions to friends via inputInvoiceTelegram with telegramPaymentPurposePremiumGift payments or in-store purchases.
         *
         * @param referrer Referrer specified in the link.
         */
        public InternalLinkTypePremiumGiftPurchase(String referrer) {
            this.referrer = referrer;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -947456567;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a proxy. Call addProxy with the given parameters to process the link and add the proxy.
     */
    public static class InternalLinkTypeProxy extends InternalLinkType {
        /**
         * The proxy; may be null if the proxy is unsupported, in which case an alert can be shown to the user.
         */
        @Nullable public Proxy proxy;

        /**
         * The link is a link to a proxy. Call addProxy with the given parameters to process the link and add the proxy.
         */
        public InternalLinkTypeProxy() {
        }

        /**
         * The link is a link to a proxy. Call addProxy with the given parameters to process the link and add the proxy.
         *
         * @param proxy The proxy; may be null if the proxy is unsupported, in which case an alert can be shown to the user.
         */
        public InternalLinkTypeProxy(Proxy proxy) {
            this.proxy = proxy;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1592321116;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a chat by its username. Call searchPublicChat with the given chat username to process the link. If the chat is found, open its profile information screen or the chat itself. If draft text isn't empty and the chat is a private chat with a regular user, then put the draft text in the input field.
     */
    public static class InternalLinkTypePublicChat extends InternalLinkType {
        /**
         * Username of the chat.
         */
        public String chatUsername;
        /**
         * Draft text for message to send in the chat.
         */
        public String draftText;
        /**
         * True, if chat profile information screen must be opened; otherwise, the chat itself must be opened.
         */
        public boolean openProfile;

        /**
         * The link is a link to a chat by its username. Call searchPublicChat with the given chat username to process the link. If the chat is found, open its profile information screen or the chat itself. If draft text isn't empty and the chat is a private chat with a regular user, then put the draft text in the input field.
         */
        public InternalLinkTypePublicChat() {
        }

        /**
         * The link is a link to a chat by its username. Call searchPublicChat with the given chat username to process the link. If the chat is found, open its profile information screen or the chat itself. If draft text isn't empty and the chat is a private chat with a regular user, then put the draft text in the input field.
         *
         * @param chatUsername Username of the chat.
         * @param draftText Draft text for message to send in the chat.
         * @param openProfile True, if chat profile information screen must be opened; otherwise, the chat itself must be opened.
         */
        public InternalLinkTypePublicChat(String chatUsername, String draftText, boolean openProfile) {
            this.chatUsername = chatUsername;
            this.draftText = draftText;
            this.openProfile = openProfile;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1769614592;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link can be used to login the current user on another device, but it must be scanned from QR-code using in-app camera. An alert similar to &quot;This code can be used to allow someone to log in to your Telegram account. To confirm Telegram login, please go to Settings &gt; Devices &gt; Scan QR and scan the code&quot; needs to be shown.
     */
    public static class InternalLinkTypeQrCodeAuthentication extends InternalLinkType {

        /**
         * The link can be used to login the current user on another device, but it must be scanned from QR-code using in-app camera. An alert similar to &quot;This code can be used to allow someone to log in to your Telegram account. To confirm Telegram login, please go to Settings &gt; Devices &gt; Scan QR and scan the code&quot; needs to be shown.
         */
        public InternalLinkTypeQrCodeAuthentication() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1089332956;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a dialog for creating of a managed bot. Call searchPublicChat with the given manager bot username. If the chat is found, the chat is a chat with a bot and the bot has canManageBots == true, then show bot creation confirmation dialog with the given suggestedBotUsername and suggestedBotName. If user agrees, call createBot with viaLink == true to create the bot.
     */
    public static class InternalLinkTypeRequestManagedBot extends InternalLinkType {
        /**
         * Username of the bot which will manage the new bot.
         */
        public String managerBotUsername;
        /**
         * Suggested username for the bot; always ends with &quot;bot&quot; case-insensitive.
         */
        public String suggestedBotUsername;
        /**
         * Suggested name for the bot; may be empty if not specified.
         */
        public String suggestedBotName;

        /**
         * The link is a link to a dialog for creating of a managed bot. Call searchPublicChat with the given manager bot username. If the chat is found, the chat is a chat with a bot and the bot has canManageBots == true, then show bot creation confirmation dialog with the given suggestedBotUsername and suggestedBotName. If user agrees, call createBot with viaLink == true to create the bot.
         */
        public InternalLinkTypeRequestManagedBot() {
        }

        /**
         * The link is a link to a dialog for creating of a managed bot. Call searchPublicChat with the given manager bot username. If the chat is found, the chat is a chat with a bot and the bot has canManageBots == true, then show bot creation confirmation dialog with the given suggestedBotUsername and suggestedBotName. If user agrees, call createBot with viaLink == true to create the bot.
         *
         * @param managerBotUsername Username of the bot which will manage the new bot.
         * @param suggestedBotUsername Suggested username for the bot; always ends with &quot;bot&quot; case-insensitive.
         * @param suggestedBotName Suggested name for the bot; may be empty if not specified.
         */
        public InternalLinkTypeRequestManagedBot(String managerBotUsername, String suggestedBotUsername, String suggestedBotName) {
            this.managerBotUsername = managerBotUsername;
            this.suggestedBotUsername = suggestedBotUsername;
            this.suggestedBotName = suggestedBotName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1416354488;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link forces restore of App Store purchases when opened. For official iOS application only.
     */
    public static class InternalLinkTypeRestorePurchases extends InternalLinkType {

        /**
         * The link forces restore of App Store purchases when opened. For official iOS application only.
         */
        public InternalLinkTypeRestorePurchases() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 606090371;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to the Saved Messages chat. Call createPrivateChat with getOption(&quot;my_id&quot;) and open the chat.
     */
    public static class InternalLinkTypeSavedMessages extends InternalLinkType {

        /**
         * The link is a link to the Saved Messages chat. Call createPrivateChat with getOption(&quot;my_id&quot;) and open the chat.
         */
        public InternalLinkTypeSavedMessages() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 248860451;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to the global chat and messages search field.
     */
    public static class InternalLinkTypeSearch extends InternalLinkType {

        /**
         * The link is a link to the global chat and messages search field.
         */
        public InternalLinkTypeSearch() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -591437024;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to application settings.
     */
    public static class InternalLinkTypeSettings extends InternalLinkType {
        /**
         * Section of the application settings to open; may be null if none.
         */
        @Nullable public SettingsSection section;

        /**
         * The link is a link to application settings.
         */
        public InternalLinkTypeSettings() {
        }

        /**
         * The link is a link to application settings.
         *
         * @param section Section of the application settings to open; may be null if none.
         */
        public InternalLinkTypeSettings(SettingsSection section) {
            this.section = section;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 574986998;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to the Telegram Star purchase section of the application.
     */
    public static class InternalLinkTypeStarPurchase extends InternalLinkType {
        /**
         * The number of Telegram Stars that must be owned by the user.
         */
        public long starCount;
        /**
         * Purpose of Telegram Star purchase. Arbitrary string specified by the server, for example, &quot;subs&quot; if the Telegram Stars are required to extend channel subscriptions.
         */
        public String purpose;

        /**
         * The link is a link to the Telegram Star purchase section of the application.
         */
        public InternalLinkTypeStarPurchase() {
        }

        /**
         * The link is a link to the Telegram Star purchase section of the application.
         *
         * @param starCount The number of Telegram Stars that must be owned by the user.
         * @param purpose Purpose of Telegram Star purchase. Arbitrary string specified by the server, for example, &quot;subs&quot; if the Telegram Stars are required to extend channel subscriptions.
         */
        public InternalLinkTypeStarPurchase(long starCount, String purpose) {
            this.starCount = starCount;
            this.purpose = purpose;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -459567298;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a sticker set. Call searchStickerSet with the given sticker set name to process the link and show the sticker set. If the sticker set is found and the user wants to add it, then call changeStickerSet.
     */
    public static class InternalLinkTypeStickerSet extends InternalLinkType {
        /**
         * Name of the sticker set.
         */
        public String stickerSetName;
        /**
         * True, if the sticker set is expected to contain custom emoji.
         */
        public boolean expectCustomEmoji;

        /**
         * The link is a link to a sticker set. Call searchStickerSet with the given sticker set name to process the link and show the sticker set. If the sticker set is found and the user wants to add it, then call changeStickerSet.
         */
        public InternalLinkTypeStickerSet() {
        }

        /**
         * The link is a link to a sticker set. Call searchStickerSet with the given sticker set name to process the link and show the sticker set. If the sticker set is found and the user wants to add it, then call changeStickerSet.
         *
         * @param stickerSetName Name of the sticker set.
         * @param expectCustomEmoji True, if the sticker set is expected to contain custom emoji.
         */
        public InternalLinkTypeStickerSet(String stickerSetName, boolean expectCustomEmoji) {
            this.stickerSetName = stickerSetName;
            this.expectCustomEmoji = expectCustomEmoji;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1589227614;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a story. Call searchPublicChat with the given poster username, then call getStory with the received chat identifier and the given story identifier, then show the story if received.
     */
    public static class InternalLinkTypeStory extends InternalLinkType {
        /**
         * Username of the poster of the story.
         */
        public String storyPosterUsername;
        /**
         * Story identifier.
         */
        public int storyId;

        /**
         * The link is a link to a story. Call searchPublicChat with the given poster username, then call getStory with the received chat identifier and the given story identifier, then show the story if received.
         */
        public InternalLinkTypeStory() {
        }

        /**
         * The link is a link to a story. Call searchPublicChat with the given poster username, then call getStory with the received chat identifier and the given story identifier, then show the story if received.
         *
         * @param storyPosterUsername Username of the poster of the story.
         * @param storyId Story identifier.
         */
        public InternalLinkTypeStory(String storyPosterUsername, int storyId) {
            this.storyPosterUsername = storyPosterUsername;
            this.storyId = storyId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1852042869;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to an album of stories. Call searchPublicChat with the given username, then call getStoryAlbumStories with the received chat identifier and the given story album identifier, then show the story album if received.
     */
    public static class InternalLinkTypeStoryAlbum extends InternalLinkType {
        /**
         * Username of the owner of the story album.
         */
        public String storyAlbumOwnerUsername;
        /**
         * Story album identifier.
         */
        public int storyAlbumId;

        /**
         * The link is a link to an album of stories. Call searchPublicChat with the given username, then call getStoryAlbumStories with the received chat identifier and the given story album identifier, then show the story album if received.
         */
        public InternalLinkTypeStoryAlbum() {
        }

        /**
         * The link is a link to an album of stories. Call searchPublicChat with the given username, then call getStoryAlbumStories with the received chat identifier and the given story album identifier, then show the story album if received.
         *
         * @param storyAlbumOwnerUsername Username of the owner of the story album.
         * @param storyAlbumId Story album identifier.
         */
        public InternalLinkTypeStoryAlbum(String storyAlbumOwnerUsername, int storyAlbumId) {
            this.storyAlbumOwnerUsername = storyAlbumOwnerUsername;
            this.storyAlbumId = storyAlbumId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -332692184;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a text composition style. Call searchTextCompositionStyle with the given style name to get information about the style. If the style is found and the user wants to add it, then call addTextCompositionStyle.
     */
    public static class InternalLinkTypeTextCompositionStyle extends InternalLinkType {
        /**
         * Name of the style.
         */
        public String styleName;

        /**
         * The link is a link to a text composition style. Call searchTextCompositionStyle with the given style name to get information about the style. If the style is found and the user wants to add it, then call addTextCompositionStyle.
         */
        public InternalLinkTypeTextCompositionStyle() {
        }

        /**
         * The link is a link to a text composition style. Call searchTextCompositionStyle with the given style name to get information about the style. If the style is found and the user wants to add it, then call addTextCompositionStyle.
         *
         * @param styleName Name of the style.
         */
        public InternalLinkTypeTextCompositionStyle(String styleName) {
            this.styleName = styleName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2055372583;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a cloud theme. TDLib has no theme support yet.
     */
    public static class InternalLinkTypeTheme extends InternalLinkType {
        /**
         * Name of the theme.
         */
        public String themeName;

        /**
         * The link is a link to a cloud theme. TDLib has no theme support yet.
         */
        public InternalLinkTypeTheme() {
        }

        /**
         * The link is a link to a cloud theme. TDLib has no theme support yet.
         *
         * @param themeName Name of the theme.
         */
        public InternalLinkTypeTheme(String themeName) {
            this.themeName = themeName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -200935417;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is an unknown tg: link. Call getDeepLinkInfo to process the link.
     */
    public static class InternalLinkTypeUnknownDeepLink extends InternalLinkType {
        /**
         * Link to be passed to getDeepLinkInfo.
         */
        public String link;

        /**
         * The link is an unknown tg: link. Call getDeepLinkInfo to process the link.
         */
        public InternalLinkTypeUnknownDeepLink() {
        }

        /**
         * The link is an unknown tg: link. Call getDeepLinkInfo to process the link.
         *
         * @param link Link to be passed to getDeepLinkInfo.
         */
        public InternalLinkTypeUnknownDeepLink(String link) {
            this.link = link;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 625596379;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to an upgraded gift. Call getUpgradedGift with the given name to process the link.
     */
    public static class InternalLinkTypeUpgradedGift extends InternalLinkType {
        /**
         * Name of the unique gift.
         */
        public String name;

        /**
         * The link is a link to an upgraded gift. Call getUpgradedGift with the given name to process the link.
         */
        public InternalLinkTypeUpgradedGift() {
        }

        /**
         * The link is a link to an upgraded gift. Call getUpgradedGift with the given name to process the link.
         *
         * @param name Name of the unique gift.
         */
        public InternalLinkTypeUpgradedGift(String name) {
            this.name = name;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -708405605;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a user by its phone number. Call searchUserByPhoneNumber with the given phone number to process the link. If the user is found, then call createPrivateChat and open user's profile information screen or the chat itself. If draft text isn't empty, then put the draft text in the input field.
     */
    public static class InternalLinkTypeUserPhoneNumber extends InternalLinkType {
        /**
         * Phone number of the user.
         */
        public String phoneNumber;
        /**
         * Draft text for message to send in the chat.
         */
        public String draftText;
        /**
         * True, if user's profile information screen must be opened; otherwise, the chat itself must be opened.
         */
        public boolean openProfile;

        /**
         * The link is a link to a user by its phone number. Call searchUserByPhoneNumber with the given phone number to process the link. If the user is found, then call createPrivateChat and open user's profile information screen or the chat itself. If draft text isn't empty, then put the draft text in the input field.
         */
        public InternalLinkTypeUserPhoneNumber() {
        }

        /**
         * The link is a link to a user by its phone number. Call searchUserByPhoneNumber with the given phone number to process the link. If the user is found, then call createPrivateChat and open user's profile information screen or the chat itself. If draft text isn't empty, then put the draft text in the input field.
         *
         * @param phoneNumber Phone number of the user.
         * @param draftText Draft text for message to send in the chat.
         * @param openProfile True, if user's profile information screen must be opened; otherwise, the chat itself must be opened.
         */
        public InternalLinkTypeUserPhoneNumber(String phoneNumber, String draftText, boolean openProfile) {
            this.phoneNumber = phoneNumber;
            this.draftText = draftText;
            this.openProfile = openProfile;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 273398536;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a user by a temporary token. Call searchUserByToken with the given token to process the link. If the user is found, then call createPrivateChat and open the chat.
     */
    public static class InternalLinkTypeUserToken extends InternalLinkType {
        /**
         * The token.
         */
        public String token;

        /**
         * The link is a link to a user by a temporary token. Call searchUserByToken with the given token to process the link. If the user is found, then call createPrivateChat and open the chat.
         */
        public InternalLinkTypeUserToken() {
        }

        /**
         * The link is a link to a user by a temporary token. Call searchUserByToken with the given token to process the link. If the user is found, then call createPrivateChat and open the chat.
         *
         * @param token The token.
         */
        public InternalLinkTypeUserToken(String token) {
            this.token = token;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1462248615;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a video chat. Call searchPublicChat with the given chat username, and then joinVideoChat with the given invite hash to process the link.
     */
    public static class InternalLinkTypeVideoChat extends InternalLinkType {
        /**
         * Username of the chat with the video chat.
         */
        public String chatUsername;
        /**
         * If non-empty, invite hash to be used to join the video chat without being muted by administrators.
         */
        public String inviteHash;
        /**
         * True, if the video chat is expected to be a live stream in a channel or a broadcast group.
         */
        public boolean isLiveStream;

        /**
         * The link is a link to a video chat. Call searchPublicChat with the given chat username, and then joinVideoChat with the given invite hash to process the link.
         */
        public InternalLinkTypeVideoChat() {
        }

        /**
         * The link is a link to a video chat. Call searchPublicChat with the given chat username, and then joinVideoChat with the given invite hash to process the link.
         *
         * @param chatUsername Username of the chat with the video chat.
         * @param inviteHash If non-empty, invite hash to be used to join the video chat without being muted by administrators.
         * @param isLiveStream True, if the video chat is expected to be a live stream in a channel or a broadcast group.
         */
        public InternalLinkTypeVideoChat(String chatUsername, String inviteHash, boolean isLiveStream) {
            this.chatUsername = chatUsername;
            this.inviteHash = inviteHash;
            this.isLiveStream = isLiveStream;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2020149068;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a Web App. Call searchPublicChat with the given bot username, check that the user is a bot. If the bot is restricted for the current user, then show an error message. Otherwise, call searchWebApp with the received bot and the given webAppShortName. Process received foundWebApp by showing a confirmation dialog if needed. If the bot can be added to attachment or side menu, but isn't added yet, then show a disclaimer about Mini Apps being third-party applications instead of the dialog and ask the user to accept their Terms of service. If the user accept the terms and confirms adding, then use toggleBotIsAddedToAttachmentMenu to add the bot. Then, call getWebAppLinkUrl and open the returned URL as a Web App.
     */
    public static class InternalLinkTypeWebApp extends InternalLinkType {
        /**
         * Username of the bot that owns the Web App.
         */
        public String botUsername;
        /**
         * Short name of the Web App.
         */
        public String webAppShortName;
        /**
         * Start parameter to be passed to getWebAppLinkUrl.
         */
        public String startParameter;
        /**
         * The mode in which the Web App must be opened.
         */
        public WebAppOpenMode mode;

        /**
         * The link is a link to a Web App. Call searchPublicChat with the given bot username, check that the user is a bot. If the bot is restricted for the current user, then show an error message. Otherwise, call searchWebApp with the received bot and the given webAppShortName. Process received foundWebApp by showing a confirmation dialog if needed. If the bot can be added to attachment or side menu, but isn't added yet, then show a disclaimer about Mini Apps being third-party applications instead of the dialog and ask the user to accept their Terms of service. If the user accept the terms and confirms adding, then use toggleBotIsAddedToAttachmentMenu to add the bot. Then, call getWebAppLinkUrl and open the returned URL as a Web App.
         */
        public InternalLinkTypeWebApp() {
        }

        /**
         * The link is a link to a Web App. Call searchPublicChat with the given bot username, check that the user is a bot. If the bot is restricted for the current user, then show an error message. Otherwise, call searchWebApp with the received bot and the given webAppShortName. Process received foundWebApp by showing a confirmation dialog if needed. If the bot can be added to attachment or side menu, but isn't added yet, then show a disclaimer about Mini Apps being third-party applications instead of the dialog and ask the user to accept their Terms of service. If the user accept the terms and confirms adding, then use toggleBotIsAddedToAttachmentMenu to add the bot. Then, call getWebAppLinkUrl and open the returned URL as a Web App.
         *
         * @param botUsername Username of the bot that owns the Web App.
         * @param webAppShortName Short name of the Web App.
         * @param startParameter Start parameter to be passed to getWebAppLinkUrl.
         * @param mode The mode in which the Web App must be opened.
         */
        public InternalLinkTypeWebApp(String botUsername, String webAppShortName, String startParameter, WebAppOpenMode mode) {
            this.botUsername = botUsername;
            this.webAppShortName = webAppShortName;
            this.startParameter = startParameter;
            this.mode = mode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2062112045;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes result of group call participant invitation.
     */
    public abstract static class InviteGroupCallParticipantResult extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            InviteGroupCallParticipantResultUserPrivacyRestricted.CONSTRUCTOR,
            InviteGroupCallParticipantResultUserAlreadyParticipant.CONSTRUCTOR,
            InviteGroupCallParticipantResultUserWasBanned.CONSTRUCTOR,
            InviteGroupCallParticipantResultSuccess.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public InviteGroupCallParticipantResult() {
        }
    }

    /**
     * The user can't be invited due to their privacy settings.
     */
    public static class InviteGroupCallParticipantResultUserPrivacyRestricted extends InviteGroupCallParticipantResult {

        /**
         * The user can't be invited due to their privacy settings.
         */
        public InviteGroupCallParticipantResultUserPrivacyRestricted() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 53003769;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user can't be invited because they are already a participant of the call.
     */
    public static class InviteGroupCallParticipantResultUserAlreadyParticipant extends InviteGroupCallParticipantResult {

        /**
         * The user can't be invited because they are already a participant of the call.
         */
        public InviteGroupCallParticipantResultUserAlreadyParticipant() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 661526151;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user can't be invited because they were banned by the owner of the call and can be invited back only by the owner of the group call.
     */
    public static class InviteGroupCallParticipantResultUserWasBanned extends InviteGroupCallParticipantResult {

        /**
         * The user can't be invited because they were banned by the owner of the call and can be invited back only by the owner of the group call.
         */
        public InviteGroupCallParticipantResultUserWasBanned() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -204345357;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user was invited and a service message of the type messageGroupCall was sent which can be used in declineGroupCallInvitation to cancel the invitation.
     */
    public static class InviteGroupCallParticipantResultSuccess extends InviteGroupCallParticipantResult {
        /**
         * Identifier of the chat with the invitation message.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;

        /**
         * The user was invited and a service message of the type messageGroupCall was sent which can be used in declineGroupCallInvitation to cancel the invitation.
         */
        public InviteGroupCallParticipantResultSuccess() {
        }

        /**
         * The user was invited and a service message of the type messageGroupCall was sent which can be used in declineGroupCallInvitation to cancel the invitation.
         *
         * @param chatId Identifier of the chat with the invitation message.
         * @param messageId Identifier of the message.
         */
        public InviteGroupCallParticipantResultSuccess(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1914309427;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the type of chat to which points an invite link.
     */
    public abstract static class InviteLinkChatType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            InviteLinkChatTypeBasicGroup.CONSTRUCTOR,
            InviteLinkChatTypeSupergroup.CONSTRUCTOR,
            InviteLinkChatTypeChannel.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public InviteLinkChatType() {
        }
    }

    /**
     * The link is an invite link for a basic group.
     */
    public static class InviteLinkChatTypeBasicGroup extends InviteLinkChatType {

        /**
         * The link is an invite link for a basic group.
         */
        public InviteLinkChatTypeBasicGroup() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1296287214;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is an invite link for a supergroup.
     */
    public static class InviteLinkChatTypeSupergroup extends InviteLinkChatType {

        /**
         * The link is an invite link for a supergroup.
         */
        public InviteLinkChatTypeSupergroup() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1038640984;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is an invite link for a channel.
     */
    public static class InviteLinkChatTypeChannel extends InviteLinkChatType {

        /**
         * The link is an invite link for a channel.
         */
        public InviteLinkChatTypeChannel() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 806547211;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Product invoice.
     */
    public static class Invoice extends Object {
        /**
         * ISO 4217 currency code.
         */
        public String currency;
        /**
         * A list of objects used to calculate the total price of the product.
         */
        public LabeledPricePart[] priceParts;
        /**
         * The number of seconds between consecutive Telegram Star debiting for subscription invoices; 0 if the invoice doesn't create subscription.
         */
        public int subscriptionPeriod;
        /**
         * The maximum allowed amount of tip in the smallest units of the currency.
         */
        public long maxTipAmount;
        /**
         * Suggested amounts of tip in the smallest units of the currency.
         */
        public long[] suggestedTipAmounts;
        /**
         * An HTTP URL with terms of service for recurring payments. If non-empty, the invoice payment will result in recurring payments and the user must accept the terms of service before allowed to pay.
         */
        public String recurringPaymentTermsOfServiceUrl;
        /**
         * An HTTP URL with terms of service for non-recurring payments. If non-empty, then the user must accept the terms of service before allowed to pay.
         */
        public String termsOfServiceUrl;
        /**
         * True, if the payment is a test payment.
         */
        public boolean isTest;
        /**
         * True, if the user's name is needed for payment.
         */
        public boolean needName;
        /**
         * True, if the user's phone number is needed for payment.
         */
        public boolean needPhoneNumber;
        /**
         * True, if the user's email address is needed for payment.
         */
        public boolean needEmailAddress;
        /**
         * True, if the user's shipping address is needed for payment.
         */
        public boolean needShippingAddress;
        /**
         * True, if the user's phone number will be sent to the provider.
         */
        public boolean sendPhoneNumberToProvider;
        /**
         * True, if the user's email address will be sent to the provider.
         */
        public boolean sendEmailAddressToProvider;
        /**
         * True, if the total price depends on the shipping method.
         */
        public boolean isFlexible;

        /**
         * Product invoice.
         */
        public Invoice() {
        }

        /**
         * Product invoice.
         *
         * @param currency ISO 4217 currency code.
         * @param priceParts A list of objects used to calculate the total price of the product.
         * @param subscriptionPeriod The number of seconds between consecutive Telegram Star debiting for subscription invoices; 0 if the invoice doesn't create subscription.
         * @param maxTipAmount The maximum allowed amount of tip in the smallest units of the currency.
         * @param suggestedTipAmounts Suggested amounts of tip in the smallest units of the currency.
         * @param recurringPaymentTermsOfServiceUrl An HTTP URL with terms of service for recurring payments. If non-empty, the invoice payment will result in recurring payments and the user must accept the terms of service before allowed to pay.
         * @param termsOfServiceUrl An HTTP URL with terms of service for non-recurring payments. If non-empty, then the user must accept the terms of service before allowed to pay.
         * @param isTest True, if the payment is a test payment.
         * @param needName True, if the user's name is needed for payment.
         * @param needPhoneNumber True, if the user's phone number is needed for payment.
         * @param needEmailAddress True, if the user's email address is needed for payment.
         * @param needShippingAddress True, if the user's shipping address is needed for payment.
         * @param sendPhoneNumberToProvider True, if the user's phone number will be sent to the provider.
         * @param sendEmailAddressToProvider True, if the user's email address will be sent to the provider.
         * @param isFlexible True, if the total price depends on the shipping method.
         */
        public Invoice(String currency, LabeledPricePart[] priceParts, int subscriptionPeriod, long maxTipAmount, long[] suggestedTipAmounts, String recurringPaymentTermsOfServiceUrl, String termsOfServiceUrl, boolean isTest, boolean needName, boolean needPhoneNumber, boolean needEmailAddress, boolean needShippingAddress, boolean sendPhoneNumberToProvider, boolean sendEmailAddressToProvider, boolean isFlexible) {
            this.currency = currency;
            this.priceParts = priceParts;
            this.subscriptionPeriod = subscriptionPeriod;
            this.maxTipAmount = maxTipAmount;
            this.suggestedTipAmounts = suggestedTipAmounts;
            this.recurringPaymentTermsOfServiceUrl = recurringPaymentTermsOfServiceUrl;
            this.termsOfServiceUrl = termsOfServiceUrl;
            this.isTest = isTest;
            this.needName = needName;
            this.needPhoneNumber = needPhoneNumber;
            this.needEmailAddress = needEmailAddress;
            this.needShippingAddress = needShippingAddress;
            this.sendPhoneNumberToProvider = sendPhoneNumberToProvider;
            this.sendEmailAddressToProvider = sendEmailAddressToProvider;
            this.isFlexible = isFlexible;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 113204876;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents one member of a JSON object.
     */
    public static class JsonObjectMember extends Object {
        /**
         * Member's key.
         */
        public String key;
        /**
         * Member's value.
         */
        public JsonValue value;

        /**
         * Represents one member of a JSON object.
         */
        public JsonObjectMember() {
        }

        /**
         * Represents one member of a JSON object.
         *
         * @param key Member's key.
         * @param value Member's value.
         */
        public JsonObjectMember(String key, JsonValue value) {
            this.key = key;
            this.value = value;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1803309418;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents a JSON value.
     */
    public abstract static class JsonValue extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            JsonValueNull.CONSTRUCTOR,
            JsonValueBoolean.CONSTRUCTOR,
            JsonValueNumber.CONSTRUCTOR,
            JsonValueString.CONSTRUCTOR,
            JsonValueArray.CONSTRUCTOR,
            JsonValueObject.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public JsonValue() {
        }
    }

    /**
     * Represents a null JSON value.
     */
    public static class JsonValueNull extends JsonValue {

        /**
         * Represents a null JSON value.
         */
        public JsonValueNull() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -92872499;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a boolean JSON value.
     */
    public static class JsonValueBoolean extends JsonValue {
        /**
         * The value.
         */
        public boolean value;

        /**
         * Represents a boolean JSON value.
         */
        public JsonValueBoolean() {
        }

        /**
         * Represents a boolean JSON value.
         *
         * @param value The value.
         */
        public JsonValueBoolean(boolean value) {
            this.value = value;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2142186576;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a numeric JSON value.
     */
    public static class JsonValueNumber extends JsonValue {
        /**
         * The value.
         */
        public double value;

        /**
         * Represents a numeric JSON value.
         */
        public JsonValueNumber() {
        }

        /**
         * Represents a numeric JSON value.
         *
         * @param value The value.
         */
        public JsonValueNumber(double value) {
            this.value = value;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1010822033;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a string JSON value.
     */
    public static class JsonValueString extends JsonValue {
        /**
         * The value.
         */
        public String value;

        /**
         * Represents a string JSON value.
         */
        public JsonValueString() {
        }

        /**
         * Represents a string JSON value.
         *
         * @param value The value.
         */
        public JsonValueString(String value) {
            this.value = value;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1597947313;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a JSON array.
     */
    public static class JsonValueArray extends JsonValue {
        /**
         * The list of array elements.
         */
        public JsonValue[] values;

        /**
         * Represents a JSON array.
         */
        public JsonValueArray() {
        }

        /**
         * Represents a JSON array.
         *
         * @param values The list of array elements.
         */
        public JsonValueArray(JsonValue[] values) {
            this.values = values;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -183913546;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a JSON object.
     */
    public static class JsonValueObject extends JsonValue {
        /**
         * The list of object members.
         */
        public JsonObjectMember[] members;

        /**
         * Represents a JSON object.
         */
        public JsonValueObject() {
        }

        /**
         * Represents a JSON object.
         *
         * @param members The list of object members.
         */
        public JsonValueObject(JsonObjectMember[] members) {
            this.members = members;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 520252026;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a single button in a bot keyboard.
     */
    public static class KeyboardButton extends Object {
        /**
         * Text of the button.
         */
        public String text;
        /**
         * Identifier of the custom emoji that must be shown on the button; 0 if none.
         */
        public long iconCustomEmojiId;
        /**
         * Style of the button.
         */
        public ButtonStyle style;
        /**
         * Type of the button.
         */
        public KeyboardButtonType type;

        /**
         * Represents a single button in a bot keyboard.
         */
        public KeyboardButton() {
        }

        /**
         * Represents a single button in a bot keyboard.
         *
         * @param text Text of the button.
         * @param iconCustomEmojiId Identifier of the custom emoji that must be shown on the button; 0 if none.
         * @param style Style of the button.
         * @param type Type of the button.
         */
        public KeyboardButton(String text, long iconCustomEmojiId, ButtonStyle style, KeyboardButtonType type) {
            this.text = text;
            this.iconCustomEmojiId = iconCustomEmojiId;
            this.style = style;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -405853143;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes source of a keyboard button.
     */
    public abstract static class KeyboardButtonSource extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            KeyboardButtonSourceMessage.CONSTRUCTOR,
            KeyboardButtonSourceWebApp.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public KeyboardButtonSource() {
        }
    }

    /**
     * The button is from a bot's message.
     */
    public static class KeyboardButtonSourceMessage extends KeyboardButtonSource {
        /**
         * Identifier of the chat with the message.
         */
        public long chatId;
        /**
         * Identifier of the message with the button.
         */
        public long messageId;

        /**
         * The button is from a bot's message.
         */
        public KeyboardButtonSourceMessage() {
        }

        /**
         * The button is from a bot's message.
         *
         * @param chatId Identifier of the chat with the message.
         * @param messageId Identifier of the message with the button.
         */
        public KeyboardButtonSourceMessage(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 326023575;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The button is a prepared keyboard button from a Mini App received via getPreparedKeyboardButton.
     */
    public static class KeyboardButtonSourceWebApp extends KeyboardButtonSource {
        /**
         * Identifier of the bot that created the button.
         */
        public long botUserId;
        /**
         * Identifier of the prepared button.
         */
        public String preparedButtonId;

        /**
         * The button is a prepared keyboard button from a Mini App received via getPreparedKeyboardButton.
         */
        public KeyboardButtonSourceWebApp() {
        }

        /**
         * The button is a prepared keyboard button from a Mini App received via getPreparedKeyboardButton.
         *
         * @param botUserId Identifier of the bot that created the button.
         * @param preparedButtonId Identifier of the prepared button.
         */
        public KeyboardButtonSourceWebApp(long botUserId, String preparedButtonId) {
            this.botUserId = botUserId;
            this.preparedButtonId = preparedButtonId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -450665232;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a keyboard button type.
     */
    public abstract static class KeyboardButtonType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            KeyboardButtonTypeText.CONSTRUCTOR,
            KeyboardButtonTypeRequestPhoneNumber.CONSTRUCTOR,
            KeyboardButtonTypeRequestLocation.CONSTRUCTOR,
            KeyboardButtonTypeRequestPoll.CONSTRUCTOR,
            KeyboardButtonTypeRequestUsers.CONSTRUCTOR,
            KeyboardButtonTypeRequestChat.CONSTRUCTOR,
            KeyboardButtonTypeRequestManagedBot.CONSTRUCTOR,
            KeyboardButtonTypeWebApp.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public KeyboardButtonType() {
        }
    }

    /**
     * A simple button, with text that must be sent when the button is pressed.
     */
    public static class KeyboardButtonTypeText extends KeyboardButtonType {

        /**
         * A simple button, with text that must be sent when the button is pressed.
         */
        public KeyboardButtonTypeText() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1773037256;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A button that sends the user's phone number when pressed; available only in private chats.
     */
    public static class KeyboardButtonTypeRequestPhoneNumber extends KeyboardButtonType {

        /**
         * A button that sends the user's phone number when pressed; available only in private chats.
         */
        public KeyboardButtonTypeRequestPhoneNumber() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1529235527;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A button that sends the user's location when pressed; available only in private chats.
     */
    public static class KeyboardButtonTypeRequestLocation extends KeyboardButtonType {

        /**
         * A button that sends the user's location when pressed; available only in private chats.
         */
        public KeyboardButtonTypeRequestLocation() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -125661955;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A button that allows the user to create and send a poll when pressed; available only in private chats.
     */
    public static class KeyboardButtonTypeRequestPoll extends KeyboardButtonType {
        /**
         * If true, only regular polls must be allowed to create.
         */
        public boolean forceRegular;
        /**
         * If true, only polls in quiz mode must be allowed to create.
         */
        public boolean forceQuiz;

        /**
         * A button that allows the user to create and send a poll when pressed; available only in private chats.
         */
        public KeyboardButtonTypeRequestPoll() {
        }

        /**
         * A button that allows the user to create and send a poll when pressed; available only in private chats.
         *
         * @param forceRegular If true, only regular polls must be allowed to create.
         * @param forceQuiz If true, only polls in quiz mode must be allowed to create.
         */
        public KeyboardButtonTypeRequestPoll(boolean forceRegular, boolean forceQuiz) {
            this.forceRegular = forceRegular;
            this.forceQuiz = forceQuiz;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1902435512;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A button that requests users to be shared by the current user; available only in private chats. Use the method shareUsersWithBot to complete the request.
     */
    public static class KeyboardButtonTypeRequestUsers extends KeyboardButtonType {
        /**
         * Unique button identifier.
         */
        public int id;
        /**
         * True, if the shared users must or must not be bots.
         */
        public boolean restrictUserIsBot;
        /**
         * True, if the shared users must be bots; otherwise, the shared users must not be bots. Ignored if restrictUserIsBot is false.
         */
        public boolean userIsBot;
        /**
         * True, if the shared users must or must not be Telegram Premium users.
         */
        public boolean restrictUserIsPremium;
        /**
         * True, if the shared users must be Telegram Premium users; otherwise, the shared users must not be Telegram Premium users. Ignored if restrictUserIsPremium is false.
         */
        public boolean userIsPremium;
        /**
         * The maximum number of users to share.
         */
        public int maxQuantity;
        /**
         * Pass true to request name of the users; bots only.
         */
        public boolean requestName;
        /**
         * Pass true to request username of the users; bots only.
         */
        public boolean requestUsername;
        /**
         * Pass true to request photo of the users; bots only.
         */
        public boolean requestPhoto;

        /**
         * A button that requests users to be shared by the current user; available only in private chats. Use the method shareUsersWithBot to complete the request.
         */
        public KeyboardButtonTypeRequestUsers() {
        }

        /**
         * A button that requests users to be shared by the current user; available only in private chats. Use the method shareUsersWithBot to complete the request.
         *
         * @param id Unique button identifier.
         * @param restrictUserIsBot True, if the shared users must or must not be bots.
         * @param userIsBot True, if the shared users must be bots; otherwise, the shared users must not be bots. Ignored if restrictUserIsBot is false.
         * @param restrictUserIsPremium True, if the shared users must or must not be Telegram Premium users.
         * @param userIsPremium True, if the shared users must be Telegram Premium users; otherwise, the shared users must not be Telegram Premium users. Ignored if restrictUserIsPremium is false.
         * @param maxQuantity The maximum number of users to share.
         * @param requestName Pass true to request name of the users; bots only.
         * @param requestUsername Pass true to request username of the users; bots only.
         * @param requestPhoto Pass true to request photo of the users; bots only.
         */
        public KeyboardButtonTypeRequestUsers(int id, boolean restrictUserIsBot, boolean userIsBot, boolean restrictUserIsPremium, boolean userIsPremium, int maxQuantity, boolean requestName, boolean requestUsername, boolean requestPhoto) {
            this.id = id;
            this.restrictUserIsBot = restrictUserIsBot;
            this.userIsBot = userIsBot;
            this.restrictUserIsPremium = restrictUserIsPremium;
            this.userIsPremium = userIsPremium;
            this.maxQuantity = maxQuantity;
            this.requestName = requestName;
            this.requestUsername = requestUsername;
            this.requestPhoto = requestPhoto;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1738765315;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A button that requests a chat to be shared by the current user; available only in private chats. Use the method shareChatWithBot to complete the request.
     */
    public static class KeyboardButtonTypeRequestChat extends KeyboardButtonType {
        /**
         * Unique button identifier.
         */
        public int id;
        /**
         * True, if the chat must be a channel; otherwise, a basic group or a supergroup chat is shared.
         */
        public boolean chatIsChannel;
        /**
         * True, if the chat must or must not be a forum supergroup.
         */
        public boolean restrictChatIsForum;
        /**
         * True, if the chat must be a forum supergroup; otherwise, the chat must not be a forum supergroup. Ignored if restrictChatIsForum is false.
         */
        public boolean chatIsForum;
        /**
         * True, if the chat must or must not have a username.
         */
        public boolean restrictChatHasUsername;
        /**
         * True, if the chat must have a username; otherwise, the chat must not have a username. Ignored if restrictChatHasUsername is false.
         */
        public boolean chatHasUsername;
        /**
         * True, if the chat must be created by the current user.
         */
        public boolean chatIsCreated;
        /**
         * Expected user administrator rights in the chat; may be null if they aren't restricted.
         */
        @Nullable public ChatAdministratorRights userAdministratorRights;
        /**
         * Expected bot administrator rights in the chat; may be null if they aren't restricted.
         */
        @Nullable public ChatAdministratorRights botAdministratorRights;
        /**
         * True, if the bot must be a member of the chat; for basic group and supergroup chats only.
         */
        public boolean botIsMember;
        /**
         * Pass true to request title of the chat; bots only.
         */
        public boolean requestTitle;
        /**
         * Pass true to request username of the chat; bots only.
         */
        public boolean requestUsername;
        /**
         * Pass true to request photo of the chat; bots only.
         */
        public boolean requestPhoto;

        /**
         * A button that requests a chat to be shared by the current user; available only in private chats. Use the method shareChatWithBot to complete the request.
         */
        public KeyboardButtonTypeRequestChat() {
        }

        /**
         * A button that requests a chat to be shared by the current user; available only in private chats. Use the method shareChatWithBot to complete the request.
         *
         * @param id Unique button identifier.
         * @param chatIsChannel True, if the chat must be a channel; otherwise, a basic group or a supergroup chat is shared.
         * @param restrictChatIsForum True, if the chat must or must not be a forum supergroup.
         * @param chatIsForum True, if the chat must be a forum supergroup; otherwise, the chat must not be a forum supergroup. Ignored if restrictChatIsForum is false.
         * @param restrictChatHasUsername True, if the chat must or must not have a username.
         * @param chatHasUsername True, if the chat must have a username; otherwise, the chat must not have a username. Ignored if restrictChatHasUsername is false.
         * @param chatIsCreated True, if the chat must be created by the current user.
         * @param userAdministratorRights Expected user administrator rights in the chat; may be null if they aren't restricted.
         * @param botAdministratorRights Expected bot administrator rights in the chat; may be null if they aren't restricted.
         * @param botIsMember True, if the bot must be a member of the chat; for basic group and supergroup chats only.
         * @param requestTitle Pass true to request title of the chat; bots only.
         * @param requestUsername Pass true to request username of the chat; bots only.
         * @param requestPhoto Pass true to request photo of the chat; bots only.
         */
        public KeyboardButtonTypeRequestChat(int id, boolean chatIsChannel, boolean restrictChatIsForum, boolean chatIsForum, boolean restrictChatHasUsername, boolean chatHasUsername, boolean chatIsCreated, ChatAdministratorRights userAdministratorRights, ChatAdministratorRights botAdministratorRights, boolean botIsMember, boolean requestTitle, boolean requestUsername, boolean requestPhoto) {
            this.id = id;
            this.chatIsChannel = chatIsChannel;
            this.restrictChatIsForum = restrictChatIsForum;
            this.chatIsForum = chatIsForum;
            this.restrictChatHasUsername = restrictChatHasUsername;
            this.chatHasUsername = chatHasUsername;
            this.chatIsCreated = chatIsCreated;
            this.userAdministratorRights = userAdministratorRights;
            this.botAdministratorRights = botAdministratorRights;
            this.botIsMember = botIsMember;
            this.requestTitle = requestTitle;
            this.requestUsername = requestUsername;
            this.requestPhoto = requestPhoto;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1511138485;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A button that requests creation of a managed bot by the current user; available only in private chats. Use the method createBot to complete the request.
     */
    public static class KeyboardButtonTypeRequestManagedBot extends KeyboardButtonType {
        /**
         * Unique button identifier.
         */
        public int id;
        /**
         * Suggested name for the bot; may be empty if not specified.
         */
        public String suggestedName;
        /**
         * Suggested username for the bot; may be empty if not specified.
         */
        public String suggestedUsername;

        /**
         * A button that requests creation of a managed bot by the current user; available only in private chats. Use the method createBot to complete the request.
         */
        public KeyboardButtonTypeRequestManagedBot() {
        }

        /**
         * A button that requests creation of a managed bot by the current user; available only in private chats. Use the method createBot to complete the request.
         *
         * @param id Unique button identifier.
         * @param suggestedName Suggested name for the bot; may be empty if not specified.
         * @param suggestedUsername Suggested username for the bot; may be empty if not specified.
         */
        public KeyboardButtonTypeRequestManagedBot(int id, String suggestedName, String suggestedUsername) {
            this.id = id;
            this.suggestedName = suggestedName;
            this.suggestedUsername = suggestedUsername;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 311203127;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A button that opens a Web App by calling getWebAppUrl.
     */
    public static class KeyboardButtonTypeWebApp extends KeyboardButtonType {
        /**
         * An HTTP URL to pass to getWebAppUrl.
         */
        public String url;

        /**
         * A button that opens a Web App by calling getWebAppUrl.
         */
        public KeyboardButtonTypeWebApp() {
        }

        /**
         * A button that opens a Web App by calling getWebAppUrl.
         *
         * @param url An HTTP URL to pass to getWebAppUrl.
         */
        public KeyboardButtonTypeWebApp(String url) {
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1892220770;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Portion of the price of a product (e.g., &quot;delivery cost&quot;, &quot;tax amount&quot;).
     */
    public static class LabeledPricePart extends Object {
        /**
         * Label for this portion of the product price.
         */
        public String label;
        /**
         * Currency amount in the smallest units of the currency.
         */
        public long amount;

        /**
         * Portion of the price of a product (e.g., &quot;delivery cost&quot;, &quot;tax amount&quot;).
         */
        public LabeledPricePart() {
        }

        /**
         * Portion of the price of a product (e.g., &quot;delivery cost&quot;, &quot;tax amount&quot;).
         *
         * @param label Label for this portion of the product price.
         * @param amount Currency amount in the smallest units of the currency.
         */
        public LabeledPricePart(String label, long amount) {
            this.label = label;
            this.amount = amount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 552789798;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a language pack.
     */
    public static class LanguagePackInfo extends Object {
        /**
         * Unique language pack identifier.
         */
        public String id;
        /**
         * Identifier of a base language pack; may be empty. If a string is missed in the language pack, then it must be fetched from base language pack. Unsupported in custom language packs.
         */
        public String baseLanguagePackId;
        /**
         * Language name.
         */
        public String name;
        /**
         * Name of the language in that language.
         */
        public String nativeName;
        /**
         * A language code to be used to apply plural forms. See https://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html for more information.
         */
        public String pluralCode;
        /**
         * True, if the language pack is official.
         */
        public boolean isOfficial;
        /**
         * True, if the language pack strings are RTL.
         */
        public boolean isRtl;
        /**
         * True, if the language pack is a beta language pack.
         */
        public boolean isBeta;
        /**
         * True, if the language pack is installed by the current user.
         */
        public boolean isInstalled;
        /**
         * Total number of non-deleted strings from the language pack.
         */
        public int totalStringCount;
        /**
         * Total number of translated strings from the language pack.
         */
        public int translatedStringCount;
        /**
         * Total number of non-deleted strings from the language pack available locally.
         */
        public int localStringCount;
        /**
         * Link to language translation interface; empty for custom local language packs.
         */
        public String translationUrl;

        /**
         * Contains information about a language pack.
         */
        public LanguagePackInfo() {
        }

        /**
         * Contains information about a language pack.
         *
         * @param id Unique language pack identifier.
         * @param baseLanguagePackId Identifier of a base language pack; may be empty. If a string is missed in the language pack, then it must be fetched from base language pack. Unsupported in custom language packs.
         * @param name Language name.
         * @param nativeName Name of the language in that language.
         * @param pluralCode A language code to be used to apply plural forms. See https://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html for more information.
         * @param isOfficial True, if the language pack is official.
         * @param isRtl True, if the language pack strings are RTL.
         * @param isBeta True, if the language pack is a beta language pack.
         * @param isInstalled True, if the language pack is installed by the current user.
         * @param totalStringCount Total number of non-deleted strings from the language pack.
         * @param translatedStringCount Total number of translated strings from the language pack.
         * @param localStringCount Total number of non-deleted strings from the language pack available locally.
         * @param translationUrl Link to language translation interface; empty for custom local language packs.
         */
        public LanguagePackInfo(String id, String baseLanguagePackId, String name, String nativeName, String pluralCode, boolean isOfficial, boolean isRtl, boolean isBeta, boolean isInstalled, int totalStringCount, int translatedStringCount, int localStringCount, String translationUrl) {
            this.id = id;
            this.baseLanguagePackId = baseLanguagePackId;
            this.name = name;
            this.nativeName = nativeName;
            this.pluralCode = pluralCode;
            this.isOfficial = isOfficial;
            this.isRtl = isRtl;
            this.isBeta = isBeta;
            this.isInstalled = isInstalled;
            this.totalStringCount = totalStringCount;
            this.translatedStringCount = translatedStringCount;
            this.localStringCount = localStringCount;
            this.translationUrl = translationUrl;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 542199642;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents one language pack string.
     */
    public static class LanguagePackString extends Object {
        /**
         * String key.
         */
        public String key;
        /**
         * String value; pass null if the string needs to be taken from the built-in English language pack.
         */
        public LanguagePackStringValue value;

        /**
         * Represents one language pack string.
         */
        public LanguagePackString() {
        }

        /**
         * Represents one language pack string.
         *
         * @param key String key.
         * @param value String value; pass null if the string needs to be taken from the built-in English language pack.
         */
        public LanguagePackString(String key, LanguagePackStringValue value) {
            this.key = key;
            this.value = value;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1307632736;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents the value of a string in a language pack.
     */
    public abstract static class LanguagePackStringValue extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            LanguagePackStringValueOrdinary.CONSTRUCTOR,
            LanguagePackStringValuePluralized.CONSTRUCTOR,
            LanguagePackStringValueDeleted.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public LanguagePackStringValue() {
        }
    }

    /**
     * An ordinary language pack string.
     */
    public static class LanguagePackStringValueOrdinary extends LanguagePackStringValue {
        /**
         * String value.
         */
        public String value;

        /**
         * An ordinary language pack string.
         */
        public LanguagePackStringValueOrdinary() {
        }

        /**
         * An ordinary language pack string.
         *
         * @param value String value.
         */
        public LanguagePackStringValueOrdinary(String value) {
            this.value = value;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -249256352;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A language pack string which has different forms based on the number of some object it mentions. See https://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html for more information.
     */
    public static class LanguagePackStringValuePluralized extends LanguagePackStringValue {
        /**
         * Value for zero objects.
         */
        public String zeroValue;
        /**
         * Value for one object.
         */
        public String oneValue;
        /**
         * Value for two objects.
         */
        public String twoValue;
        /**
         * Value for few objects.
         */
        public String fewValue;
        /**
         * Value for many objects.
         */
        public String manyValue;
        /**
         * Default value.
         */
        public String otherValue;

        /**
         * A language pack string which has different forms based on the number of some object it mentions. See https://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html for more information.
         */
        public LanguagePackStringValuePluralized() {
        }

        /**
         * A language pack string which has different forms based on the number of some object it mentions. See https://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html for more information.
         *
         * @param zeroValue Value for zero objects.
         * @param oneValue Value for one object.
         * @param twoValue Value for two objects.
         * @param fewValue Value for few objects.
         * @param manyValue Value for many objects.
         * @param otherValue Default value.
         */
        public LanguagePackStringValuePluralized(String zeroValue, String oneValue, String twoValue, String fewValue, String manyValue, String otherValue) {
            this.zeroValue = zeroValue;
            this.oneValue = oneValue;
            this.twoValue = twoValue;
            this.fewValue = fewValue;
            this.manyValue = manyValue;
            this.otherValue = otherValue;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1906840261;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A deleted language pack string, the value must be taken from the built-in English language pack.
     */
    public static class LanguagePackStringValueDeleted extends LanguagePackStringValue {

        /**
         * A deleted language pack string, the value must be taken from the built-in English language pack.
         */
        public LanguagePackStringValueDeleted() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1834792698;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of language pack strings.
     */
    public static class LanguagePackStrings extends Object {
        /**
         * A list of language pack strings.
         */
        public LanguagePackString[] strings;

        /**
         * Contains a list of language pack strings.
         */
        public LanguagePackStrings() {
        }

        /**
         * Contains a list of language pack strings.
         *
         * @param strings A list of language pack strings.
         */
        public LanguagePackStrings(LanguagePackString[] strings) {
            this.strings = strings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1172082922;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a link preview.
     */
    public static class LinkPreview extends Object {
        /**
         * Original URL of the link.
         */
        public String url;
        /**
         * URL to display.
         */
        public String displayUrl;
        /**
         * Short name of the site (e.g., Google Docs, App Store).
         */
        public String siteName;
        /**
         * Title of the content.
         */
        public String title;
        /**
         * Description of the content.
         */
        public FormattedText description;
        /**
         * Author of the content.
         */
        public String author;
        /**
         * Type of the link preview.
         */
        public LinkPreviewType type;
        /**
         * True, if size of media in the preview can be changed.
         */
        public boolean hasLargeMedia;
        /**
         * True, if large media preview must be shown; otherwise, the media preview must be shown small and only the first frame must be shown for videos.
         */
        public boolean showLargeMedia;
        /**
         * True, if media must be shown above link preview description; otherwise, the media must be shown below the description.
         */
        public boolean showMediaAboveDescription;
        /**
         * True, if there is no need to show an ordinary open URL confirmation, when opening the URL from the preview, because the URL is shown in the message text in clear.
         */
        public boolean skipConfirmation;
        /**
         * True, if the link preview must be shown above message text; otherwise, the link preview must be shown below the message text.
         */
        public boolean showAboveText;
        /**
         * Version of instant view (currently, can be 1 or 2) for the web page; 0 if none.
         */
        public int instantViewVersion;

        /**
         * Describes a link preview.
         */
        public LinkPreview() {
        }

        /**
         * Describes a link preview.
         *
         * @param url Original URL of the link.
         * @param displayUrl URL to display.
         * @param siteName Short name of the site (e.g., Google Docs, App Store).
         * @param title Title of the content.
         * @param description Description of the content.
         * @param author Author of the content.
         * @param type Type of the link preview.
         * @param hasLargeMedia True, if size of media in the preview can be changed.
         * @param showLargeMedia True, if large media preview must be shown; otherwise, the media preview must be shown small and only the first frame must be shown for videos.
         * @param showMediaAboveDescription True, if media must be shown above link preview description; otherwise, the media must be shown below the description.
         * @param skipConfirmation True, if there is no need to show an ordinary open URL confirmation, when opening the URL from the preview, because the URL is shown in the message text in clear.
         * @param showAboveText True, if the link preview must be shown above message text; otherwise, the link preview must be shown below the message text.
         * @param instantViewVersion Version of instant view (currently, can be 1 or 2) for the web page; 0 if none.
         */
        public LinkPreview(String url, String displayUrl, String siteName, String title, FormattedText description, String author, LinkPreviewType type, boolean hasLargeMedia, boolean showLargeMedia, boolean showMediaAboveDescription, boolean skipConfirmation, boolean showAboveText, int instantViewVersion) {
            this.url = url;
            this.displayUrl = displayUrl;
            this.siteName = siteName;
            this.title = title;
            this.description = description;
            this.author = author;
            this.type = type;
            this.hasLargeMedia = hasLargeMedia;
            this.showLargeMedia = showLargeMedia;
            this.showMediaAboveDescription = showMediaAboveDescription;
            this.skipConfirmation = skipConfirmation;
            this.showAboveText = showAboveText;
            this.instantViewVersion = instantViewVersion;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1729417714;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a media from a link preview album.
     */
    public abstract static class LinkPreviewAlbumMedia extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            LinkPreviewAlbumMediaPhoto.CONSTRUCTOR,
            LinkPreviewAlbumMediaVideo.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public LinkPreviewAlbumMedia() {
        }
    }

    /**
     * The media is a photo.
     */
    public static class LinkPreviewAlbumMediaPhoto extends LinkPreviewAlbumMedia {
        /**
         * Photo description.
         */
        public Photo photo;

        /**
         * The media is a photo.
         */
        public LinkPreviewAlbumMediaPhoto() {
        }

        /**
         * The media is a photo.
         *
         * @param photo Photo description.
         */
        public LinkPreviewAlbumMediaPhoto(Photo photo) {
            this.photo = photo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -935480434;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The media is a video.
     */
    public static class LinkPreviewAlbumMediaVideo extends LinkPreviewAlbumMedia {
        /**
         * Video description.
         */
        public Video video;

        /**
         * The media is a video.
         */
        public LinkPreviewAlbumMediaVideo() {
        }

        /**
         * The media is a video.
         *
         * @param video Video description.
         */
        public LinkPreviewAlbumMediaVideo(Video video) {
            this.video = video;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 390616795;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Options to be used for generation of a link preview.
     */
    public static class LinkPreviewOptions extends Object {
        /**
         * True, if link preview must be disabled.
         */
        public boolean isDisabled;
        /**
         * URL to use for link preview. If empty, then the first URL found in the message text will be used.
         */
        public String url;
        /**
         * True, if shown media preview must be small; ignored in secret chats or if the URL isn't explicitly specified.
         */
        public boolean forceSmallMedia;
        /**
         * True, if shown media preview must be large; ignored in secret chats or if the URL isn't explicitly specified.
         */
        public boolean forceLargeMedia;
        /**
         * True, if link preview must be shown above message text; otherwise, the link preview will be shown below the message text; ignored in secret chats.
         */
        public boolean showAboveText;

        /**
         * Options to be used for generation of a link preview.
         */
        public LinkPreviewOptions() {
        }

        /**
         * Options to be used for generation of a link preview.
         *
         * @param isDisabled True, if link preview must be disabled.
         * @param url URL to use for link preview. If empty, then the first URL found in the message text will be used.
         * @param forceSmallMedia True, if shown media preview must be small; ignored in secret chats or if the URL isn't explicitly specified.
         * @param forceLargeMedia True, if shown media preview must be large; ignored in secret chats or if the URL isn't explicitly specified.
         * @param showAboveText True, if link preview must be shown above message text; otherwise, the link preview will be shown below the message text; ignored in secret chats.
         */
        public LinkPreviewOptions(boolean isDisabled, String url, boolean forceSmallMedia, boolean forceLargeMedia, boolean showAboveText) {
            this.isDisabled = isDisabled;
            this.url = url;
            this.forceSmallMedia = forceSmallMedia;
            this.forceLargeMedia = forceLargeMedia;
            this.showAboveText = showAboveText;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1046590451;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes type of link preview.
     */
    public abstract static class LinkPreviewType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            LinkPreviewTypeAlbum.CONSTRUCTOR,
            LinkPreviewTypeAnimation.CONSTRUCTOR,
            LinkPreviewTypeApp.CONSTRUCTOR,
            LinkPreviewTypeArticle.CONSTRUCTOR,
            LinkPreviewTypeAudio.CONSTRUCTOR,
            LinkPreviewTypeBackground.CONSTRUCTOR,
            LinkPreviewTypeChannelBoost.CONSTRUCTOR,
            LinkPreviewTypeChat.CONSTRUCTOR,
            LinkPreviewTypeDirectMessagesChat.CONSTRUCTOR,
            LinkPreviewTypeDocument.CONSTRUCTOR,
            LinkPreviewTypeEmbeddedAnimationPlayer.CONSTRUCTOR,
            LinkPreviewTypeEmbeddedAudioPlayer.CONSTRUCTOR,
            LinkPreviewTypeEmbeddedVideoPlayer.CONSTRUCTOR,
            LinkPreviewTypeExternalAudio.CONSTRUCTOR,
            LinkPreviewTypeExternalVideo.CONSTRUCTOR,
            LinkPreviewTypeGiftAuction.CONSTRUCTOR,
            LinkPreviewTypeGiftCollection.CONSTRUCTOR,
            LinkPreviewTypeGroupCall.CONSTRUCTOR,
            LinkPreviewTypeInvoice.CONSTRUCTOR,
            LinkPreviewTypeLiveStory.CONSTRUCTOR,
            LinkPreviewTypeMessage.CONSTRUCTOR,
            LinkPreviewTypePhoto.CONSTRUCTOR,
            LinkPreviewTypePremiumGiftCode.CONSTRUCTOR,
            LinkPreviewTypeRequestManagedBot.CONSTRUCTOR,
            LinkPreviewTypeShareableChatFolder.CONSTRUCTOR,
            LinkPreviewTypeSticker.CONSTRUCTOR,
            LinkPreviewTypeStickerSet.CONSTRUCTOR,
            LinkPreviewTypeStory.CONSTRUCTOR,
            LinkPreviewTypeStoryAlbum.CONSTRUCTOR,
            LinkPreviewTypeSupergroupBoost.CONSTRUCTOR,
            LinkPreviewTypeTextCompositionStyle.CONSTRUCTOR,
            LinkPreviewTypeTheme.CONSTRUCTOR,
            LinkPreviewTypeUnsupported.CONSTRUCTOR,
            LinkPreviewTypeUpgradedGift.CONSTRUCTOR,
            LinkPreviewTypeUser.CONSTRUCTOR,
            LinkPreviewTypeVideo.CONSTRUCTOR,
            LinkPreviewTypeVideoChat.CONSTRUCTOR,
            LinkPreviewTypeVideoNote.CONSTRUCTOR,
            LinkPreviewTypeVoiceNote.CONSTRUCTOR,
            LinkPreviewTypeWebApp.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public LinkPreviewType() {
        }
    }

    /**
     * The link is a link to a media album consisting of photos and videos.
     */
    public static class LinkPreviewTypeAlbum extends LinkPreviewType {
        /**
         * The list of album media.
         */
        public LinkPreviewAlbumMedia[] media;
        /**
         * Album caption.
         */
        public String caption;

        /**
         * The link is a link to a media album consisting of photos and videos.
         */
        public LinkPreviewTypeAlbum() {
        }

        /**
         * The link is a link to a media album consisting of photos and videos.
         *
         * @param media The list of album media.
         * @param caption Album caption.
         */
        public LinkPreviewTypeAlbum(LinkPreviewAlbumMedia[] media, String caption) {
            this.media = media;
            this.caption = caption;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -919156671;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to an animation.
     */
    public static class LinkPreviewTypeAnimation extends LinkPreviewType {
        /**
         * The animation.
         */
        public Animation animation;

        /**
         * The link is a link to an animation.
         */
        public LinkPreviewTypeAnimation() {
        }

        /**
         * The link is a link to an animation.
         *
         * @param animation The animation.
         */
        public LinkPreviewTypeAnimation(Animation animation) {
            this.animation = animation;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1386429132;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to an app at App Store or Google Play.
     */
    public static class LinkPreviewTypeApp extends LinkPreviewType {
        /**
         * Photo for the app.
         */
        public Photo photo;

        /**
         * The link is a link to an app at App Store or Google Play.
         */
        public LinkPreviewTypeApp() {
        }

        /**
         * The link is a link to an app at App Store or Google Play.
         *
         * @param photo Photo for the app.
         */
        public LinkPreviewTypeApp(Photo photo) {
            this.photo = photo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -475623953;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a web site.
     */
    public static class LinkPreviewTypeArticle extends LinkPreviewType {
        /**
         * Article's main photo; may be null.
         */
        @Nullable public Photo photo;

        /**
         * The link is a link to a web site.
         */
        public LinkPreviewTypeArticle() {
        }

        /**
         * The link is a link to a web site.
         *
         * @param photo Article's main photo; may be null.
         */
        public LinkPreviewTypeArticle(Photo photo) {
            this.photo = photo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2093915097;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to an audio.
     */
    public static class LinkPreviewTypeAudio extends LinkPreviewType {
        /**
         * The audio description.
         */
        public Audio audio;

        /**
         * The link is a link to an audio.
         */
        public LinkPreviewTypeAudio() {
        }

        /**
         * The link is a link to an audio.
         *
         * @param audio The audio description.
         */
        public LinkPreviewTypeAudio(Audio audio) {
            this.audio = audio;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1977878482;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a background. Link preview title and description are available only for filled backgrounds.
     */
    public static class LinkPreviewTypeBackground extends LinkPreviewType {
        /**
         * Document with the background; may be null for filled backgrounds.
         */
        @Nullable public Document document;
        /**
         * Type of the background; may be null if unknown.
         */
        @Nullable public BackgroundType backgroundType;

        /**
         * The link is a link to a background. Link preview title and description are available only for filled backgrounds.
         */
        public LinkPreviewTypeBackground() {
        }

        /**
         * The link is a link to a background. Link preview title and description are available only for filled backgrounds.
         *
         * @param document Document with the background; may be null for filled backgrounds.
         * @param backgroundType Type of the background; may be null if unknown.
         */
        public LinkPreviewTypeBackground(Document document, BackgroundType backgroundType) {
            this.document = document;
            this.backgroundType = backgroundType;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 977838560;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to boost a channel chat.
     */
    public static class LinkPreviewTypeChannelBoost extends LinkPreviewType {
        /**
         * Photo of the chat; may be null.
         */
        @Nullable public ChatPhoto photo;

        /**
         * The link is a link to boost a channel chat.
         */
        public LinkPreviewTypeChannelBoost() {
        }

        /**
         * The link is a link to boost a channel chat.
         *
         * @param photo Photo of the chat; may be null.
         */
        public LinkPreviewTypeChannelBoost(ChatPhoto photo) {
            this.photo = photo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -957086634;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a chat.
     */
    public static class LinkPreviewTypeChat extends LinkPreviewType {
        /**
         * Type of the chat.
         */
        public InviteLinkChatType type;
        /**
         * Photo of the chat; may be null.
         */
        @Nullable public ChatPhoto photo;
        /**
         * True, if the link only creates join request.
         */
        public boolean createsJoinRequest;

        /**
         * The link is a link to a chat.
         */
        public LinkPreviewTypeChat() {
        }

        /**
         * The link is a link to a chat.
         *
         * @param type Type of the chat.
         * @param photo Photo of the chat; may be null.
         * @param createsJoinRequest True, if the link only creates join request.
         */
        public LinkPreviewTypeChat(InviteLinkChatType type, ChatPhoto photo, boolean createsJoinRequest) {
            this.type = type;
            this.photo = photo;
            this.createsJoinRequest = createsJoinRequest;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1372610270;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a direct messages chat of a channel.
     */
    public static class LinkPreviewTypeDirectMessagesChat extends LinkPreviewType {
        /**
         * Photo of the channel chat; may be null.
         */
        @Nullable public ChatPhoto photo;

        /**
         * The link is a link to a direct messages chat of a channel.
         */
        public LinkPreviewTypeDirectMessagesChat() {
        }

        /**
         * The link is a link to a direct messages chat of a channel.
         *
         * @param photo Photo of the channel chat; may be null.
         */
        public LinkPreviewTypeDirectMessagesChat(ChatPhoto photo) {
            this.photo = photo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 578255582;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a general file.
     */
    public static class LinkPreviewTypeDocument extends LinkPreviewType {
        /**
         * The document description.
         */
        public Document document;

        /**
         * The link is a link to a general file.
         */
        public LinkPreviewTypeDocument() {
        }

        /**
         * The link is a link to a general file.
         *
         * @param document The document description.
         */
        public LinkPreviewTypeDocument(Document document) {
            this.document = document;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1090426462;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to an animation player.
     */
    public static class LinkPreviewTypeEmbeddedAnimationPlayer extends LinkPreviewType {
        /**
         * URL of the external animation player.
         */
        public String url;
        /**
         * The cached animation; may be null if unknown.
         */
        @Nullable public Animation animation;
        /**
         * Thumbnail of the animation; may be null if unknown.
         */
        @Nullable public Photo thumbnail;
        /**
         * Duration of the animation, in seconds.
         */
        public int duration;
        /**
         * Expected width of the embedded player.
         */
        public int width;
        /**
         * Expected height of the embedded player.
         */
        public int height;

        /**
         * The link is a link to an animation player.
         */
        public LinkPreviewTypeEmbeddedAnimationPlayer() {
        }

        /**
         * The link is a link to an animation player.
         *
         * @param url URL of the external animation player.
         * @param animation The cached animation; may be null if unknown.
         * @param thumbnail Thumbnail of the animation; may be null if unknown.
         * @param duration Duration of the animation, in seconds.
         * @param width Expected width of the embedded player.
         * @param height Expected height of the embedded player.
         */
        public LinkPreviewTypeEmbeddedAnimationPlayer(String url, Animation animation, Photo thumbnail, int duration, int width, int height) {
            this.url = url;
            this.animation = animation;
            this.thumbnail = thumbnail;
            this.duration = duration;
            this.width = width;
            this.height = height;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 413874679;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to an audio player.
     */
    public static class LinkPreviewTypeEmbeddedAudioPlayer extends LinkPreviewType {
        /**
         * URL of the external audio player.
         */
        public String url;
        /**
         * The cached audio; may be null if unknown.
         */
        @Nullable public Audio audio;
        /**
         * Thumbnail of the audio; may be null if unknown.
         */
        @Nullable public Photo thumbnail;
        /**
         * Duration of the audio, in seconds.
         */
        public int duration;
        /**
         * Expected width of the embedded player.
         */
        public int width;
        /**
         * Expected height of the embedded player.
         */
        public int height;

        /**
         * The link is a link to an audio player.
         */
        public LinkPreviewTypeEmbeddedAudioPlayer() {
        }

        /**
         * The link is a link to an audio player.
         *
         * @param url URL of the external audio player.
         * @param audio The cached audio; may be null if unknown.
         * @param thumbnail Thumbnail of the audio; may be null if unknown.
         * @param duration Duration of the audio, in seconds.
         * @param width Expected width of the embedded player.
         * @param height Expected height of the embedded player.
         */
        public LinkPreviewTypeEmbeddedAudioPlayer(String url, Audio audio, Photo thumbnail, int duration, int width, int height) {
            this.url = url;
            this.audio = audio;
            this.thumbnail = thumbnail;
            this.duration = duration;
            this.width = width;
            this.height = height;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2077132997;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a video player.
     */
    public static class LinkPreviewTypeEmbeddedVideoPlayer extends LinkPreviewType {
        /**
         * URL of the external video player.
         */
        public String url;
        /**
         * The cached video; may be null if unknown.
         */
        @Nullable public Video video;
        /**
         * Thumbnail of the video; may be null if unknown.
         */
        @Nullable public Photo thumbnail;
        /**
         * Duration of the video, in seconds.
         */
        public int duration;
        /**
         * Expected width of the embedded player.
         */
        public int width;
        /**
         * Expected height of the embedded player.
         */
        public int height;

        /**
         * The link is a link to a video player.
         */
        public LinkPreviewTypeEmbeddedVideoPlayer() {
        }

        /**
         * The link is a link to a video player.
         *
         * @param url URL of the external video player.
         * @param video The cached video; may be null if unknown.
         * @param thumbnail Thumbnail of the video; may be null if unknown.
         * @param duration Duration of the video, in seconds.
         * @param width Expected width of the embedded player.
         * @param height Expected height of the embedded player.
         */
        public LinkPreviewTypeEmbeddedVideoPlayer(String url, Video video, Photo thumbnail, int duration, int width, int height) {
            this.url = url;
            this.video = video;
            this.thumbnail = thumbnail;
            this.duration = duration;
            this.width = width;
            this.height = height;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -571363951;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to an audio file.
     */
    public static class LinkPreviewTypeExternalAudio extends LinkPreviewType {
        /**
         * URL of the audio file.
         */
        public String url;
        /**
         * MIME type of the audio file.
         */
        public String mimeType;
        /**
         * Duration of the audio, in seconds; 0 if unknown.
         */
        public int duration;

        /**
         * The link is a link to an audio file.
         */
        public LinkPreviewTypeExternalAudio() {
        }

        /**
         * The link is a link to an audio file.
         *
         * @param url URL of the audio file.
         * @param mimeType MIME type of the audio file.
         * @param duration Duration of the audio, in seconds; 0 if unknown.
         */
        public LinkPreviewTypeExternalAudio(String url, String mimeType, int duration) {
            this.url = url;
            this.mimeType = mimeType;
            this.duration = duration;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1971126291;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a video file.
     */
    public static class LinkPreviewTypeExternalVideo extends LinkPreviewType {
        /**
         * URL of the video file.
         */
        public String url;
        /**
         * MIME type of the video file.
         */
        public String mimeType;
        /**
         * Expected width of the video preview; 0 if unknown.
         */
        public int width;
        /**
         * Expected height of the video preview; 0 if unknown.
         */
        public int height;
        /**
         * Duration of the video, in seconds; 0 if unknown.
         */
        public int duration;

        /**
         * The link is a link to a video file.
         */
        public LinkPreviewTypeExternalVideo() {
        }

        /**
         * The link is a link to a video file.
         *
         * @param url URL of the video file.
         * @param mimeType MIME type of the video file.
         * @param width Expected width of the video preview; 0 if unknown.
         * @param height Expected height of the video preview; 0 if unknown.
         * @param duration Duration of the video, in seconds; 0 if unknown.
         */
        public LinkPreviewTypeExternalVideo(String url, String mimeType, int width, int height, int duration) {
            this.url = url;
            this.mimeType = mimeType;
            this.width = width;
            this.height = height;
            this.duration = duration;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1367198616;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a gift auction.
     */
    public static class LinkPreviewTypeGiftAuction extends LinkPreviewType {
        /**
         * The gift.
         */
        public Gift gift;
        /**
         * Point in time (Unix timestamp) when the auction will be ended.
         */
        public int auctionEndDate;

        /**
         * The link is a link to a gift auction.
         */
        public LinkPreviewTypeGiftAuction() {
        }

        /**
         * The link is a link to a gift auction.
         *
         * @param gift The gift.
         * @param auctionEndDate Point in time (Unix timestamp) when the auction will be ended.
         */
        public LinkPreviewTypeGiftAuction(Gift gift, int auctionEndDate) {
            this.gift = gift;
            this.auctionEndDate = auctionEndDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1291307457;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a gift collection.
     */
    public static class LinkPreviewTypeGiftCollection extends LinkPreviewType {
        /**
         * Icons for some gifts from the collection; may be empty.
         */
        public Sticker[] icons;

        /**
         * The link is a link to a gift collection.
         */
        public LinkPreviewTypeGiftCollection() {
        }

        /**
         * The link is a link to a gift collection.
         *
         * @param icons Icons for some gifts from the collection; may be empty.
         */
        public LinkPreviewTypeGiftCollection(Sticker[] icons) {
            this.icons = icons;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 230270537;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a group call that isn't bound to a chat.
     */
    public static class LinkPreviewTypeGroupCall extends LinkPreviewType {

        /**
         * The link is a link to a group call that isn't bound to a chat.
         */
        public LinkPreviewTypeGroupCall() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1242459936;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to an invoice.
     */
    public static class LinkPreviewTypeInvoice extends LinkPreviewType {

        /**
         * The link is a link to an invoice.
         */
        public LinkPreviewTypeInvoice() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -729855782;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a live story group call.
     */
    public static class LinkPreviewTypeLiveStory extends LinkPreviewType {
        /**
         * The identifier of the chat that posted the story.
         */
        public long storyPosterChatId;
        /**
         * Story identifier.
         */
        public int storyId;

        /**
         * The link is a link to a live story group call.
         */
        public LinkPreviewTypeLiveStory() {
        }

        /**
         * The link is a link to a live story group call.
         *
         * @param storyPosterChatId The identifier of the chat that posted the story.
         * @param storyId Story identifier.
         */
        public LinkPreviewTypeLiveStory(long storyPosterChatId, int storyId) {
            this.storyPosterChatId = storyPosterChatId;
            this.storyId = storyId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1062126469;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a text or a poll Telegram message.
     */
    public static class LinkPreviewTypeMessage extends LinkPreviewType {

        /**
         * The link is a link to a text or a poll Telegram message.
         */
        public LinkPreviewTypeMessage() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 435470750;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a photo.
     */
    public static class LinkPreviewTypePhoto extends LinkPreviewType {
        /**
         * The photo.
         */
        public Photo photo;

        /**
         * The link is a link to a photo.
         */
        public LinkPreviewTypePhoto() {
        }

        /**
         * The link is a link to a photo.
         *
         * @param photo The photo.
         */
        public LinkPreviewTypePhoto(Photo photo) {
            this.photo = photo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1362122068;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a Telegram Premium gift code.
     */
    public static class LinkPreviewTypePremiumGiftCode extends LinkPreviewType {

        /**
         * The link is a link to a Telegram Premium gift code.
         */
        public LinkPreviewTypePremiumGiftCode() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1309507761;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a dialog for creating of a managed bot.
     */
    public static class LinkPreviewTypeRequestManagedBot extends LinkPreviewType {

        /**
         * The link is a link to a dialog for creating of a managed bot.
         */
        public LinkPreviewTypeRequestManagedBot() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -361102166;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a shareable chat folder.
     */
    public static class LinkPreviewTypeShareableChatFolder extends LinkPreviewType {

        /**
         * The link is a link to a shareable chat folder.
         */
        public LinkPreviewTypeShareableChatFolder() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2141539524;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a sticker.
     */
    public static class LinkPreviewTypeSticker extends LinkPreviewType {
        /**
         * The sticker. It can be an arbitrary WEBP image and can have dimensions bigger than 512.
         */
        public Sticker sticker;

        /**
         * The link is a link to a sticker.
         */
        public LinkPreviewTypeSticker() {
        }

        /**
         * The link is a link to a sticker.
         *
         * @param sticker The sticker. It can be an arbitrary WEBP image and can have dimensions bigger than 512.
         */
        public LinkPreviewTypeSticker(Sticker sticker) {
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 610225445;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a sticker set.
     */
    public static class LinkPreviewTypeStickerSet extends LinkPreviewType {
        /**
         * Up to 4 stickers from the sticker set.
         */
        public Sticker[] stickers;

        /**
         * The link is a link to a sticker set.
         */
        public LinkPreviewTypeStickerSet() {
        }

        /**
         * The link is a link to a sticker set.
         *
         * @param stickers Up to 4 stickers from the sticker set.
         */
        public LinkPreviewTypeStickerSet(Sticker[] stickers) {
            this.stickers = stickers;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -145958768;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a story. Link preview description is unavailable.
     */
    public static class LinkPreviewTypeStory extends LinkPreviewType {
        /**
         * The identifier of the chat that posted the story.
         */
        public long storyPosterChatId;
        /**
         * Story identifier.
         */
        public int storyId;

        /**
         * The link is a link to a story. Link preview description is unavailable.
         */
        public LinkPreviewTypeStory() {
        }

        /**
         * The link is a link to a story. Link preview description is unavailable.
         *
         * @param storyPosterChatId The identifier of the chat that posted the story.
         * @param storyId Story identifier.
         */
        public LinkPreviewTypeStory(long storyPosterChatId, int storyId) {
            this.storyPosterChatId = storyPosterChatId;
            this.storyId = storyId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1045709531;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to an album of stories.
     */
    public static class LinkPreviewTypeStoryAlbum extends LinkPreviewType {
        /**
         * Icon of the album; may be null if none.
         */
        @Nullable public Photo photoIcon;
        /**
         * Video icon of the album; may be null if none.
         */
        @Nullable public Video videoIcon;

        /**
         * The link is a link to an album of stories.
         */
        public LinkPreviewTypeStoryAlbum() {
        }

        /**
         * The link is a link to an album of stories.
         *
         * @param photoIcon Icon of the album; may be null if none.
         * @param videoIcon Video icon of the album; may be null if none.
         */
        public LinkPreviewTypeStoryAlbum(Photo photoIcon, Video videoIcon) {
            this.photoIcon = photoIcon;
            this.videoIcon = videoIcon;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1935150441;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to boost a supergroup chat.
     */
    public static class LinkPreviewTypeSupergroupBoost extends LinkPreviewType {
        /**
         * Photo of the chat; may be null.
         */
        @Nullable public ChatPhoto photo;

        /**
         * The link is a link to boost a supergroup chat.
         */
        public LinkPreviewTypeSupergroupBoost() {
        }

        /**
         * The link is a link to boost a supergroup chat.
         *
         * @param photo Photo of the chat; may be null.
         */
        public LinkPreviewTypeSupergroupBoost(ChatPhoto photo) {
            this.photo = photo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1873345418;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a text composition style.
     */
    public static class LinkPreviewTypeTextCompositionStyle extends LinkPreviewType {
        /**
         * Identifier of the custom emoji corresponding to the style; 0 if none.
         */
        public long customEmojiId;

        /**
         * The link is a link to a text composition style.
         */
        public LinkPreviewTypeTextCompositionStyle() {
        }

        /**
         * The link is a link to a text composition style.
         *
         * @param customEmojiId Identifier of the custom emoji corresponding to the style; 0 if none.
         */
        public LinkPreviewTypeTextCompositionStyle(long customEmojiId) {
            this.customEmojiId = customEmojiId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2139832927;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a cloud theme. TDLib has no theme support yet.
     */
    public static class LinkPreviewTypeTheme extends LinkPreviewType {
        /**
         * The list of files with theme description.
         */
        public Document[] documents;
        /**
         * Settings for the cloud theme; may be null if unknown.
         */
        @Nullable public ThemeSettings settings;

        /**
         * The link is a link to a cloud theme. TDLib has no theme support yet.
         */
        public LinkPreviewTypeTheme() {
        }

        /**
         * The link is a link to a cloud theme. TDLib has no theme support yet.
         *
         * @param documents The list of files with theme description.
         * @param settings Settings for the cloud theme; may be null if unknown.
         */
        public LinkPreviewTypeTheme(Document[] documents, ThemeSettings settings) {
            this.documents = documents;
            this.settings = settings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -226118489;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link preview type is unsupported yet.
     */
    public static class LinkPreviewTypeUnsupported extends LinkPreviewType {

        /**
         * The link preview type is unsupported yet.
         */
        public LinkPreviewTypeUnsupported() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1924738233;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to an upgraded gift.
     */
    public static class LinkPreviewTypeUpgradedGift extends LinkPreviewType {
        /**
         * The gift.
         */
        public UpgradedGift gift;

        /**
         * The link is a link to an upgraded gift.
         */
        public LinkPreviewTypeUpgradedGift() {
        }

        /**
         * The link is a link to an upgraded gift.
         *
         * @param gift The gift.
         */
        public LinkPreviewTypeUpgradedGift(UpgradedGift gift) {
            this.gift = gift;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 293249807;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a user.
     */
    public static class LinkPreviewTypeUser extends LinkPreviewType {
        /**
         * Photo of the user; may be null if none.
         */
        @Nullable public ChatPhoto photo;
        /**
         * True, if the user is a bot.
         */
        public boolean isBot;

        /**
         * The link is a link to a user.
         */
        public LinkPreviewTypeUser() {
        }

        /**
         * The link is a link to a user.
         *
         * @param photo Photo of the user; may be null if none.
         * @param isBot True, if the user is a bot.
         */
        public LinkPreviewTypeUser(ChatPhoto photo, boolean isBot) {
            this.photo = photo;
            this.isBot = isBot;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1465024132;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a video.
     */
    public static class LinkPreviewTypeVideo extends LinkPreviewType {
        /**
         * The video description.
         */
        public Video video;
        /**
         * Cover of the video; may be null if none.
         */
        @Nullable public Photo cover;
        /**
         * Timestamp from which the video playing must start, in seconds.
         */
        public int startTimestamp;

        /**
         * The link is a link to a video.
         */
        public LinkPreviewTypeVideo() {
        }

        /**
         * The link is a link to a video.
         *
         * @param video The video description.
         * @param cover Cover of the video; may be null if none.
         * @param startTimestamp Timestamp from which the video playing must start, in seconds.
         */
        public LinkPreviewTypeVideo(Video video, Photo cover, int startTimestamp) {
            this.video = video;
            this.cover = cover;
            this.startTimestamp = startTimestamp;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1573057926;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a video chat.
     */
    public static class LinkPreviewTypeVideoChat extends LinkPreviewType {
        /**
         * Photo of the chat with the video chat; may be null if none.
         */
        @Nullable public ChatPhoto photo;
        /**
         * True, if the video chat is expected to be a live stream in a channel or a broadcast group.
         */
        public boolean isLiveStream;
        /**
         * True, if the user can use the link to join the video chat without being muted by administrators.
         */
        public boolean joinsAsSpeaker;

        /**
         * The link is a link to a video chat.
         */
        public LinkPreviewTypeVideoChat() {
        }

        /**
         * The link is a link to a video chat.
         *
         * @param photo Photo of the chat with the video chat; may be null if none.
         * @param isLiveStream True, if the video chat is expected to be a live stream in a channel or a broadcast group.
         * @param joinsAsSpeaker True, if the user can use the link to join the video chat without being muted by administrators.
         */
        public LinkPreviewTypeVideoChat(ChatPhoto photo, boolean isLiveStream, boolean joinsAsSpeaker) {
            this.photo = photo;
            this.isLiveStream = isLiveStream;
            this.joinsAsSpeaker = joinsAsSpeaker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -295676354;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a video note message.
     */
    public static class LinkPreviewTypeVideoNote extends LinkPreviewType {
        /**
         * The video note.
         */
        public VideoNote videoNote;

        /**
         * The link is a link to a video note message.
         */
        public LinkPreviewTypeVideoNote() {
        }

        /**
         * The link is a link to a video note message.
         *
         * @param videoNote The video note.
         */
        public LinkPreviewTypeVideoNote(VideoNote videoNote) {
            this.videoNote = videoNote;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -814687391;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a voice note message.
     */
    public static class LinkPreviewTypeVoiceNote extends LinkPreviewType {
        /**
         * The voice note.
         */
        public VoiceNote voiceNote;

        /**
         * The link is a link to a voice note message.
         */
        public LinkPreviewTypeVoiceNote() {
        }

        /**
         * The link is a link to a voice note message.
         *
         * @param voiceNote The voice note.
         */
        public LinkPreviewTypeVoiceNote(VoiceNote voiceNote) {
            this.voiceNote = voiceNote;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -757936341;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The link is a link to a Web App.
     */
    public static class LinkPreviewTypeWebApp extends LinkPreviewType {
        /**
         * Web App photo; may be null if none.
         */
        @Nullable public Photo photo;

        /**
         * The link is a link to a Web App.
         */
        public LinkPreviewTypeWebApp() {
        }

        /**
         * The link is a link to a Web App.
         *
         * @param photo Web App photo; may be null if none.
         */
        public LinkPreviewTypeWebApp(Photo photo) {
            this.photo = photo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1506873462;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of users and chats that spend most money on paid messages and reactions in a live story.
     */
    public static class LiveStoryDonors extends Object {
        /**
         * Total amount of spend Telegram Stars.
         */
        public long totalStarCount;
        /**
         * List of top donors in the live story.
         */
        public PaidReactor[] topDonors;

        /**
         * Contains a list of users and chats that spend most money on paid messages and reactions in a live story.
         */
        public LiveStoryDonors() {
        }

        /**
         * Contains a list of users and chats that spend most money on paid messages and reactions in a live story.
         *
         * @param totalStarCount Total amount of spend Telegram Stars.
         * @param topDonors List of top donors in the live story.
         */
        public LiveStoryDonors(long totalStarCount, PaidReactor[] topDonors) {
            this.totalStarCount = totalStarCount;
            this.topDonors = topDonors;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1254388193;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a local file.
     */
    public static class LocalFile extends Object {
        /**
         * Local path to the locally available file part; may be empty.
         */
        public String path;
        /**
         * True, if it is possible to download or generate the file.
         */
        public boolean canBeDownloaded;
        /**
         * True, if the file can be deleted.
         */
        public boolean canBeDeleted;
        /**
         * True, if the file is currently being downloaded (or a local copy is being generated by some other means).
         */
        public boolean isDownloadingActive;
        /**
         * True, if the local copy is fully available.
         */
        public boolean isDownloadingCompleted;
        /**
         * Download will be started from this offset. downloadedPrefixSize is calculated from this offset.
         */
        public long downloadOffset;
        /**
         * If isDownloadingCompleted is false, then only some prefix of the file starting from downloadOffset is ready to be read. downloadedPrefixSize is the size of that prefix in bytes.
         */
        public long downloadedPrefixSize;
        /**
         * Total downloaded file size, in bytes. Can be used only for calculating download progress. The actual file size may be bigger, and some parts of it may contain garbage.
         */
        public long downloadedSize;

        /**
         * Represents a local file.
         */
        public LocalFile() {
        }

        /**
         * Represents a local file.
         *
         * @param path Local path to the locally available file part; may be empty.
         * @param canBeDownloaded True, if it is possible to download or generate the file.
         * @param canBeDeleted True, if the file can be deleted.
         * @param isDownloadingActive True, if the file is currently being downloaded (or a local copy is being generated by some other means).
         * @param isDownloadingCompleted True, if the local copy is fully available.
         * @param downloadOffset Download will be started from this offset. downloadedPrefixSize is calculated from this offset.
         * @param downloadedPrefixSize If isDownloadingCompleted is false, then only some prefix of the file starting from downloadOffset is ready to be read. downloadedPrefixSize is the size of that prefix in bytes.
         * @param downloadedSize Total downloaded file size, in bytes. Can be used only for calculating download progress. The actual file size may be bigger, and some parts of it may contain garbage.
         */
        public LocalFile(String path, boolean canBeDownloaded, boolean canBeDeleted, boolean isDownloadingActive, boolean isDownloadingCompleted, long downloadOffset, long downloadedPrefixSize, long downloadedSize) {
            this.path = path;
            this.canBeDownloaded = canBeDownloaded;
            this.canBeDeleted = canBeDeleted;
            this.isDownloadingActive = isDownloadingActive;
            this.isDownloadingCompleted = isDownloadingCompleted;
            this.downloadOffset = downloadOffset;
            this.downloadedPrefixSize = downloadedPrefixSize;
            this.downloadedSize = downloadedSize;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1562732153;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about the current localization target.
     */
    public static class LocalizationTargetInfo extends Object {
        /**
         * List of available language packs for this application.
         */
        public LanguagePackInfo[] languagePacks;

        /**
         * Contains information about the current localization target.
         */
        public LocalizationTargetInfo() {
        }

        /**
         * Contains information about the current localization target.
         *
         * @param languagePacks List of available language packs for this application.
         */
        public LocalizationTargetInfo(LanguagePackInfo[] languagePacks) {
            this.languagePacks = languagePacks;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2048670809;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a location on planet Earth.
     */
    public static class Location extends Object {
        /**
         * Latitude of the location in degrees; as defined by the sender.
         */
        public double latitude;
        /**
         * Longitude of the location, in degrees; as defined by the sender.
         */
        public double longitude;
        /**
         * The estimated horizontal accuracy of the location, in meters; as defined by the sender. 0 if unknown.
         */
        public double horizontalAccuracy;

        /**
         * Describes a location on planet Earth.
         */
        public Location() {
        }

        /**
         * Describes a location on planet Earth.
         *
         * @param latitude Latitude of the location in degrees; as defined by the sender.
         * @param longitude Longitude of the location, in degrees; as defined by the sender.
         * @param horizontalAccuracy The estimated horizontal accuracy of the location, in meters; as defined by the sender. 0 if unknown.
         */
        public Location(double latitude, double longitude, double horizontalAccuracy) {
            this.latitude = latitude;
            this.longitude = longitude;
            this.horizontalAccuracy = horizontalAccuracy;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -443392141;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an address of a location.
     */
    public static class LocationAddress extends Object {
        /**
         * A two-letter ISO 3166-1 alpha-2 country code.
         */
        public String countryCode;
        /**
         * State, if applicable; empty if unknown.
         */
        public String state;
        /**
         * City; empty if unknown.
         */
        public String city;
        /**
         * The address; empty if unknown.
         */
        public String street;

        /**
         * Describes an address of a location.
         */
        public LocationAddress() {
        }

        /**
         * Describes an address of a location.
         *
         * @param countryCode A two-letter ISO 3166-1 alpha-2 country code.
         * @param state State, if applicable; empty if unknown.
         * @param city City; empty if unknown.
         * @param street The address; empty if unknown.
         */
        public LocationAddress(String countryCode, String state, String city, String street) {
            this.countryCode = countryCode;
            this.state = state;
            this.city = city;
            this.street = street;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1545940190;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a stream to which TDLib internal log is written.
     */
    public abstract static class LogStream extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            LogStreamDefault.CONSTRUCTOR,
            LogStreamFile.CONSTRUCTOR,
            LogStreamEmpty.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public LogStream() {
        }
    }

    /**
     * The log is written to stderr or an OS specific log.
     */
    public static class LogStreamDefault extends LogStream {

        /**
         * The log is written to stderr or an OS specific log.
         */
        public LogStreamDefault() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1390581436;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The log is written to a file.
     */
    public static class LogStreamFile extends LogStream {
        /**
         * Path to the file to where the internal TDLib log will be written.
         */
        public String path;
        /**
         * The maximum size of the file to where the internal TDLib log is written before the file will automatically be rotated, in bytes.
         */
        public long maxFileSize;
        /**
         * Pass true to additionally redirect stderr to the log file. Ignored on Windows.
         */
        public boolean redirectStderr;

        /**
         * The log is written to a file.
         */
        public LogStreamFile() {
        }

        /**
         * The log is written to a file.
         *
         * @param path Path to the file to where the internal TDLib log will be written.
         * @param maxFileSize The maximum size of the file to where the internal TDLib log is written before the file will automatically be rotated, in bytes.
         * @param redirectStderr Pass true to additionally redirect stderr to the log file. Ignored on Windows.
         */
        public LogStreamFile(String path, long maxFileSize, boolean redirectStderr) {
            this.path = path;
            this.maxFileSize = maxFileSize;
            this.redirectStderr = redirectStderr;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1532136933;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The log is written nowhere.
     */
    public static class LogStreamEmpty extends LogStream {

        /**
         * The log is written nowhere.
         */
        public LogStreamEmpty() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -499912244;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of available TDLib internal log tags.
     */
    public static class LogTags extends Object {
        /**
         * List of log tags.
         */
        public String[] tags;

        /**
         * Contains a list of available TDLib internal log tags.
         */
        public LogTags() {
        }

        /**
         * Contains a list of available TDLib internal log tags.
         *
         * @param tags List of log tags.
         */
        public LogTags(String[] tags) {
            this.tags = tags;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1604930601;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a TDLib internal log verbosity level.
     */
    public static class LogVerbosityLevel extends Object {
        /**
         * Log verbosity level.
         */
        public int verbosityLevel;

        /**
         * Contains a TDLib internal log verbosity level.
         */
        public LogVerbosityLevel() {
        }

        /**
         * Contains a TDLib internal log verbosity level.
         *
         * @param verbosityLevel Log verbosity level.
         */
        public LogVerbosityLevel(int verbosityLevel) {
            this.verbosityLevel = verbosityLevel;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1734624234;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains information about an inline button of type inlineKeyboardButtonTypeLoginUrl or an external link.
     */
    public abstract static class LoginUrlInfo extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            LoginUrlInfoOpen.CONSTRUCTOR,
            LoginUrlInfoRequestConfirmation.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public LoginUrlInfo() {
        }
    }

    /**
     * An HTTP URL needs to be open.
     */
    public static class LoginUrlInfoOpen extends LoginUrlInfo {
        /**
         * The URL to open.
         */
        public String url;
        /**
         * True, if there is no need to show an ordinary open URL confirmation.
         */
        public boolean skipConfirmation;

        /**
         * An HTTP URL needs to be open.
         */
        public LoginUrlInfoOpen() {
        }

        /**
         * An HTTP URL needs to be open.
         *
         * @param url The URL to open.
         * @param skipConfirmation True, if there is no need to show an ordinary open URL confirmation.
         */
        public LoginUrlInfoOpen(String url, boolean skipConfirmation) {
            this.url = url;
            this.skipConfirmation = skipConfirmation;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 837282306;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An authorization confirmation dialog needs to be shown to the user.
     */
    public static class LoginUrlInfoRequestConfirmation extends LoginUrlInfo {
        /**
         * An HTTP URL to be opened.
         */
        public String url;
        /**
         * A domain of the URL.
         */
        public String domain;
        /**
         * User identifier of a bot linked with the website.
         */
        public long botUserId;
        /**
         * True, if the user must be asked for the permission to the bot to send them messages.
         */
        public boolean requestWriteAccess;

        /**
         * An authorization confirmation dialog needs to be shown to the user.
         */
        public LoginUrlInfoRequestConfirmation() {
        }

        /**
         * An authorization confirmation dialog needs to be shown to the user.
         *
         * @param url An HTTP URL to be opened.
         * @param domain A domain of the URL.
         * @param botUserId User identifier of a bot linked with the website.
         * @param requestWriteAccess True, if the user must be asked for the permission to the bot to send them messages.
         */
        public LoginUrlInfoRequestConfirmation(String url, String domain, long botUserId, boolean requestWriteAccess) {
            this.url = url;
            this.domain = domain;
            this.botUserId = botUserId;
            this.requestWriteAccess = requestWriteAccess;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2128290863;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about the main Web App of a bot.
     */
    public static class MainWebApp extends Object {
        /**
         * URL of the Web App to open.
         */
        public String url;
        /**
         * The mode in which the Web App must be opened.
         */
        public WebAppOpenMode mode;

        /**
         * Contains information about the main Web App of a bot.
         */
        public MainWebApp() {
        }

        /**
         * Contains information about the main Web App of a bot.
         *
         * @param url URL of the Web App to open.
         * @param mode The mode in which the Web App must be opened.
         */
        public MainWebApp(String url, WebAppOpenMode mode) {
            this.url = url;
            this.mode = mode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1940368506;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Part of the face, relative to which a mask is placed.
     */
    public abstract static class MaskPoint extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            MaskPointForehead.CONSTRUCTOR,
            MaskPointEyes.CONSTRUCTOR,
            MaskPointMouth.CONSTRUCTOR,
            MaskPointChin.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public MaskPoint() {
        }
    }

    /**
     * The mask is placed relatively to the forehead.
     */
    public static class MaskPointForehead extends MaskPoint {

        /**
         * The mask is placed relatively to the forehead.
         */
        public MaskPointForehead() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1027512005;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The mask is placed relatively to the eyes.
     */
    public static class MaskPointEyes extends MaskPoint {

        /**
         * The mask is placed relatively to the eyes.
         */
        public MaskPointEyes() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1748310861;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The mask is placed relatively to the mouth.
     */
    public static class MaskPointMouth extends MaskPoint {

        /**
         * The mask is placed relatively to the mouth.
         */
        public MaskPointMouth() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 411773406;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The mask is placed relatively to the chin.
     */
    public static class MaskPointChin extends MaskPoint {

        /**
         * The mask is placed relatively to the chin.
         */
        public MaskPointChin() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 534995335;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Position on a photo where a mask is placed.
     */
    public static class MaskPosition extends Object {
        /**
         * Part of the face, relative to which the mask is placed.
         */
        public MaskPoint point;
        /**
         * Shift by X-axis measured in widths of the mask scaled to the face size, from left to right. (For example, -1.0 will place the mask just to the left of the default mask position.)
         */
        public double xShift;
        /**
         * Shift by Y-axis measured in heights of the mask scaled to the face size, from top to bottom. (For example, 1.0 will place the mask just below the default mask position.)
         */
        public double yShift;
        /**
         * Mask scaling coefficient. (For example, 2.0 means a doubled size.)
         */
        public double scale;

        /**
         * Position on a photo where a mask is placed.
         */
        public MaskPosition() {
        }

        /**
         * Position on a photo where a mask is placed.
         *
         * @param point Part of the face, relative to which the mask is placed.
         * @param xShift Shift by X-axis measured in widths of the mask scaled to the face size, from left to right. (For example, -1.0 will place the mask just to the left of the default mask position.)
         * @param yShift Shift by Y-axis measured in heights of the mask scaled to the face size, from top to bottom. (For example, 1.0 will place the mask just below the default mask position.)
         * @param scale Mask scaling coefficient. (For example, 2.0 means a doubled size.)
         */
        public MaskPosition(MaskPoint point, double xShift, double yShift, double scale) {
            this.point = point;
            this.xShift = xShift;
            this.yShift = yShift;
            this.scale = scale;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2097433026;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a message.
     */
    public static class Message extends Object {
        /**
         * Message identifier; unique for the chat to which the message belongs.
         */
        public long id;
        /**
         * Identifier of the sender of the message.
         */
        public MessageSender senderId;
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The sending state of the message; may be null if the message isn't being sent and didn't fail to be sent.
         */
        @Nullable public MessageSendingState sendingState;
        /**
         * The scheduling state of the message; may be null if the message isn't scheduled.
         */
        @Nullable public MessageSchedulingState schedulingState;
        /**
         * True, if the message is outgoing.
         */
        public boolean isOutgoing;
        /**
         * True, if the message is pinned.
         */
        public boolean isPinned;
        /**
         * True, if the message was sent because of a scheduled action by the message sender, for example, as away, or greeting service message.
         */
        public boolean isFromOffline;
        /**
         * True, if content of the message can be saved locally.
         */
        public boolean canBeSaved;
        /**
         * True, if media timestamp entities refers to a media in this message as opposed to a media in the replied message.
         */
        public boolean hasTimestampedMedia;
        /**
         * True, if the message is a channel post. All messages to channels are channel posts, all other messages are not channel posts.
         */
        public boolean isChannelPost;
        /**
         * True, if the message is a suggested channel post which was paid in Telegram Stars; a warning must be shown if the message is deleted in less than getOption(&quot;suggested_post_lifetime_min&quot;) seconds after sending.
         */
        public boolean isPaidStarSuggestedPost;
        /**
         * True, if the message is a suggested channel post which was paid in Toncoins; a warning must be shown if the message is deleted in less than getOption(&quot;suggested_post_lifetime_min&quot;) seconds after sending.
         */
        public boolean isPaidTonSuggestedPost;
        /**
         * True, if the message contains an unread mention for the current user.
         */
        public boolean containsUnreadMention;
        /**
         * True, if the message is a poll message with unread votes.
         */
        public boolean containsUnreadPollVotes;
        /**
         * Point in time (Unix timestamp) when the message was sent; 0 for scheduled messages.
         */
        public int date;
        /**
         * Point in time (Unix timestamp) when the message was last edited; 0 for scheduled messages.
         */
        public int editDate;
        /**
         * Information about the initial message sender; may be null if none or unknown.
         */
        @Nullable public MessageForwardInfo forwardInfo;
        /**
         * Information about the initial message for messages created with importMessages; may be null if the message isn't imported.
         */
        @Nullable public MessageImportInfo importInfo;
        /**
         * Information about interactions with the message; may be null if none.
         */
        @Nullable public MessageInteractionInfo interactionInfo;
        /**
         * Information about unread reactions added to the message.
         */
        public UnreadReaction[] unreadReactions;
        /**
         * Information about fact-check added to the message; may be null if none.
         */
        @Nullable public FactCheck factCheck;
        /**
         * Information about the suggested post; may be null if the message isn't a suggested post.
         */
        @Nullable public SuggestedPostInfo suggestedPostInfo;
        /**
         * Information about the message or the story this message is replying to; may be null if none.
         */
        @Nullable public MessageReplyTo replyTo;
        /**
         * Identifier of the topic within the chat to which the message belongs; may be null if none; may change when the chat is converted to a forum or back.
         */
        @Nullable public MessageTopic topicId;
        /**
         * The message's self-destruct type; may be null if none.
         */
        @Nullable public MessageSelfDestructType selfDestructType;
        /**
         * Time left before the message self-destruct timer expires, in seconds; 0 if self-destruction isn't scheduled yet.
         */
        public double selfDestructIn;
        /**
         * Time left before the message will be automatically deleted by messageAutoDeleteTime setting of the chat, in seconds; 0 if never.
         */
        public double autoDeleteIn;
        /**
         * If non-zero, the user identifier of the inline bot through which this message was sent.
         */
        public long viaBotUserId;
        /**
         * The identifier of the user or chat which used a guest bot to send the message; may be null if none.
         */
        @Nullable public MessageSender guestBotCallerId;
        /**
         * If non-zero, the user identifier of the business bot that sent this message.
         */
        public long senderBusinessBotUserId;
        /**
         * Number of times the sender of the message boosted the supergroup at the time the message was sent; 0 if none or unknown. For messages sent by the current user, supergroupFullInfo.myBoostCount must be used instead.
         */
        public int senderBoostCount;
        /**
         * Tag of the sender of the message in the supergroup at the time the message was sent; may be empty if none or unknown. For messages sent in basic groups or supergroup administrators, the current custom title or tag must be used instead.
         */
        public String senderTag;
        /**
         * The number of Telegram Stars the sender paid to send the message.
         */
        public long paidMessageStarCount;
        /**
         * For channel posts and anonymous group messages, optional author signature.
         */
        public String authorSignature;
        /**
         * Unique identifier of an album this message belongs to; 0 if none. Only audios, documents, photos and videos can be grouped together in albums.
         */
        public long mediaAlbumId;
        /**
         * Unique identifier of the effect added to the message; 0 if none.
         */
        public long effectId;
        /**
         * Information about the restrictions that must be applied to the message content; may be null if none.
         */
        @Nullable public RestrictionInfo restrictionInfo;
        /**
         * IETF language tag of the message language on which it can be summarized; empty if summary isn't available for the message.
         */
        public String summaryLanguageCode;
        /**
         * Content of the message.
         */
        public MessageContent content;
        /**
         * Reply markup for the message; may be null if none.
         */
        @Nullable public ReplyMarkup replyMarkup;

        /**
         * Describes a message.
         */
        public Message() {
        }

        /**
         * Describes a message.
         *
         * @param id Message identifier; unique for the chat to which the message belongs.
         * @param senderId Identifier of the sender of the message.
         * @param chatId Chat identifier.
         * @param sendingState The sending state of the message; may be null if the message isn't being sent and didn't fail to be sent.
         * @param schedulingState The scheduling state of the message; may be null if the message isn't scheduled.
         * @param isOutgoing True, if the message is outgoing.
         * @param isPinned True, if the message is pinned.
         * @param isFromOffline True, if the message was sent because of a scheduled action by the message sender, for example, as away, or greeting service message.
         * @param canBeSaved True, if content of the message can be saved locally.
         * @param hasTimestampedMedia True, if media timestamp entities refers to a media in this message as opposed to a media in the replied message.
         * @param isChannelPost True, if the message is a channel post. All messages to channels are channel posts, all other messages are not channel posts.
         * @param isPaidStarSuggestedPost True, if the message is a suggested channel post which was paid in Telegram Stars; a warning must be shown if the message is deleted in less than getOption(&quot;suggested_post_lifetime_min&quot;) seconds after sending.
         * @param isPaidTonSuggestedPost True, if the message is a suggested channel post which was paid in Toncoins; a warning must be shown if the message is deleted in less than getOption(&quot;suggested_post_lifetime_min&quot;) seconds after sending.
         * @param containsUnreadMention True, if the message contains an unread mention for the current user.
         * @param containsUnreadPollVotes True, if the message is a poll message with unread votes.
         * @param date Point in time (Unix timestamp) when the message was sent; 0 for scheduled messages.
         * @param editDate Point in time (Unix timestamp) when the message was last edited; 0 for scheduled messages.
         * @param forwardInfo Information about the initial message sender; may be null if none or unknown.
         * @param importInfo Information about the initial message for messages created with importMessages; may be null if the message isn't imported.
         * @param interactionInfo Information about interactions with the message; may be null if none.
         * @param unreadReactions Information about unread reactions added to the message.
         * @param factCheck Information about fact-check added to the message; may be null if none.
         * @param suggestedPostInfo Information about the suggested post; may be null if the message isn't a suggested post.
         * @param replyTo Information about the message or the story this message is replying to; may be null if none.
         * @param topicId Identifier of the topic within the chat to which the message belongs; may be null if none; may change when the chat is converted to a forum or back.
         * @param selfDestructType The message's self-destruct type; may be null if none.
         * @param selfDestructIn Time left before the message self-destruct timer expires, in seconds; 0 if self-destruction isn't scheduled yet.
         * @param autoDeleteIn Time left before the message will be automatically deleted by messageAutoDeleteTime setting of the chat, in seconds; 0 if never.
         * @param viaBotUserId If non-zero, the user identifier of the inline bot through which this message was sent.
         * @param guestBotCallerId The identifier of the user or chat which used a guest bot to send the message; may be null if none.
         * @param senderBusinessBotUserId If non-zero, the user identifier of the business bot that sent this message.
         * @param senderBoostCount Number of times the sender of the message boosted the supergroup at the time the message was sent; 0 if none or unknown. For messages sent by the current user, supergroupFullInfo.myBoostCount must be used instead.
         * @param senderTag Tag of the sender of the message in the supergroup at the time the message was sent; may be empty if none or unknown. For messages sent in basic groups or supergroup administrators, the current custom title or tag must be used instead.
         * @param paidMessageStarCount The number of Telegram Stars the sender paid to send the message.
         * @param authorSignature For channel posts and anonymous group messages, optional author signature.
         * @param mediaAlbumId Unique identifier of an album this message belongs to; 0 if none. Only audios, documents, photos and videos can be grouped together in albums.
         * @param effectId Unique identifier of the effect added to the message; 0 if none.
         * @param restrictionInfo Information about the restrictions that must be applied to the message content; may be null if none.
         * @param summaryLanguageCode IETF language tag of the message language on which it can be summarized; empty if summary isn't available for the message.
         * @param content Content of the message.
         * @param replyMarkup Reply markup for the message; may be null if none.
         */
        public Message(long id, MessageSender senderId, long chatId, MessageSendingState sendingState, MessageSchedulingState schedulingState, boolean isOutgoing, boolean isPinned, boolean isFromOffline, boolean canBeSaved, boolean hasTimestampedMedia, boolean isChannelPost, boolean isPaidStarSuggestedPost, boolean isPaidTonSuggestedPost, boolean containsUnreadMention, boolean containsUnreadPollVotes, int date, int editDate, MessageForwardInfo forwardInfo, MessageImportInfo importInfo, MessageInteractionInfo interactionInfo, UnreadReaction[] unreadReactions, FactCheck factCheck, SuggestedPostInfo suggestedPostInfo, MessageReplyTo replyTo, MessageTopic topicId, MessageSelfDestructType selfDestructType, double selfDestructIn, double autoDeleteIn, long viaBotUserId, MessageSender guestBotCallerId, long senderBusinessBotUserId, int senderBoostCount, String senderTag, long paidMessageStarCount, String authorSignature, long mediaAlbumId, long effectId, RestrictionInfo restrictionInfo, String summaryLanguageCode, MessageContent content, ReplyMarkup replyMarkup) {
            this.id = id;
            this.senderId = senderId;
            this.chatId = chatId;
            this.sendingState = sendingState;
            this.schedulingState = schedulingState;
            this.isOutgoing = isOutgoing;
            this.isPinned = isPinned;
            this.isFromOffline = isFromOffline;
            this.canBeSaved = canBeSaved;
            this.hasTimestampedMedia = hasTimestampedMedia;
            this.isChannelPost = isChannelPost;
            this.isPaidStarSuggestedPost = isPaidStarSuggestedPost;
            this.isPaidTonSuggestedPost = isPaidTonSuggestedPost;
            this.containsUnreadMention = containsUnreadMention;
            this.containsUnreadPollVotes = containsUnreadPollVotes;
            this.date = date;
            this.editDate = editDate;
            this.forwardInfo = forwardInfo;
            this.importInfo = importInfo;
            this.interactionInfo = interactionInfo;
            this.unreadReactions = unreadReactions;
            this.factCheck = factCheck;
            this.suggestedPostInfo = suggestedPostInfo;
            this.replyTo = replyTo;
            this.topicId = topicId;
            this.selfDestructType = selfDestructType;
            this.selfDestructIn = selfDestructIn;
            this.autoDeleteIn = autoDeleteIn;
            this.viaBotUserId = viaBotUserId;
            this.guestBotCallerId = guestBotCallerId;
            this.senderBusinessBotUserId = senderBusinessBotUserId;
            this.senderBoostCount = senderBoostCount;
            this.senderTag = senderTag;
            this.paidMessageStarCount = paidMessageStarCount;
            this.authorSignature = authorSignature;
            this.mediaAlbumId = mediaAlbumId;
            this.effectId = effectId;
            this.restrictionInfo = restrictionInfo;
            this.summaryLanguageCode = summaryLanguageCode;
            this.content = content;
            this.replyMarkup = replyMarkup;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -609581767;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains default auto-delete timer setting for new chats.
     */
    public static class MessageAutoDeleteTime extends Object {
        /**
         * Message auto-delete time, in seconds. If 0, then messages aren't deleted automatically.
         */
        public int time;

        /**
         * Contains default auto-delete timer setting for new chats.
         */
        public MessageAutoDeleteTime() {
        }

        /**
         * Contains default auto-delete timer setting for new chats.
         *
         * @param time Message auto-delete time, in seconds. If 0, then messages aren't deleted automatically.
         */
        public MessageAutoDeleteTime(int time) {
            this.time = time;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1972045589;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about found messages, split by days according to the option &quot;utc_time_offset&quot;.
     */
    public static class MessageCalendar extends Object {
        /**
         * Total number of found messages.
         */
        public int totalCount;
        /**
         * Information about messages sent.
         */
        public MessageCalendarDay[] days;

        /**
         * Contains information about found messages, split by days according to the option &quot;utc_time_offset&quot;.
         */
        public MessageCalendar() {
        }

        /**
         * Contains information about found messages, split by days according to the option &quot;utc_time_offset&quot;.
         *
         * @param totalCount Total number of found messages.
         * @param days Information about messages sent.
         */
        public MessageCalendar(int totalCount, MessageCalendarDay[] days) {
            this.totalCount = totalCount;
            this.days = days;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1682890519;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about found messages sent on a specific day.
     */
    public static class MessageCalendarDay extends Object {
        /**
         * Total number of found messages sent on the day.
         */
        public int totalCount;
        /**
         * First message sent on the day.
         */
        public Message message;

        /**
         * Contains information about found messages sent on a specific day.
         */
        public MessageCalendarDay() {
        }

        /**
         * Contains information about found messages sent on a specific day.
         *
         * @param totalCount Total number of found messages sent on the day.
         * @param message First message sent on the day.
         */
        public MessageCalendarDay(int totalCount, Message message) {
            this.totalCount = totalCount;
            this.message = message;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -376467614;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains the content of a message.
     */
    public abstract static class MessageContent extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            MessageText.CONSTRUCTOR,
            MessageAnimation.CONSTRUCTOR,
            MessageAudio.CONSTRUCTOR,
            MessageDocument.CONSTRUCTOR,
            MessagePaidMedia.CONSTRUCTOR,
            MessagePhoto.CONSTRUCTOR,
            MessageSticker.CONSTRUCTOR,
            MessageVideo.CONSTRUCTOR,
            MessageVideoNote.CONSTRUCTOR,
            MessageVoiceNote.CONSTRUCTOR,
            MessageExpiredPhoto.CONSTRUCTOR,
            MessageExpiredVideo.CONSTRUCTOR,
            MessageExpiredVideoNote.CONSTRUCTOR,
            MessageExpiredVoiceNote.CONSTRUCTOR,
            MessageLocation.CONSTRUCTOR,
            MessageVenue.CONSTRUCTOR,
            MessageContact.CONSTRUCTOR,
            MessageAnimatedEmoji.CONSTRUCTOR,
            MessageDice.CONSTRUCTOR,
            MessageGame.CONSTRUCTOR,
            MessagePoll.CONSTRUCTOR,
            MessageStakeDice.CONSTRUCTOR,
            MessageStory.CONSTRUCTOR,
            MessageChecklist.CONSTRUCTOR,
            MessageInvoice.CONSTRUCTOR,
            MessageCall.CONSTRUCTOR,
            MessageGroupCall.CONSTRUCTOR,
            MessageVideoChatScheduled.CONSTRUCTOR,
            MessageVideoChatStarted.CONSTRUCTOR,
            MessageVideoChatEnded.CONSTRUCTOR,
            MessageInviteVideoChatParticipants.CONSTRUCTOR,
            MessagePollOptionAdded.CONSTRUCTOR,
            MessagePollOptionDeleted.CONSTRUCTOR,
            MessageBasicGroupChatCreate.CONSTRUCTOR,
            MessageSupergroupChatCreate.CONSTRUCTOR,
            MessageChatChangeTitle.CONSTRUCTOR,
            MessageChatChangePhoto.CONSTRUCTOR,
            MessageChatDeletePhoto.CONSTRUCTOR,
            MessageChatOwnerLeft.CONSTRUCTOR,
            MessageChatOwnerChanged.CONSTRUCTOR,
            MessageChatHasProtectedContentToggled.CONSTRUCTOR,
            MessageChatHasProtectedContentDisableRequested.CONSTRUCTOR,
            MessageChatAddMembers.CONSTRUCTOR,
            MessageChatJoinByLink.CONSTRUCTOR,
            MessageChatJoinByRequest.CONSTRUCTOR,
            MessageChatDeleteMember.CONSTRUCTOR,
            MessageChatUpgradeTo.CONSTRUCTOR,
            MessageChatUpgradeFrom.CONSTRUCTOR,
            MessagePinMessage.CONSTRUCTOR,
            MessageScreenshotTaken.CONSTRUCTOR,
            MessageChatSetBackground.CONSTRUCTOR,
            MessageChatSetTheme.CONSTRUCTOR,
            MessageChatSetMessageAutoDeleteTime.CONSTRUCTOR,
            MessageChatBoost.CONSTRUCTOR,
            MessageForumTopicCreated.CONSTRUCTOR,
            MessageForumTopicEdited.CONSTRUCTOR,
            MessageForumTopicIsClosedToggled.CONSTRUCTOR,
            MessageForumTopicIsHiddenToggled.CONSTRUCTOR,
            MessageSuggestProfilePhoto.CONSTRUCTOR,
            MessageSuggestBirthdate.CONSTRUCTOR,
            MessageCustomServiceAction.CONSTRUCTOR,
            MessageGameScore.CONSTRUCTOR,
            MessageManagedBotCreated.CONSTRUCTOR,
            MessagePaymentSuccessful.CONSTRUCTOR,
            MessagePaymentSuccessfulBot.CONSTRUCTOR,
            MessagePaymentRefunded.CONSTRUCTOR,
            MessageGiftedPremium.CONSTRUCTOR,
            MessagePremiumGiftCode.CONSTRUCTOR,
            MessageGiveawayCreated.CONSTRUCTOR,
            MessageGiveaway.CONSTRUCTOR,
            MessageGiveawayCompleted.CONSTRUCTOR,
            MessageGiveawayWinners.CONSTRUCTOR,
            MessageGiftedStars.CONSTRUCTOR,
            MessageGiftedTon.CONSTRUCTOR,
            MessageGiveawayPrizeStars.CONSTRUCTOR,
            MessageGift.CONSTRUCTOR,
            MessageUpgradedGift.CONSTRUCTOR,
            MessageRefundedUpgradedGift.CONSTRUCTOR,
            MessageUpgradedGiftPurchaseOffer.CONSTRUCTOR,
            MessageUpgradedGiftPurchaseOfferRejected.CONSTRUCTOR,
            MessagePaidMessagesRefunded.CONSTRUCTOR,
            MessagePaidMessagePriceChanged.CONSTRUCTOR,
            MessageDirectMessagePriceChanged.CONSTRUCTOR,
            MessageChecklistTasksDone.CONSTRUCTOR,
            MessageChecklistTasksAdded.CONSTRUCTOR,
            MessageSuggestedPostApprovalFailed.CONSTRUCTOR,
            MessageSuggestedPostApproved.CONSTRUCTOR,
            MessageSuggestedPostDeclined.CONSTRUCTOR,
            MessageSuggestedPostPaid.CONSTRUCTOR,
            MessageSuggestedPostRefunded.CONSTRUCTOR,
            MessageContactRegistered.CONSTRUCTOR,
            MessageUsersShared.CONSTRUCTOR,
            MessageChatShared.CONSTRUCTOR,
            MessageBotWriteAccessAllowed.CONSTRUCTOR,
            MessageWebAppDataSent.CONSTRUCTOR,
            MessageWebAppDataReceived.CONSTRUCTOR,
            MessagePassportDataSent.CONSTRUCTOR,
            MessagePassportDataReceived.CONSTRUCTOR,
            MessageProximityAlertTriggered.CONSTRUCTOR,
            MessageUnsupported.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public MessageContent() {
        }
    }

    /**
     * A text message.
     */
    public static class MessageText extends MessageContent {
        /**
         * Text of the message.
         */
        public FormattedText text;
        /**
         * A link preview attached to the message; may be null.
         */
        @Nullable public LinkPreview linkPreview;
        /**
         * Options which were used for generation of the link preview; may be null if default options were used.
         */
        @Nullable public LinkPreviewOptions linkPreviewOptions;

        /**
         * A text message.
         */
        public MessageText() {
        }

        /**
         * A text message.
         *
         * @param text Text of the message.
         * @param linkPreview A link preview attached to the message; may be null.
         * @param linkPreviewOptions Options which were used for generation of the link preview; may be null if default options were used.
         */
        public MessageText(FormattedText text, LinkPreview linkPreview, LinkPreviewOptions linkPreviewOptions) {
            this.text = text;
            this.linkPreview = linkPreview;
            this.linkPreviewOptions = linkPreviewOptions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1751469188;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An animation message (GIF-style).
     */
    public static class MessageAnimation extends MessageContent {
        /**
         * The animation description.
         */
        public Animation animation;
        /**
         * Animation caption.
         */
        public FormattedText caption;
        /**
         * True, if the caption must be shown above the animation; otherwise, the caption must be shown below the animation.
         */
        public boolean showCaptionAboveMedia;
        /**
         * True, if the animation preview must be covered by a spoiler animation.
         */
        public boolean hasSpoiler;
        /**
         * True, if the animation thumbnail must be blurred and the animation must be shown only while tapped.
         */
        public boolean isSecret;

        /**
         * An animation message (GIF-style).
         */
        public MessageAnimation() {
        }

        /**
         * An animation message (GIF-style).
         *
         * @param animation The animation description.
         * @param caption Animation caption.
         * @param showCaptionAboveMedia True, if the caption must be shown above the animation; otherwise, the caption must be shown below the animation.
         * @param hasSpoiler True, if the animation preview must be covered by a spoiler animation.
         * @param isSecret True, if the animation thumbnail must be blurred and the animation must be shown only while tapped.
         */
        public MessageAnimation(Animation animation, FormattedText caption, boolean showCaptionAboveMedia, boolean hasSpoiler, boolean isSecret) {
            this.animation = animation;
            this.caption = caption;
            this.showCaptionAboveMedia = showCaptionAboveMedia;
            this.hasSpoiler = hasSpoiler;
            this.isSecret = isSecret;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1899294424;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An audio message.
     */
    public static class MessageAudio extends MessageContent {
        /**
         * The audio description.
         */
        public Audio audio;
        /**
         * Audio caption.
         */
        public FormattedText caption;

        /**
         * An audio message.
         */
        public MessageAudio() {
        }

        /**
         * An audio message.
         *
         * @param audio The audio description.
         * @param caption Audio caption.
         */
        public MessageAudio(Audio audio, FormattedText caption) {
            this.audio = audio;
            this.caption = caption;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 276722716;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A document message (general file).
     */
    public static class MessageDocument extends MessageContent {
        /**
         * The document description.
         */
        public Document document;
        /**
         * Document caption.
         */
        public FormattedText caption;

        /**
         * A document message (general file).
         */
        public MessageDocument() {
        }

        /**
         * A document message (general file).
         *
         * @param document The document description.
         * @param caption Document caption.
         */
        public MessageDocument(Document document, FormattedText caption) {
            this.document = document;
            this.caption = caption;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 596945783;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with paid media.
     */
    public static class MessagePaidMedia extends MessageContent {
        /**
         * Number of Telegram Stars needed to buy access to the media in the message.
         */
        public long starCount;
        /**
         * Information about the media.
         */
        public PaidMedia[] media;
        /**
         * Media caption.
         */
        public FormattedText caption;
        /**
         * True, if the caption must be shown above the media; otherwise, the caption must be shown below the media.
         */
        public boolean showCaptionAboveMedia;

        /**
         * A message with paid media.
         */
        public MessagePaidMedia() {
        }

        /**
         * A message with paid media.
         *
         * @param starCount Number of Telegram Stars needed to buy access to the media in the message.
         * @param media Information about the media.
         * @param caption Media caption.
         * @param showCaptionAboveMedia True, if the caption must be shown above the media; otherwise, the caption must be shown below the media.
         */
        public MessagePaidMedia(long starCount, PaidMedia[] media, FormattedText caption, boolean showCaptionAboveMedia) {
            this.starCount = starCount;
            this.media = media;
            this.caption = caption;
            this.showCaptionAboveMedia = showCaptionAboveMedia;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -724750073;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A photo message.
     */
    public static class MessagePhoto extends MessageContent {
        /**
         * The photo.
         */
        public Photo photo;
        /**
         * The video representing the live photo; may be null if the photo is static.
         */
        @Nullable public Video video;
        /**
         * Photo caption.
         */
        public FormattedText caption;
        /**
         * True, if the caption must be shown above the photo; otherwise, the caption must be shown below the photo.
         */
        public boolean showCaptionAboveMedia;
        /**
         * True, if the photo preview must be covered by a spoiler animation.
         */
        public boolean hasSpoiler;
        /**
         * True, if the photo must be blurred and must be shown only while tapped.
         */
        public boolean isSecret;

        /**
         * A photo message.
         */
        public MessagePhoto() {
        }

        /**
         * A photo message.
         *
         * @param photo The photo.
         * @param video The video representing the live photo; may be null if the photo is static.
         * @param caption Photo caption.
         * @param showCaptionAboveMedia True, if the caption must be shown above the photo; otherwise, the caption must be shown below the photo.
         * @param hasSpoiler True, if the photo preview must be covered by a spoiler animation.
         * @param isSecret True, if the photo must be blurred and must be shown only while tapped.
         */
        public MessagePhoto(Photo photo, Video video, FormattedText caption, boolean showCaptionAboveMedia, boolean hasSpoiler, boolean isSecret) {
            this.photo = photo;
            this.video = video;
            this.caption = caption;
            this.showCaptionAboveMedia = showCaptionAboveMedia;
            this.hasSpoiler = hasSpoiler;
            this.isSecret = isSecret;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1512013306;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A sticker message.
     */
    public static class MessageSticker extends MessageContent {
        /**
         * The sticker description.
         */
        public Sticker sticker;
        /**
         * True, if premium animation of the sticker must be played.
         */
        public boolean isPremium;

        /**
         * A sticker message.
         */
        public MessageSticker() {
        }

        /**
         * A sticker message.
         *
         * @param sticker The sticker description.
         * @param isPremium True, if premium animation of the sticker must be played.
         */
        public MessageSticker(Sticker sticker, boolean isPremium) {
            this.sticker = sticker;
            this.isPremium = isPremium;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -437199670;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A video message.
     */
    public static class MessageVideo extends MessageContent {
        /**
         * The video description.
         */
        public Video video;
        /**
         * Alternative qualities of the video.
         */
        public AlternativeVideo[] alternativeVideos;
        /**
         * Available storyboards for the video.
         */
        public VideoStoryboard[] storyboards;
        /**
         * Cover of the video; may be null if none.
         */
        @Nullable public Photo cover;
        /**
         * Timestamp from which the video playing must start, in seconds.
         */
        public int startTimestamp;
        /**
         * Video caption.
         */
        public FormattedText caption;
        /**
         * True, if the caption must be shown above the video; otherwise, the caption must be shown below the video.
         */
        public boolean showCaptionAboveMedia;
        /**
         * True, if the video preview must be covered by a spoiler animation.
         */
        public boolean hasSpoiler;
        /**
         * True, if the video thumbnail must be blurred and the video must be shown only while tapped.
         */
        public boolean isSecret;

        /**
         * A video message.
         */
        public MessageVideo() {
        }

        /**
         * A video message.
         *
         * @param video The video description.
         * @param alternativeVideos Alternative qualities of the video.
         * @param storyboards Available storyboards for the video.
         * @param cover Cover of the video; may be null if none.
         * @param startTimestamp Timestamp from which the video playing must start, in seconds.
         * @param caption Video caption.
         * @param showCaptionAboveMedia True, if the caption must be shown above the video; otherwise, the caption must be shown below the video.
         * @param hasSpoiler True, if the video preview must be covered by a spoiler animation.
         * @param isSecret True, if the video thumbnail must be blurred and the video must be shown only while tapped.
         */
        public MessageVideo(Video video, AlternativeVideo[] alternativeVideos, VideoStoryboard[] storyboards, Photo cover, int startTimestamp, FormattedText caption, boolean showCaptionAboveMedia, boolean hasSpoiler, boolean isSecret) {
            this.video = video;
            this.alternativeVideos = alternativeVideos;
            this.storyboards = storyboards;
            this.cover = cover;
            this.startTimestamp = startTimestamp;
            this.caption = caption;
            this.showCaptionAboveMedia = showCaptionAboveMedia;
            this.hasSpoiler = hasSpoiler;
            this.isSecret = isSecret;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 952522912;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A video note message.
     */
    public static class MessageVideoNote extends MessageContent {
        /**
         * The video note description.
         */
        public VideoNote videoNote;
        /**
         * True, if at least one of the recipients has viewed the video note.
         */
        public boolean isViewed;
        /**
         * True, if the video note thumbnail must be blurred and the video note must be shown only while tapped.
         */
        public boolean isSecret;

        /**
         * A video note message.
         */
        public MessageVideoNote() {
        }

        /**
         * A video note message.
         *
         * @param videoNote The video note description.
         * @param isViewed True, if at least one of the recipients has viewed the video note.
         * @param isSecret True, if the video note thumbnail must be blurred and the video note must be shown only while tapped.
         */
        public MessageVideoNote(VideoNote videoNote, boolean isViewed, boolean isSecret) {
            this.videoNote = videoNote;
            this.isViewed = isViewed;
            this.isSecret = isSecret;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 963323014;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A voice note message.
     */
    public static class MessageVoiceNote extends MessageContent {
        /**
         * The voice note description.
         */
        public VoiceNote voiceNote;
        /**
         * Voice note caption.
         */
        public FormattedText caption;
        /**
         * True, if at least one of the recipients has listened to the voice note.
         */
        public boolean isListened;

        /**
         * A voice note message.
         */
        public MessageVoiceNote() {
        }

        /**
         * A voice note message.
         *
         * @param voiceNote The voice note description.
         * @param caption Voice note caption.
         * @param isListened True, if at least one of the recipients has listened to the voice note.
         */
        public MessageVoiceNote(VoiceNote voiceNote, FormattedText caption, boolean isListened) {
            this.voiceNote = voiceNote;
            this.caption = caption;
            this.isListened = isListened;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 527777781;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A self-destructed photo message.
     */
    public static class MessageExpiredPhoto extends MessageContent {

        /**
         * A self-destructed photo message.
         */
        public MessageExpiredPhoto() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1404641801;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A self-destructed video message.
     */
    public static class MessageExpiredVideo extends MessageContent {

        /**
         * A self-destructed video message.
         */
        public MessageExpiredVideo() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1212209981;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A self-destructed video note message.
     */
    public static class MessageExpiredVideoNote extends MessageContent {

        /**
         * A self-destructed video note message.
         */
        public MessageExpiredVideoNote() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 599540711;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A self-destructed voice note message.
     */
    public static class MessageExpiredVoiceNote extends MessageContent {

        /**
         * A self-destructed voice note message.
         */
        public MessageExpiredVoiceNote() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 143684989;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with a location.
     */
    public static class MessageLocation extends MessageContent {
        /**
         * The location description.
         */
        public Location location;
        /**
         * Time relative to the message send date, for which the location can be updated, in seconds; if 0x7FFFFFFF, then location can be updated forever.
         */
        public int livePeriod;
        /**
         * Left time for which the location can be updated, in seconds. If 0, then the location can't be updated anymore. The update updateMessageContent is not sent when this field changes.
         */
        public int expiresIn;
        /**
         * For live locations, a direction in which the location moves, in degrees; 1-360. If 0 the direction is unknown.
         */
        public int heading;
        /**
         * For live locations, a maximum distance to another chat member for proximity alerts, in meters (0-100000). 0 if the notification is disabled. Available only to the message sender.
         */
        public int proximityAlertRadius;

        /**
         * A message with a location.
         */
        public MessageLocation() {
        }

        /**
         * A message with a location.
         *
         * @param location The location description.
         * @param livePeriod Time relative to the message send date, for which the location can be updated, in seconds; if 0x7FFFFFFF, then location can be updated forever.
         * @param expiresIn Left time for which the location can be updated, in seconds. If 0, then the location can't be updated anymore. The update updateMessageContent is not sent when this field changes.
         * @param heading For live locations, a direction in which the location moves, in degrees; 1-360. If 0 the direction is unknown.
         * @param proximityAlertRadius For live locations, a maximum distance to another chat member for proximity alerts, in meters (0-100000). 0 if the notification is disabled. Available only to the message sender.
         */
        public MessageLocation(Location location, int livePeriod, int expiresIn, int heading, int proximityAlertRadius) {
            this.location = location;
            this.livePeriod = livePeriod;
            this.expiresIn = expiresIn;
            this.heading = heading;
            this.proximityAlertRadius = proximityAlertRadius;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 303973492;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with information about a venue.
     */
    public static class MessageVenue extends MessageContent {
        /**
         * The venue description.
         */
        public Venue venue;

        /**
         * A message with information about a venue.
         */
        public MessageVenue() {
        }

        /**
         * A message with information about a venue.
         *
         * @param venue The venue description.
         */
        public MessageVenue(Venue venue) {
            this.venue = venue;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2146492043;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with a user contact.
     */
    public static class MessageContact extends MessageContent {
        /**
         * The contact description.
         */
        public Contact contact;

        /**
         * A message with a user contact.
         */
        public MessageContact() {
        }

        /**
         * A message with a user contact.
         *
         * @param contact The contact description.
         */
        public MessageContact(Contact contact) {
            this.contact = contact;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -512684966;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with an animated emoji.
     */
    public static class MessageAnimatedEmoji extends MessageContent {
        /**
         * The animated emoji.
         */
        public AnimatedEmoji animatedEmoji;
        /**
         * The corresponding emoji.
         */
        public String emoji;

        /**
         * A message with an animated emoji.
         */
        public MessageAnimatedEmoji() {
        }

        /**
         * A message with an animated emoji.
         *
         * @param animatedEmoji The animated emoji.
         * @param emoji The corresponding emoji.
         */
        public MessageAnimatedEmoji(AnimatedEmoji animatedEmoji, String emoji) {
            this.animatedEmoji = animatedEmoji;
            this.emoji = emoji;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 908195298;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A dice message. The dice value is randomly generated by the server.
     */
    public static class MessageDice extends MessageContent {
        /**
         * The animated stickers with the initial dice animation; may be null if unknown. The update updateMessageContent will be sent when the sticker became known.
         */
        @Nullable public DiceStickers initialState;
        /**
         * The animated stickers with the final dice animation; may be null if unknown. The update updateMessageContent will be sent when the sticker became known.
         */
        @Nullable public DiceStickers finalState;
        /**
         * Emoji on which the dice throw animation is based.
         */
        public String emoji;
        /**
         * The dice value. If the value is 0, then the dice don't have final state yet.
         */
        public int value;
        /**
         * Number of frame after which a success animation like a shower of confetti needs to be shown on updateMessageSendSucceeded.
         */
        public int successAnimationFrameNumber;

        /**
         * A dice message. The dice value is randomly generated by the server.
         */
        public MessageDice() {
        }

        /**
         * A dice message. The dice value is randomly generated by the server.
         *
         * @param initialState The animated stickers with the initial dice animation; may be null if unknown. The update updateMessageContent will be sent when the sticker became known.
         * @param finalState The animated stickers with the final dice animation; may be null if unknown. The update updateMessageContent will be sent when the sticker became known.
         * @param emoji Emoji on which the dice throw animation is based.
         * @param value The dice value. If the value is 0, then the dice don't have final state yet.
         * @param successAnimationFrameNumber Number of frame after which a success animation like a shower of confetti needs to be shown on updateMessageSendSucceeded.
         */
        public MessageDice(DiceStickers initialState, DiceStickers finalState, String emoji, int value, int successAnimationFrameNumber) {
            this.initialState = initialState;
            this.finalState = finalState;
            this.emoji = emoji;
            this.value = value;
            this.successAnimationFrameNumber = successAnimationFrameNumber;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1115779641;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with a game.
     */
    public static class MessageGame extends MessageContent {
        /**
         * The game description.
         */
        public Game game;

        /**
         * A message with a game.
         */
        public MessageGame() {
        }

        /**
         * A message with a game.
         *
         * @param game The game description.
         */
        public MessageGame(Game game) {
            this.game = game;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -69441162;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with a poll.
     */
    public static class MessagePoll extends MessageContent {
        /**
         * Information about the poll.
         */
        public Poll poll;
        /**
         * Description of the poll.
         */
        public FormattedText description;
        /**
         * Media attached to the poll; may be null if none. If present, currently, can be only of the types messageAnimation, messageAudio, messageDocument, messageLocation, messagePhoto, messageVenue, or messageVideo without caption.
         */
        @Nullable public MessageContent media;
        /**
         * True, if an option can be added to the poll using addPollOption.
         */
        public boolean canAddOption;

        /**
         * A message with a poll.
         */
        public MessagePoll() {
        }

        /**
         * A message with a poll.
         *
         * @param poll Information about the poll.
         * @param description Description of the poll.
         * @param media Media attached to the poll; may be null if none. If present, currently, can be only of the types messageAnimation, messageAudio, messageDocument, messageLocation, messagePhoto, messageVenue, or messageVideo without caption.
         * @param canAddOption True, if an option can be added to the poll using addPollOption.
         */
        public MessagePoll(Poll poll, FormattedText description, MessageContent media, boolean canAddOption) {
            this.poll = poll;
            this.description = description;
            this.media = media;
            this.canAddOption = canAddOption;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1644813882;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A stake dice message. The dice value is randomly generated by the server.
     */
    public static class MessageStakeDice extends MessageContent {
        /**
         * The animated stickers with the initial dice animation; may be null if unknown. The update updateMessageContent will be sent when the sticker became known.
         */
        @Nullable public DiceStickers initialState;
        /**
         * The animated stickers with the final dice animation; may be null if unknown. The update updateMessageContent will be sent when the sticker became known.
         */
        @Nullable public DiceStickers finalState;
        /**
         * The dice value. If the value is 0, then the dice don't have final state yet.
         */
        public int value;
        /**
         * The Toncoin amount that was staked; in the smallest units of the currency.
         */
        public long stakeToncoinAmount;
        /**
         * The Toncoin amount that was gained from the roll; in the smallest units of the currency; -1 if the dice don't have final state yet.
         */
        public long prizeToncoinAmount;

        /**
         * A stake dice message. The dice value is randomly generated by the server.
         */
        public MessageStakeDice() {
        }

        /**
         * A stake dice message. The dice value is randomly generated by the server.
         *
         * @param initialState The animated stickers with the initial dice animation; may be null if unknown. The update updateMessageContent will be sent when the sticker became known.
         * @param finalState The animated stickers with the final dice animation; may be null if unknown. The update updateMessageContent will be sent when the sticker became known.
         * @param value The dice value. If the value is 0, then the dice don't have final state yet.
         * @param stakeToncoinAmount The Toncoin amount that was staked; in the smallest units of the currency.
         * @param prizeToncoinAmount The Toncoin amount that was gained from the roll; in the smallest units of the currency; -1 if the dice don't have final state yet.
         */
        public MessageStakeDice(DiceStickers initialState, DiceStickers finalState, int value, long stakeToncoinAmount, long prizeToncoinAmount) {
            this.initialState = initialState;
            this.finalState = finalState;
            this.value = value;
            this.stakeToncoinAmount = stakeToncoinAmount;
            this.prizeToncoinAmount = prizeToncoinAmount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 844428448;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with a forwarded story.
     */
    public static class MessageStory extends MessageContent {
        /**
         * Identifier of the chat that posted the story.
         */
        public long storyPosterChatId;
        /**
         * Story identifier.
         */
        public int storyId;
        /**
         * True, if the story was automatically forwarded because of a mention of the user.
         */
        public boolean viaMention;

        /**
         * A message with a forwarded story.
         */
        public MessageStory() {
        }

        /**
         * A message with a forwarded story.
         *
         * @param storyPosterChatId Identifier of the chat that posted the story.
         * @param storyId Story identifier.
         * @param viaMention True, if the story was automatically forwarded because of a mention of the user.
         */
        public MessageStory(long storyPosterChatId, int storyId, boolean viaMention) {
            this.storyPosterChatId = storyPosterChatId;
            this.storyId = storyId;
            this.viaMention = viaMention;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1514236353;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with a checklist.
     */
    public static class MessageChecklist extends MessageContent {
        /**
         * The checklist description.
         */
        public Checklist list;

        /**
         * A message with a checklist.
         */
        public MessageChecklist() {
        }

        /**
         * A message with a checklist.
         *
         * @param list The checklist description.
         */
        public MessageChecklist(Checklist list) {
            this.list = list;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 609926697;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with an invoice from a bot. Use getInternalLink with internalLinkTypeBotStart to share the invoice.
     */
    public static class MessageInvoice extends MessageContent {
        /**
         * Information about the product.
         */
        public ProductInfo productInfo;
        /**
         * Currency for the product price.
         */
        public String currency;
        /**
         * Product total price in the smallest units of the currency.
         */
        public long totalAmount;
        /**
         * Unique invoice bot startParameter to be passed to getInternalLink.
         */
        public String startParameter;
        /**
         * True, if the invoice is a test invoice.
         */
        public boolean isTest;
        /**
         * True, if the shipping address must be specified.
         */
        public boolean needShippingAddress;
        /**
         * The identifier of the message with the receipt, after the product has been purchased.
         */
        public long receiptMessageId;
        /**
         * Extended media attached to the invoice; may be null if none.
         */
        @Nullable public PaidMedia paidMedia;
        /**
         * Extended media caption; may be null if none.
         */
        @Nullable public FormattedText paidMediaCaption;

        /**
         * A message with an invoice from a bot. Use getInternalLink with internalLinkTypeBotStart to share the invoice.
         */
        public MessageInvoice() {
        }

        /**
         * A message with an invoice from a bot. Use getInternalLink with internalLinkTypeBotStart to share the invoice.
         *
         * @param productInfo Information about the product.
         * @param currency Currency for the product price.
         * @param totalAmount Product total price in the smallest units of the currency.
         * @param startParameter Unique invoice bot startParameter to be passed to getInternalLink.
         * @param isTest True, if the invoice is a test invoice.
         * @param needShippingAddress True, if the shipping address must be specified.
         * @param receiptMessageId The identifier of the message with the receipt, after the product has been purchased.
         * @param paidMedia Extended media attached to the invoice; may be null if none.
         * @param paidMediaCaption Extended media caption; may be null if none.
         */
        public MessageInvoice(ProductInfo productInfo, String currency, long totalAmount, String startParameter, boolean isTest, boolean needShippingAddress, long receiptMessageId, PaidMedia paidMedia, FormattedText paidMediaCaption) {
            this.productInfo = productInfo;
            this.currency = currency;
            this.totalAmount = totalAmount;
            this.startParameter = startParameter;
            this.isTest = isTest;
            this.needShippingAddress = needShippingAddress;
            this.receiptMessageId = receiptMessageId;
            this.paidMedia = paidMedia;
            this.paidMediaCaption = paidMediaCaption;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 263060806;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with information about an ended call.
     */
    public static class MessageCall extends MessageContent {
        /**
         * Persistent unique call identifier; 0 for calls from other devices, which can't be passed as inputCallFromMessage.
         */
        public long uniqueId;
        /**
         * True, if the call was a video call.
         */
        public boolean isVideo;
        /**
         * Reason why the call was discarded.
         */
        public CallDiscardReason discardReason;
        /**
         * Call duration, in seconds.
         */
        public int duration;

        /**
         * A message with information about an ended call.
         */
        public MessageCall() {
        }

        /**
         * A message with information about an ended call.
         *
         * @param uniqueId Persistent unique call identifier; 0 for calls from other devices, which can't be passed as inputCallFromMessage.
         * @param isVideo True, if the call was a video call.
         * @param discardReason Reason why the call was discarded.
         * @param duration Call duration, in seconds.
         */
        public MessageCall(long uniqueId, boolean isVideo, CallDiscardReason discardReason, int duration) {
            this.uniqueId = uniqueId;
            this.isVideo = isVideo;
            this.discardReason = discardReason;
            this.duration = duration;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 142247375;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with information about a group call not bound to a chat. If the message is incoming, the call isn't active, isn't missed, and has no duration, and getOption(&quot;can_accept_calls&quot;) is true, then incoming call screen must be shown to the user. Use getGroupCallParticipants to show current group call participants on the screen. Use joinGroupCall to accept the call or declineGroupCallInvitation to decline it. If the call become active or missed, then the call screen must be hidden.
     */
    public static class MessageGroupCall extends MessageContent {
        /**
         * Persistent unique group call identifier.
         */
        public long uniqueId;
        /**
         * True, if the call is active, i.e. the called user joined the call.
         */
        public boolean isActive;
        /**
         * True, if the called user missed or declined the call.
         */
        public boolean wasMissed;
        /**
         * True, if the call is a video call.
         */
        public boolean isVideo;
        /**
         * Call duration, in seconds; for left calls only.
         */
        public int duration;
        /**
         * Identifiers of some other call participants.
         */
        public MessageSender[] otherParticipantIds;

        /**
         * A message with information about a group call not bound to a chat. If the message is incoming, the call isn't active, isn't missed, and has no duration, and getOption(&quot;can_accept_calls&quot;) is true, then incoming call screen must be shown to the user. Use getGroupCallParticipants to show current group call participants on the screen. Use joinGroupCall to accept the call or declineGroupCallInvitation to decline it. If the call become active or missed, then the call screen must be hidden.
         */
        public MessageGroupCall() {
        }

        /**
         * A message with information about a group call not bound to a chat. If the message is incoming, the call isn't active, isn't missed, and has no duration, and getOption(&quot;can_accept_calls&quot;) is true, then incoming call screen must be shown to the user. Use getGroupCallParticipants to show current group call participants on the screen. Use joinGroupCall to accept the call or declineGroupCallInvitation to decline it. If the call become active or missed, then the call screen must be hidden.
         *
         * @param uniqueId Persistent unique group call identifier.
         * @param isActive True, if the call is active, i.e. the called user joined the call.
         * @param wasMissed True, if the called user missed or declined the call.
         * @param isVideo True, if the call is a video call.
         * @param duration Call duration, in seconds; for left calls only.
         * @param otherParticipantIds Identifiers of some other call participants.
         */
        public MessageGroupCall(long uniqueId, boolean isActive, boolean wasMissed, boolean isVideo, int duration, MessageSender[] otherParticipantIds) {
            this.uniqueId = uniqueId;
            this.isActive = isActive;
            this.wasMissed = wasMissed;
            this.isVideo = isVideo;
            this.duration = duration;
            this.otherParticipantIds = otherParticipantIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1735752741;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new video chat was scheduled.
     */
    public static class MessageVideoChatScheduled extends MessageContent {
        /**
         * Identifier of the video chat. The video chat can be received through the method getGroupCall.
         */
        public int groupCallId;
        /**
         * Point in time (Unix timestamp) when the group call is expected to be started by an administrator.
         */
        public int startDate;

        /**
         * A new video chat was scheduled.
         */
        public MessageVideoChatScheduled() {
        }

        /**
         * A new video chat was scheduled.
         *
         * @param groupCallId Identifier of the video chat. The video chat can be received through the method getGroupCall.
         * @param startDate Point in time (Unix timestamp) when the group call is expected to be started by an administrator.
         */
        public MessageVideoChatScheduled(int groupCallId, int startDate) {
            this.groupCallId = groupCallId;
            this.startDate = startDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1855185481;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A newly created video chat.
     */
    public static class MessageVideoChatStarted extends MessageContent {
        /**
         * Identifier of the video chat. The video chat can be received through the method getGroupCall.
         */
        public int groupCallId;

        /**
         * A newly created video chat.
         */
        public MessageVideoChatStarted() {
        }

        /**
         * A newly created video chat.
         *
         * @param groupCallId Identifier of the video chat. The video chat can be received through the method getGroupCall.
         */
        public MessageVideoChatStarted(int groupCallId) {
            this.groupCallId = groupCallId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 521225561;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with information about an ended video chat.
     */
    public static class MessageVideoChatEnded extends MessageContent {
        /**
         * Call duration, in seconds.
         */
        public int duration;

        /**
         * A message with information about an ended video chat.
         */
        public MessageVideoChatEnded() {
        }

        /**
         * A message with information about an ended video chat.
         *
         * @param duration Call duration, in seconds.
         */
        public MessageVideoChatEnded(int duration) {
            this.duration = duration;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2032544855;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with information about an invitation to a video chat.
     */
    public static class MessageInviteVideoChatParticipants extends MessageContent {
        /**
         * Identifier of the video chat. The video chat can be received through the method getGroupCall.
         */
        public int groupCallId;
        /**
         * Invited user identifiers.
         */
        public long[] userIds;

        /**
         * A message with information about an invitation to a video chat.
         */
        public MessageInviteVideoChatParticipants() {
        }

        /**
         * A message with information about an invitation to a video chat.
         *
         * @param groupCallId Identifier of the video chat. The video chat can be received through the method getGroupCall.
         * @param userIds Invited user identifiers.
         */
        public MessageInviteVideoChatParticipants(int groupCallId, long[] userIds) {
            this.groupCallId = groupCallId;
            this.userIds = userIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1459065585;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with information about an added poll option.
     */
    public static class MessagePollOptionAdded extends MessageContent {
        /**
         * Identifier of the message with the poll; can be an identifier of a deleted message or 0.
         */
        public long pollMessageId;
        /**
         * Identifier of the added option in the poll.
         */
        public String optionId;
        /**
         * Text of the option; 1-100 characters; may contain only custom emoji entities.
         */
        public FormattedText text;

        /**
         * A message with information about an added poll option.
         */
        public MessagePollOptionAdded() {
        }

        /**
         * A message with information about an added poll option.
         *
         * @param pollMessageId Identifier of the message with the poll; can be an identifier of a deleted message or 0.
         * @param optionId Identifier of the added option in the poll.
         * @param text Text of the option; 1-100 characters; may contain only custom emoji entities.
         */
        public MessagePollOptionAdded(long pollMessageId, String optionId, FormattedText text) {
            this.pollMessageId = pollMessageId;
            this.optionId = optionId;
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1826080462;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with information about a deleted poll option.
     */
    public static class MessagePollOptionDeleted extends MessageContent {
        /**
         * Identifier of the message with the poll; can be an identifier of a deleted message or 0.
         */
        public long pollMessageId;
        /**
         * Identifier of the deleted option in the poll.
         */
        public String optionId;
        /**
         * Text of the option; 1-100 characters; may contain only custom emoji entities.
         */
        public FormattedText text;

        /**
         * A message with information about a deleted poll option.
         */
        public MessagePollOptionDeleted() {
        }

        /**
         * A message with information about a deleted poll option.
         *
         * @param pollMessageId Identifier of the message with the poll; can be an identifier of a deleted message or 0.
         * @param optionId Identifier of the deleted option in the poll.
         * @param text Text of the option; 1-100 characters; may contain only custom emoji entities.
         */
        public MessagePollOptionDeleted(long pollMessageId, String optionId, FormattedText text) {
            this.pollMessageId = pollMessageId;
            this.optionId = optionId;
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1808348024;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A newly created basic group.
     */
    public static class MessageBasicGroupChatCreate extends MessageContent {
        /**
         * Title of the basic group.
         */
        public String title;
        /**
         * User identifiers of members in the basic group.
         */
        public long[] memberUserIds;

        /**
         * A newly created basic group.
         */
        public MessageBasicGroupChatCreate() {
        }

        /**
         * A newly created basic group.
         *
         * @param title Title of the basic group.
         * @param memberUserIds User identifiers of members in the basic group.
         */
        public MessageBasicGroupChatCreate(String title, long[] memberUserIds) {
            this.title = title;
            this.memberUserIds = memberUserIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 795404060;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A newly created supergroup or channel.
     */
    public static class MessageSupergroupChatCreate extends MessageContent {
        /**
         * Title of the supergroup or channel.
         */
        public String title;

        /**
         * A newly created supergroup or channel.
         */
        public MessageSupergroupChatCreate() {
        }

        /**
         * A newly created supergroup or channel.
         *
         * @param title Title of the supergroup or channel.
         */
        public MessageSupergroupChatCreate(String title) {
            this.title = title;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -434325733;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An updated chat title.
     */
    public static class MessageChatChangeTitle extends MessageContent {
        /**
         * New chat title.
         */
        public String title;

        /**
         * An updated chat title.
         */
        public MessageChatChangeTitle() {
        }

        /**
         * An updated chat title.
         *
         * @param title New chat title.
         */
        public MessageChatChangeTitle(String title) {
            this.title = title;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 748272449;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An updated chat photo.
     */
    public static class MessageChatChangePhoto extends MessageContent {
        /**
         * New chat photo.
         */
        public ChatPhoto photo;

        /**
         * An updated chat photo.
         */
        public MessageChatChangePhoto() {
        }

        /**
         * An updated chat photo.
         *
         * @param photo New chat photo.
         */
        public MessageChatChangePhoto(ChatPhoto photo) {
            this.photo = photo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -813415093;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A deleted chat photo.
     */
    public static class MessageChatDeletePhoto extends MessageContent {

        /**
         * A deleted chat photo.
         */
        public MessageChatDeletePhoto() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -184374809;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The owner of the chat has left.
     */
    public static class MessageChatOwnerLeft extends MessageContent {
        /**
         * Identifier of the user who will become the new owner of the chat if the previous owner isn't return; 0 if none.
         */
        public long newOwnerUserId;

        /**
         * The owner of the chat has left.
         */
        public MessageChatOwnerLeft() {
        }

        /**
         * The owner of the chat has left.
         *
         * @param newOwnerUserId Identifier of the user who will become the new owner of the chat if the previous owner isn't return; 0 if none.
         */
        public MessageChatOwnerLeft(long newOwnerUserId) {
            this.newOwnerUserId = newOwnerUserId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 391852540;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The owner of the chat has changed.
     */
    public static class MessageChatOwnerChanged extends MessageContent {
        /**
         * Identifier of the user who is the new owner of the chat.
         */
        public long newOwnerUserId;

        /**
         * The owner of the chat has changed.
         */
        public MessageChatOwnerChanged() {
        }

        /**
         * The owner of the chat has changed.
         *
         * @param newOwnerUserId Identifier of the user who is the new owner of the chat.
         */
        public MessageChatOwnerChanged(long newOwnerUserId) {
            this.newOwnerUserId = newOwnerUserId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1679665913;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Chat hasProtectedContent setting was changed or request to change it was rejected.
     */
    public static class MessageChatHasProtectedContentToggled extends MessageContent {
        /**
         * Identifier of the message with the request to change the setting; can be an identifier of a deleted message or 0.
         */
        public long requestMessageId;
        /**
         * Previous value of the setting.
         */
        public boolean oldHasProtectedContent;
        /**
         * New value of the setting.
         */
        public boolean newHasProtectedContent;

        /**
         * Chat hasProtectedContent setting was changed or request to change it was rejected.
         */
        public MessageChatHasProtectedContentToggled() {
        }

        /**
         * Chat hasProtectedContent setting was changed or request to change it was rejected.
         *
         * @param requestMessageId Identifier of the message with the request to change the setting; can be an identifier of a deleted message or 0.
         * @param oldHasProtectedContent Previous value of the setting.
         * @param newHasProtectedContent New value of the setting.
         */
        public MessageChatHasProtectedContentToggled(long requestMessageId, boolean oldHasProtectedContent, boolean newHasProtectedContent) {
            this.requestMessageId = requestMessageId;
            this.oldHasProtectedContent = oldHasProtectedContent;
            this.newHasProtectedContent = newHasProtectedContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -809083979;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Chat hasProtectedContent setting was requested to be disabled.
     */
    public static class MessageChatHasProtectedContentDisableRequested extends MessageContent {
        /**
         * True, if the request has expired.
         */
        public boolean isExpired;

        /**
         * Chat hasProtectedContent setting was requested to be disabled.
         */
        public MessageChatHasProtectedContentDisableRequested() {
        }

        /**
         * Chat hasProtectedContent setting was requested to be disabled.
         *
         * @param isExpired True, if the request has expired.
         */
        public MessageChatHasProtectedContentDisableRequested(boolean isExpired) {
            this.isExpired = isExpired;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 334722856;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * New chat members were added.
     */
    public static class MessageChatAddMembers extends MessageContent {
        /**
         * User identifiers of the new members.
         */
        public long[] memberUserIds;

        /**
         * New chat members were added.
         */
        public MessageChatAddMembers() {
        }

        /**
         * New chat members were added.
         *
         * @param memberUserIds User identifiers of the new members.
         */
        public MessageChatAddMembers(long[] memberUserIds) {
            this.memberUserIds = memberUserIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1701117908;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new member joined the chat via an invite link.
     */
    public static class MessageChatJoinByLink extends MessageContent {

        /**
         * A new member joined the chat via an invite link.
         */
        public MessageChatJoinByLink() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1846493311;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new member was accepted to the chat by an administrator.
     */
    public static class MessageChatJoinByRequest extends MessageContent {

        /**
         * A new member was accepted to the chat by an administrator.
         */
        public MessageChatJoinByRequest() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1195428732;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat member was deleted.
     */
    public static class MessageChatDeleteMember extends MessageContent {
        /**
         * User identifier of the deleted chat member.
         */
        public long userId;

        /**
         * A chat member was deleted.
         */
        public MessageChatDeleteMember() {
        }

        /**
         * A chat member was deleted.
         *
         * @param userId User identifier of the deleted chat member.
         */
        public MessageChatDeleteMember(long userId) {
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 938029481;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A basic group was upgraded to a supergroup and was deactivated as the result.
     */
    public static class MessageChatUpgradeTo extends MessageContent {
        /**
         * Identifier of the supergroup to which the basic group was upgraded.
         */
        public long supergroupId;

        /**
         * A basic group was upgraded to a supergroup and was deactivated as the result.
         */
        public MessageChatUpgradeTo() {
        }

        /**
         * A basic group was upgraded to a supergroup and was deactivated as the result.
         *
         * @param supergroupId Identifier of the supergroup to which the basic group was upgraded.
         */
        public MessageChatUpgradeTo(long supergroupId) {
            this.supergroupId = supergroupId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 104813723;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A supergroup has been created from a basic group.
     */
    public static class MessageChatUpgradeFrom extends MessageContent {
        /**
         * Title of the newly created supergroup.
         */
        public String title;
        /**
         * The identifier of the original basic group.
         */
        public long basicGroupId;

        /**
         * A supergroup has been created from a basic group.
         */
        public MessageChatUpgradeFrom() {
        }

        /**
         * A supergroup has been created from a basic group.
         *
         * @param title Title of the newly created supergroup.
         * @param basicGroupId The identifier of the original basic group.
         */
        public MessageChatUpgradeFrom(String title, long basicGroupId) {
            this.title = title;
            this.basicGroupId = basicGroupId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 325954268;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message has been pinned.
     */
    public static class MessagePinMessage extends MessageContent {
        /**
         * Identifier of the pinned message, can be an identifier of a deleted message or 0.
         */
        public long messageId;

        /**
         * A message has been pinned.
         */
        public MessagePinMessage() {
        }

        /**
         * A message has been pinned.
         *
         * @param messageId Identifier of the pinned message, can be an identifier of a deleted message or 0.
         */
        public MessagePinMessage(long messageId) {
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 953503801;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A screenshot of a message in the chat has been taken.
     */
    public static class MessageScreenshotTaken extends MessageContent {

        /**
         * A screenshot of a message in the chat has been taken.
         */
        public MessageScreenshotTaken() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1564971605;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new background was set in the chat.
     */
    public static class MessageChatSetBackground extends MessageContent {
        /**
         * Identifier of the message with a previously set same background; 0 if none. Can be an identifier of a deleted message.
         */
        public long oldBackgroundMessageId;
        /**
         * The new background.
         */
        public ChatBackground background;
        /**
         * True, if the background was set only for self.
         */
        public boolean onlyForSelf;

        /**
         * A new background was set in the chat.
         */
        public MessageChatSetBackground() {
        }

        /**
         * A new background was set in the chat.
         *
         * @param oldBackgroundMessageId Identifier of the message with a previously set same background; 0 if none. Can be an identifier of a deleted message.
         * @param background The new background.
         * @param onlyForSelf True, if the background was set only for self.
         */
        public MessageChatSetBackground(long oldBackgroundMessageId, ChatBackground background, boolean onlyForSelf) {
            this.oldBackgroundMessageId = oldBackgroundMessageId;
            this.background = background;
            this.onlyForSelf = onlyForSelf;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1029536832;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A theme in the chat has been changed.
     */
    public static class MessageChatSetTheme extends MessageContent {
        /**
         * New theme for the chat; may be null if chat theme was reset to the default one.
         */
        @Nullable public ChatTheme theme;

        /**
         * A theme in the chat has been changed.
         */
        public MessageChatSetTheme() {
        }

        /**
         * A theme in the chat has been changed.
         *
         * @param theme New theme for the chat; may be null if chat theme was reset to the default one.
         */
        public MessageChatSetTheme(ChatTheme theme) {
            this.theme = theme;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1227514007;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The auto-delete or self-destruct timer for messages in the chat has been changed.
     */
    public static class MessageChatSetMessageAutoDeleteTime extends MessageContent {
        /**
         * New value auto-delete or self-destruct time, in seconds; 0 if disabled.
         */
        public int messageAutoDeleteTime;
        /**
         * If not 0, a user identifier, which default setting was automatically applied.
         */
        public long fromUserId;

        /**
         * The auto-delete or self-destruct timer for messages in the chat has been changed.
         */
        public MessageChatSetMessageAutoDeleteTime() {
        }

        /**
         * The auto-delete or self-destruct timer for messages in the chat has been changed.
         *
         * @param messageAutoDeleteTime New value auto-delete or self-destruct time, in seconds; 0 if disabled.
         * @param fromUserId If not 0, a user identifier, which default setting was automatically applied.
         */
        public MessageChatSetMessageAutoDeleteTime(int messageAutoDeleteTime, long fromUserId) {
            this.messageAutoDeleteTime = messageAutoDeleteTime;
            this.fromUserId = fromUserId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1637745966;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat was boosted by the sender of the message.
     */
    public static class MessageChatBoost extends MessageContent {
        /**
         * Number of times the chat was boosted.
         */
        public int boostCount;

        /**
         * The chat was boosted by the sender of the message.
         */
        public MessageChatBoost() {
        }

        /**
         * The chat was boosted by the sender of the message.
         *
         * @param boostCount Number of times the chat was boosted.
         */
        public MessageChatBoost(int boostCount) {
            this.boostCount = boostCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1583310219;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A forum topic has been created.
     */
    public static class MessageForumTopicCreated extends MessageContent {
        /**
         * Name of the topic.
         */
        public String name;
        /**
         * True, if the name of the topic wasn't added explicitly.
         */
        public boolean isNameImplicit;
        /**
         * Icon of the topic.
         */
        public ForumTopicIcon icon;

        /**
         * A forum topic has been created.
         */
        public MessageForumTopicCreated() {
        }

        /**
         * A forum topic has been created.
         *
         * @param name Name of the topic.
         * @param isNameImplicit True, if the name of the topic wasn't added explicitly.
         * @param icon Icon of the topic.
         */
        public MessageForumTopicCreated(String name, boolean isNameImplicit, ForumTopicIcon icon) {
            this.name = name;
            this.isNameImplicit = isNameImplicit;
            this.icon = icon;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -714462886;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A forum topic has been edited.
     */
    public static class MessageForumTopicEdited extends MessageContent {
        /**
         * If non-empty, the new name of the topic.
         */
        public String name;
        /**
         * True, if icon's customEmojiId is changed.
         */
        public boolean editIconCustomEmojiId;
        /**
         * New unique identifier of the custom emoji shown on the topic icon; 0 if none. Must be ignored if editIconCustomEmojiId is false.
         */
        public long iconCustomEmojiId;

        /**
         * A forum topic has been edited.
         */
        public MessageForumTopicEdited() {
        }

        /**
         * A forum topic has been edited.
         *
         * @param name If non-empty, the new name of the topic.
         * @param editIconCustomEmojiId True, if icon's customEmojiId is changed.
         * @param iconCustomEmojiId New unique identifier of the custom emoji shown on the topic icon; 0 if none. Must be ignored if editIconCustomEmojiId is false.
         */
        public MessageForumTopicEdited(String name, boolean editIconCustomEmojiId, long iconCustomEmojiId) {
            this.name = name;
            this.editIconCustomEmojiId = editIconCustomEmojiId;
            this.iconCustomEmojiId = iconCustomEmojiId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 12629888;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A forum topic has been closed or opened.
     */
    public static class MessageForumTopicIsClosedToggled extends MessageContent {
        /**
         * True, if the topic was closed; otherwise, the topic was reopened.
         */
        public boolean isClosed;

        /**
         * A forum topic has been closed or opened.
         */
        public MessageForumTopicIsClosedToggled() {
        }

        /**
         * A forum topic has been closed or opened.
         *
         * @param isClosed True, if the topic was closed; otherwise, the topic was reopened.
         */
        public MessageForumTopicIsClosedToggled(boolean isClosed) {
            this.isClosed = isClosed;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1264029664;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A General forum topic has been hidden or unhidden.
     */
    public static class MessageForumTopicIsHiddenToggled extends MessageContent {
        /**
         * True, if the topic was hidden; otherwise, the topic was unhidden.
         */
        public boolean isHidden;

        /**
         * A General forum topic has been hidden or unhidden.
         */
        public MessageForumTopicIsHiddenToggled() {
        }

        /**
         * A General forum topic has been hidden or unhidden.
         *
         * @param isHidden True, if the topic was hidden; otherwise, the topic was unhidden.
         */
        public MessageForumTopicIsHiddenToggled(boolean isHidden) {
            this.isHidden = isHidden;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1751936002;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A profile photo was suggested to a user in a private chat.
     */
    public static class MessageSuggestProfilePhoto extends MessageContent {
        /**
         * The suggested chat photo. Use the method setProfilePhoto with inputChatPhotoPrevious to apply the photo.
         */
        public ChatPhoto photo;

        /**
         * A profile photo was suggested to a user in a private chat.
         */
        public MessageSuggestProfilePhoto() {
        }

        /**
         * A profile photo was suggested to a user in a private chat.
         *
         * @param photo The suggested chat photo. Use the method setProfilePhoto with inputChatPhotoPrevious to apply the photo.
         */
        public MessageSuggestProfilePhoto(ChatPhoto photo) {
            this.photo = photo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1251926297;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A birthdate was suggested to be set.
     */
    public static class MessageSuggestBirthdate extends MessageContent {
        /**
         * The suggested birthdate. Use the method setBirthdate to apply the birthdate.
         */
        public Birthdate birthdate;

        /**
         * A birthdate was suggested to be set.
         */
        public MessageSuggestBirthdate() {
        }

        /**
         * A birthdate was suggested to be set.
         *
         * @param birthdate The suggested birthdate. Use the method setBirthdate to apply the birthdate.
         */
        public MessageSuggestBirthdate(Birthdate birthdate) {
            this.birthdate = birthdate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -682342263;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A non-standard action has happened in the chat.
     */
    public static class MessageCustomServiceAction extends MessageContent {
        /**
         * Message text to be shown in the chat.
         */
        public String text;

        /**
         * A non-standard action has happened in the chat.
         */
        public MessageCustomServiceAction() {
        }

        /**
         * A non-standard action has happened in the chat.
         *
         * @param text Message text to be shown in the chat.
         */
        public MessageCustomServiceAction(String text) {
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1435879282;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new high score was achieved in a game.
     */
    public static class MessageGameScore extends MessageContent {
        /**
         * Identifier of the message with the game, can be an identifier of a deleted message.
         */
        public long gameMessageId;
        /**
         * Identifier of the game; may be different from the games presented in the message with the game.
         */
        public long gameId;
        /**
         * New score.
         */
        public int score;

        /**
         * A new high score was achieved in a game.
         */
        public MessageGameScore() {
        }

        /**
         * A new high score was achieved in a game.
         *
         * @param gameMessageId Identifier of the message with the game, can be an identifier of a deleted message.
         * @param gameId Identifier of the game; may be different from the games presented in the message with the game.
         * @param score New score.
         */
        public MessageGameScore(long gameMessageId, long gameId, int score) {
            this.gameMessageId = gameMessageId;
            this.gameId = gameId;
            this.score = score;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1344904575;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A bot managed by another bot was created by the user.
     */
    public static class MessageManagedBotCreated extends MessageContent {
        /**
         * User identifier of the created bot.
         */
        public long botUserId;

        /**
         * A bot managed by another bot was created by the user.
         */
        public MessageManagedBotCreated() {
        }

        /**
         * A bot managed by another bot was created by the user.
         *
         * @param botUserId User identifier of the created bot.
         */
        public MessageManagedBotCreated(long botUserId) {
            this.botUserId = botUserId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1787873036;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A payment has been sent to a bot or a business account.
     */
    public static class MessagePaymentSuccessful extends MessageContent {
        /**
         * Identifier of the chat, containing the corresponding invoice message.
         */
        public long invoiceChatId;
        /**
         * Identifier of the message with the corresponding invoice; may be 0 or an identifier of a deleted message.
         */
        public long invoiceMessageId;
        /**
         * Currency for the price of the product.
         */
        public String currency;
        /**
         * Total price for the product, in the smallest units of the currency.
         */
        public long totalAmount;
        /**
         * Point in time (Unix timestamp) when the subscription will expire; 0 if unknown or the payment isn't recurring.
         */
        public int subscriptionUntilDate;
        /**
         * True, if this is a recurring payment.
         */
        public boolean isRecurring;
        /**
         * True, if this is the first recurring payment.
         */
        public boolean isFirstRecurring;
        /**
         * Name of the invoice; may be empty if unknown.
         */
        public String invoiceName;

        /**
         * A payment has been sent to a bot or a business account.
         */
        public MessagePaymentSuccessful() {
        }

        /**
         * A payment has been sent to a bot or a business account.
         *
         * @param invoiceChatId Identifier of the chat, containing the corresponding invoice message.
         * @param invoiceMessageId Identifier of the message with the corresponding invoice; may be 0 or an identifier of a deleted message.
         * @param currency Currency for the price of the product.
         * @param totalAmount Total price for the product, in the smallest units of the currency.
         * @param subscriptionUntilDate Point in time (Unix timestamp) when the subscription will expire; 0 if unknown or the payment isn't recurring.
         * @param isRecurring True, if this is a recurring payment.
         * @param isFirstRecurring True, if this is the first recurring payment.
         * @param invoiceName Name of the invoice; may be empty if unknown.
         */
        public MessagePaymentSuccessful(long invoiceChatId, long invoiceMessageId, String currency, long totalAmount, int subscriptionUntilDate, boolean isRecurring, boolean isFirstRecurring, String invoiceName) {
            this.invoiceChatId = invoiceChatId;
            this.invoiceMessageId = invoiceMessageId;
            this.currency = currency;
            this.totalAmount = totalAmount;
            this.subscriptionUntilDate = subscriptionUntilDate;
            this.isRecurring = isRecurring;
            this.isFirstRecurring = isFirstRecurring;
            this.invoiceName = invoiceName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1046878481;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A payment has been received by the bot or the business account.
     */
    public static class MessagePaymentSuccessfulBot extends MessageContent {
        /**
         * Currency for price of the product.
         */
        public String currency;
        /**
         * Total price for the product, in the smallest units of the currency.
         */
        public long totalAmount;
        /**
         * Point in time (Unix timestamp) when the subscription will expire; 0 if unknown or the payment isn't recurring.
         */
        public int subscriptionUntilDate;
        /**
         * True, if this is a recurring payment.
         */
        public boolean isRecurring;
        /**
         * True, if this is the first recurring payment.
         */
        public boolean isFirstRecurring;
        /**
         * Invoice payload.
         */
        public byte[] invoicePayload;
        /**
         * Identifier of the shipping option chosen by the user; may be empty if not applicable; for bots only.
         */
        public String shippingOptionId;
        /**
         * Information about the order; may be null; for bots only.
         */
        @Nullable public OrderInfo orderInfo;
        /**
         * Telegram payment identifier.
         */
        public String telegramPaymentChargeId;
        /**
         * Provider payment identifier.
         */
        public String providerPaymentChargeId;

        /**
         * A payment has been received by the bot or the business account.
         */
        public MessagePaymentSuccessfulBot() {
        }

        /**
         * A payment has been received by the bot or the business account.
         *
         * @param currency Currency for price of the product.
         * @param totalAmount Total price for the product, in the smallest units of the currency.
         * @param subscriptionUntilDate Point in time (Unix timestamp) when the subscription will expire; 0 if unknown or the payment isn't recurring.
         * @param isRecurring True, if this is a recurring payment.
         * @param isFirstRecurring True, if this is the first recurring payment.
         * @param invoicePayload Invoice payload.
         * @param shippingOptionId Identifier of the shipping option chosen by the user; may be empty if not applicable; for bots only.
         * @param orderInfo Information about the order; may be null; for bots only.
         * @param telegramPaymentChargeId Telegram payment identifier.
         * @param providerPaymentChargeId Provider payment identifier.
         */
        public MessagePaymentSuccessfulBot(String currency, long totalAmount, int subscriptionUntilDate, boolean isRecurring, boolean isFirstRecurring, byte[] invoicePayload, String shippingOptionId, OrderInfo orderInfo, String telegramPaymentChargeId, String providerPaymentChargeId) {
            this.currency = currency;
            this.totalAmount = totalAmount;
            this.subscriptionUntilDate = subscriptionUntilDate;
            this.isRecurring = isRecurring;
            this.isFirstRecurring = isFirstRecurring;
            this.invoicePayload = invoicePayload;
            this.shippingOptionId = shippingOptionId;
            this.orderInfo = orderInfo;
            this.telegramPaymentChargeId = telegramPaymentChargeId;
            this.providerPaymentChargeId = providerPaymentChargeId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -949596737;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A payment has been refunded.
     */
    public static class MessagePaymentRefunded extends MessageContent {
        /**
         * Identifier of the previous owner of the Telegram Stars that refunds them.
         */
        public MessageSender ownerId;
        /**
         * Currency for the price of the product.
         */
        public String currency;
        /**
         * Total price for the product, in the smallest units of the currency.
         */
        public long totalAmount;
        /**
         * Invoice payload; only for bots.
         */
        public byte[] invoicePayload;
        /**
         * Telegram payment identifier.
         */
        public String telegramPaymentChargeId;
        /**
         * Provider payment identifier.
         */
        public String providerPaymentChargeId;

        /**
         * A payment has been refunded.
         */
        public MessagePaymentRefunded() {
        }

        /**
         * A payment has been refunded.
         *
         * @param ownerId Identifier of the previous owner of the Telegram Stars that refunds them.
         * @param currency Currency for the price of the product.
         * @param totalAmount Total price for the product, in the smallest units of the currency.
         * @param invoicePayload Invoice payload; only for bots.
         * @param telegramPaymentChargeId Telegram payment identifier.
         * @param providerPaymentChargeId Provider payment identifier.
         */
        public MessagePaymentRefunded(MessageSender ownerId, String currency, long totalAmount, byte[] invoicePayload, String telegramPaymentChargeId, String providerPaymentChargeId) {
            this.ownerId = ownerId;
            this.currency = currency;
            this.totalAmount = totalAmount;
            this.invoicePayload = invoicePayload;
            this.telegramPaymentChargeId = telegramPaymentChargeId;
            this.providerPaymentChargeId = providerPaymentChargeId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 297580787;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Telegram Premium was gifted to a user.
     */
    public static class MessageGiftedPremium extends MessageContent {
        /**
         * The identifier of a user who gifted Telegram Premium; 0 if the gift was anonymous or is outgoing.
         */
        public long gifterUserId;
        /**
         * The identifier of a user who received Telegram Premium; 0 if the gift is incoming.
         */
        public long receiverUserId;
        /**
         * Message added to the gifted Telegram Premium by the sender.
         */
        public FormattedText text;
        /**
         * Currency for the paid amount.
         */
        public String currency;
        /**
         * The paid amount, in the smallest units of the currency.
         */
        public long amount;
        /**
         * Cryptocurrency used to pay for the gift; may be empty if none.
         */
        public String cryptocurrency;
        /**
         * The paid amount, in the smallest units of the cryptocurrency; 0 if none.
         */
        public long cryptocurrencyAmount;
        /**
         * Number of months the Telegram Premium subscription will be active after code activation; 0 if the number of months isn't integer.
         */
        public int monthCount;
        /**
         * Number of days the Telegram Premium subscription will be active.
         */
        public int dayCount;
        /**
         * A sticker to be shown in the message; may be null if unknown.
         */
        @Nullable public Sticker sticker;

        /**
         * Telegram Premium was gifted to a user.
         */
        public MessageGiftedPremium() {
        }

        /**
         * Telegram Premium was gifted to a user.
         *
         * @param gifterUserId The identifier of a user who gifted Telegram Premium; 0 if the gift was anonymous or is outgoing.
         * @param receiverUserId The identifier of a user who received Telegram Premium; 0 if the gift is incoming.
         * @param text Message added to the gifted Telegram Premium by the sender.
         * @param currency Currency for the paid amount.
         * @param amount The paid amount, in the smallest units of the currency.
         * @param cryptocurrency Cryptocurrency used to pay for the gift; may be empty if none.
         * @param cryptocurrencyAmount The paid amount, in the smallest units of the cryptocurrency; 0 if none.
         * @param monthCount Number of months the Telegram Premium subscription will be active after code activation; 0 if the number of months isn't integer.
         * @param dayCount Number of days the Telegram Premium subscription will be active.
         * @param sticker A sticker to be shown in the message; may be null if unknown.
         */
        public MessageGiftedPremium(long gifterUserId, long receiverUserId, FormattedText text, String currency, long amount, String cryptocurrency, long cryptocurrencyAmount, int monthCount, int dayCount, Sticker sticker) {
            this.gifterUserId = gifterUserId;
            this.receiverUserId = receiverUserId;
            this.text = text;
            this.currency = currency;
            this.amount = amount;
            this.cryptocurrency = cryptocurrency;
            this.cryptocurrencyAmount = cryptocurrencyAmount;
            this.monthCount = monthCount;
            this.dayCount = dayCount;
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 807892848;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Premium gift code was created for the user.
     */
    public static class MessagePremiumGiftCode extends MessageContent {
        /**
         * Identifier of a chat or a user who created the gift code; may be null if unknown.
         */
        @Nullable public MessageSender creatorId;
        /**
         * Message added to the gift.
         */
        public FormattedText text;
        /**
         * True, if the gift code was created for a giveaway.
         */
        public boolean isFromGiveaway;
        /**
         * True, if the winner for the corresponding Telegram Premium subscription wasn't chosen.
         */
        public boolean isUnclaimed;
        /**
         * Currency for the paid amount; empty if unknown.
         */
        public String currency;
        /**
         * The paid amount, in the smallest units of the currency; 0 if unknown.
         */
        public long amount;
        /**
         * Cryptocurrency used to pay for the gift; may be empty if none or unknown.
         */
        public String cryptocurrency;
        /**
         * The paid amount, in the smallest units of the cryptocurrency; 0 if unknown.
         */
        public long cryptocurrencyAmount;
        /**
         * Number of months the Telegram Premium subscription will be active after code activation; 0 if the number of months isn't integer.
         */
        public int monthCount;
        /**
         * Number of days the Telegram Premium subscription will be active after code activation.
         */
        public int dayCount;
        /**
         * A sticker to be shown in the message; may be null if unknown.
         */
        @Nullable public Sticker sticker;
        /**
         * The gift code.
         */
        public String code;

        /**
         * A Telegram Premium gift code was created for the user.
         */
        public MessagePremiumGiftCode() {
        }

        /**
         * A Telegram Premium gift code was created for the user.
         *
         * @param creatorId Identifier of a chat or a user who created the gift code; may be null if unknown.
         * @param text Message added to the gift.
         * @param isFromGiveaway True, if the gift code was created for a giveaway.
         * @param isUnclaimed True, if the winner for the corresponding Telegram Premium subscription wasn't chosen.
         * @param currency Currency for the paid amount; empty if unknown.
         * @param amount The paid amount, in the smallest units of the currency; 0 if unknown.
         * @param cryptocurrency Cryptocurrency used to pay for the gift; may be empty if none or unknown.
         * @param cryptocurrencyAmount The paid amount, in the smallest units of the cryptocurrency; 0 if unknown.
         * @param monthCount Number of months the Telegram Premium subscription will be active after code activation; 0 if the number of months isn't integer.
         * @param dayCount Number of days the Telegram Premium subscription will be active after code activation.
         * @param sticker A sticker to be shown in the message; may be null if unknown.
         * @param code The gift code.
         */
        public MessagePremiumGiftCode(MessageSender creatorId, FormattedText text, boolean isFromGiveaway, boolean isUnclaimed, String currency, long amount, String cryptocurrency, long cryptocurrencyAmount, int monthCount, int dayCount, Sticker sticker, String code) {
            this.creatorId = creatorId;
            this.text = text;
            this.isFromGiveaway = isFromGiveaway;
            this.isUnclaimed = isUnclaimed;
            this.currency = currency;
            this.amount = amount;
            this.cryptocurrency = cryptocurrency;
            this.cryptocurrencyAmount = cryptocurrencyAmount;
            this.monthCount = monthCount;
            this.dayCount = dayCount;
            this.sticker = sticker;
            this.code = code;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 680217675;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A giveaway was created for the chat. Use telegramPaymentPurposePremiumGiveaway, storePaymentPurposePremiumGiveaway, telegramPaymentPurposeStarGiveaway, or storePaymentPurposeStarGiveaway to create a giveaway.
     */
    public static class MessageGiveawayCreated extends MessageContent {
        /**
         * Number of Telegram Stars that will be shared by winners of the giveaway; 0 for Telegram Premium giveaways.
         */
        public long starCount;

        /**
         * A giveaway was created for the chat. Use telegramPaymentPurposePremiumGiveaway, storePaymentPurposePremiumGiveaway, telegramPaymentPurposeStarGiveaway, or storePaymentPurposeStarGiveaway to create a giveaway.
         */
        public MessageGiveawayCreated() {
        }

        /**
         * A giveaway was created for the chat. Use telegramPaymentPurposePremiumGiveaway, storePaymentPurposePremiumGiveaway, telegramPaymentPurposeStarGiveaway, or storePaymentPurposeStarGiveaway to create a giveaway.
         *
         * @param starCount Number of Telegram Stars that will be shared by winners of the giveaway; 0 for Telegram Premium giveaways.
         */
        public MessageGiveawayCreated(long starCount) {
            this.starCount = starCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 972252063;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A giveaway.
     */
    public static class MessageGiveaway extends MessageContent {
        /**
         * Giveaway parameters.
         */
        public GiveawayParameters parameters;
        /**
         * Number of users which will receive Telegram Premium subscription gift codes.
         */
        public int winnerCount;
        /**
         * Prize of the giveaway.
         */
        public GiveawayPrize prize;
        /**
         * A sticker to be shown in the message; may be null if unknown.
         */
        @Nullable public Sticker sticker;

        /**
         * A giveaway.
         */
        public MessageGiveaway() {
        }

        /**
         * A giveaway.
         *
         * @param parameters Giveaway parameters.
         * @param winnerCount Number of users which will receive Telegram Premium subscription gift codes.
         * @param prize Prize of the giveaway.
         * @param sticker A sticker to be shown in the message; may be null if unknown.
         */
        public MessageGiveaway(GiveawayParameters parameters, int winnerCount, GiveawayPrize prize, Sticker sticker) {
            this.parameters = parameters;
            this.winnerCount = winnerCount;
            this.prize = prize;
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -345908568;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A giveaway without public winners has been completed for the chat.
     */
    public static class MessageGiveawayCompleted extends MessageContent {
        /**
         * Identifier of the message with the giveaway; may be 0 or an identifier of a deleted message.
         */
        public long giveawayMessageId;
        /**
         * Number of winners in the giveaway.
         */
        public int winnerCount;
        /**
         * True, if the giveaway is a Telegram Star giveaway.
         */
        public boolean isStarGiveaway;
        /**
         * Number of undistributed prizes; for Telegram Premium giveaways only.
         */
        public int unclaimedPrizeCount;

        /**
         * A giveaway without public winners has been completed for the chat.
         */
        public MessageGiveawayCompleted() {
        }

        /**
         * A giveaway without public winners has been completed for the chat.
         *
         * @param giveawayMessageId Identifier of the message with the giveaway; may be 0 or an identifier of a deleted message.
         * @param winnerCount Number of winners in the giveaway.
         * @param isStarGiveaway True, if the giveaway is a Telegram Star giveaway.
         * @param unclaimedPrizeCount Number of undistributed prizes; for Telegram Premium giveaways only.
         */
        public MessageGiveawayCompleted(long giveawayMessageId, int winnerCount, boolean isStarGiveaway, int unclaimedPrizeCount) {
            this.giveawayMessageId = giveawayMessageId;
            this.winnerCount = winnerCount;
            this.isStarGiveaway = isStarGiveaway;
            this.unclaimedPrizeCount = unclaimedPrizeCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -467351305;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A giveaway with public winners has been completed for the chat.
     */
    public static class MessageGiveawayWinners extends MessageContent {
        /**
         * Identifier of the supergroup or channel chat, which was automatically boosted by the winners of the giveaway.
         */
        public long boostedChatId;
        /**
         * Identifier of the message with the giveaway in the boosted chat.
         */
        public long giveawayMessageId;
        /**
         * Number of other chats that participated in the giveaway.
         */
        public int additionalChatCount;
        /**
         * Point in time (Unix timestamp) when the winners were selected. May be bigger than winners selection date specified in parameters of the giveaway.
         */
        public int actualWinnersSelectionDate;
        /**
         * True, if only new members of the chats were eligible for the giveaway.
         */
        public boolean onlyNewMembers;
        /**
         * True, if the giveaway was canceled and was fully refunded.
         */
        public boolean wasRefunded;
        /**
         * Prize of the giveaway.
         */
        public GiveawayPrize prize;
        /**
         * Additional description of the giveaway prize.
         */
        public String prizeDescription;
        /**
         * Total number of winners in the giveaway.
         */
        public int winnerCount;
        /**
         * Up to 100 user identifiers of the winners of the giveaway.
         */
        public long[] winnerUserIds;
        /**
         * Number of undistributed prizes; for Telegram Premium giveaways only.
         */
        public int unclaimedPrizeCount;

        /**
         * A giveaway with public winners has been completed for the chat.
         */
        public MessageGiveawayWinners() {
        }

        /**
         * A giveaway with public winners has been completed for the chat.
         *
         * @param boostedChatId Identifier of the supergroup or channel chat, which was automatically boosted by the winners of the giveaway.
         * @param giveawayMessageId Identifier of the message with the giveaway in the boosted chat.
         * @param additionalChatCount Number of other chats that participated in the giveaway.
         * @param actualWinnersSelectionDate Point in time (Unix timestamp) when the winners were selected. May be bigger than winners selection date specified in parameters of the giveaway.
         * @param onlyNewMembers True, if only new members of the chats were eligible for the giveaway.
         * @param wasRefunded True, if the giveaway was canceled and was fully refunded.
         * @param prize Prize of the giveaway.
         * @param prizeDescription Additional description of the giveaway prize.
         * @param winnerCount Total number of winners in the giveaway.
         * @param winnerUserIds Up to 100 user identifiers of the winners of the giveaway.
         * @param unclaimedPrizeCount Number of undistributed prizes; for Telegram Premium giveaways only.
         */
        public MessageGiveawayWinners(long boostedChatId, long giveawayMessageId, int additionalChatCount, int actualWinnersSelectionDate, boolean onlyNewMembers, boolean wasRefunded, GiveawayPrize prize, String prizeDescription, int winnerCount, long[] winnerUserIds, int unclaimedPrizeCount) {
            this.boostedChatId = boostedChatId;
            this.giveawayMessageId = giveawayMessageId;
            this.additionalChatCount = additionalChatCount;
            this.actualWinnersSelectionDate = actualWinnersSelectionDate;
            this.onlyNewMembers = onlyNewMembers;
            this.wasRefunded = wasRefunded;
            this.prize = prize;
            this.prizeDescription = prizeDescription;
            this.winnerCount = winnerCount;
            this.winnerUserIds = winnerUserIds;
            this.unclaimedPrizeCount = unclaimedPrizeCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2098585405;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Telegram Stars were gifted to a user.
     */
    public static class MessageGiftedStars extends MessageContent {
        /**
         * The identifier of a user who gifted Telegram Stars; 0 if the gift was anonymous or is outgoing.
         */
        public long gifterUserId;
        /**
         * The identifier of a user who received Telegram Stars; 0 if the gift is incoming.
         */
        public long receiverUserId;
        /**
         * Currency for the paid amount.
         */
        public String currency;
        /**
         * The paid amount, in the smallest units of the currency.
         */
        public long amount;
        /**
         * Cryptocurrency used to pay for the gift; may be empty if none.
         */
        public String cryptocurrency;
        /**
         * The paid amount, in the smallest units of the cryptocurrency; 0 if none.
         */
        public long cryptocurrencyAmount;
        /**
         * Number of Telegram Stars that were gifted.
         */
        public long starCount;
        /**
         * Identifier of the transaction for Telegram Stars purchase; for receiver only.
         */
        public String transactionId;
        /**
         * A sticker to be shown in the message; may be null if unknown.
         */
        @Nullable public Sticker sticker;

        /**
         * Telegram Stars were gifted to a user.
         */
        public MessageGiftedStars() {
        }

        /**
         * Telegram Stars were gifted to a user.
         *
         * @param gifterUserId The identifier of a user who gifted Telegram Stars; 0 if the gift was anonymous or is outgoing.
         * @param receiverUserId The identifier of a user who received Telegram Stars; 0 if the gift is incoming.
         * @param currency Currency for the paid amount.
         * @param amount The paid amount, in the smallest units of the currency.
         * @param cryptocurrency Cryptocurrency used to pay for the gift; may be empty if none.
         * @param cryptocurrencyAmount The paid amount, in the smallest units of the cryptocurrency; 0 if none.
         * @param starCount Number of Telegram Stars that were gifted.
         * @param transactionId Identifier of the transaction for Telegram Stars purchase; for receiver only.
         * @param sticker A sticker to be shown in the message; may be null if unknown.
         */
        public MessageGiftedStars(long gifterUserId, long receiverUserId, String currency, long amount, String cryptocurrency, long cryptocurrencyAmount, long starCount, String transactionId, Sticker sticker) {
            this.gifterUserId = gifterUserId;
            this.receiverUserId = receiverUserId;
            this.currency = currency;
            this.amount = amount;
            this.cryptocurrency = cryptocurrency;
            this.cryptocurrencyAmount = cryptocurrencyAmount;
            this.starCount = starCount;
            this.transactionId = transactionId;
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1102954151;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toncoins were gifted to a user.
     */
    public static class MessageGiftedTon extends MessageContent {
        /**
         * The identifier of a user who gifted Toncoins; 0 if the gift was anonymous or is outgoing.
         */
        public long gifterUserId;
        /**
         * The identifier of a user who received Toncoins; 0 if the gift is incoming.
         */
        public long receiverUserId;
        /**
         * The received Toncoin amount, in the smallest units of the cryptocurrency.
         */
        public long tonAmount;
        /**
         * Identifier of the transaction for Toncoin credit; for receiver only.
         */
        public String transactionId;
        /**
         * A sticker to be shown in the message; may be null if unknown.
         */
        @Nullable public Sticker sticker;

        /**
         * Toncoins were gifted to a user.
         */
        public MessageGiftedTon() {
        }

        /**
         * Toncoins were gifted to a user.
         *
         * @param gifterUserId The identifier of a user who gifted Toncoins; 0 if the gift was anonymous or is outgoing.
         * @param receiverUserId The identifier of a user who received Toncoins; 0 if the gift is incoming.
         * @param tonAmount The received Toncoin amount, in the smallest units of the cryptocurrency.
         * @param transactionId Identifier of the transaction for Toncoin credit; for receiver only.
         * @param sticker A sticker to be shown in the message; may be null if unknown.
         */
        public MessageGiftedTon(long gifterUserId, long receiverUserId, long tonAmount, String transactionId, Sticker sticker) {
            this.gifterUserId = gifterUserId;
            this.receiverUserId = receiverUserId;
            this.tonAmount = tonAmount;
            this.transactionId = transactionId;
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 766483995;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Stars were received by the current user from a giveaway.
     */
    public static class MessageGiveawayPrizeStars extends MessageContent {
        /**
         * Number of Telegram Stars that were received.
         */
        public long starCount;
        /**
         * Identifier of the transaction for Telegram Stars credit.
         */
        public String transactionId;
        /**
         * Identifier of the supergroup or channel chat, which was automatically boosted by the winners of the giveaway.
         */
        public long boostedChatId;
        /**
         * Identifier of the message with the giveaway in the boosted chat; may be 0 or an identifier of a deleted message.
         */
        public long giveawayMessageId;
        /**
         * True, if the corresponding winner wasn't chosen and the Telegram Stars were received by the owner of the boosted chat.
         */
        public boolean isUnclaimed;
        /**
         * A sticker to be shown in the message; may be null if unknown.
         */
        @Nullable public Sticker sticker;

        /**
         * A Telegram Stars were received by the current user from a giveaway.
         */
        public MessageGiveawayPrizeStars() {
        }

        /**
         * A Telegram Stars were received by the current user from a giveaway.
         *
         * @param starCount Number of Telegram Stars that were received.
         * @param transactionId Identifier of the transaction for Telegram Stars credit.
         * @param boostedChatId Identifier of the supergroup or channel chat, which was automatically boosted by the winners of the giveaway.
         * @param giveawayMessageId Identifier of the message with the giveaway in the boosted chat; may be 0 or an identifier of a deleted message.
         * @param isUnclaimed True, if the corresponding winner wasn't chosen and the Telegram Stars were received by the owner of the boosted chat.
         * @param sticker A sticker to be shown in the message; may be null if unknown.
         */
        public MessageGiveawayPrizeStars(long starCount, String transactionId, long boostedChatId, long giveawayMessageId, boolean isUnclaimed, Sticker sticker) {
            this.starCount = starCount;
            this.transactionId = transactionId;
            this.boostedChatId = boostedChatId;
            this.giveawayMessageId = giveawayMessageId;
            this.isUnclaimed = isUnclaimed;
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1441833501;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A regular gift was received or sent by the current user, or the current user was notified about a channel gift.
     */
    public static class MessageGift extends MessageContent {
        /**
         * The gift.
         */
        public Gift gift;
        /**
         * Sender of the gift; may be null for outgoing messages about prepaid upgrade of gifts from unknown users.
         */
        @Nullable public MessageSender senderId;
        /**
         * Receiver of the gift.
         */
        public MessageSender receiverId;
        /**
         * Unique identifier of the received gift for the current user; only for the receiver of the gift.
         */
        public String receivedGiftId;
        /**
         * Message added to the gift.
         */
        public FormattedText text;
        /**
         * Unique number of the gift among gifts upgraded from the same gift after upgrade; 0 if yet unassigned.
         */
        public int uniqueGiftNumber;
        /**
         * Number of Telegram Stars that can be claimed by the receiver instead of the regular gift; 0 if the gift can't be sold by the receiver.
         */
        public long sellStarCount;
        /**
         * Number of Telegram Stars that were paid by the sender for the ability to upgrade the gift.
         */
        public long prepaidUpgradeStarCount;
        /**
         * True, if the upgrade was bought after the gift was sent. In this case, prepaid upgrade cost must not be added to the gift cost.
         */
        public boolean isUpgradeSeparate;
        /**
         * True, if the message is a notification about a gift won on an auction.
         */
        public boolean isFromAuction;
        /**
         * True, if the sender and gift text are shown only to the gift receiver; otherwise, everyone will be able to see them.
         */
        public boolean isPrivate;
        /**
         * True, if the gift is displayed on the user's or the channel's profile page; only for the receiver of the gift.
         */
        public boolean isSaved;
        /**
         * True, if the message is about prepaid upgrade of the gift by another user.
         */
        public boolean isPrepaidUpgrade;
        /**
         * True, if the gift can be upgraded to a unique gift; only for the receiver of the gift.
         */
        public boolean canBeUpgraded;
        /**
         * True, if the gift was converted to Telegram Stars; only for the receiver of the gift.
         */
        public boolean wasConverted;
        /**
         * True, if the gift was upgraded to a unique gift.
         */
        public boolean wasUpgraded;
        /**
         * True, if the gift was refunded and isn't available anymore.
         */
        public boolean wasRefunded;
        /**
         * Identifier of the corresponding upgraded gift; may be empty if unknown. Use getReceivedGift to get information about the gift.
         */
        public String upgradedReceivedGiftId;
        /**
         * If non-empty, then the user can pay for an upgrade of the gift using buyGiftUpgrade.
         */
        public String prepaidUpgradeHash;

        /**
         * A regular gift was received or sent by the current user, or the current user was notified about a channel gift.
         */
        public MessageGift() {
        }

        /**
         * A regular gift was received or sent by the current user, or the current user was notified about a channel gift.
         *
         * @param gift The gift.
         * @param senderId Sender of the gift; may be null for outgoing messages about prepaid upgrade of gifts from unknown users.
         * @param receiverId Receiver of the gift.
         * @param receivedGiftId Unique identifier of the received gift for the current user; only for the receiver of the gift.
         * @param text Message added to the gift.
         * @param uniqueGiftNumber Unique number of the gift among gifts upgraded from the same gift after upgrade; 0 if yet unassigned.
         * @param sellStarCount Number of Telegram Stars that can be claimed by the receiver instead of the regular gift; 0 if the gift can't be sold by the receiver.
         * @param prepaidUpgradeStarCount Number of Telegram Stars that were paid by the sender for the ability to upgrade the gift.
         * @param isUpgradeSeparate True, if the upgrade was bought after the gift was sent. In this case, prepaid upgrade cost must not be added to the gift cost.
         * @param isFromAuction True, if the message is a notification about a gift won on an auction.
         * @param isPrivate True, if the sender and gift text are shown only to the gift receiver; otherwise, everyone will be able to see them.
         * @param isSaved True, if the gift is displayed on the user's or the channel's profile page; only for the receiver of the gift.
         * @param isPrepaidUpgrade True, if the message is about prepaid upgrade of the gift by another user.
         * @param canBeUpgraded True, if the gift can be upgraded to a unique gift; only for the receiver of the gift.
         * @param wasConverted True, if the gift was converted to Telegram Stars; only for the receiver of the gift.
         * @param wasUpgraded True, if the gift was upgraded to a unique gift.
         * @param wasRefunded True, if the gift was refunded and isn't available anymore.
         * @param upgradedReceivedGiftId Identifier of the corresponding upgraded gift; may be empty if unknown. Use getReceivedGift to get information about the gift.
         * @param prepaidUpgradeHash If non-empty, then the user can pay for an upgrade of the gift using buyGiftUpgrade.
         */
        public MessageGift(Gift gift, MessageSender senderId, MessageSender receiverId, String receivedGiftId, FormattedText text, int uniqueGiftNumber, long sellStarCount, long prepaidUpgradeStarCount, boolean isUpgradeSeparate, boolean isFromAuction, boolean isPrivate, boolean isSaved, boolean isPrepaidUpgrade, boolean canBeUpgraded, boolean wasConverted, boolean wasUpgraded, boolean wasRefunded, String upgradedReceivedGiftId, String prepaidUpgradeHash) {
            this.gift = gift;
            this.senderId = senderId;
            this.receiverId = receiverId;
            this.receivedGiftId = receivedGiftId;
            this.text = text;
            this.uniqueGiftNumber = uniqueGiftNumber;
            this.sellStarCount = sellStarCount;
            this.prepaidUpgradeStarCount = prepaidUpgradeStarCount;
            this.isUpgradeSeparate = isUpgradeSeparate;
            this.isFromAuction = isFromAuction;
            this.isPrivate = isPrivate;
            this.isSaved = isSaved;
            this.isPrepaidUpgrade = isPrepaidUpgrade;
            this.canBeUpgraded = canBeUpgraded;
            this.wasConverted = wasConverted;
            this.wasUpgraded = wasUpgraded;
            this.wasRefunded = wasRefunded;
            this.upgradedReceivedGiftId = upgradedReceivedGiftId;
            this.prepaidUpgradeHash = prepaidUpgradeHash;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1990929579;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An upgraded gift was received or sent by the current user, or the current user was notified about a channel gift.
     */
    public static class MessageUpgradedGift extends MessageContent {
        /**
         * The gift.
         */
        public UpgradedGift gift;
        /**
         * Sender of the gift; may be null for anonymous gifts.
         */
        @Nullable public MessageSender senderId;
        /**
         * Receiver of the gift.
         */
        public MessageSender receiverId;
        /**
         * Origin of the upgraded gift.
         */
        public UpgradedGiftOrigin origin;
        /**
         * Unique identifier of the received gift for the current user; only for the receiver of the gift.
         */
        public String receivedGiftId;
        /**
         * True, if the gift is displayed on the user's or the channel's profile page; only for the receiver of the gift.
         */
        public boolean isSaved;
        /**
         * True, if the gift can be transferred to another owner; only for the receiver of the gift.
         */
        public boolean canBeTransferred;
        /**
         * True, if the gift has already been transferred to another owner; only for the receiver of the gift.
         */
        public boolean wasTransferred;
        /**
         * Number of Telegram Stars that must be paid to transfer the upgraded gift; only for the receiver of the gift.
         */
        public long transferStarCount;
        /**
         * Number of Telegram Stars that must be paid to drop original details of the upgraded gift; 0 if not available; only for the receiver of the gift.
         */
        public long dropOriginalDetailsStarCount;
        /**
         * Point in time (Unix timestamp) when the gift can be transferred to another owner; can be in the past; 0 if the gift can be transferred immediately or transfer isn't possible; only for the receiver of the gift.
         */
        public int nextTransferDate;
        /**
         * Point in time (Unix timestamp) when the gift can be resold to another user; can be in the past; 0 if the gift can't be resold; only for the receiver of the gift.
         */
        public int nextResaleDate;
        /**
         * Point in time (Unix timestamp) when the gift can be transferred to the TON blockchain as an NFT; can be in the past; 0 if NFT export isn't possible; only for the receiver of the gift.
         */
        public int exportDate;
        /**
         * Point in time (Unix timestamp) when the gift can be used to craft another gift can be in the past; only for the receiver of the gift.
         */
        public int craftDate;

        /**
         * An upgraded gift was received or sent by the current user, or the current user was notified about a channel gift.
         */
        public MessageUpgradedGift() {
        }

        /**
         * An upgraded gift was received or sent by the current user, or the current user was notified about a channel gift.
         *
         * @param gift The gift.
         * @param senderId Sender of the gift; may be null for anonymous gifts.
         * @param receiverId Receiver of the gift.
         * @param origin Origin of the upgraded gift.
         * @param receivedGiftId Unique identifier of the received gift for the current user; only for the receiver of the gift.
         * @param isSaved True, if the gift is displayed on the user's or the channel's profile page; only for the receiver of the gift.
         * @param canBeTransferred True, if the gift can be transferred to another owner; only for the receiver of the gift.
         * @param wasTransferred True, if the gift has already been transferred to another owner; only for the receiver of the gift.
         * @param transferStarCount Number of Telegram Stars that must be paid to transfer the upgraded gift; only for the receiver of the gift.
         * @param dropOriginalDetailsStarCount Number of Telegram Stars that must be paid to drop original details of the upgraded gift; 0 if not available; only for the receiver of the gift.
         * @param nextTransferDate Point in time (Unix timestamp) when the gift can be transferred to another owner; can be in the past; 0 if the gift can be transferred immediately or transfer isn't possible; only for the receiver of the gift.
         * @param nextResaleDate Point in time (Unix timestamp) when the gift can be resold to another user; can be in the past; 0 if the gift can't be resold; only for the receiver of the gift.
         * @param exportDate Point in time (Unix timestamp) when the gift can be transferred to the TON blockchain as an NFT; can be in the past; 0 if NFT export isn't possible; only for the receiver of the gift.
         * @param craftDate Point in time (Unix timestamp) when the gift can be used to craft another gift can be in the past; only for the receiver of the gift.
         */
        public MessageUpgradedGift(UpgradedGift gift, MessageSender senderId, MessageSender receiverId, UpgradedGiftOrigin origin, String receivedGiftId, boolean isSaved, boolean canBeTransferred, boolean wasTransferred, long transferStarCount, long dropOriginalDetailsStarCount, int nextTransferDate, int nextResaleDate, int exportDate, int craftDate) {
            this.gift = gift;
            this.senderId = senderId;
            this.receiverId = receiverId;
            this.origin = origin;
            this.receivedGiftId = receivedGiftId;
            this.isSaved = isSaved;
            this.canBeTransferred = canBeTransferred;
            this.wasTransferred = wasTransferred;
            this.transferStarCount = transferStarCount;
            this.dropOriginalDetailsStarCount = dropOriginalDetailsStarCount;
            this.nextTransferDate = nextTransferDate;
            this.nextResaleDate = nextResaleDate;
            this.exportDate = exportDate;
            this.craftDate = craftDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1432909893;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A gift which purchase, upgrade or transfer were refunded.
     */
    public static class MessageRefundedUpgradedGift extends MessageContent {
        /**
         * The gift.
         */
        public Gift gift;
        /**
         * Sender of the gift.
         */
        public MessageSender senderId;
        /**
         * Receiver of the gift.
         */
        public MessageSender receiverId;
        /**
         * Origin of the upgraded gift.
         */
        public UpgradedGiftOrigin origin;

        /**
         * A gift which purchase, upgrade or transfer were refunded.
         */
        public MessageRefundedUpgradedGift() {
        }

        /**
         * A gift which purchase, upgrade or transfer were refunded.
         *
         * @param gift The gift.
         * @param senderId Sender of the gift.
         * @param receiverId Receiver of the gift.
         * @param origin Origin of the upgraded gift.
         */
        public MessageRefundedUpgradedGift(Gift gift, MessageSender senderId, MessageSender receiverId, UpgradedGiftOrigin origin) {
            this.gift = gift;
            this.senderId = senderId;
            this.receiverId = receiverId;
            this.origin = origin;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -605744001;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An offer to purchase an upgraded gift was sent or received.
     */
    public static class MessageUpgradedGiftPurchaseOffer extends MessageContent {
        /**
         * The gift.
         */
        public UpgradedGift gift;
        /**
         * State of the offer.
         */
        public GiftPurchaseOfferState state;
        /**
         * The proposed price.
         */
        public GiftResalePrice price;
        /**
         * Point in time (Unix timestamp) when the offer will expire or has expired.
         */
        public int expirationDate;

        /**
         * An offer to purchase an upgraded gift was sent or received.
         */
        public MessageUpgradedGiftPurchaseOffer() {
        }

        /**
         * An offer to purchase an upgraded gift was sent or received.
         *
         * @param gift The gift.
         * @param state State of the offer.
         * @param price The proposed price.
         * @param expirationDate Point in time (Unix timestamp) when the offer will expire or has expired.
         */
        public MessageUpgradedGiftPurchaseOffer(UpgradedGift gift, GiftPurchaseOfferState state, GiftResalePrice price, int expirationDate) {
            this.gift = gift;
            this.state = state;
            this.price = price;
            this.expirationDate = expirationDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1809958483;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An offer to purchase a gift was rejected or expired.
     */
    public static class MessageUpgradedGiftPurchaseOfferRejected extends MessageContent {
        /**
         * The gift.
         */
        public UpgradedGift gift;
        /**
         * The proposed price.
         */
        public GiftResalePrice price;
        /**
         * Identifier of the message with purchase offer which was rejected or expired; may be 0 or an identifier of a deleted message.
         */
        public long offerMessageId;
        /**
         * True, if the offer has expired; otherwise, the offer was explicitly rejected.
         */
        public boolean wasExpired;

        /**
         * An offer to purchase a gift was rejected or expired.
         */
        public MessageUpgradedGiftPurchaseOfferRejected() {
        }

        /**
         * An offer to purchase a gift was rejected or expired.
         *
         * @param gift The gift.
         * @param price The proposed price.
         * @param offerMessageId Identifier of the message with purchase offer which was rejected or expired; may be 0 or an identifier of a deleted message.
         * @param wasExpired True, if the offer has expired; otherwise, the offer was explicitly rejected.
         */
        public MessageUpgradedGiftPurchaseOfferRejected(UpgradedGift gift, GiftResalePrice price, long offerMessageId, boolean wasExpired) {
            this.gift = gift;
            this.price = price;
            this.offerMessageId = offerMessageId;
            this.wasExpired = wasExpired;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 59315711;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Paid messages were refunded.
     */
    public static class MessagePaidMessagesRefunded extends MessageContent {
        /**
         * The number of refunded messages.
         */
        public int messageCount;
        /**
         * The number of refunded Telegram Stars.
         */
        public long starCount;

        /**
         * Paid messages were refunded.
         */
        public MessagePaidMessagesRefunded() {
        }

        /**
         * Paid messages were refunded.
         *
         * @param messageCount The number of refunded messages.
         * @param starCount The number of refunded Telegram Stars.
         */
        public MessagePaidMessagesRefunded(int messageCount, long starCount) {
            this.messageCount = messageCount;
            this.starCount = starCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 580403343;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A price for paid messages was changed in the supergroup chat.
     */
    public static class MessagePaidMessagePriceChanged extends MessageContent {
        /**
         * The new number of Telegram Stars that must be paid by non-administrator users of the supergroup chat for each sent message.
         */
        public long paidMessageStarCount;

        /**
         * A price for paid messages was changed in the supergroup chat.
         */
        public MessagePaidMessagePriceChanged() {
        }

        /**
         * A price for paid messages was changed in the supergroup chat.
         *
         * @param paidMessageStarCount The new number of Telegram Stars that must be paid by non-administrator users of the supergroup chat for each sent message.
         */
        public MessagePaidMessagePriceChanged(long paidMessageStarCount) {
            this.paidMessageStarCount = paidMessageStarCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -344945397;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A price for direct messages was changed in the channel chat.
     */
    public static class MessageDirectMessagePriceChanged extends MessageContent {
        /**
         * True, if direct messages group was enabled for the channel; false otherwise.
         */
        public boolean isEnabled;
        /**
         * The new number of Telegram Stars that must be paid by non-administrator users of the channel chat for each message sent to the direct messages group; 0 if the direct messages group was disabled or the messages are free.
         */
        public long paidMessageStarCount;

        /**
         * A price for direct messages was changed in the channel chat.
         */
        public MessageDirectMessagePriceChanged() {
        }

        /**
         * A price for direct messages was changed in the channel chat.
         *
         * @param isEnabled True, if direct messages group was enabled for the channel; false otherwise.
         * @param paidMessageStarCount The new number of Telegram Stars that must be paid by non-administrator users of the channel chat for each message sent to the direct messages group; 0 if the direct messages group was disabled or the messages are free.
         */
        public MessageDirectMessagePriceChanged(boolean isEnabled, long paidMessageStarCount) {
            this.isEnabled = isEnabled;
            this.paidMessageStarCount = paidMessageStarCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1320832439;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Some tasks from a checklist were marked as done or not done.
     */
    public static class MessageChecklistTasksDone extends MessageContent {
        /**
         * Identifier of the message with the checklist; may be 0 or an identifier of a deleted message.
         */
        public long checklistMessageId;
        /**
         * Identifiers of tasks that were marked as done.
         */
        public int[] markedAsDoneTaskIds;
        /**
         * Identifiers of tasks that were marked as not done.
         */
        public int[] markedAsNotDoneTaskIds;

        /**
         * Some tasks from a checklist were marked as done or not done.
         */
        public MessageChecklistTasksDone() {
        }

        /**
         * Some tasks from a checklist were marked as done or not done.
         *
         * @param checklistMessageId Identifier of the message with the checklist; may be 0 or an identifier of a deleted message.
         * @param markedAsDoneTaskIds Identifiers of tasks that were marked as done.
         * @param markedAsNotDoneTaskIds Identifiers of tasks that were marked as not done.
         */
        public MessageChecklistTasksDone(long checklistMessageId, int[] markedAsDoneTaskIds, int[] markedAsNotDoneTaskIds) {
            this.checklistMessageId = checklistMessageId;
            this.markedAsDoneTaskIds = markedAsDoneTaskIds;
            this.markedAsNotDoneTaskIds = markedAsNotDoneTaskIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -716083401;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Some tasks were added to a checklist.
     */
    public static class MessageChecklistTasksAdded extends MessageContent {
        /**
         * Identifier of the message with the checklist; may be 0 or an identifier of a deleted message.
         */
        public long checklistMessageId;
        /**
         * List of tasks added to the checklist.
         */
        public ChecklistTask[] tasks;

        /**
         * Some tasks were added to a checklist.
         */
        public MessageChecklistTasksAdded() {
        }

        /**
         * Some tasks were added to a checklist.
         *
         * @param checklistMessageId Identifier of the message with the checklist; may be 0 or an identifier of a deleted message.
         * @param tasks List of tasks added to the checklist.
         */
        public MessageChecklistTasksAdded(long checklistMessageId, ChecklistTask[] tasks) {
            this.checklistMessageId = checklistMessageId;
            this.tasks = tasks;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2057538984;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Approval of suggested post has failed, because the user which proposed the post had no enough funds.
     */
    public static class MessageSuggestedPostApprovalFailed extends MessageContent {
        /**
         * Identifier of the message with the suggested post; may be 0 or an identifier of a deleted message.
         */
        public long suggestedPostMessageId;
        /**
         * Price of the suggested post.
         */
        public SuggestedPostPrice price;

        /**
         * Approval of suggested post has failed, because the user which proposed the post had no enough funds.
         */
        public MessageSuggestedPostApprovalFailed() {
        }

        /**
         * Approval of suggested post has failed, because the user which proposed the post had no enough funds.
         *
         * @param suggestedPostMessageId Identifier of the message with the suggested post; may be 0 or an identifier of a deleted message.
         * @param price Price of the suggested post.
         */
        public MessageSuggestedPostApprovalFailed(long suggestedPostMessageId, SuggestedPostPrice price) {
            this.suggestedPostMessageId = suggestedPostMessageId;
            this.price = price;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1752703725;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A suggested post was approved.
     */
    public static class MessageSuggestedPostApproved extends MessageContent {
        /**
         * Identifier of the message with the suggested post; may be 0 or an identifier of a deleted message.
         */
        public long suggestedPostMessageId;
        /**
         * Price of the suggested post; may be null if the post is non-paid.
         */
        @Nullable public SuggestedPostPrice price;
        /**
         * Point in time (Unix timestamp) when the post is expected to be published.
         */
        public int sendDate;

        /**
         * A suggested post was approved.
         */
        public MessageSuggestedPostApproved() {
        }

        /**
         * A suggested post was approved.
         *
         * @param suggestedPostMessageId Identifier of the message with the suggested post; may be 0 or an identifier of a deleted message.
         * @param price Price of the suggested post; may be null if the post is non-paid.
         * @param sendDate Point in time (Unix timestamp) when the post is expected to be published.
         */
        public MessageSuggestedPostApproved(long suggestedPostMessageId, SuggestedPostPrice price, int sendDate) {
            this.suggestedPostMessageId = suggestedPostMessageId;
            this.price = price;
            this.sendDate = sendDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 563425361;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A suggested post was declined.
     */
    public static class MessageSuggestedPostDeclined extends MessageContent {
        /**
         * Identifier of the message with the suggested post; may be 0 or an identifier of a deleted message.
         */
        public long suggestedPostMessageId;
        /**
         * Comment added by administrator of the channel when the post was declined.
         */
        public String comment;

        /**
         * A suggested post was declined.
         */
        public MessageSuggestedPostDeclined() {
        }

        /**
         * A suggested post was declined.
         *
         * @param suggestedPostMessageId Identifier of the message with the suggested post; may be 0 or an identifier of a deleted message.
         * @param comment Comment added by administrator of the channel when the post was declined.
         */
        public MessageSuggestedPostDeclined(long suggestedPostMessageId, String comment) {
            this.suggestedPostMessageId = suggestedPostMessageId;
            this.comment = comment;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -26948155;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A suggested post was published for getOption(&quot;suggested_post_lifetime_min&quot;) seconds and payment for the post was received.
     */
    public static class MessageSuggestedPostPaid extends MessageContent {
        /**
         * Identifier of the message with the suggested post; may be 0 or an identifier of a deleted message.
         */
        public long suggestedPostMessageId;
        /**
         * The amount of received Telegram Stars.
         */
        public StarAmount starAmount;
        /**
         * The amount of received Toncoins; in the smallest units of the cryptocurrency.
         */
        public long tonAmount;

        /**
         * A suggested post was published for getOption(&quot;suggested_post_lifetime_min&quot;) seconds and payment for the post was received.
         */
        public MessageSuggestedPostPaid() {
        }

        /**
         * A suggested post was published for getOption(&quot;suggested_post_lifetime_min&quot;) seconds and payment for the post was received.
         *
         * @param suggestedPostMessageId Identifier of the message with the suggested post; may be 0 or an identifier of a deleted message.
         * @param starAmount The amount of received Telegram Stars.
         * @param tonAmount The amount of received Toncoins; in the smallest units of the cryptocurrency.
         */
        public MessageSuggestedPostPaid(long suggestedPostMessageId, StarAmount starAmount, long tonAmount) {
            this.suggestedPostMessageId = suggestedPostMessageId;
            this.starAmount = starAmount;
            this.tonAmount = tonAmount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1575439273;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A suggested post was refunded.
     */
    public static class MessageSuggestedPostRefunded extends MessageContent {
        /**
         * Identifier of the message with the suggested post; may be 0 or an identifier of a deleted message.
         */
        public long suggestedPostMessageId;
        /**
         * Reason of the refund.
         */
        public SuggestedPostRefundReason reason;

        /**
         * A suggested post was refunded.
         */
        public MessageSuggestedPostRefunded() {
        }

        /**
         * A suggested post was refunded.
         *
         * @param suggestedPostMessageId Identifier of the message with the suggested post; may be 0 or an identifier of a deleted message.
         * @param reason Reason of the refund.
         */
        public MessageSuggestedPostRefunded(long suggestedPostMessageId, SuggestedPostRefundReason reason) {
            this.suggestedPostMessageId = suggestedPostMessageId;
            this.reason = reason;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -554073340;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A contact has registered with Telegram.
     */
    public static class MessageContactRegistered extends MessageContent {

        /**
         * A contact has registered with Telegram.
         */
        public MessageContactRegistered() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1502020353;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The current user shared users, which were requested by the bot.
     */
    public static class MessageUsersShared extends MessageContent {
        /**
         * The shared users.
         */
        public SharedUser[] users;
        /**
         * Identifier of the keyboard button with the request.
         */
        public int buttonId;

        /**
         * The current user shared users, which were requested by the bot.
         */
        public MessageUsersShared() {
        }

        /**
         * The current user shared users, which were requested by the bot.
         *
         * @param users The shared users.
         * @param buttonId Identifier of the keyboard button with the request.
         */
        public MessageUsersShared(SharedUser[] users, int buttonId) {
            this.users = users;
            this.buttonId = buttonId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -842442318;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The current user shared a chat, which was requested by the bot.
     */
    public static class MessageChatShared extends MessageContent {
        /**
         * The shared chat.
         */
        public SharedChat chat;
        /**
         * Identifier of the keyboard button with the request.
         */
        public int buttonId;

        /**
         * The current user shared a chat, which was requested by the bot.
         */
        public MessageChatShared() {
        }

        /**
         * The current user shared a chat, which was requested by the bot.
         *
         * @param chat The shared chat.
         * @param buttonId Identifier of the keyboard button with the request.
         */
        public MessageChatShared(SharedChat chat, int buttonId) {
            this.chat = chat;
            this.buttonId = buttonId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1362699935;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user allowed the bot to send messages.
     */
    public static class MessageBotWriteAccessAllowed extends MessageContent {
        /**
         * The reason why the bot was allowed to write messages.
         */
        public BotWriteAccessAllowReason reason;

        /**
         * The user allowed the bot to send messages.
         */
        public MessageBotWriteAccessAllowed() {
        }

        /**
         * The user allowed the bot to send messages.
         *
         * @param reason The reason why the bot was allowed to write messages.
         */
        public MessageBotWriteAccessAllowed(BotWriteAccessAllowReason reason) {
            this.reason = reason;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1702185036;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Data from a Web App has been sent to a bot.
     */
    public static class MessageWebAppDataSent extends MessageContent {
        /**
         * Text of the keyboardButtonTypeWebApp button, which opened the Web App.
         */
        public String buttonText;

        /**
         * Data from a Web App has been sent to a bot.
         */
        public MessageWebAppDataSent() {
        }

        /**
         * Data from a Web App has been sent to a bot.
         *
         * @param buttonText Text of the keyboardButtonTypeWebApp button, which opened the Web App.
         */
        public MessageWebAppDataSent(String buttonText) {
            this.buttonText = buttonText;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -83674862;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Data from a Web App has been received; for bots only.
     */
    public static class MessageWebAppDataReceived extends MessageContent {
        /**
         * Text of the keyboardButtonTypeWebApp button, which opened the Web App.
         */
        public String buttonText;
        /**
         * The data.
         */
        public String data;

        /**
         * Data from a Web App has been received; for bots only.
         */
        public MessageWebAppDataReceived() {
        }

        /**
         * Data from a Web App has been received; for bots only.
         *
         * @param buttonText Text of the keyboardButtonTypeWebApp button, which opened the Web App.
         * @param data The data.
         */
        public MessageWebAppDataReceived(String buttonText, String data) {
            this.buttonText = buttonText;
            this.data = data;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -8578539;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Telegram Passport data has been sent to a bot.
     */
    public static class MessagePassportDataSent extends MessageContent {
        /**
         * List of Telegram Passport element types sent.
         */
        public PassportElementType[] types;

        /**
         * Telegram Passport data has been sent to a bot.
         */
        public MessagePassportDataSent() {
        }

        /**
         * Telegram Passport data has been sent to a bot.
         *
         * @param types List of Telegram Passport element types sent.
         */
        public MessagePassportDataSent(PassportElementType[] types) {
            this.types = types;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1017405171;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Telegram Passport data has been received; for bots only.
     */
    public static class MessagePassportDataReceived extends MessageContent {
        /**
         * List of received Telegram Passport elements.
         */
        public EncryptedPassportElement[] elements;
        /**
         * Encrypted data credentials.
         */
        public EncryptedCredentials credentials;

        /**
         * Telegram Passport data has been received; for bots only.
         */
        public MessagePassportDataReceived() {
        }

        /**
         * Telegram Passport data has been received; for bots only.
         *
         * @param elements List of received Telegram Passport elements.
         * @param credentials Encrypted data credentials.
         */
        public MessagePassportDataReceived(EncryptedPassportElement[] elements, EncryptedCredentials credentials) {
            this.elements = elements;
            this.credentials = credentials;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1367863624;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A user in the chat came within proximity alert range.
     */
    public static class MessageProximityAlertTriggered extends MessageContent {
        /**
         * The identifier of a user or chat that triggered the proximity alert.
         */
        public MessageSender travelerId;
        /**
         * The identifier of a user or chat that subscribed for the proximity alert.
         */
        public MessageSender watcherId;
        /**
         * The distance between the users.
         */
        public int distance;

        /**
         * A user in the chat came within proximity alert range.
         */
        public MessageProximityAlertTriggered() {
        }

        /**
         * A user in the chat came within proximity alert range.
         *
         * @param travelerId The identifier of a user or chat that triggered the proximity alert.
         * @param watcherId The identifier of a user or chat that subscribed for the proximity alert.
         * @param distance The distance between the users.
         */
        public MessageProximityAlertTriggered(MessageSender travelerId, MessageSender watcherId, int distance) {
            this.travelerId = travelerId;
            this.watcherId = watcherId;
            this.distance = distance;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 67761875;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message content that is not supported in the current TDLib version.
     */
    public static class MessageUnsupported extends MessageContent {

        /**
         * A message content that is not supported in the current TDLib version.
         */
        public MessageUnsupported() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1816726139;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Options to be used when a message content is copied without reference to the original sender. Service messages, messages with messageInvoice, messagePaidMedia, messageGiveaway, or messageGiveawayWinners content can't be copied.
     */
    public static class MessageCopyOptions extends Object {
        /**
         * True, if content of the message needs to be copied without reference to the original sender. Always true if the message is forwarded to a secret chat or is local. Use messageProperties.canBeCopied and messageProperties.canBeCopiedToSecretChat to check whether the message is suitable.
         */
        public boolean sendCopy;
        /**
         * True, if media caption of the message copy needs to be replaced. Ignored if sendCopy is false.
         */
        public boolean replaceCaption;
        /**
         * New message caption; pass null to copy message without caption. Ignored if replaceCaption is false.
         */
        public FormattedText newCaption;
        /**
         * True, if new caption must be shown above the media; otherwise, new caption must be shown below the media; not supported in secret chats. Ignored if replaceCaption is false.
         */
        public boolean newShowCaptionAboveMedia;

        /**
         * Options to be used when a message content is copied without reference to the original sender. Service messages, messages with messageInvoice, messagePaidMedia, messageGiveaway, or messageGiveawayWinners content can't be copied.
         */
        public MessageCopyOptions() {
        }

        /**
         * Options to be used when a message content is copied without reference to the original sender. Service messages, messages with messageInvoice, messagePaidMedia, messageGiveaway, or messageGiveawayWinners content can't be copied.
         *
         * @param sendCopy True, if content of the message needs to be copied without reference to the original sender. Always true if the message is forwarded to a secret chat or is local. Use messageProperties.canBeCopied and messageProperties.canBeCopiedToSecretChat to check whether the message is suitable.
         * @param replaceCaption True, if media caption of the message copy needs to be replaced. Ignored if sendCopy is false.
         * @param newCaption New message caption; pass null to copy message without caption. Ignored if replaceCaption is false.
         * @param newShowCaptionAboveMedia True, if new caption must be shown above the media; otherwise, new caption must be shown below the media; not supported in secret chats. Ignored if replaceCaption is false.
         */
        public MessageCopyOptions(boolean sendCopy, boolean replaceCaption, FormattedText newCaption, boolean newShowCaptionAboveMedia) {
            this.sendCopy = sendCopy;
            this.replaceCaption = replaceCaption;
            this.newCaption = newCaption;
            this.newShowCaptionAboveMedia = newShowCaptionAboveMedia;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1079772090;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about an effect added to a message.
     */
    public static class MessageEffect extends Object {
        /**
         * Unique identifier of the effect.
         */
        public long id;
        /**
         * Static icon for the effect in WEBP format; may be null if none.
         */
        @Nullable public Sticker staticIcon;
        /**
         * Emoji corresponding to the effect that can be used if static icon isn't available.
         */
        public String emoji;
        /**
         * True, if Telegram Premium subscription is required to use the effect.
         */
        public boolean isPremium;
        /**
         * Type of the effect.
         */
        public MessageEffectType type;

        /**
         * Contains information about an effect added to a message.
         */
        public MessageEffect() {
        }

        /**
         * Contains information about an effect added to a message.
         *
         * @param id Unique identifier of the effect.
         * @param staticIcon Static icon for the effect in WEBP format; may be null if none.
         * @param emoji Emoji corresponding to the effect that can be used if static icon isn't available.
         * @param isPremium True, if Telegram Premium subscription is required to use the effect.
         * @param type Type of the effect.
         */
        public MessageEffect(long id, Sticker staticIcon, String emoji, boolean isPremium, MessageEffectType type) {
            this.id = id;
            this.staticIcon = staticIcon;
            this.emoji = emoji;
            this.isPremium = isPremium;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1758836433;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes type of emoji effect.
     */
    public abstract static class MessageEffectType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            MessageEffectTypeEmojiReaction.CONSTRUCTOR,
            MessageEffectTypePremiumSticker.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public MessageEffectType() {
        }
    }

    /**
     * An effect from an emoji reaction.
     */
    public static class MessageEffectTypeEmojiReaction extends MessageEffectType {
        /**
         * Select animation for the effect in TGS format.
         */
        public Sticker selectAnimation;
        /**
         * Effect animation for the effect in TGS format.
         */
        public Sticker effectAnimation;

        /**
         * An effect from an emoji reaction.
         */
        public MessageEffectTypeEmojiReaction() {
        }

        /**
         * An effect from an emoji reaction.
         *
         * @param selectAnimation Select animation for the effect in TGS format.
         * @param effectAnimation Effect animation for the effect in TGS format.
         */
        public MessageEffectTypeEmojiReaction(Sticker selectAnimation, Sticker effectAnimation) {
            this.selectAnimation = selectAnimation;
            this.effectAnimation = effectAnimation;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1756079678;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An effect from a premium sticker.
     */
    public static class MessageEffectTypePremiumSticker extends MessageEffectType {
        /**
         * The premium sticker. The effect can be found at sticker.fullType.premiumAnimation.
         */
        public Sticker sticker;

        /**
         * An effect from a premium sticker.
         */
        public MessageEffectTypePremiumSticker() {
        }

        /**
         * An effect from a premium sticker.
         *
         * @param sticker The premium sticker. The effect can be found at sticker.fullType.premiumAnimation.
         */
        public MessageEffectTypePremiumSticker(Sticker sticker) {
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1637231609;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains information about a file with messages exported from another app.
     */
    public abstract static class MessageFileType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            MessageFileTypePrivate.CONSTRUCTOR,
            MessageFileTypeGroup.CONSTRUCTOR,
            MessageFileTypeUnknown.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public MessageFileType() {
        }
    }

    /**
     * The messages were exported from a private chat.
     */
    public static class MessageFileTypePrivate extends MessageFileType {
        /**
         * Name of the other party; may be empty if unrecognized.
         */
        public String name;

        /**
         * The messages were exported from a private chat.
         */
        public MessageFileTypePrivate() {
        }

        /**
         * The messages were exported from a private chat.
         *
         * @param name Name of the other party; may be empty if unrecognized.
         */
        public MessageFileTypePrivate(String name) {
            this.name = name;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -521908524;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The messages were exported from a group chat.
     */
    public static class MessageFileTypeGroup extends MessageFileType {
        /**
         * Title of the group chat; may be empty if unrecognized.
         */
        public String title;

        /**
         * The messages were exported from a group chat.
         */
        public MessageFileTypeGroup() {
        }

        /**
         * The messages were exported from a group chat.
         *
         * @param title Title of the group chat; may be empty if unrecognized.
         */
        public MessageFileTypeGroup(String title) {
            this.title = title;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -219836568;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The messages were exported from a chat of unknown type.
     */
    public static class MessageFileTypeUnknown extends MessageFileType {

        /**
         * The messages were exported from a chat of unknown type.
         */
        public MessageFileTypeUnknown() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1176353458;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a forwarded message.
     */
    public static class MessageForwardInfo extends Object {
        /**
         * Origin of the forwarded message.
         */
        public MessageOrigin origin;
        /**
         * Point in time (Unix timestamp) when the message was originally sent.
         */
        public int date;
        /**
         * For messages forwarded to the chat with the current user (Saved Messages), to the Replies bot chat, or to the channel's discussion group, information about the source message from which the message was forwarded last time; may be null for other forwards or if unknown.
         */
        @Nullable public ForwardSource source;
        /**
         * The type of public service announcement for the forwarded message.
         */
        public String publicServiceAnnouncementType;

        /**
         * Contains information about a forwarded message.
         */
        public MessageForwardInfo() {
        }

        /**
         * Contains information about a forwarded message.
         *
         * @param origin Origin of the forwarded message.
         * @param date Point in time (Unix timestamp) when the message was originally sent.
         * @param source For messages forwarded to the chat with the current user (Saved Messages), to the Replies bot chat, or to the channel's discussion group, information about the source message from which the message was forwarded last time; may be null for other forwards or if unknown.
         * @param publicServiceAnnouncementType The type of public service announcement for the forwarded message.
         */
        public MessageForwardInfo(MessageOrigin origin, int date, ForwardSource source, String publicServiceAnnouncementType) {
            this.origin = origin;
            this.date = date;
            this.source = source;
            this.publicServiceAnnouncementType = publicServiceAnnouncementType;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -880313475;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a message created with importMessages.
     */
    public static class MessageImportInfo extends Object {
        /**
         * Name of the original sender.
         */
        public String senderName;
        /**
         * Point in time (Unix timestamp) when the message was originally sent.
         */
        public int date;

        /**
         * Contains information about a message created with importMessages.
         */
        public MessageImportInfo() {
        }

        /**
         * Contains information about a message created with importMessages.
         *
         * @param senderName Name of the original sender.
         * @param date Point in time (Unix timestamp) when the message was originally sent.
         */
        public MessageImportInfo(String senderName, int date) {
            this.senderName = senderName;
            this.date = date;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -421549105;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about interactions with a message.
     */
    public static class MessageInteractionInfo extends Object {
        /**
         * Number of times the message was viewed.
         */
        public int viewCount;
        /**
         * Number of times the message was forwarded.
         */
        public int forwardCount;
        /**
         * Information about direct or indirect replies to the message; may be null. Currently, available only in channels with a discussion supergroup and discussion supergroups for messages, which are not replies itself.
         */
        @Nullable public MessageReplyInfo replyInfo;
        /**
         * The list of reactions or tags added to the message; may be null.
         */
        @Nullable public MessageReactions reactions;

        /**
         * Contains information about interactions with a message.
         */
        public MessageInteractionInfo() {
        }

        /**
         * Contains information about interactions with a message.
         *
         * @param viewCount Number of times the message was viewed.
         * @param forwardCount Number of times the message was forwarded.
         * @param replyInfo Information about direct or indirect replies to the message; may be null. Currently, available only in channels with a discussion supergroup and discussion supergroups for messages, which are not replies itself.
         * @param reactions The list of reactions or tags added to the message; may be null.
         */
        public MessageInteractionInfo(int viewCount, int forwardCount, MessageReplyInfo replyInfo, MessageReactions reactions) {
            this.viewCount = viewCount;
            this.forwardCount = forwardCount;
            this.replyInfo = replyInfo;
            this.reactions = reactions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 733797893;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains an HTTPS link to a message in a supergroup or channel, or a forum topic.
     */
    public static class MessageLink extends Object {
        /**
         * The link.
         */
        public String link;
        /**
         * True, if the link will work for non-members of the chat.
         */
        public boolean isPublic;

        /**
         * Contains an HTTPS link to a message in a supergroup or channel, or a forum topic.
         */
        public MessageLink() {
        }

        /**
         * Contains an HTTPS link to a message in a supergroup or channel, or a forum topic.
         *
         * @param link The link.
         * @param isPublic True, if the link will work for non-members of the chat.
         */
        public MessageLink(String link, boolean isPublic) {
            this.link = link;
            this.isPublic = isPublic;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1354089818;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a link to a message or a forum topic in a chat.
     */
    public static class MessageLinkInfo extends Object {
        /**
         * True, if the link is a public link for a message or a forum topic in a chat.
         */
        public boolean isPublic;
        /**
         * If found, identifier of the chat to which the link points, 0 otherwise.
         */
        public long chatId;
        /**
         * Identifier of the specific topic in which the message must be opened, or a topic to open if the message is missing; may be null if none.
         */
        @Nullable public MessageTopic topicId;
        /**
         * If found, the linked message; may be null.
         */
        @Nullable public Message message;
        /**
         * Timestamp from which the video/audio/video note/voice note/story playing must start, in seconds; 0 if not specified. The media can be in the message content or in its link preview.
         */
        public int mediaTimestamp;
        /**
         * Identifier of the checklist task that is linked; 0 if none.
         */
        public int checklistTaskId;
        /**
         * Identifier of the poll option that is linked; empty if none.
         */
        public String pollOptionId;
        /**
         * True, if the whole media album to which the message belongs is linked.
         */
        public boolean forAlbum;

        /**
         * Contains information about a link to a message or a forum topic in a chat.
         */
        public MessageLinkInfo() {
        }

        /**
         * Contains information about a link to a message or a forum topic in a chat.
         *
         * @param isPublic True, if the link is a public link for a message or a forum topic in a chat.
         * @param chatId If found, identifier of the chat to which the link points, 0 otherwise.
         * @param topicId Identifier of the specific topic in which the message must be opened, or a topic to open if the message is missing; may be null if none.
         * @param message If found, the linked message; may be null.
         * @param mediaTimestamp Timestamp from which the video/audio/video note/voice note/story playing must start, in seconds; 0 if not specified. The media can be in the message content or in its link preview.
         * @param checklistTaskId Identifier of the checklist task that is linked; 0 if none.
         * @param pollOptionId Identifier of the poll option that is linked; empty if none.
         * @param forAlbum True, if the whole media album to which the message belongs is linked.
         */
        public MessageLinkInfo(boolean isPublic, long chatId, MessageTopic topicId, Message message, int mediaTimestamp, int checklistTaskId, String pollOptionId, boolean forAlbum) {
            this.isPublic = isPublic;
            this.chatId = chatId;
            this.topicId = topicId;
            this.message = message;
            this.mediaTimestamp = mediaTimestamp;
            this.checklistTaskId = checklistTaskId;
            this.pollOptionId = pollOptionId;
            this.forAlbum = forAlbum;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1091360815;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains information about the origin of a message.
     */
    public abstract static class MessageOrigin extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            MessageOriginUser.CONSTRUCTOR,
            MessageOriginHiddenUser.CONSTRUCTOR,
            MessageOriginChat.CONSTRUCTOR,
            MessageOriginChannel.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public MessageOrigin() {
        }
    }

    /**
     * The message was originally sent by a known user.
     */
    public static class MessageOriginUser extends MessageOrigin {
        /**
         * Identifier of the user who originally sent the message.
         */
        public long senderUserId;

        /**
         * The message was originally sent by a known user.
         */
        public MessageOriginUser() {
        }

        /**
         * The message was originally sent by a known user.
         *
         * @param senderUserId Identifier of the user who originally sent the message.
         */
        public MessageOriginUser(long senderUserId) {
            this.senderUserId = senderUserId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1677684669;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message was originally sent by a user, which is hidden by their privacy settings.
     */
    public static class MessageOriginHiddenUser extends MessageOrigin {
        /**
         * Name of the sender.
         */
        public String senderName;

        /**
         * The message was originally sent by a user, which is hidden by their privacy settings.
         */
        public MessageOriginHiddenUser() {
        }

        /**
         * The message was originally sent by a user, which is hidden by their privacy settings.
         *
         * @param senderName Name of the sender.
         */
        public MessageOriginHiddenUser(String senderName) {
            this.senderName = senderName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -317971494;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message was originally sent on behalf of a chat.
     */
    public static class MessageOriginChat extends MessageOrigin {
        /**
         * Identifier of the chat that originally sent the message.
         */
        public long senderChatId;
        /**
         * For messages originally sent by an anonymous chat administrator, original message author signature.
         */
        public String authorSignature;

        /**
         * The message was originally sent on behalf of a chat.
         */
        public MessageOriginChat() {
        }

        /**
         * The message was originally sent on behalf of a chat.
         *
         * @param senderChatId Identifier of the chat that originally sent the message.
         * @param authorSignature For messages originally sent by an anonymous chat administrator, original message author signature.
         */
        public MessageOriginChat(long senderChatId, String authorSignature) {
            this.senderChatId = senderChatId;
            this.authorSignature = authorSignature;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -205824332;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message was originally a post in a channel.
     */
    public static class MessageOriginChannel extends MessageOrigin {
        /**
         * Identifier of the channel chat to which the message was originally sent.
         */
        public long chatId;
        /**
         * Message identifier of the original message.
         */
        public long messageId;
        /**
         * Original post author signature.
         */
        public String authorSignature;

        /**
         * The message was originally a post in a channel.
         */
        public MessageOriginChannel() {
        }

        /**
         * The message was originally a post in a channel.
         *
         * @param chatId Identifier of the channel chat to which the message was originally sent.
         * @param messageId Message identifier of the original message.
         * @param authorSignature Original post author signature.
         */
        public MessageOriginChannel(long chatId, long messageId, String authorSignature) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.authorSignature = authorSignature;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1451535938;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a message in a specific position.
     */
    public static class MessagePosition extends Object {
        /**
         * 0-based message position in the full list of suitable messages.
         */
        public int position;
        /**
         * Message identifier.
         */
        public long messageId;
        /**
         * Point in time (Unix timestamp) when the message was sent.
         */
        public int date;

        /**
         * Contains information about a message in a specific position.
         */
        public MessagePosition() {
        }

        /**
         * Contains information about a message in a specific position.
         *
         * @param position 0-based message position in the full list of suitable messages.
         * @param messageId Message identifier.
         * @param date Point in time (Unix timestamp) when the message was sent.
         */
        public MessagePosition(int position, long messageId, int date) {
            this.position = position;
            this.messageId = messageId;
            this.date = date;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1292189935;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of message positions.
     */
    public static class MessagePositions extends Object {
        /**
         * Total number of messages found.
         */
        public int totalCount;
        /**
         * List of message positions.
         */
        public MessagePosition[] positions;

        /**
         * Contains a list of message positions.
         */
        public MessagePositions() {
        }

        /**
         * Contains a list of message positions.
         *
         * @param totalCount Total number of messages found.
         * @param positions List of message positions.
         */
        public MessagePositions(int totalCount, MessagePosition[] positions) {
            this.totalCount = totalCount;
            this.positions = positions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1930466649;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains properties of a message and describes actions that can be done with the message right now.
     */
    public static class MessageProperties extends Object {
        /**
         * True, if an offer can be added to the message using addOffer.
         */
        public boolean canAddOffer;
        /**
         * True, if tasks can be added to the message's checklist using addChecklistTasks if the current user has Telegram Premium subscription.
         */
        public boolean canAddTasks;
        /**
         * True, if the message is a suggested post that can be approved by the user using approveSuggestedPost.
         */
        public boolean canBeApproved;
        /**
         * True, if content of the message can be copied using inputMessageForwarded or forwardMessages with copy options.
         */
        public boolean canBeCopied;
        /**
         * True, if content of the message can be copied to a secret chat using inputMessageForwarded or forwardMessages with copy options.
         */
        public boolean canBeCopiedToSecretChat;
        /**
         * True, if the message is a suggested post that can be declined by the user using declineSuggestedPost.
         */
        public boolean canBeDeclined;
        /**
         * True, if the message can be deleted only for the current user while other users will continue to see it using the method deleteMessages with revoke == false.
         */
        public boolean canBeDeletedOnlyForSelf;
        /**
         * True, if the message can be deleted for all users using the method deleteMessages with revoke == true.
         */
        public boolean canBeDeletedForAllUsers;
        /**
         * True, if the message can be edited using the methods editMessageText, editMessageCaption, or editMessageReplyMarkup. For live location, poll, and checklist messages this fields shows whether editMessageLiveLocation, stopPoll, or editMessageChecklist respectively can be used with this message.
         */
        public boolean canBeEdited;
        /**
         * True, if the message can be forwarded using inputMessageForwarded or forwardMessages without copy options.
         */
        public boolean canBeForwarded;
        /**
         * True, if the message can be paid using inputInvoiceMessage.
         */
        public boolean canBePaid;
        /**
         * True, if the message can be pinned or unpinned in the chat using pinChatMessage or unpinChatMessage.
         */
        public boolean canBePinned;
        /**
         * True, if the message can be replied in the same chat and forum topic using inputMessageReplyToMessage.
         */
        public boolean canBeReplied;
        /**
         * True, if the message can be replied in another chat or forum topic using inputMessageReplyToExternalMessage.
         */
        public boolean canBeRepliedInAnotherChat;
        /**
         * True, if content of the message can be saved locally.
         */
        public boolean canBeSaved;
        /**
         * True, if the message can be shared in a story using inputStoryAreaTypeMessage.
         */
        public boolean canBeSharedInStory;
        /**
         * True, if the user can delete reactions of other users in the message using the method deleteMessageReactionsFromSender.
         */
        public boolean canDeleteReactions;
        /**
         * True, if the message can be edited using the method editMessageMedia.
         */
        public boolean canEditMedia;
        /**
         * True, if scheduling state of the message can be edited.
         */
        public boolean canEditSchedulingState;
        /**
         * True, if another price or post send time can be suggested using addOffer.
         */
        public boolean canEditSuggestedPostInfo;
        /**
         * True, if author of the message sent on behalf of a chat can be received through getMessageAuthor.
         */
        public boolean canGetAuthor;
        /**
         * True, if code for message embedding can be received using getMessageEmbeddingCode.
         */
        public boolean canGetEmbeddingCode;
        /**
         * True, if a link can be generated for the message using getMessageLink.
         */
        public boolean canGetLink;
        /**
         * True, if media timestamp links can be generated for media timestamp entities in the message text, caption or link preview description using getMessageLink.
         */
        public boolean canGetMediaTimestampLinks;
        /**
         * True, if information about the message thread is available through getMessageThread and getMessageThreadHistory.
         */
        public boolean canGetMessageThread;
        /**
         * True, if the message is a poll and vote statistics are available through getPollVoteStatistics.
         */
        public boolean canGetPollVoteStatistics;
        /**
         * True, if read date of the message can be received through getMessageReadDate.
         */
        public boolean canGetReadDate;
        /**
         * True, if message statistics are available through getMessageStatistics and message forwards can be received using getMessagePublicForwards.
         */
        public boolean canGetStatistics;
        /**
         * True, if advertisements for video of the message can be received through getVideoMessageAdvertisements.
         */
        public boolean canGetVideoAdvertisements;
        /**
         * True, if chat members already viewed the message can be received through getMessageViewers.
         */
        public boolean canGetViewers;
        /**
         * True, if tasks can be marked as done or not done in the message's checklist using markChecklistTasksAsDone if the current user has Telegram Premium subscription.
         */
        public boolean canMarkTasksAsDone;
        /**
         * True, if speech can be recognized for the message through recognizeSpeech.
         */
        public boolean canRecognizeSpeech;
        /**
         * True, if the message can be reported using reportChat.
         */
        public boolean canReportChat;
        /**
         * True, if reactions on the message can be reported through reportMessageReactions.
         */
        public boolean canReportReactions;
        /**
         * True, if the message can be reported using reportSupergroupSpam.
         */
        public boolean canReportSupergroupSpam;
        /**
         * True, if fact check for the message can be changed through setMessageFactCheck.
         */
        public boolean canSetFactCheck;
        /**
         * True, if content of the message can't be saved locally, because it is protected by the current user; if true, then canBeSaved is false.
         */
        public boolean hasProtectedContentByCurrentUser;
        /**
         * True, if content of the message can't be saved locally, because it is protected by the other user; if true, then canBeSaved is false.
         */
        public boolean hasProtectedContentByOtherUser;
        /**
         * True, if message statistics must be available from context menu of the message.
         */
        public boolean needShowStatistics;

        /**
         * Contains properties of a message and describes actions that can be done with the message right now.
         */
        public MessageProperties() {
        }

        /**
         * Contains properties of a message and describes actions that can be done with the message right now.
         *
         * @param canAddOffer True, if an offer can be added to the message using addOffer.
         * @param canAddTasks True, if tasks can be added to the message's checklist using addChecklistTasks if the current user has Telegram Premium subscription.
         * @param canBeApproved True, if the message is a suggested post that can be approved by the user using approveSuggestedPost.
         * @param canBeCopied True, if content of the message can be copied using inputMessageForwarded or forwardMessages with copy options.
         * @param canBeCopiedToSecretChat True, if content of the message can be copied to a secret chat using inputMessageForwarded or forwardMessages with copy options.
         * @param canBeDeclined True, if the message is a suggested post that can be declined by the user using declineSuggestedPost.
         * @param canBeDeletedOnlyForSelf True, if the message can be deleted only for the current user while other users will continue to see it using the method deleteMessages with revoke == false.
         * @param canBeDeletedForAllUsers True, if the message can be deleted for all users using the method deleteMessages with revoke == true.
         * @param canBeEdited True, if the message can be edited using the methods editMessageText, editMessageCaption, or editMessageReplyMarkup. For live location, poll, and checklist messages this fields shows whether editMessageLiveLocation, stopPoll, or editMessageChecklist respectively can be used with this message.
         * @param canBeForwarded True, if the message can be forwarded using inputMessageForwarded or forwardMessages without copy options.
         * @param canBePaid True, if the message can be paid using inputInvoiceMessage.
         * @param canBePinned True, if the message can be pinned or unpinned in the chat using pinChatMessage or unpinChatMessage.
         * @param canBeReplied True, if the message can be replied in the same chat and forum topic using inputMessageReplyToMessage.
         * @param canBeRepliedInAnotherChat True, if the message can be replied in another chat or forum topic using inputMessageReplyToExternalMessage.
         * @param canBeSaved True, if content of the message can be saved locally.
         * @param canBeSharedInStory True, if the message can be shared in a story using inputStoryAreaTypeMessage.
         * @param canDeleteReactions True, if the user can delete reactions of other users in the message using the method deleteMessageReactionsFromSender.
         * @param canEditMedia True, if the message can be edited using the method editMessageMedia.
         * @param canEditSchedulingState True, if scheduling state of the message can be edited.
         * @param canEditSuggestedPostInfo True, if another price or post send time can be suggested using addOffer.
         * @param canGetAuthor True, if author of the message sent on behalf of a chat can be received through getMessageAuthor.
         * @param canGetEmbeddingCode True, if code for message embedding can be received using getMessageEmbeddingCode.
         * @param canGetLink True, if a link can be generated for the message using getMessageLink.
         * @param canGetMediaTimestampLinks True, if media timestamp links can be generated for media timestamp entities in the message text, caption or link preview description using getMessageLink.
         * @param canGetMessageThread True, if information about the message thread is available through getMessageThread and getMessageThreadHistory.
         * @param canGetPollVoteStatistics True, if the message is a poll and vote statistics are available through getPollVoteStatistics.
         * @param canGetReadDate True, if read date of the message can be received through getMessageReadDate.
         * @param canGetStatistics True, if message statistics are available through getMessageStatistics and message forwards can be received using getMessagePublicForwards.
         * @param canGetVideoAdvertisements True, if advertisements for video of the message can be received through getVideoMessageAdvertisements.
         * @param canGetViewers True, if chat members already viewed the message can be received through getMessageViewers.
         * @param canMarkTasksAsDone True, if tasks can be marked as done or not done in the message's checklist using markChecklistTasksAsDone if the current user has Telegram Premium subscription.
         * @param canRecognizeSpeech True, if speech can be recognized for the message through recognizeSpeech.
         * @param canReportChat True, if the message can be reported using reportChat.
         * @param canReportReactions True, if reactions on the message can be reported through reportMessageReactions.
         * @param canReportSupergroupSpam True, if the message can be reported using reportSupergroupSpam.
         * @param canSetFactCheck True, if fact check for the message can be changed through setMessageFactCheck.
         * @param hasProtectedContentByCurrentUser True, if content of the message can't be saved locally, because it is protected by the current user; if true, then canBeSaved is false.
         * @param hasProtectedContentByOtherUser True, if content of the message can't be saved locally, because it is protected by the other user; if true, then canBeSaved is false.
         * @param needShowStatistics True, if message statistics must be available from context menu of the message.
         */
        public MessageProperties(boolean canAddOffer, boolean canAddTasks, boolean canBeApproved, boolean canBeCopied, boolean canBeCopiedToSecretChat, boolean canBeDeclined, boolean canBeDeletedOnlyForSelf, boolean canBeDeletedForAllUsers, boolean canBeEdited, boolean canBeForwarded, boolean canBePaid, boolean canBePinned, boolean canBeReplied, boolean canBeRepliedInAnotherChat, boolean canBeSaved, boolean canBeSharedInStory, boolean canDeleteReactions, boolean canEditMedia, boolean canEditSchedulingState, boolean canEditSuggestedPostInfo, boolean canGetAuthor, boolean canGetEmbeddingCode, boolean canGetLink, boolean canGetMediaTimestampLinks, boolean canGetMessageThread, boolean canGetPollVoteStatistics, boolean canGetReadDate, boolean canGetStatistics, boolean canGetVideoAdvertisements, boolean canGetViewers, boolean canMarkTasksAsDone, boolean canRecognizeSpeech, boolean canReportChat, boolean canReportReactions, boolean canReportSupergroupSpam, boolean canSetFactCheck, boolean hasProtectedContentByCurrentUser, boolean hasProtectedContentByOtherUser, boolean needShowStatistics) {
            this.canAddOffer = canAddOffer;
            this.canAddTasks = canAddTasks;
            this.canBeApproved = canBeApproved;
            this.canBeCopied = canBeCopied;
            this.canBeCopiedToSecretChat = canBeCopiedToSecretChat;
            this.canBeDeclined = canBeDeclined;
            this.canBeDeletedOnlyForSelf = canBeDeletedOnlyForSelf;
            this.canBeDeletedForAllUsers = canBeDeletedForAllUsers;
            this.canBeEdited = canBeEdited;
            this.canBeForwarded = canBeForwarded;
            this.canBePaid = canBePaid;
            this.canBePinned = canBePinned;
            this.canBeReplied = canBeReplied;
            this.canBeRepliedInAnotherChat = canBeRepliedInAnotherChat;
            this.canBeSaved = canBeSaved;
            this.canBeSharedInStory = canBeSharedInStory;
            this.canDeleteReactions = canDeleteReactions;
            this.canEditMedia = canEditMedia;
            this.canEditSchedulingState = canEditSchedulingState;
            this.canEditSuggestedPostInfo = canEditSuggestedPostInfo;
            this.canGetAuthor = canGetAuthor;
            this.canGetEmbeddingCode = canGetEmbeddingCode;
            this.canGetLink = canGetLink;
            this.canGetMediaTimestampLinks = canGetMediaTimestampLinks;
            this.canGetMessageThread = canGetMessageThread;
            this.canGetPollVoteStatistics = canGetPollVoteStatistics;
            this.canGetReadDate = canGetReadDate;
            this.canGetStatistics = canGetStatistics;
            this.canGetVideoAdvertisements = canGetVideoAdvertisements;
            this.canGetViewers = canGetViewers;
            this.canMarkTasksAsDone = canMarkTasksAsDone;
            this.canRecognizeSpeech = canRecognizeSpeech;
            this.canReportChat = canReportChat;
            this.canReportReactions = canReportReactions;
            this.canReportSupergroupSpam = canReportSupergroupSpam;
            this.canSetFactCheck = canSetFactCheck;
            this.hasProtectedContentByCurrentUser = hasProtectedContentByCurrentUser;
            this.hasProtectedContentByOtherUser = hasProtectedContentByOtherUser;
            this.needShowStatistics = needShowStatistics;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -688751636;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a reaction to a message.
     */
    public static class MessageReaction extends Object {
        /**
         * Type of the reaction.
         */
        public ReactionType type;
        /**
         * Number of times the reaction was added.
         */
        public int totalCount;
        /**
         * True, if the reaction is chosen by the current user.
         */
        public boolean isChosen;
        /**
         * Identifier of the message sender used by the current user to add the reaction; may be null if unknown or the reaction isn't chosen.
         */
        @Nullable public MessageSender usedSenderId;
        /**
         * Identifiers of at most 3 recent message senders, added the reaction; available in private, basic group and supergroup chats.
         */
        public MessageSender[] recentSenderIds;

        /**
         * Contains information about a reaction to a message.
         */
        public MessageReaction() {
        }

        /**
         * Contains information about a reaction to a message.
         *
         * @param type Type of the reaction.
         * @param totalCount Number of times the reaction was added.
         * @param isChosen True, if the reaction is chosen by the current user.
         * @param usedSenderId Identifier of the message sender used by the current user to add the reaction; may be null if unknown or the reaction isn't chosen.
         * @param recentSenderIds Identifiers of at most 3 recent message senders, added the reaction; available in private, basic group and supergroup chats.
         */
        public MessageReaction(ReactionType type, int totalCount, boolean isChosen, MessageSender usedSenderId, MessageSender[] recentSenderIds) {
            this.type = type;
            this.totalCount = totalCount;
            this.isChosen = isChosen;
            this.usedSenderId = usedSenderId;
            this.recentSenderIds = recentSenderIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1093994369;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of reactions added to a message.
     */
    public static class MessageReactions extends Object {
        /**
         * List of added reactions.
         */
        public MessageReaction[] reactions;
        /**
         * True, if the reactions are tags and Telegram Premium users can filter messages by them.
         */
        public boolean areTags;
        /**
         * Information about top users that added the paid reaction.
         */
        public PaidReactor[] paidReactors;
        /**
         * True, if the list of added reactions is available using getMessageAddedReactions.
         */
        public boolean canGetAddedReactions;

        /**
         * Contains a list of reactions added to a message.
         */
        public MessageReactions() {
        }

        /**
         * Contains a list of reactions added to a message.
         *
         * @param reactions List of added reactions.
         * @param areTags True, if the reactions are tags and Telegram Premium users can filter messages by them.
         * @param paidReactors Information about top users that added the paid reaction.
         * @param canGetAddedReactions True, if the list of added reactions is available using getMessageAddedReactions.
         */
        public MessageReactions(MessageReaction[] reactions, boolean areTags, PaidReactor[] paidReactors, boolean canGetAddedReactions) {
            this.reactions = reactions;
            this.areTags = areTags;
            this.paidReactors = paidReactors;
            this.canGetAddedReactions = canGetAddedReactions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1475966817;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes read date of a recent outgoing message in a private chat.
     */
    public abstract static class MessageReadDate extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            MessageReadDateRead.CONSTRUCTOR,
            MessageReadDateUnread.CONSTRUCTOR,
            MessageReadDateTooOld.CONSTRUCTOR,
            MessageReadDateUserPrivacyRestricted.CONSTRUCTOR,
            MessageReadDateMyPrivacyRestricted.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public MessageReadDate() {
        }
    }

    /**
     * Contains read date of the message.
     */
    public static class MessageReadDateRead extends MessageReadDate {
        /**
         * Point in time (Unix timestamp) when the message was read by the other user.
         */
        public int readDate;

        /**
         * Contains read date of the message.
         */
        public MessageReadDateRead() {
        }

        /**
         * Contains read date of the message.
         *
         * @param readDate Point in time (Unix timestamp) when the message was read by the other user.
         */
        public MessageReadDateRead(int readDate) {
            this.readDate = readDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1972186672;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message is unread yet.
     */
    public static class MessageReadDateUnread extends MessageReadDate {

        /**
         * The message is unread yet.
         */
        public MessageReadDateUnread() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 397549868;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message is too old to get read date.
     */
    public static class MessageReadDateTooOld extends MessageReadDate {

        /**
         * The message is too old to get read date.
         */
        public MessageReadDateTooOld() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1233773024;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The read date is unknown due to privacy settings of the other user.
     */
    public static class MessageReadDateUserPrivacyRestricted extends MessageReadDate {

        /**
         * The read date is unknown due to privacy settings of the other user.
         */
        public MessageReadDateUserPrivacyRestricted() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1282567130;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The read date is unknown due to privacy settings of the current user, but will be known if the user subscribes to Telegram Premium.
     */
    public static class MessageReadDateMyPrivacyRestricted extends MessageReadDate {

        /**
         * The read date is unknown due to privacy settings of the current user, but will be known if the user subscribes to Telegram Premium.
         */
        public MessageReadDateMyPrivacyRestricted() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -693971852;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about replies to a message.
     */
    public static class MessageReplyInfo extends Object {
        /**
         * Number of times the message was directly or indirectly replied.
         */
        public int replyCount;
        /**
         * Identifiers of at most 3 recent repliers to the message; available in channels with a discussion supergroup. The users and chats are expected to be inaccessible: only their photo and name will be available.
         */
        public MessageSender[] recentReplierIds;
        /**
         * Identifier of the last read incoming reply to the message.
         */
        public long lastReadInboxMessageId;
        /**
         * Identifier of the last read outgoing reply to the message.
         */
        public long lastReadOutboxMessageId;
        /**
         * Identifier of the last reply to the message.
         */
        public long lastMessageId;

        /**
         * Contains information about replies to a message.
         */
        public MessageReplyInfo() {
        }

        /**
         * Contains information about replies to a message.
         *
         * @param replyCount Number of times the message was directly or indirectly replied.
         * @param recentReplierIds Identifiers of at most 3 recent repliers to the message; available in channels with a discussion supergroup. The users and chats are expected to be inaccessible: only their photo and name will be available.
         * @param lastReadInboxMessageId Identifier of the last read incoming reply to the message.
         * @param lastReadOutboxMessageId Identifier of the last read outgoing reply to the message.
         * @param lastMessageId Identifier of the last reply to the message.
         */
        public MessageReplyInfo(int replyCount, MessageSender[] recentReplierIds, long lastReadInboxMessageId, long lastReadOutboxMessageId, long lastMessageId) {
            this.replyCount = replyCount;
            this.recentReplierIds = recentReplierIds;
            this.lastReadInboxMessageId = lastReadInboxMessageId;
            this.lastReadOutboxMessageId = lastReadOutboxMessageId;
            this.lastMessageId = lastMessageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2093702263;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains information about the message or the story a message is replying to.
     */
    public abstract static class MessageReplyTo extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            MessageReplyToMessage.CONSTRUCTOR,
            MessageReplyToStory.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public MessageReplyTo() {
        }
    }

    /**
     * Describes a message replied by a given message.
     */
    public static class MessageReplyToMessage extends MessageReplyTo {
        /**
         * The identifier of the chat to which the message belongs; may be 0 if the replied message is in unknown chat.
         */
        public long chatId;
        /**
         * The identifier of the message; may be 0 if the replied message is in unknown chat.
         */
        public long messageId;
        /**
         * Chosen quote from the replied message; may be null if none.
         */
        @Nullable public TextQuote quote;
        /**
         * Identifier of the checklist task in the original message that was replied; 0 if none.
         */
        public int checklistTaskId;
        /**
         * Identifier of the poll option in the original message that was replied; empty if none.
         */
        public String pollOptionId;
        /**
         * Information about origin of the message if the message was from another chat or topic; may be null for messages from the same chat.
         */
        @Nullable public MessageOrigin origin;
        /**
         * Point in time (Unix timestamp) when the message was sent if the message was from another chat or topic; 0 for messages from the same chat.
         */
        public int originSendDate;
        /**
         * Media content of the message if the message was from another chat or topic; may be null for messages from the same chat and messages without media. Can be only one of the following types: messageAnimation, messageAudio, messageChecklist, messageContact, messageDice, messageDocument, messageGame, messageGiveaway, messageGiveawayWinners, messageInvoice, messageLocation, messagePaidMedia, messagePhoto, messagePoll, messageStakeDice, messageSticker, messageStory, messageText (for link preview), messageVenue, messageVideo, messageVideoNote, or messageVoiceNote.
         */
        @Nullable public MessageContent content;

        /**
         * Describes a message replied by a given message.
         */
        public MessageReplyToMessage() {
        }

        /**
         * Describes a message replied by a given message.
         *
         * @param chatId The identifier of the chat to which the message belongs; may be 0 if the replied message is in unknown chat.
         * @param messageId The identifier of the message; may be 0 if the replied message is in unknown chat.
         * @param quote Chosen quote from the replied message; may be null if none.
         * @param checklistTaskId Identifier of the checklist task in the original message that was replied; 0 if none.
         * @param pollOptionId Identifier of the poll option in the original message that was replied; empty if none.
         * @param origin Information about origin of the message if the message was from another chat or topic; may be null for messages from the same chat.
         * @param originSendDate Point in time (Unix timestamp) when the message was sent if the message was from another chat or topic; 0 for messages from the same chat.
         * @param content Media content of the message if the message was from another chat or topic; may be null for messages from the same chat and messages without media. Can be only one of the following types: messageAnimation, messageAudio, messageChecklist, messageContact, messageDice, messageDocument, messageGame, messageGiveaway, messageGiveawayWinners, messageInvoice, messageLocation, messagePaidMedia, messagePhoto, messagePoll, messageStakeDice, messageSticker, messageStory, messageText (for link preview), messageVenue, messageVideo, messageVideoNote, or messageVoiceNote.
         */
        public MessageReplyToMessage(long chatId, long messageId, TextQuote quote, int checklistTaskId, String pollOptionId, MessageOrigin origin, int originSendDate, MessageContent content) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.quote = quote;
            this.checklistTaskId = checklistTaskId;
            this.pollOptionId = pollOptionId;
            this.origin = origin;
            this.originSendDate = originSendDate;
            this.content = content;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -203917195;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a story replied by a given message.
     */
    public static class MessageReplyToStory extends MessageReplyTo {
        /**
         * The identifier of the poster of the story.
         */
        public long storyPosterChatId;
        /**
         * The identifier of the story.
         */
        public int storyId;

        /**
         * Describes a story replied by a given message.
         */
        public MessageReplyToStory() {
        }

        /**
         * Describes a story replied by a given message.
         *
         * @param storyPosterChatId The identifier of the poster of the story.
         * @param storyId The identifier of the story.
         */
        public MessageReplyToStory(long storyPosterChatId, int storyId) {
            this.storyPosterChatId = storyPosterChatId;
            this.storyId = storyId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -674492596;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains information about the time when a scheduled message will be sent.
     */
    public abstract static class MessageSchedulingState extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            MessageSchedulingStateSendAtDate.CONSTRUCTOR,
            MessageSchedulingStateSendWhenOnline.CONSTRUCTOR,
            MessageSchedulingStateSendWhenVideoProcessed.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public MessageSchedulingState() {
        }
    }

    /**
     * The message will be sent at the specified date.
     */
    public static class MessageSchedulingStateSendAtDate extends MessageSchedulingState {
        /**
         * Point in time (Unix timestamp) when the message will be sent. The date must be within 367 days in the future.
         */
        public int sendDate;
        /**
         * Period after which the message will be sent again; in seconds; 0 if never; for Telegram Premium users only; may be non-zero only in sendMessage and forwardMessages with one message requests; must be one of 0, 86400, 7 * 86400, 14 * 86400, 30 * 86400, 91 * 86400, 182 * 86400, 365 * 86400, or additionally 60, or 300 in the Test DC.
         */
        public int repeatPeriod;

        /**
         * The message will be sent at the specified date.
         */
        public MessageSchedulingStateSendAtDate() {
        }

        /**
         * The message will be sent at the specified date.
         *
         * @param sendDate Point in time (Unix timestamp) when the message will be sent. The date must be within 367 days in the future.
         * @param repeatPeriod Period after which the message will be sent again; in seconds; 0 if never; for Telegram Premium users only; may be non-zero only in sendMessage and forwardMessages with one message requests; must be one of 0, 86400, 7 * 86400, 14 * 86400, 30 * 86400, 91 * 86400, 182 * 86400, 365 * 86400, or additionally 60, or 300 in the Test DC.
         */
        public MessageSchedulingStateSendAtDate(int sendDate, int repeatPeriod) {
            this.sendDate = sendDate;
            this.repeatPeriod = repeatPeriod;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1505903015;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message will be sent when the other user is online. Applicable to private chats only and when the exact online status of the other user is known.
     */
    public static class MessageSchedulingStateSendWhenOnline extends MessageSchedulingState {

        /**
         * The message will be sent when the other user is online. Applicable to private chats only and when the exact online status of the other user is known.
         */
        public MessageSchedulingStateSendWhenOnline() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2092947464;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message will be sent when the video in the message is converted and optimized; can be used only by the server.
     */
    public static class MessageSchedulingStateSendWhenVideoProcessed extends MessageSchedulingState {
        /**
         * Approximate point in time (Unix timestamp) when the message is expected to be sent.
         */
        public int sendDate;

        /**
         * The message will be sent when the video in the message is converted and optimized; can be used only by the server.
         */
        public MessageSchedulingStateSendWhenVideoProcessed() {
        }

        /**
         * The message will be sent when the video in the message is converted and optimized; can be used only by the server.
         *
         * @param sendDate Approximate point in time (Unix timestamp) when the message is expected to be sent.
         */
        public MessageSchedulingStateSendWhenVideoProcessed(int sendDate) {
            this.sendDate = sendDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2101578734;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes when a message will be self-destructed.
     */
    public abstract static class MessageSelfDestructType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            MessageSelfDestructTypeTimer.CONSTRUCTOR,
            MessageSelfDestructTypeImmediately.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public MessageSelfDestructType() {
        }
    }

    /**
     * The message will be self-destructed in the specified time after its content was opened.
     */
    public static class MessageSelfDestructTypeTimer extends MessageSelfDestructType {
        /**
         * The message's self-destruct time, in seconds; must be between 0 and 60 in private chats.
         */
        public int selfDestructTime;

        /**
         * The message will be self-destructed in the specified time after its content was opened.
         */
        public MessageSelfDestructTypeTimer() {
        }

        /**
         * The message will be self-destructed in the specified time after its content was opened.
         *
         * @param selfDestructTime The message's self-destruct time, in seconds; must be between 0 and 60 in private chats.
         */
        public MessageSelfDestructTypeTimer(int selfDestructTime) {
            this.selfDestructTime = selfDestructTime;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1351440333;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message can be opened only once and will be self-destructed once closed.
     */
    public static class MessageSelfDestructTypeImmediately extends MessageSelfDestructType {

        /**
         * The message can be opened only once and will be self-destructed once closed.
         */
        public MessageSelfDestructTypeImmediately() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1036218363;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Options to be used when a message is sent.
     */
    public static class MessageSendOptions extends Object {
        /**
         * Information about the suggested post; pass null if none. For messages to channel direct messages chat only. Applicable only to sendMessage and addOffer.
         */
        public InputSuggestedPostInfo suggestedPostInfo;
        /**
         * Pass true to disable notification for the message.
         */
        public boolean disableNotification;
        /**
         * Pass true if the message is sent from the background.
         */
        public boolean fromBackground;
        /**
         * Pass true if the content of the message must be protected from forwarding and saving; for bots only.
         */
        public boolean protectContent;
        /**
         * Pass true to allow the message to ignore regular broadcast limits for a small fee; for bots only.
         */
        public boolean allowPaidBroadcast;
        /**
         * The number of Telegram Stars the user agreed to pay to send the messages.
         */
        public long paidMessageStarCount;
        /**
         * Pass true if the user explicitly chosen a sticker or a custom emoji from an installed sticker set; applicable only to sendMessage and sendMessageAlbum.
         */
        public boolean updateOrderOfInstalledStickerSets;
        /**
         * Message scheduling state; pass null to send message immediately. Messages sent to a secret chat, to a chat with paid messages, to a channel direct messages chat, live location messages and self-destructing messages can't be scheduled.
         */
        public MessageSchedulingState schedulingState;
        /**
         * Identifier of the effect to apply to the message; pass 0 if none; applicable only to sendMessage, sendMessageAlbum in private chats and forwardMessages with one message to private chats.
         */
        public long effectId;
        /**
         * Non-persistent identifier, which will be returned back in messageSendingStatePending object and can be used to match sent messages and corresponding updateNewMessage updates.
         */
        public int sendingId;
        /**
         * Pass true to get a fake message instead of actually sending them.
         */
        public boolean onlyPreview;

        /**
         * Options to be used when a message is sent.
         */
        public MessageSendOptions() {
        }

        /**
         * Options to be used when a message is sent.
         *
         * @param suggestedPostInfo Information about the suggested post; pass null if none. For messages to channel direct messages chat only. Applicable only to sendMessage and addOffer.
         * @param disableNotification Pass true to disable notification for the message.
         * @param fromBackground Pass true if the message is sent from the background.
         * @param protectContent Pass true if the content of the message must be protected from forwarding and saving; for bots only.
         * @param allowPaidBroadcast Pass true to allow the message to ignore regular broadcast limits for a small fee; for bots only.
         * @param paidMessageStarCount The number of Telegram Stars the user agreed to pay to send the messages.
         * @param updateOrderOfInstalledStickerSets Pass true if the user explicitly chosen a sticker or a custom emoji from an installed sticker set; applicable only to sendMessage and sendMessageAlbum.
         * @param schedulingState Message scheduling state; pass null to send message immediately. Messages sent to a secret chat, to a chat with paid messages, to a channel direct messages chat, live location messages and self-destructing messages can't be scheduled.
         * @param effectId Identifier of the effect to apply to the message; pass 0 if none; applicable only to sendMessage, sendMessageAlbum in private chats and forwardMessages with one message to private chats.
         * @param sendingId Non-persistent identifier, which will be returned back in messageSendingStatePending object and can be used to match sent messages and corresponding updateNewMessage updates.
         * @param onlyPreview Pass true to get a fake message instead of actually sending them.
         */
        public MessageSendOptions(InputSuggestedPostInfo suggestedPostInfo, boolean disableNotification, boolean fromBackground, boolean protectContent, boolean allowPaidBroadcast, long paidMessageStarCount, boolean updateOrderOfInstalledStickerSets, MessageSchedulingState schedulingState, long effectId, int sendingId, boolean onlyPreview) {
            this.suggestedPostInfo = suggestedPostInfo;
            this.disableNotification = disableNotification;
            this.fromBackground = fromBackground;
            this.protectContent = protectContent;
            this.allowPaidBroadcast = allowPaidBroadcast;
            this.paidMessageStarCount = paidMessageStarCount;
            this.updateOrderOfInstalledStickerSets = updateOrderOfInstalledStickerSets;
            this.schedulingState = schedulingState;
            this.effectId = effectId;
            this.sendingId = sendingId;
            this.onlyPreview = onlyPreview;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1725581906;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains information about the sender of a message.
     */
    public abstract static class MessageSender extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            MessageSenderUser.CONSTRUCTOR,
            MessageSenderChat.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public MessageSender() {
        }
    }

    /**
     * The message was sent by a known user.
     */
    public static class MessageSenderUser extends MessageSender {
        /**
         * Identifier of the user who sent the message.
         */
        public long userId;

        /**
         * The message was sent by a known user.
         */
        public MessageSenderUser() {
        }

        /**
         * The message was sent by a known user.
         *
         * @param userId Identifier of the user who sent the message.
         */
        public MessageSenderUser(long userId) {
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -336109341;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message was sent on behalf of a chat.
     */
    public static class MessageSenderChat extends MessageSender {
        /**
         * Identifier of the chat that sent the message.
         */
        public long chatId;

        /**
         * The message was sent on behalf of a chat.
         */
        public MessageSenderChat() {
        }

        /**
         * The message was sent on behalf of a chat.
         *
         * @param chatId Identifier of the chat that sent the message.
         */
        public MessageSenderChat(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -239660751;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of message senders.
     */
    public static class MessageSenders extends Object {
        /**
         * Approximate total number of message senders found.
         */
        public int totalCount;
        /**
         * List of message senders.
         */
        public MessageSender[] senders;

        /**
         * Represents a list of message senders.
         */
        public MessageSenders() {
        }

        /**
         * Represents a list of message senders.
         *
         * @param totalCount Approximate total number of message senders found.
         * @param senders List of message senders.
         */
        public MessageSenders(int totalCount, MessageSender[] senders) {
            this.totalCount = totalCount;
            this.senders = senders;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -690158467;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains information about the sending state of the message.
     */
    public abstract static class MessageSendingState extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            MessageSendingStatePending.CONSTRUCTOR,
            MessageSendingStateFailed.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public MessageSendingState() {
        }
    }

    /**
     * The message is being sent now, but has not yet been delivered to the server.
     */
    public static class MessageSendingStatePending extends MessageSendingState {
        /**
         * Non-persistent message sending identifier, specified by the application.
         */
        public int sendingId;

        /**
         * The message is being sent now, but has not yet been delivered to the server.
         */
        public MessageSendingStatePending() {
        }

        /**
         * The message is being sent now, but has not yet been delivered to the server.
         *
         * @param sendingId Non-persistent message sending identifier, specified by the application.
         */
        public MessageSendingStatePending(int sendingId) {
            this.sendingId = sendingId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -215260236;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message failed to be sent.
     */
    public static class MessageSendingStateFailed extends MessageSendingState {
        /**
         * The cause of the message sending failure.
         */
        public Error error;
        /**
         * True, if the message can be re-sent using resendMessages or readdQuickReplyShortcutMessages.
         */
        public boolean canRetry;
        /**
         * True, if the message can be re-sent only on behalf of a different sender.
         */
        public boolean needAnotherSender;
        /**
         * True, if the message can be re-sent only if another quote is chosen in the message that is replied by the given message.
         */
        public boolean needAnotherReplyQuote;
        /**
         * True, if the message can be re-sent only if the message to be replied is removed. This will be done automatically by resendMessages.
         */
        public boolean needDropReply;
        /**
         * The number of Telegram Stars that must be paid to send the message; 0 if the current amount is correct.
         */
        public long requiredPaidMessageStarCount;
        /**
         * Time left before the message can be re-sent, in seconds. No update is sent when this field changes.
         */
        public double retryAfter;

        /**
         * The message failed to be sent.
         */
        public MessageSendingStateFailed() {
        }

        /**
         * The message failed to be sent.
         *
         * @param error The cause of the message sending failure.
         * @param canRetry True, if the message can be re-sent using resendMessages or readdQuickReplyShortcutMessages.
         * @param needAnotherSender True, if the message can be re-sent only on behalf of a different sender.
         * @param needAnotherReplyQuote True, if the message can be re-sent only if another quote is chosen in the message that is replied by the given message.
         * @param needDropReply True, if the message can be re-sent only if the message to be replied is removed. This will be done automatically by resendMessages.
         * @param requiredPaidMessageStarCount The number of Telegram Stars that must be paid to send the message; 0 if the current amount is correct.
         * @param retryAfter Time left before the message can be re-sent, in seconds. No update is sent when this field changes.
         */
        public MessageSendingStateFailed(Error error, boolean canRetry, boolean needAnotherSender, boolean needAnotherReplyQuote, boolean needDropReply, long requiredPaidMessageStarCount, double retryAfter) {
            this.error = error;
            this.canRetry = canRetry;
            this.needAnotherSender = needAnotherSender;
            this.needAnotherReplyQuote = needAnotherReplyQuote;
            this.needDropReply = needDropReply;
            this.requiredPaidMessageStarCount = requiredPaidMessageStarCount;
            this.retryAfter = retryAfter;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -777630522;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes source of a message.
     */
    public abstract static class MessageSource extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            MessageSourceChatHistory.CONSTRUCTOR,
            MessageSourceMessageThreadHistory.CONSTRUCTOR,
            MessageSourceForumTopicHistory.CONSTRUCTOR,
            MessageSourceDirectMessagesChatTopicHistory.CONSTRUCTOR,
            MessageSourceHistoryPreview.CONSTRUCTOR,
            MessageSourceChatList.CONSTRUCTOR,
            MessageSourceSearch.CONSTRUCTOR,
            MessageSourceChatEventLog.CONSTRUCTOR,
            MessageSourceNotification.CONSTRUCTOR,
            MessageSourceScreenshot.CONSTRUCTOR,
            MessageSourceOther.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public MessageSource() {
        }
    }

    /**
     * The message is from a chat history.
     */
    public static class MessageSourceChatHistory extends MessageSource {

        /**
         * The message is from a chat history.
         */
        public MessageSourceChatHistory() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1090386116;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message is from history of a message thread.
     */
    public static class MessageSourceMessageThreadHistory extends MessageSource {

        /**
         * The message is from history of a message thread.
         */
        public MessageSourceMessageThreadHistory() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 290427142;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message is from history of a forum topic.
     */
    public static class MessageSourceForumTopicHistory extends MessageSource {

        /**
         * The message is from history of a forum topic.
         */
        public MessageSourceForumTopicHistory() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1518064457;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message is from history of a topic in a channel direct messages chat administered by the current user.
     */
    public static class MessageSourceDirectMessagesChatTopicHistory extends MessageSource {

        /**
         * The message is from history of a topic in a channel direct messages chat administered by the current user.
         */
        public MessageSourceDirectMessagesChatTopicHistory() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1869256503;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message is from chat, message thread or forum topic history preview.
     */
    public static class MessageSourceHistoryPreview extends MessageSource {

        /**
         * The message is from chat, message thread or forum topic history preview.
         */
        public MessageSourceHistoryPreview() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1024254993;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message is from a chat list or a forum topic list.
     */
    public static class MessageSourceChatList extends MessageSource {

        /**
         * The message is from a chat list or a forum topic list.
         */
        public MessageSourceChatList() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2047406102;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message is from search results, including file downloads, local file list, outgoing document messages, calendar.
     */
    public static class MessageSourceSearch extends MessageSource {

        /**
         * The message is from search results, including file downloads, local file list, outgoing document messages, calendar.
         */
        public MessageSourceSearch() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1921333105;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message is from a chat event log.
     */
    public static class MessageSourceChatEventLog extends MessageSource {

        /**
         * The message is from a chat event log.
         */
        public MessageSourceChatEventLog() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1028777540;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message is from a notification.
     */
    public static class MessageSourceNotification extends MessageSource {

        /**
         * The message is from a notification.
         */
        public MessageSourceNotification() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1046406163;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message was screenshotted; the source must be used only if the message content was visible during the screenshot.
     */
    public static class MessageSourceScreenshot extends MessageSource {

        /**
         * The message was screenshotted; the source must be used only if the message content was visible during the screenshot.
         */
        public MessageSourceScreenshot() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 469982474;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message is from some other source.
     */
    public static class MessageSourceOther extends MessageSource {

        /**
         * The message is from some other source.
         */
        public MessageSourceOther() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 901818114;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A detailed statistics about a message.
     */
    public static class MessageStatistics extends Object {
        /**
         * A graph containing number of message views and shares.
         */
        public StatisticalGraph messageInteractionGraph;
        /**
         * A graph containing number of message reactions.
         */
        public StatisticalGraph messageReactionGraph;

        /**
         * A detailed statistics about a message.
         */
        public MessageStatistics() {
        }

        /**
         * A detailed statistics about a message.
         *
         * @param messageInteractionGraph A graph containing number of message views and shares.
         * @param messageReactionGraph A graph containing number of message reactions.
         */
        public MessageStatistics(StatisticalGraph messageInteractionGraph, StatisticalGraph messageReactionGraph) {
            this.messageInteractionGraph = messageInteractionGraph;
            this.messageReactionGraph = messageReactionGraph;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1563537657;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a message thread.
     */
    public static class MessageThreadInfo extends Object {
        /**
         * Identifier of the chat to which the message thread belongs.
         */
        public long chatId;
        /**
         * Message thread identifier, unique within the chat.
         */
        public long messageThreadId;
        /**
         * Information about the message thread; may be null for forum topic threads.
         */
        @Nullable public MessageReplyInfo replyInfo;
        /**
         * Approximate number of unread messages in the message thread.
         */
        public int unreadMessageCount;
        /**
         * The messages from which the thread starts. The messages are returned in reverse chronological order (i.e., in order of decreasing messageId).
         */
        public Message[] messages;
        /**
         * A draft of a message in the message thread; may be null if none.
         */
        @Nullable public DraftMessage draftMessage;

        /**
         * Contains information about a message thread.
         */
        public MessageThreadInfo() {
        }

        /**
         * Contains information about a message thread.
         *
         * @param chatId Identifier of the chat to which the message thread belongs.
         * @param messageThreadId Message thread identifier, unique within the chat.
         * @param replyInfo Information about the message thread; may be null for forum topic threads.
         * @param unreadMessageCount Approximate number of unread messages in the message thread.
         * @param messages The messages from which the thread starts. The messages are returned in reverse chronological order (i.e., in order of decreasing messageId).
         * @param draftMessage A draft of a message in the message thread; may be null if none.
         */
        public MessageThreadInfo(long chatId, long messageThreadId, MessageReplyInfo replyInfo, int unreadMessageCount, Message[] messages, DraftMessage draftMessage) {
            this.chatId = chatId;
            this.messageThreadId = messageThreadId;
            this.replyInfo = replyInfo;
            this.unreadMessageCount = unreadMessageCount;
            this.messages = messages;
            this.draftMessage = draftMessage;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -248536056;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a topic of messages in a chat.
     */
    public abstract static class MessageTopic extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            MessageTopicThread.CONSTRUCTOR,
            MessageTopicForum.CONSTRUCTOR,
            MessageTopicDirectMessages.CONSTRUCTOR,
            MessageTopicSavedMessages.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public MessageTopic() {
        }
    }

    /**
     * A topic in a non-forum supergroup chat.
     */
    public static class MessageTopicThread extends MessageTopic {
        /**
         * Unique identifier of the message thread.
         */
        public long messageThreadId;

        /**
         * A topic in a non-forum supergroup chat.
         */
        public MessageTopicThread() {
        }

        /**
         * A topic in a non-forum supergroup chat.
         *
         * @param messageThreadId Unique identifier of the message thread.
         */
        public MessageTopicThread(long messageThreadId) {
            this.messageThreadId = messageThreadId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1360920071;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A topic in a forum supergroup chat or a chat with a bot.
     */
    public static class MessageTopicForum extends MessageTopic {
        /**
         * Unique identifier of the forum topic.
         */
        public int forumTopicId;

        /**
         * A topic in a forum supergroup chat or a chat with a bot.
         */
        public MessageTopicForum() {
        }

        /**
         * A topic in a forum supergroup chat or a chat with a bot.
         *
         * @param forumTopicId Unique identifier of the forum topic.
         */
        public MessageTopicForum(int forumTopicId) {
            this.forumTopicId = forumTopicId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2119440112;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A topic in a channel direct messages chat administered by the current user.
     */
    public static class MessageTopicDirectMessages extends MessageTopic {
        /**
         * Unique identifier of the topic.
         */
        public long directMessagesChatTopicId;

        /**
         * A topic in a channel direct messages chat administered by the current user.
         */
        public MessageTopicDirectMessages() {
        }

        /**
         * A topic in a channel direct messages chat administered by the current user.
         *
         * @param directMessagesChatTopicId Unique identifier of the topic.
         */
        public MessageTopicDirectMessages(long directMessagesChatTopicId) {
            this.directMessagesChatTopicId = directMessagesChatTopicId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1285378599;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A topic in Saved Messages chat.
     */
    public static class MessageTopicSavedMessages extends MessageTopic {
        /**
         * Unique identifier of the Saved Messages topic.
         */
        public long savedMessagesTopicId;

        /**
         * A topic in Saved Messages chat.
         */
        public MessageTopicSavedMessages() {
        }

        /**
         * A topic in Saved Messages chat.
         *
         * @param savedMessagesTopicId Unique identifier of the Saved Messages topic.
         */
        public MessageTopicSavedMessages(long savedMessagesTopicId) {
            this.savedMessagesTopicId = savedMessagesTopicId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 588026991;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a viewer of a message.
     */
    public static class MessageViewer extends Object {
        /**
         * User identifier of the viewer.
         */
        public long userId;
        /**
         * Approximate point in time (Unix timestamp) when the message was viewed.
         */
        public int viewDate;

        /**
         * Represents a viewer of a message.
         */
        public MessageViewer() {
        }

        /**
         * Represents a viewer of a message.
         *
         * @param userId User identifier of the viewer.
         * @param viewDate Approximate point in time (Unix timestamp) when the message was viewed.
         */
        public MessageViewer(long userId, int viewDate) {
            this.userId = userId;
            this.viewDate = viewDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1458639309;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of message viewers.
     */
    public static class MessageViewers extends Object {
        /**
         * List of message viewers.
         */
        public MessageViewer[] viewers;

        /**
         * Represents a list of message viewers.
         */
        public MessageViewers() {
        }

        /**
         * Represents a list of message viewers.
         *
         * @param viewers List of message viewers.
         */
        public MessageViewers(MessageViewer[] viewers) {
            this.viewers = viewers;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2116480287;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of messages.
     */
    public static class Messages extends Object {
        /**
         * Approximate total number of messages found.
         */
        public int totalCount;
        /**
         * List of messages; messages may be null.
         */
        public Message[] messages;

        /**
         * Contains a list of messages.
         */
        public Messages() {
        }

        /**
         * Contains a list of messages.
         *
         * @param totalCount Approximate total number of messages found.
         * @param messages List of messages; messages may be null.
         */
        public Messages(int totalCount, Message[] messages) {
            this.totalCount = totalCount;
            this.messages = messages;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -16498159;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Thumbnail image of a very poor quality and low resolution.
     */
    public static class Minithumbnail extends Object {
        /**
         * Thumbnail width, usually doesn't exceed 40.
         */
        public int width;
        /**
         * Thumbnail height, usually doesn't exceed 40.
         */
        public int height;
        /**
         * The thumbnail in JPEG format.
         */
        public byte[] data;

        /**
         * Thumbnail image of a very poor quality and low resolution.
         */
        public Minithumbnail() {
        }

        /**
         * Thumbnail image of a very poor quality and low resolution.
         *
         * @param width Thumbnail width, usually doesn't exceed 40.
         * @param height Thumbnail height, usually doesn't exceed 40.
         * @param data The thumbnail in JPEG format.
         */
        public Minithumbnail(int width, int height, byte[] data) {
            this.width = width;
            this.height = height;
            this.data = data;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -328540758;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A full list of available network statistic entries.
     */
    public static class NetworkStatistics extends Object {
        /**
         * Point in time (Unix timestamp) from which the statistics are collected.
         */
        public int sinceDate;
        /**
         * Network statistics entries.
         */
        public NetworkStatisticsEntry[] entries;

        /**
         * A full list of available network statistic entries.
         */
        public NetworkStatistics() {
        }

        /**
         * A full list of available network statistic entries.
         *
         * @param sinceDate Point in time (Unix timestamp) from which the statistics are collected.
         * @param entries Network statistics entries.
         */
        public NetworkStatistics(int sinceDate, NetworkStatisticsEntry[] entries) {
            this.sinceDate = sinceDate;
            this.entries = entries;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1615554212;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains statistics about network usage.
     */
    public abstract static class NetworkStatisticsEntry extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            NetworkStatisticsEntryFile.CONSTRUCTOR,
            NetworkStatisticsEntryCall.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public NetworkStatisticsEntry() {
        }
    }

    /**
     * Contains information about the total amount of data that was used to send and receive files.
     */
    public static class NetworkStatisticsEntryFile extends NetworkStatisticsEntry {
        /**
         * Type of the file the data is part of; pass null if the data isn't related to files.
         */
        public FileType fileType;
        /**
         * Type of the network the data was sent through. Call setNetworkType to maintain the actual network type.
         */
        public NetworkType networkType;
        /**
         * Total number of bytes sent.
         */
        public long sentBytes;
        /**
         * Total number of bytes received.
         */
        public long receivedBytes;

        /**
         * Contains information about the total amount of data that was used to send and receive files.
         */
        public NetworkStatisticsEntryFile() {
        }

        /**
         * Contains information about the total amount of data that was used to send and receive files.
         *
         * @param fileType Type of the file the data is part of; pass null if the data isn't related to files.
         * @param networkType Type of the network the data was sent through. Call setNetworkType to maintain the actual network type.
         * @param sentBytes Total number of bytes sent.
         * @param receivedBytes Total number of bytes received.
         */
        public NetworkStatisticsEntryFile(FileType fileType, NetworkType networkType, long sentBytes, long receivedBytes) {
            this.fileType = fileType;
            this.networkType = networkType;
            this.sentBytes = sentBytes;
            this.receivedBytes = receivedBytes;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 188452706;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about the total amount of data that was used for calls.
     */
    public static class NetworkStatisticsEntryCall extends NetworkStatisticsEntry {
        /**
         * Type of the network the data was sent through. Call setNetworkType to maintain the actual network type.
         */
        public NetworkType networkType;
        /**
         * Total number of bytes sent.
         */
        public long sentBytes;
        /**
         * Total number of bytes received.
         */
        public long receivedBytes;
        /**
         * Total call duration, in seconds.
         */
        public double duration;

        /**
         * Contains information about the total amount of data that was used for calls.
         */
        public NetworkStatisticsEntryCall() {
        }

        /**
         * Contains information about the total amount of data that was used for calls.
         *
         * @param networkType Type of the network the data was sent through. Call setNetworkType to maintain the actual network type.
         * @param sentBytes Total number of bytes sent.
         * @param receivedBytes Total number of bytes received.
         * @param duration Total call duration, in seconds.
         */
        public NetworkStatisticsEntryCall(NetworkType networkType, long sentBytes, long receivedBytes, double duration) {
            this.networkType = networkType;
            this.sentBytes = sentBytes;
            this.receivedBytes = receivedBytes;
            this.duration = duration;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 737000365;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents the type of network.
     */
    public abstract static class NetworkType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            NetworkTypeNone.CONSTRUCTOR,
            NetworkTypeMobile.CONSTRUCTOR,
            NetworkTypeMobileRoaming.CONSTRUCTOR,
            NetworkTypeWiFi.CONSTRUCTOR,
            NetworkTypeOther.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public NetworkType() {
        }
    }

    /**
     * The network is not available.
     */
    public static class NetworkTypeNone extends NetworkType {

        /**
         * The network is not available.
         */
        public NetworkTypeNone() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1971691759;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A mobile network.
     */
    public static class NetworkTypeMobile extends NetworkType {

        /**
         * A mobile network.
         */
        public NetworkTypeMobile() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 819228239;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A mobile roaming network.
     */
    public static class NetworkTypeMobileRoaming extends NetworkType {

        /**
         * A mobile roaming network.
         */
        public NetworkTypeMobileRoaming() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1435199760;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Wi-Fi network.
     */
    public static class NetworkTypeWiFi extends NetworkType {

        /**
         * A Wi-Fi network.
         */
        public NetworkTypeWiFi() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -633872070;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A different network type (e.g., Ethernet network).
     */
    public static class NetworkTypeOther extends NetworkType {

        /**
         * A different network type (e.g., Ethernet network).
         */
        public NetworkTypeOther() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1942128539;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains privacy settings for chats with non-contacts.
     */
    public static class NewChatPrivacySettings extends Object {
        /**
         * True, if non-contacts users are able to write first to the current user. Telegram Premium subscribers are able to write first regardless of this setting.
         */
        public boolean allowNewChatsFromUnknownUsers;
        /**
         * Number of Telegram Stars that must be paid for every incoming private message by non-contacts; 0-getOption(&quot;paid_message_star_count_max&quot;). If positive, then allowNewChatsFromUnknownUsers must be true. The current user will receive getOption(&quot;paid_message_earnings_per_mille&quot;) Telegram Stars for each 1000 Telegram Stars paid for message sending. Can be positive, only if getOption(&quot;can_enable_paid_messages&quot;) is true.
         */
        public long incomingPaidMessageStarCount;

        /**
         * Contains privacy settings for chats with non-contacts.
         */
        public NewChatPrivacySettings() {
        }

        /**
         * Contains privacy settings for chats with non-contacts.
         *
         * @param allowNewChatsFromUnknownUsers True, if non-contacts users are able to write first to the current user. Telegram Premium subscribers are able to write first regardless of this setting.
         * @param incomingPaidMessageStarCount Number of Telegram Stars that must be paid for every incoming private message by non-contacts; 0-getOption(&quot;paid_message_star_count_max&quot;). If positive, then allowNewChatsFromUnknownUsers must be true. The current user will receive getOption(&quot;paid_message_earnings_per_mille&quot;) Telegram Stars for each 1000 Telegram Stars paid for message sending. Can be positive, only if getOption(&quot;can_enable_paid_messages&quot;) is true.
         */
        public NewChatPrivacySettings(boolean allowNewChatsFromUnknownUsers, long incomingPaidMessageStarCount) {
            this.allowNewChatsFromUnknownUsers = allowNewChatsFromUnknownUsers;
            this.incomingPaidMessageStarCount = incomingPaidMessageStarCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 123716192;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a notification.
     */
    public static class Notification extends Object {
        /**
         * Unique persistent identifier of this notification.
         */
        public int id;
        /**
         * Notification date.
         */
        public int date;
        /**
         * True, if the notification was explicitly sent without sound.
         */
        public boolean isSilent;
        /**
         * Notification type.
         */
        public NotificationType type;

        /**
         * Contains information about a notification.
         */
        public Notification() {
        }

        /**
         * Contains information about a notification.
         *
         * @param id Unique persistent identifier of this notification.
         * @param date Notification date.
         * @param isSilent True, if the notification was explicitly sent without sound.
         * @param type Notification type.
         */
        public Notification(int id, int date, boolean isSilent, NotificationType type) {
            this.id = id;
            this.date = date;
            this.isSilent = isSilent;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 788743120;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a group of notifications.
     */
    public static class NotificationGroup extends Object {
        /**
         * Unique persistent auto-incremented from 1 identifier of the notification group.
         */
        public int id;
        /**
         * Type of the group.
         */
        public NotificationGroupType type;
        /**
         * Identifier of a chat to which all notifications in the group belong.
         */
        public long chatId;
        /**
         * Total number of active notifications in the group.
         */
        public int totalCount;
        /**
         * The list of active notifications.
         */
        public Notification[] notifications;

        /**
         * Describes a group of notifications.
         */
        public NotificationGroup() {
        }

        /**
         * Describes a group of notifications.
         *
         * @param id Unique persistent auto-incremented from 1 identifier of the notification group.
         * @param type Type of the group.
         * @param chatId Identifier of a chat to which all notifications in the group belong.
         * @param totalCount Total number of active notifications in the group.
         * @param notifications The list of active notifications.
         */
        public NotificationGroup(int id, NotificationGroupType type, long chatId, int totalCount, Notification[] notifications) {
            this.id = id;
            this.type = type;
            this.chatId = chatId;
            this.totalCount = totalCount;
            this.notifications = notifications;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 780691541;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the type of notifications in a notification group.
     */
    public abstract static class NotificationGroupType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            NotificationGroupTypeMessages.CONSTRUCTOR,
            NotificationGroupTypeMentions.CONSTRUCTOR,
            NotificationGroupTypeSecretChat.CONSTRUCTOR,
            NotificationGroupTypeCalls.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public NotificationGroupType() {
        }
    }

    /**
     * A group containing notifications of type notificationTypeNewMessage and notificationTypeNewPushMessage with ordinary unread messages.
     */
    public static class NotificationGroupTypeMessages extends NotificationGroupType {

        /**
         * A group containing notifications of type notificationTypeNewMessage and notificationTypeNewPushMessage with ordinary unread messages.
         */
        public NotificationGroupTypeMessages() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1702481123;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A group containing notifications of type notificationTypeNewMessage and notificationTypeNewPushMessage with unread mentions of the current user, replies to their messages, or a pinned message.
     */
    public static class NotificationGroupTypeMentions extends NotificationGroupType {

        /**
         * A group containing notifications of type notificationTypeNewMessage and notificationTypeNewPushMessage with unread mentions of the current user, replies to their messages, or a pinned message.
         */
        public NotificationGroupTypeMentions() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2050324051;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A group containing a notification of type notificationTypeNewSecretChat.
     */
    public static class NotificationGroupTypeSecretChat extends NotificationGroupType {

        /**
         * A group containing a notification of type notificationTypeNewSecretChat.
         */
        public NotificationGroupTypeSecretChat() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1390759476;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A group containing notifications of type notificationTypeNewCall.
     */
    public static class NotificationGroupTypeCalls extends NotificationGroupType {

        /**
         * A group containing notifications of type notificationTypeNewCall.
         */
        public NotificationGroupTypeCalls() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1379123538;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the types of chats to which notification settings are relevant.
     */
    public abstract static class NotificationSettingsScope extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            NotificationSettingsScopePrivateChats.CONSTRUCTOR,
            NotificationSettingsScopeGroupChats.CONSTRUCTOR,
            NotificationSettingsScopeChannelChats.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public NotificationSettingsScope() {
        }
    }

    /**
     * Notification settings applied to all private and secret chats when the corresponding chat setting has a default value.
     */
    public static class NotificationSettingsScopePrivateChats extends NotificationSettingsScope {

        /**
         * Notification settings applied to all private and secret chats when the corresponding chat setting has a default value.
         */
        public NotificationSettingsScopePrivateChats() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 937446759;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Notification settings applied to all basic group and supergroup chats when the corresponding chat setting has a default value.
     */
    public static class NotificationSettingsScopeGroupChats extends NotificationSettingsScope {

        /**
         * Notification settings applied to all basic group and supergroup chats when the corresponding chat setting has a default value.
         */
        public NotificationSettingsScopeGroupChats() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1212142067;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Notification settings applied to all channel chats when the corresponding chat setting has a default value.
     */
    public static class NotificationSettingsScopeChannelChats extends NotificationSettingsScope {

        /**
         * Notification settings applied to all channel chats when the corresponding chat setting has a default value.
         */
        public NotificationSettingsScopeChannelChats() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 548013448;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a notification sound in MP3 format.
     */
    public static class NotificationSound extends Object {
        /**
         * Unique identifier of the notification sound.
         */
        public long id;
        /**
         * Duration of the sound, in seconds.
         */
        public int duration;
        /**
         * Point in time (Unix timestamp) when the sound was created.
         */
        public int date;
        /**
         * Title of the notification sound.
         */
        public String title;
        /**
         * Arbitrary data, defined while the sound was uploaded.
         */
        public String data;
        /**
         * File containing the sound.
         */
        public File sound;

        /**
         * Describes a notification sound in MP3 format.
         */
        public NotificationSound() {
        }

        /**
         * Describes a notification sound in MP3 format.
         *
         * @param id Unique identifier of the notification sound.
         * @param duration Duration of the sound, in seconds.
         * @param date Point in time (Unix timestamp) when the sound was created.
         * @param title Title of the notification sound.
         * @param data Arbitrary data, defined while the sound was uploaded.
         * @param sound File containing the sound.
         */
        public NotificationSound(long id, int duration, int date, String title, String data, File sound) {
            this.id = id;
            this.duration = duration;
            this.date = date;
            this.title = title;
            this.data = data;
            this.sound = sound;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -185638601;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of notification sounds.
     */
    public static class NotificationSounds extends Object {
        /**
         * A list of notification sounds.
         */
        public NotificationSound[] notificationSounds;

        /**
         * Contains a list of notification sounds.
         */
        public NotificationSounds() {
        }

        /**
         * Contains a list of notification sounds.
         *
         * @param notificationSounds A list of notification sounds.
         */
        public NotificationSounds(NotificationSound[] notificationSounds) {
            this.notificationSounds = notificationSounds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -630813169;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains detailed information about a notification.
     */
    public abstract static class NotificationType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            NotificationTypeNewMessage.CONSTRUCTOR,
            NotificationTypeNewSecretChat.CONSTRUCTOR,
            NotificationTypeNewCall.CONSTRUCTOR,
            NotificationTypeNewPushMessage.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public NotificationType() {
        }
    }

    /**
     * New message was received.
     */
    public static class NotificationTypeNewMessage extends NotificationType {
        /**
         * The message.
         */
        public Message message;
        /**
         * True, if message content must be displayed in notifications.
         */
        public boolean showPreview;

        /**
         * New message was received.
         */
        public NotificationTypeNewMessage() {
        }

        /**
         * New message was received.
         *
         * @param message The message.
         * @param showPreview True, if message content must be displayed in notifications.
         */
        public NotificationTypeNewMessage(Message message, boolean showPreview) {
            this.message = message;
            this.showPreview = showPreview;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -254745614;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * New secret chat was created.
     */
    public static class NotificationTypeNewSecretChat extends NotificationType {

        /**
         * New secret chat was created.
         */
        public NotificationTypeNewSecretChat() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1198638768;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * New call was received.
     */
    public static class NotificationTypeNewCall extends NotificationType {
        /**
         * Call identifier.
         */
        public int callId;

        /**
         * New call was received.
         */
        public NotificationTypeNewCall() {
        }

        /**
         * New call was received.
         *
         * @param callId Call identifier.
         */
        public NotificationTypeNewCall(int callId) {
            this.callId = callId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1712734585;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * New message was received through a push notification.
     */
    public static class NotificationTypeNewPushMessage extends NotificationType {
        /**
         * The message identifier. The message will not be available in the chat history, but the identifier can be used in viewMessages, or as a message to be replied in the same chat.
         */
        public long messageId;
        /**
         * Identifier of the sender of the message. Corresponding user or chat may be inaccessible.
         */
        public MessageSender senderId;
        /**
         * Name of the sender.
         */
        public String senderName;
        /**
         * True, if the message is outgoing.
         */
        public boolean isOutgoing;
        /**
         * Push message content.
         */
        public PushMessageContent content;

        /**
         * New message was received through a push notification.
         */
        public NotificationTypeNewPushMessage() {
        }

        /**
         * New message was received through a push notification.
         *
         * @param messageId The message identifier. The message will not be available in the chat history, but the identifier can be used in viewMessages, or as a message to be replied in the same chat.
         * @param senderId Identifier of the sender of the message. Corresponding user or chat may be inaccessible.
         * @param senderName Name of the sender.
         * @param isOutgoing True, if the message is outgoing.
         * @param content Push message content.
         */
        public NotificationTypeNewPushMessage(long messageId, MessageSender senderId, String senderName, boolean isOutgoing, PushMessageContent content) {
            this.messageId = messageId;
            this.senderId = senderId;
            this.senderName = senderName;
            this.isOutgoing = isOutgoing;
            this.content = content;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -711680462;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Information about the OAuth authorization.
     */
    public static class OauthLinkInfo extends Object {
        /**
         * Identifier of the user for which the link was generated; may be 0 if unknown. The corresponding user may be unknown. If the user is logged in the application, then they must be chosen for authorization by default.
         */
        public long userId;
        /**
         * An HTTP URL where the user authorizes.
         */
        public String url;
        /**
         * A domain of the URL.
         */
        public String domain;
        /**
         * True, if the authorization originates from an application.
         */
        public boolean fromApp;
        /**
         * Verified name of the application; if empty, then &quot;Unverified App&quot; must be shown instead.
         */
        public String verifiedAppName;
        /**
         * User identifier of a bot linked with the website.
         */
        public long botUserId;
        /**
         * True, if the user must be asked for the permission to the bot to send them messages.
         */
        public boolean requestWriteAccess;
        /**
         * True, if the user must be asked for the permission to share their phone number.
         */
        public boolean requestPhoneNumberAccess;
        /**
         * The version of a browser used for the authorization.
         */
        public String browser;
        /**
         * Operating system the browser is running on.
         */
        public String platform;
        /**
         * IP address from which the authorization is performed, in human-readable format.
         */
        public String ipAddress;
        /**
         * Human-readable description of a country and a region from which the authorization is performed, based on the IP address.
         */
        public String location;
        /**
         * True, if code matching dialog must be shown first and checkOauthRequestMatchCode must be called before acceptOauthRequest. Otherwise, checkOauthRequestMatchCode must not be called.
         */
        public boolean matchCodeFirst;
        /**
         * The list of codes to match; may be empty if irrelevant.
         */
        public String[] matchCodes;

        /**
         * Information about the OAuth authorization.
         */
        public OauthLinkInfo() {
        }

        /**
         * Information about the OAuth authorization.
         *
         * @param userId Identifier of the user for which the link was generated; may be 0 if unknown. The corresponding user may be unknown. If the user is logged in the application, then they must be chosen for authorization by default.
         * @param url An HTTP URL where the user authorizes.
         * @param domain A domain of the URL.
         * @param fromApp True, if the authorization originates from an application.
         * @param verifiedAppName Verified name of the application; if empty, then &quot;Unverified App&quot; must be shown instead.
         * @param botUserId User identifier of a bot linked with the website.
         * @param requestWriteAccess True, if the user must be asked for the permission to the bot to send them messages.
         * @param requestPhoneNumberAccess True, if the user must be asked for the permission to share their phone number.
         * @param browser The version of a browser used for the authorization.
         * @param platform Operating system the browser is running on.
         * @param ipAddress IP address from which the authorization is performed, in human-readable format.
         * @param location Human-readable description of a country and a region from which the authorization is performed, based on the IP address.
         * @param matchCodeFirst True, if code matching dialog must be shown first and checkOauthRequestMatchCode must be called before acceptOauthRequest. Otherwise, checkOauthRequestMatchCode must not be called.
         * @param matchCodes The list of codes to match; may be empty if irrelevant.
         */
        public OauthLinkInfo(long userId, String url, String domain, boolean fromApp, String verifiedAppName, long botUserId, boolean requestWriteAccess, boolean requestPhoneNumberAccess, String browser, String platform, String ipAddress, String location, boolean matchCodeFirst, String[] matchCodes) {
            this.userId = userId;
            this.url = url;
            this.domain = domain;
            this.fromApp = fromApp;
            this.verifiedAppName = verifiedAppName;
            this.botUserId = botUserId;
            this.requestWriteAccess = requestWriteAccess;
            this.requestPhoneNumberAccess = requestPhoneNumberAccess;
            this.browser = browser;
            this.platform = platform;
            this.ipAddress = ipAddress;
            this.location = location;
            this.matchCodeFirst = matchCodeFirst;
            this.matchCodes = matchCodes;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -908945202;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An object of this type is returned on a successful function call for certain functions.
     */
    public static class Ok extends Object {

        /**
         * An object of this type is returned on a successful function call for certain functions.
         */
        public Ok() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -722616727;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents the value of an option.
     */
    public abstract static class OptionValue extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            OptionValueBoolean.CONSTRUCTOR,
            OptionValueEmpty.CONSTRUCTOR,
            OptionValueInteger.CONSTRUCTOR,
            OptionValueString.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public OptionValue() {
        }
    }

    /**
     * Represents a boolean option.
     */
    public static class OptionValueBoolean extends OptionValue {
        /**
         * The value of the option.
         */
        public boolean value;

        /**
         * Represents a boolean option.
         */
        public OptionValueBoolean() {
        }

        /**
         * Represents a boolean option.
         *
         * @param value The value of the option.
         */
        public OptionValueBoolean(boolean value) {
            this.value = value;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 63135518;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents an unknown option or an option which has a default value.
     */
    public static class OptionValueEmpty extends OptionValue {

        /**
         * Represents an unknown option or an option which has a default value.
         */
        public OptionValueEmpty() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 918955155;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents an integer option.
     */
    public static class OptionValueInteger extends OptionValue {
        /**
         * The value of the option.
         */
        public long value;

        /**
         * Represents an integer option.
         */
        public OptionValueInteger() {
        }

        /**
         * Represents an integer option.
         *
         * @param value The value of the option.
         */
        public OptionValueInteger(long value) {
            this.value = value;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -186858780;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a string option.
     */
    public static class OptionValueString extends OptionValue {
        /**
         * The value of the option.
         */
        public String value;

        /**
         * Represents a string option.
         */
        public OptionValueString() {
        }

        /**
         * Represents a string option.
         *
         * @param value The value of the option.
         */
        public OptionValueString(String value) {
            this.value = value;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 756248212;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Order information.
     */
    public static class OrderInfo extends Object {
        /**
         * Name of the user.
         */
        public String name;
        /**
         * Phone number of the user.
         */
        public String phoneNumber;
        /**
         * Email address of the user.
         */
        public String emailAddress;
        /**
         * Shipping address for this order; may be null.
         */
        @Nullable public Address shippingAddress;

        /**
         * Order information.
         */
        public OrderInfo() {
        }

        /**
         * Order information.
         *
         * @param name Name of the user.
         * @param phoneNumber Phone number of the user.
         * @param emailAddress Email address of the user.
         * @param shippingAddress Shipping address for this order; may be null.
         */
        public OrderInfo(String name, String phoneNumber, String emailAddress, Address shippingAddress) {
            this.name = name;
            this.phoneNumber = phoneNumber;
            this.emailAddress = emailAddress;
            this.shippingAddress = shippingAddress;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 783997294;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents outline of an image.
     */
    public static class Outline extends Object {
        /**
         * The list of closed vector paths.
         */
        public ClosedVectorPath[] paths;

        /**
         * Represents outline of an image.
         */
        public Outline() {
        }

        /**
         * Represents outline of an image.
         *
         * @param paths The list of closed vector paths.
         */
        public Outline(ClosedVectorPath[] paths) {
            this.paths = paths;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -161506702;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a block of an instant view for a web page.
     */
    public abstract static class PageBlock extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            PageBlockTitle.CONSTRUCTOR,
            PageBlockSubtitle.CONSTRUCTOR,
            PageBlockAuthorDate.CONSTRUCTOR,
            PageBlockHeader.CONSTRUCTOR,
            PageBlockSubheader.CONSTRUCTOR,
            PageBlockKicker.CONSTRUCTOR,
            PageBlockParagraph.CONSTRUCTOR,
            PageBlockPreformatted.CONSTRUCTOR,
            PageBlockFooter.CONSTRUCTOR,
            PageBlockDivider.CONSTRUCTOR,
            PageBlockAnchor.CONSTRUCTOR,
            PageBlockList.CONSTRUCTOR,
            PageBlockBlockQuote.CONSTRUCTOR,
            PageBlockPullQuote.CONSTRUCTOR,
            PageBlockAnimation.CONSTRUCTOR,
            PageBlockAudio.CONSTRUCTOR,
            PageBlockPhoto.CONSTRUCTOR,
            PageBlockVideo.CONSTRUCTOR,
            PageBlockVoiceNote.CONSTRUCTOR,
            PageBlockCover.CONSTRUCTOR,
            PageBlockEmbedded.CONSTRUCTOR,
            PageBlockEmbeddedPost.CONSTRUCTOR,
            PageBlockCollage.CONSTRUCTOR,
            PageBlockSlideshow.CONSTRUCTOR,
            PageBlockChatLink.CONSTRUCTOR,
            PageBlockTable.CONSTRUCTOR,
            PageBlockDetails.CONSTRUCTOR,
            PageBlockRelatedArticles.CONSTRUCTOR,
            PageBlockMap.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public PageBlock() {
        }
    }

    /**
     * The title of a page.
     */
    public static class PageBlockTitle extends PageBlock {
        /**
         * Title.
         */
        public RichText title;

        /**
         * The title of a page.
         */
        public PageBlockTitle() {
        }

        /**
         * The title of a page.
         *
         * @param title Title.
         */
        public PageBlockTitle(RichText title) {
            this.title = title;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1629664784;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The subtitle of a page.
     */
    public static class PageBlockSubtitle extends PageBlock {
        /**
         * Subtitle.
         */
        public RichText subtitle;

        /**
         * The subtitle of a page.
         */
        public PageBlockSubtitle() {
        }

        /**
         * The subtitle of a page.
         *
         * @param subtitle Subtitle.
         */
        public PageBlockSubtitle(RichText subtitle) {
            this.subtitle = subtitle;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 264524263;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The author and publishing date of a page.
     */
    public static class PageBlockAuthorDate extends PageBlock {
        /**
         * Author.
         */
        public RichText author;
        /**
         * Point in time (Unix timestamp) when the article was published; 0 if unknown.
         */
        public int publishDate;

        /**
         * The author and publishing date of a page.
         */
        public PageBlockAuthorDate() {
        }

        /**
         * The author and publishing date of a page.
         *
         * @param author Author.
         * @param publishDate Point in time (Unix timestamp) when the article was published; 0 if unknown.
         */
        public PageBlockAuthorDate(RichText author, int publishDate) {
            this.author = author;
            this.publishDate = publishDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1300231184;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A header.
     */
    public static class PageBlockHeader extends PageBlock {
        /**
         * Header.
         */
        public RichText header;

        /**
         * A header.
         */
        public PageBlockHeader() {
        }

        /**
         * A header.
         *
         * @param header Header.
         */
        public PageBlockHeader(RichText header) {
            this.header = header;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1402854811;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A subheader.
     */
    public static class PageBlockSubheader extends PageBlock {
        /**
         * Subheader.
         */
        public RichText subheader;

        /**
         * A subheader.
         */
        public PageBlockSubheader() {
        }

        /**
         * A subheader.
         *
         * @param subheader Subheader.
         */
        public PageBlockSubheader(RichText subheader) {
            this.subheader = subheader;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1263956774;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A kicker.
     */
    public static class PageBlockKicker extends PageBlock {
        /**
         * Kicker.
         */
        public RichText kicker;

        /**
         * A kicker.
         */
        public PageBlockKicker() {
        }

        /**
         * A kicker.
         *
         * @param kicker Kicker.
         */
        public PageBlockKicker(RichText kicker) {
            this.kicker = kicker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1361282635;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A text paragraph.
     */
    public static class PageBlockParagraph extends PageBlock {
        /**
         * Paragraph text.
         */
        public RichText text;

        /**
         * A text paragraph.
         */
        public PageBlockParagraph() {
        }

        /**
         * A text paragraph.
         *
         * @param text Paragraph text.
         */
        public PageBlockParagraph(RichText text) {
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1182402406;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A preformatted text paragraph.
     */
    public static class PageBlockPreformatted extends PageBlock {
        /**
         * Paragraph text.
         */
        public RichText text;
        /**
         * Programming language for which the text needs to be formatted.
         */
        public String language;

        /**
         * A preformatted text paragraph.
         */
        public PageBlockPreformatted() {
        }

        /**
         * A preformatted text paragraph.
         *
         * @param text Paragraph text.
         * @param language Programming language for which the text needs to be formatted.
         */
        public PageBlockPreformatted(RichText text, String language) {
            this.text = text;
            this.language = language;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1066346178;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The footer of a page.
     */
    public static class PageBlockFooter extends PageBlock {
        /**
         * Footer.
         */
        public RichText footer;

        /**
         * The footer of a page.
         */
        public PageBlockFooter() {
        }

        /**
         * The footer of a page.
         *
         * @param footer Footer.
         */
        public PageBlockFooter(RichText footer) {
            this.footer = footer;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 886429480;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An empty block separating a page.
     */
    public static class PageBlockDivider extends PageBlock {

        /**
         * An empty block separating a page.
         */
        public PageBlockDivider() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -618614392;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An invisible anchor on a page, which can be used in a URL to open the page from the specified anchor.
     */
    public static class PageBlockAnchor extends PageBlock {
        /**
         * Name of the anchor.
         */
        public String name;

        /**
         * An invisible anchor on a page, which can be used in a URL to open the page from the specified anchor.
         */
        public PageBlockAnchor() {
        }

        /**
         * An invisible anchor on a page, which can be used in a URL to open the page from the specified anchor.
         *
         * @param name Name of the anchor.
         */
        public PageBlockAnchor(String name) {
            this.name = name;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -837994576;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A list of data blocks.
     */
    public static class PageBlockList extends PageBlock {
        /**
         * The items of the list.
         */
        public PageBlockListItem[] items;

        /**
         * A list of data blocks.
         */
        public PageBlockList() {
        }

        /**
         * A list of data blocks.
         *
         * @param items The items of the list.
         */
        public PageBlockList(PageBlockListItem[] items) {
            this.items = items;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1037074852;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A block quote.
     */
    public static class PageBlockBlockQuote extends PageBlock {
        /**
         * Quote text.
         */
        public RichText text;
        /**
         * Quote credit.
         */
        public RichText credit;

        /**
         * A block quote.
         */
        public PageBlockBlockQuote() {
        }

        /**
         * A block quote.
         *
         * @param text Quote text.
         * @param credit Quote credit.
         */
        public PageBlockBlockQuote(RichText text, RichText credit) {
            this.text = text;
            this.credit = credit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1657834142;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A pull quote.
     */
    public static class PageBlockPullQuote extends PageBlock {
        /**
         * Quote text.
         */
        public RichText text;
        /**
         * Quote credit.
         */
        public RichText credit;

        /**
         * A pull quote.
         */
        public PageBlockPullQuote() {
        }

        /**
         * A pull quote.
         *
         * @param text Quote text.
         * @param credit Quote credit.
         */
        public PageBlockPullQuote(RichText text, RichText credit) {
            this.text = text;
            this.credit = credit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 490242317;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An animation.
     */
    public static class PageBlockAnimation extends PageBlock {
        /**
         * Animation file; may be null.
         */
        @Nullable public Animation animation;
        /**
         * Animation caption.
         */
        public PageBlockCaption caption;
        /**
         * True, if the animation must be played automatically.
         */
        public boolean needAutoplay;

        /**
         * An animation.
         */
        public PageBlockAnimation() {
        }

        /**
         * An animation.
         *
         * @param animation Animation file; may be null.
         * @param caption Animation caption.
         * @param needAutoplay True, if the animation must be played automatically.
         */
        public PageBlockAnimation(Animation animation, PageBlockCaption caption, boolean needAutoplay) {
            this.animation = animation;
            this.caption = caption;
            this.needAutoplay = needAutoplay;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1355669513;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An audio file.
     */
    public static class PageBlockAudio extends PageBlock {
        /**
         * Audio file; may be null.
         */
        @Nullable public Audio audio;
        /**
         * Audio file caption.
         */
        public PageBlockCaption caption;

        /**
         * An audio file.
         */
        public PageBlockAudio() {
        }

        /**
         * An audio file.
         *
         * @param audio Audio file; may be null.
         * @param caption Audio file caption.
         */
        public PageBlockAudio(Audio audio, PageBlockCaption caption) {
            this.audio = audio;
            this.caption = caption;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -63371245;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A photo.
     */
    public static class PageBlockPhoto extends PageBlock {
        /**
         * Photo file; may be null.
         */
        @Nullable public Photo photo;
        /**
         * Photo caption.
         */
        public PageBlockCaption caption;
        /**
         * URL that needs to be opened when the photo is clicked.
         */
        public String url;

        /**
         * A photo.
         */
        public PageBlockPhoto() {
        }

        /**
         * A photo.
         *
         * @param photo Photo file; may be null.
         * @param caption Photo caption.
         * @param url URL that needs to be opened when the photo is clicked.
         */
        public PageBlockPhoto(Photo photo, PageBlockCaption caption, String url) {
            this.photo = photo;
            this.caption = caption;
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 417601156;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A video.
     */
    public static class PageBlockVideo extends PageBlock {
        /**
         * Video file; may be null.
         */
        @Nullable public Video video;
        /**
         * Video caption.
         */
        public PageBlockCaption caption;
        /**
         * True, if the video must be played automatically.
         */
        public boolean needAutoplay;
        /**
         * True, if the video must be looped.
         */
        public boolean isLooped;

        /**
         * A video.
         */
        public PageBlockVideo() {
        }

        /**
         * A video.
         *
         * @param video Video file; may be null.
         * @param caption Video caption.
         * @param needAutoplay True, if the video must be played automatically.
         * @param isLooped True, if the video must be looped.
         */
        public PageBlockVideo(Video video, PageBlockCaption caption, boolean needAutoplay, boolean isLooped) {
            this.video = video;
            this.caption = caption;
            this.needAutoplay = needAutoplay;
            this.isLooped = isLooped;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 510041394;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A voice note.
     */
    public static class PageBlockVoiceNote extends PageBlock {
        /**
         * Voice note; may be null.
         */
        @Nullable public VoiceNote voiceNote;
        /**
         * Voice note caption.
         */
        public PageBlockCaption caption;

        /**
         * A voice note.
         */
        public PageBlockVoiceNote() {
        }

        /**
         * A voice note.
         *
         * @param voiceNote Voice note; may be null.
         * @param caption Voice note caption.
         */
        public PageBlockVoiceNote(VoiceNote voiceNote, PageBlockCaption caption) {
            this.voiceNote = voiceNote;
            this.caption = caption;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1823310463;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A page cover.
     */
    public static class PageBlockCover extends PageBlock {
        /**
         * Cover.
         */
        public PageBlock cover;

        /**
         * A page cover.
         */
        public PageBlockCover() {
        }

        /**
         * A page cover.
         *
         * @param cover Cover.
         */
        public PageBlockCover(PageBlock cover) {
            this.cover = cover;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 972174080;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An embedded web page.
     */
    public static class PageBlockEmbedded extends PageBlock {
        /**
         * URL of the embedded page, if available.
         */
        public String url;
        /**
         * HTML-markup of the embedded page.
         */
        public String html;
        /**
         * Poster photo, if available; may be null.
         */
        @Nullable public Photo posterPhoto;
        /**
         * Block width; 0 if unknown.
         */
        public int width;
        /**
         * Block height; 0 if unknown.
         */
        public int height;
        /**
         * Block caption.
         */
        public PageBlockCaption caption;
        /**
         * True, if the block must be full width.
         */
        public boolean isFullWidth;
        /**
         * True, if scrolling needs to be allowed.
         */
        public boolean allowScrolling;

        /**
         * An embedded web page.
         */
        public PageBlockEmbedded() {
        }

        /**
         * An embedded web page.
         *
         * @param url URL of the embedded page, if available.
         * @param html HTML-markup of the embedded page.
         * @param posterPhoto Poster photo, if available; may be null.
         * @param width Block width; 0 if unknown.
         * @param height Block height; 0 if unknown.
         * @param caption Block caption.
         * @param isFullWidth True, if the block must be full width.
         * @param allowScrolling True, if scrolling needs to be allowed.
         */
        public PageBlockEmbedded(String url, String html, Photo posterPhoto, int width, int height, PageBlockCaption caption, boolean isFullWidth, boolean allowScrolling) {
            this.url = url;
            this.html = html;
            this.posterPhoto = posterPhoto;
            this.width = width;
            this.height = height;
            this.caption = caption;
            this.isFullWidth = isFullWidth;
            this.allowScrolling = allowScrolling;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1942577763;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An embedded post.
     */
    public static class PageBlockEmbeddedPost extends PageBlock {
        /**
         * URL of the embedded post.
         */
        public String url;
        /**
         * Post author.
         */
        public String author;
        /**
         * Post author photo; may be null.
         */
        @Nullable public Photo authorPhoto;
        /**
         * Point in time (Unix timestamp) when the post was created; 0 if unknown.
         */
        public int date;
        /**
         * Post content.
         */
        public PageBlock[] pageBlocks;
        /**
         * Post caption.
         */
        public PageBlockCaption caption;

        /**
         * An embedded post.
         */
        public PageBlockEmbeddedPost() {
        }

        /**
         * An embedded post.
         *
         * @param url URL of the embedded post.
         * @param author Post author.
         * @param authorPhoto Post author photo; may be null.
         * @param date Point in time (Unix timestamp) when the post was created; 0 if unknown.
         * @param pageBlocks Post content.
         * @param caption Post caption.
         */
        public PageBlockEmbeddedPost(String url, String author, Photo authorPhoto, int date, PageBlock[] pageBlocks, PageBlockCaption caption) {
            this.url = url;
            this.author = author;
            this.authorPhoto = authorPhoto;
            this.date = date;
            this.pageBlocks = pageBlocks;
            this.caption = caption;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 397600949;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A collage.
     */
    public static class PageBlockCollage extends PageBlock {
        /**
         * Collage item contents.
         */
        public PageBlock[] pageBlocks;
        /**
         * Block caption.
         */
        public PageBlockCaption caption;

        /**
         * A collage.
         */
        public PageBlockCollage() {
        }

        /**
         * A collage.
         *
         * @param pageBlocks Collage item contents.
         * @param caption Block caption.
         */
        public PageBlockCollage(PageBlock[] pageBlocks, PageBlockCaption caption) {
            this.pageBlocks = pageBlocks;
            this.caption = caption;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1163760110;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A slideshow.
     */
    public static class PageBlockSlideshow extends PageBlock {
        /**
         * Slideshow item contents.
         */
        public PageBlock[] pageBlocks;
        /**
         * Block caption.
         */
        public PageBlockCaption caption;

        /**
         * A slideshow.
         */
        public PageBlockSlideshow() {
        }

        /**
         * A slideshow.
         *
         * @param pageBlocks Slideshow item contents.
         * @param caption Block caption.
         */
        public PageBlockSlideshow(PageBlock[] pageBlocks, PageBlockCaption caption) {
            this.pageBlocks = pageBlocks;
            this.caption = caption;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 539217375;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A link to a chat.
     */
    public static class PageBlockChatLink extends PageBlock {
        /**
         * Chat title.
         */
        public String title;
        /**
         * Chat photo; may be null.
         */
        @Nullable public ChatPhotoInfo photo;
        /**
         * Identifier of the accent color for chat title and background of chat photo.
         */
        public int accentColorId;
        /**
         * Chat username by which all other information about the chat can be resolved.
         */
        public String username;

        /**
         * A link to a chat.
         */
        public PageBlockChatLink() {
        }

        /**
         * A link to a chat.
         *
         * @param title Chat title.
         * @param photo Chat photo; may be null.
         * @param accentColorId Identifier of the accent color for chat title and background of chat photo.
         * @param username Chat username by which all other information about the chat can be resolved.
         */
        public PageBlockChatLink(String title, ChatPhotoInfo photo, int accentColorId, String username) {
            this.title = title;
            this.photo = photo;
            this.accentColorId = accentColorId;
            this.username = username;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1646188731;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A table.
     */
    public static class PageBlockTable extends PageBlock {
        /**
         * Table caption.
         */
        public RichText caption;
        /**
         * Table cells.
         */
        public PageBlockTableCell[][] cells;
        /**
         * True, if the table is bordered.
         */
        public boolean isBordered;
        /**
         * True, if the table is striped.
         */
        public boolean isStriped;

        /**
         * A table.
         */
        public PageBlockTable() {
        }

        /**
         * A table.
         *
         * @param caption Table caption.
         * @param cells Table cells.
         * @param isBordered True, if the table is bordered.
         * @param isStriped True, if the table is striped.
         */
        public PageBlockTable(RichText caption, PageBlockTableCell[][] cells, boolean isBordered, boolean isStriped) {
            this.caption = caption;
            this.cells = cells;
            this.isBordered = isBordered;
            this.isStriped = isStriped;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -942649288;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A collapsible block.
     */
    public static class PageBlockDetails extends PageBlock {
        /**
         * Always visible heading for the block.
         */
        public RichText header;
        /**
         * Block contents.
         */
        public PageBlock[] pageBlocks;
        /**
         * True, if the block is open by default.
         */
        public boolean isOpen;

        /**
         * A collapsible block.
         */
        public PageBlockDetails() {
        }

        /**
         * A collapsible block.
         *
         * @param header Always visible heading for the block.
         * @param pageBlocks Block contents.
         * @param isOpen True, if the block is open by default.
         */
        public PageBlockDetails(RichText header, PageBlock[] pageBlocks, boolean isOpen) {
            this.header = header;
            this.pageBlocks = pageBlocks;
            this.isOpen = isOpen;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1599869809;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Related articles.
     */
    public static class PageBlockRelatedArticles extends PageBlock {
        /**
         * Block header.
         */
        public RichText header;
        /**
         * List of related articles.
         */
        public PageBlockRelatedArticle[] articles;

        /**
         * Related articles.
         */
        public PageBlockRelatedArticles() {
        }

        /**
         * Related articles.
         *
         * @param header Block header.
         * @param articles List of related articles.
         */
        public PageBlockRelatedArticles(RichText header, PageBlockRelatedArticle[] articles) {
            this.header = header;
            this.articles = articles;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1807324374;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A map.
     */
    public static class PageBlockMap extends PageBlock {
        /**
         * Location of the map center.
         */
        public Location location;
        /**
         * Map zoom level.
         */
        public int zoom;
        /**
         * Map width.
         */
        public int width;
        /**
         * Map height.
         */
        public int height;
        /**
         * Block caption.
         */
        public PageBlockCaption caption;

        /**
         * A map.
         */
        public PageBlockMap() {
        }

        /**
         * A map.
         *
         * @param location Location of the map center.
         * @param zoom Map zoom level.
         * @param width Map width.
         * @param height Map height.
         * @param caption Block caption.
         */
        public PageBlockMap(Location location, int zoom, int width, int height, PageBlockCaption caption) {
            this.location = location;
            this.zoom = zoom;
            this.width = width;
            this.height = height;
            this.caption = caption;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1510961171;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a caption of another block.
     */
    public static class PageBlockCaption extends Object {
        /**
         * Content of the caption.
         */
        public RichText text;
        /**
         * Block credit (like HTML tag &lt;cite&gt;).
         */
        public RichText credit;

        /**
         * Contains a caption of another block.
         */
        public PageBlockCaption() {
        }

        /**
         * Contains a caption of another block.
         *
         * @param text Content of the caption.
         * @param credit Block credit (like HTML tag &lt;cite&gt;).
         */
        public PageBlockCaption(RichText text, RichText credit) {
            this.text = text;
            this.credit = credit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1180064650;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a horizontal alignment of a table cell content.
     */
    public abstract static class PageBlockHorizontalAlignment extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            PageBlockHorizontalAlignmentLeft.CONSTRUCTOR,
            PageBlockHorizontalAlignmentCenter.CONSTRUCTOR,
            PageBlockHorizontalAlignmentRight.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public PageBlockHorizontalAlignment() {
        }
    }

    /**
     * The content must be left-aligned.
     */
    public static class PageBlockHorizontalAlignmentLeft extends PageBlockHorizontalAlignment {

        /**
         * The content must be left-aligned.
         */
        public PageBlockHorizontalAlignmentLeft() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 848701417;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The content must be center-aligned.
     */
    public static class PageBlockHorizontalAlignmentCenter extends PageBlockHorizontalAlignment {

        /**
         * The content must be center-aligned.
         */
        public PageBlockHorizontalAlignmentCenter() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1009203990;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The content must be right-aligned.
     */
    public static class PageBlockHorizontalAlignmentRight extends PageBlockHorizontalAlignment {

        /**
         * The content must be right-aligned.
         */
        public PageBlockHorizontalAlignmentRight() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1371369214;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an item of a list page block.
     */
    public static class PageBlockListItem extends Object {
        /**
         * Item label.
         */
        public String label;
        /**
         * Item blocks.
         */
        public PageBlock[] pageBlocks;

        /**
         * Describes an item of a list page block.
         */
        public PageBlockListItem() {
        }

        /**
         * Describes an item of a list page block.
         *
         * @param label Item label.
         * @param pageBlocks Item blocks.
         */
        public PageBlockListItem(String label, PageBlock[] pageBlocks) {
            this.label = label;
            this.pageBlocks = pageBlocks;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 323186259;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a related article.
     */
    public static class PageBlockRelatedArticle extends Object {
        /**
         * Related article URL.
         */
        public String url;
        /**
         * Article title; may be empty.
         */
        public String title;
        /**
         * Article description; may be empty.
         */
        public String description;
        /**
         * Article photo; may be null.
         */
        @Nullable public Photo photo;
        /**
         * Article author; may be empty.
         */
        public String author;
        /**
         * Point in time (Unix timestamp) when the article was published; 0 if unknown.
         */
        public int publishDate;

        /**
         * Contains information about a related article.
         */
        public PageBlockRelatedArticle() {
        }

        /**
         * Contains information about a related article.
         *
         * @param url Related article URL.
         * @param title Article title; may be empty.
         * @param description Article description; may be empty.
         * @param photo Article photo; may be null.
         * @param author Article author; may be empty.
         * @param publishDate Point in time (Unix timestamp) when the article was published; 0 if unknown.
         */
        public PageBlockRelatedArticle(String url, String title, String description, Photo photo, String author, int publishDate) {
            this.url = url;
            this.title = title;
            this.description = description;
            this.photo = photo;
            this.author = author;
            this.publishDate = publishDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 481199251;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a cell of a table.
     */
    public static class PageBlockTableCell extends Object {
        /**
         * Cell text; may be null. If the text is null, then the cell must be invisible.
         */
        @Nullable public RichText text;
        /**
         * True, if it is a header cell.
         */
        public boolean isHeader;
        /**
         * The number of columns the cell spans.
         */
        public int colspan;
        /**
         * The number of rows the cell spans.
         */
        public int rowspan;
        /**
         * Horizontal cell content alignment.
         */
        public PageBlockHorizontalAlignment align;
        /**
         * Vertical cell content alignment.
         */
        public PageBlockVerticalAlignment valign;

        /**
         * Represents a cell of a table.
         */
        public PageBlockTableCell() {
        }

        /**
         * Represents a cell of a table.
         *
         * @param text Cell text; may be null. If the text is null, then the cell must be invisible.
         * @param isHeader True, if it is a header cell.
         * @param colspan The number of columns the cell spans.
         * @param rowspan The number of rows the cell spans.
         * @param align Horizontal cell content alignment.
         * @param valign Vertical cell content alignment.
         */
        public PageBlockTableCell(RichText text, boolean isHeader, int colspan, int rowspan, PageBlockHorizontalAlignment align, PageBlockVerticalAlignment valign) {
            this.text = text;
            this.isHeader = isHeader;
            this.colspan = colspan;
            this.rowspan = rowspan;
            this.align = align;
            this.valign = valign;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1417658214;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a Vertical alignment of a table cell content.
     */
    public abstract static class PageBlockVerticalAlignment extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            PageBlockVerticalAlignmentTop.CONSTRUCTOR,
            PageBlockVerticalAlignmentMiddle.CONSTRUCTOR,
            PageBlockVerticalAlignmentBottom.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public PageBlockVerticalAlignment() {
        }
    }

    /**
     * The content must be top-aligned.
     */
    public static class PageBlockVerticalAlignmentTop extends PageBlockVerticalAlignment {

        /**
         * The content must be top-aligned.
         */
        public PageBlockVerticalAlignmentTop() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 195500454;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The content must be middle-aligned.
     */
    public static class PageBlockVerticalAlignmentMiddle extends PageBlockVerticalAlignment {

        /**
         * The content must be middle-aligned.
         */
        public PageBlockVerticalAlignmentMiddle() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2123096587;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The content must be bottom-aligned.
     */
    public static class PageBlockVerticalAlignmentBottom extends PageBlockVerticalAlignment {

        /**
         * The content must be bottom-aligned.
         */
        public PageBlockVerticalAlignmentBottom() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2092531158;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a paid media.
     */
    public abstract static class PaidMedia extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            PaidMediaPreview.CONSTRUCTOR,
            PaidMediaPhoto.CONSTRUCTOR,
            PaidMediaVideo.CONSTRUCTOR,
            PaidMediaUnsupported.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public PaidMedia() {
        }
    }

    /**
     * The media is hidden until the invoice is paid.
     */
    public static class PaidMediaPreview extends PaidMedia {
        /**
         * Media width; 0 if unknown.
         */
        public int width;
        /**
         * Media height; 0 if unknown.
         */
        public int height;
        /**
         * Media duration, in seconds; 0 if unknown.
         */
        public int duration;
        /**
         * Media minithumbnail; may be null.
         */
        @Nullable public Minithumbnail minithumbnail;

        /**
         * The media is hidden until the invoice is paid.
         */
        public PaidMediaPreview() {
        }

        /**
         * The media is hidden until the invoice is paid.
         *
         * @param width Media width; 0 if unknown.
         * @param height Media height; 0 if unknown.
         * @param duration Media duration, in seconds; 0 if unknown.
         * @param minithumbnail Media minithumbnail; may be null.
         */
        public PaidMediaPreview(int width, int height, int duration, Minithumbnail minithumbnail) {
            this.width = width;
            this.height = height;
            this.duration = duration;
            this.minithumbnail = minithumbnail;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1128151948;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The media is a photo.
     */
    public static class PaidMediaPhoto extends PaidMedia {
        /**
         * The photo.
         */
        public Photo photo;
        /**
         * The video representing the live photo; may be null if the photo is static.
         */
        @Nullable public Video video;

        /**
         * The media is a photo.
         */
        public PaidMediaPhoto() {
        }

        /**
         * The media is a photo.
         *
         * @param photo The photo.
         * @param video The video representing the live photo; may be null if the photo is static.
         */
        public PaidMediaPhoto(Photo photo, Video video) {
            this.photo = photo;
            this.video = video;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -307151500;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The media is a video.
     */
    public static class PaidMediaVideo extends PaidMedia {
        /**
         * The video.
         */
        public Video video;
        /**
         * Cover of the video; may be null if none.
         */
        @Nullable public Photo cover;
        /**
         * Timestamp from which the video playing must start, in seconds.
         */
        public int startTimestamp;

        /**
         * The media is a video.
         */
        public PaidMediaVideo() {
        }

        /**
         * The media is a video.
         *
         * @param video The video.
         * @param cover Cover of the video; may be null if none.
         * @param startTimestamp Timestamp from which the video playing must start, in seconds.
         */
        public PaidMediaVideo(Video video, Photo cover, int startTimestamp) {
            this.video = video;
            this.cover = cover;
            this.startTimestamp = startTimestamp;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 870838318;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The media is unsupported.
     */
    public static class PaidMediaUnsupported extends PaidMedia {

        /**
         * The media is unsupported.
         */
        public PaidMediaUnsupported() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 112999974;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes type of paid message reaction.
     */
    public abstract static class PaidReactionType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            PaidReactionTypeRegular.CONSTRUCTOR,
            PaidReactionTypeAnonymous.CONSTRUCTOR,
            PaidReactionTypeChat.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public PaidReactionType() {
        }
    }

    /**
     * A paid reaction on behalf of the current user.
     */
    public static class PaidReactionTypeRegular extends PaidReactionType {

        /**
         * A paid reaction on behalf of the current user.
         */
        public PaidReactionTypeRegular() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1199187333;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An anonymous paid reaction.
     */
    public static class PaidReactionTypeAnonymous extends PaidReactionType {

        /**
         * An anonymous paid reaction.
         */
        public PaidReactionTypeAnonymous() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 47892621;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A paid reaction on behalf of an owned chat.
     */
    public static class PaidReactionTypeChat extends PaidReactionType {
        /**
         * Identifier of the chat.
         */
        public long chatId;

        /**
         * A paid reaction on behalf of an owned chat.
         */
        public PaidReactionTypeChat() {
        }

        /**
         * A paid reaction on behalf of an owned chat.
         *
         * @param chatId Identifier of the chat.
         */
        public PaidReactionTypeChat(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -675782044;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a user who added paid reactions.
     */
    public static class PaidReactor extends Object {
        /**
         * Identifier of the user or chat that added the reactions; may be null for anonymous reactors that aren't the current user.
         */
        @Nullable public MessageSender senderId;
        /**
         * Number of Telegram Stars added.
         */
        public long starCount;
        /**
         * True, if the reactor is one of the most active reactors; may be false if the reactor is the current user.
         */
        public boolean isTop;
        /**
         * True, if the paid reaction was added by the current user.
         */
        public boolean isMe;
        /**
         * True, if the reactor is anonymous.
         */
        public boolean isAnonymous;

        /**
         * Contains information about a user who added paid reactions.
         */
        public PaidReactor() {
        }

        /**
         * Contains information about a user who added paid reactions.
         *
         * @param senderId Identifier of the user or chat that added the reactions; may be null for anonymous reactors that aren't the current user.
         * @param starCount Number of Telegram Stars added.
         * @param isTop True, if the reactor is one of the most active reactors; may be false if the reactor is the current user.
         * @param isMe True, if the paid reaction was added by the current user.
         * @param isAnonymous True, if the reactor is anonymous.
         */
        public PaidReactor(MessageSender senderId, long starCount, boolean isTop, boolean isMe, boolean isAnonymous) {
            this.senderId = senderId;
            this.starCount = starCount;
            this.isTop = isTop;
            this.isMe = isMe;
            this.isAnonymous = isAnonymous;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -748917113;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a passkey.
     */
    public static class Passkey extends Object {
        /**
         * Unique identifier of the passkey.
         */
        public String id;
        /**
         * Name of the passkey.
         */
        public String name;
        /**
         * Point in time (Unix timestamp) when the passkey was added.
         */
        public int additionDate;
        /**
         * Point in time (Unix timestamp) when the passkey was used last time; 0 if never.
         */
        public int lastUsageDate;
        /**
         * Identifier of the custom emoji that is used as the icon of the software, which created the passkey; 0 if unknown.
         */
        public long softwareIconCustomEmojiId;

        /**
         * Describes a passkey.
         */
        public Passkey() {
        }

        /**
         * Describes a passkey.
         *
         * @param id Unique identifier of the passkey.
         * @param name Name of the passkey.
         * @param additionDate Point in time (Unix timestamp) when the passkey was added.
         * @param lastUsageDate Point in time (Unix timestamp) when the passkey was used last time; 0 if never.
         * @param softwareIconCustomEmojiId Identifier of the custom emoji that is used as the icon of the software, which created the passkey; 0 if unknown.
         */
        public Passkey(String id, String name, int additionDate, int lastUsageDate, long softwareIconCustomEmojiId) {
            this.id = id;
            this.name = name;
            this.additionDate = additionDate;
            this.lastUsageDate = lastUsageDate;
            this.softwareIconCustomEmojiId = softwareIconCustomEmojiId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1200601505;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of passkeys.
     */
    public static class Passkeys extends Object {
        /**
         * List of passkeys.
         */
        public Passkey[] passkeys;

        /**
         * Contains a list of passkeys.
         */
        public Passkeys() {
        }

        /**
         * Contains a list of passkeys.
         *
         * @param passkeys List of passkeys.
         */
        public Passkeys(Passkey[] passkeys) {
            this.passkeys = passkeys;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 601084419;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a Telegram Passport authorization form that was requested.
     */
    public static class PassportAuthorizationForm extends Object {
        /**
         * Unique identifier of the authorization form.
         */
        public int id;
        /**
         * Telegram Passport elements that must be provided to complete the form.
         */
        public PassportRequiredElement[] requiredElements;
        /**
         * URL for the privacy policy of the service; may be empty.
         */
        public String privacyPolicyUrl;

        /**
         * Contains information about a Telegram Passport authorization form that was requested.
         */
        public PassportAuthorizationForm() {
        }

        /**
         * Contains information about a Telegram Passport authorization form that was requested.
         *
         * @param id Unique identifier of the authorization form.
         * @param requiredElements Telegram Passport elements that must be provided to complete the form.
         * @param privacyPolicyUrl URL for the privacy policy of the service; may be empty.
         */
        public PassportAuthorizationForm(int id, PassportRequiredElement[] requiredElements, String privacyPolicyUrl) {
            this.id = id;
            this.requiredElements = requiredElements;
            this.privacyPolicyUrl = privacyPolicyUrl;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1070673218;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains information about a Telegram Passport element.
     */
    public abstract static class PassportElement extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            PassportElementPersonalDetails.CONSTRUCTOR,
            PassportElementPassport.CONSTRUCTOR,
            PassportElementDriverLicense.CONSTRUCTOR,
            PassportElementIdentityCard.CONSTRUCTOR,
            PassportElementInternalPassport.CONSTRUCTOR,
            PassportElementAddress.CONSTRUCTOR,
            PassportElementUtilityBill.CONSTRUCTOR,
            PassportElementBankStatement.CONSTRUCTOR,
            PassportElementRentalAgreement.CONSTRUCTOR,
            PassportElementPassportRegistration.CONSTRUCTOR,
            PassportElementTemporaryRegistration.CONSTRUCTOR,
            PassportElementPhoneNumber.CONSTRUCTOR,
            PassportElementEmailAddress.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public PassportElement() {
        }
    }

    /**
     * A Telegram Passport element containing the user's personal details.
     */
    public static class PassportElementPersonalDetails extends PassportElement {
        /**
         * Personal details of the user.
         */
        public PersonalDetails personalDetails;

        /**
         * A Telegram Passport element containing the user's personal details.
         */
        public PassportElementPersonalDetails() {
        }

        /**
         * A Telegram Passport element containing the user's personal details.
         *
         * @param personalDetails Personal details of the user.
         */
        public PassportElementPersonalDetails(PersonalDetails personalDetails) {
            this.personalDetails = personalDetails;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1217724035;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's passport.
     */
    public static class PassportElementPassport extends PassportElement {
        /**
         * Passport.
         */
        public IdentityDocument passport;

        /**
         * A Telegram Passport element containing the user's passport.
         */
        public PassportElementPassport() {
        }

        /**
         * A Telegram Passport element containing the user's passport.
         *
         * @param passport Passport.
         */
        public PassportElementPassport(IdentityDocument passport) {
            this.passport = passport;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -263985373;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's driver license.
     */
    public static class PassportElementDriverLicense extends PassportElement {
        /**
         * Driver license.
         */
        public IdentityDocument driverLicense;

        /**
         * A Telegram Passport element containing the user's driver license.
         */
        public PassportElementDriverLicense() {
        }

        /**
         * A Telegram Passport element containing the user's driver license.
         *
         * @param driverLicense Driver license.
         */
        public PassportElementDriverLicense(IdentityDocument driverLicense) {
            this.driverLicense = driverLicense;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1643580589;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's identity card.
     */
    public static class PassportElementIdentityCard extends PassportElement {
        /**
         * Identity card.
         */
        public IdentityDocument identityCard;

        /**
         * A Telegram Passport element containing the user's identity card.
         */
        public PassportElementIdentityCard() {
        }

        /**
         * A Telegram Passport element containing the user's identity card.
         *
         * @param identityCard Identity card.
         */
        public PassportElementIdentityCard(IdentityDocument identityCard) {
            this.identityCard = identityCard;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2083775797;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's internal passport.
     */
    public static class PassportElementInternalPassport extends PassportElement {
        /**
         * Internal passport.
         */
        public IdentityDocument internalPassport;

        /**
         * A Telegram Passport element containing the user's internal passport.
         */
        public PassportElementInternalPassport() {
        }

        /**
         * A Telegram Passport element containing the user's internal passport.
         *
         * @param internalPassport Internal passport.
         */
        public PassportElementInternalPassport(IdentityDocument internalPassport) {
            this.internalPassport = internalPassport;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 36220295;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's address.
     */
    public static class PassportElementAddress extends PassportElement {
        /**
         * Address.
         */
        public Address address;

        /**
         * A Telegram Passport element containing the user's address.
         */
        public PassportElementAddress() {
        }

        /**
         * A Telegram Passport element containing the user's address.
         *
         * @param address Address.
         */
        public PassportElementAddress(Address address) {
            this.address = address;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -782625232;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's utility bill.
     */
    public static class PassportElementUtilityBill extends PassportElement {
        /**
         * Utility bill.
         */
        public PersonalDocument utilityBill;

        /**
         * A Telegram Passport element containing the user's utility bill.
         */
        public PassportElementUtilityBill() {
        }

        /**
         * A Telegram Passport element containing the user's utility bill.
         *
         * @param utilityBill Utility bill.
         */
        public PassportElementUtilityBill(PersonalDocument utilityBill) {
            this.utilityBill = utilityBill;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -234611246;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's bank statement.
     */
    public static class PassportElementBankStatement extends PassportElement {
        /**
         * Bank statement.
         */
        public PersonalDocument bankStatement;

        /**
         * A Telegram Passport element containing the user's bank statement.
         */
        public PassportElementBankStatement() {
        }

        /**
         * A Telegram Passport element containing the user's bank statement.
         *
         * @param bankStatement Bank statement.
         */
        public PassportElementBankStatement(PersonalDocument bankStatement) {
            this.bankStatement = bankStatement;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -366464408;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's rental agreement.
     */
    public static class PassportElementRentalAgreement extends PassportElement {
        /**
         * Rental agreement.
         */
        public PersonalDocument rentalAgreement;

        /**
         * A Telegram Passport element containing the user's rental agreement.
         */
        public PassportElementRentalAgreement() {
        }

        /**
         * A Telegram Passport element containing the user's rental agreement.
         *
         * @param rentalAgreement Rental agreement.
         */
        public PassportElementRentalAgreement(PersonalDocument rentalAgreement) {
            this.rentalAgreement = rentalAgreement;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -290141400;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's passport registration pages.
     */
    public static class PassportElementPassportRegistration extends PassportElement {
        /**
         * Passport registration pages.
         */
        public PersonalDocument passportRegistration;

        /**
         * A Telegram Passport element containing the user's passport registration pages.
         */
        public PassportElementPassportRegistration() {
        }

        /**
         * A Telegram Passport element containing the user's passport registration pages.
         *
         * @param passportRegistration Passport registration pages.
         */
        public PassportElementPassportRegistration(PersonalDocument passportRegistration) {
            this.passportRegistration = passportRegistration;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 618323071;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's temporary registration.
     */
    public static class PassportElementTemporaryRegistration extends PassportElement {
        /**
         * Temporary registration.
         */
        public PersonalDocument temporaryRegistration;

        /**
         * A Telegram Passport element containing the user's temporary registration.
         */
        public PassportElementTemporaryRegistration() {
        }

        /**
         * A Telegram Passport element containing the user's temporary registration.
         *
         * @param temporaryRegistration Temporary registration.
         */
        public PassportElementTemporaryRegistration(PersonalDocument temporaryRegistration) {
            this.temporaryRegistration = temporaryRegistration;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1237626864;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's phone number.
     */
    public static class PassportElementPhoneNumber extends PassportElement {
        /**
         * Phone number.
         */
        public String phoneNumber;

        /**
         * A Telegram Passport element containing the user's phone number.
         */
        public PassportElementPhoneNumber() {
        }

        /**
         * A Telegram Passport element containing the user's phone number.
         *
         * @param phoneNumber Phone number.
         */
        public PassportElementPhoneNumber(String phoneNumber) {
            this.phoneNumber = phoneNumber;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1320118375;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's email address.
     */
    public static class PassportElementEmailAddress extends PassportElement {
        /**
         * Email address.
         */
        public String emailAddress;

        /**
         * A Telegram Passport element containing the user's email address.
         */
        public PassportElementEmailAddress() {
        }

        /**
         * A Telegram Passport element containing the user's email address.
         *
         * @param emailAddress Email address.
         */
        public PassportElementEmailAddress(String emailAddress) {
            this.emailAddress = emailAddress;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1528129531;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains the description of an error in a Telegram Passport element.
     */
    public static class PassportElementError extends Object {
        /**
         * Type of the Telegram Passport element which has the error.
         */
        public PassportElementType type;
        /**
         * Error message.
         */
        public String message;
        /**
         * Error source.
         */
        public PassportElementErrorSource source;

        /**
         * Contains the description of an error in a Telegram Passport element.
         */
        public PassportElementError() {
        }

        /**
         * Contains the description of an error in a Telegram Passport element.
         *
         * @param type Type of the Telegram Passport element which has the error.
         * @param message Error message.
         * @param source Error source.
         */
        public PassportElementError(PassportElementType type, String message, PassportElementErrorSource source) {
            this.type = type;
            this.message = message;
            this.source = source;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1861902395;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains the description of an error in a Telegram Passport element.
     */
    public abstract static class PassportElementErrorSource extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            PassportElementErrorSourceUnspecified.CONSTRUCTOR,
            PassportElementErrorSourceDataField.CONSTRUCTOR,
            PassportElementErrorSourceFrontSide.CONSTRUCTOR,
            PassportElementErrorSourceReverseSide.CONSTRUCTOR,
            PassportElementErrorSourceSelfie.CONSTRUCTOR,
            PassportElementErrorSourceTranslationFile.CONSTRUCTOR,
            PassportElementErrorSourceTranslationFiles.CONSTRUCTOR,
            PassportElementErrorSourceFile.CONSTRUCTOR,
            PassportElementErrorSourceFiles.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public PassportElementErrorSource() {
        }
    }

    /**
     * The element contains an error in an unspecified place. The error will be considered resolved when new data is added.
     */
    public static class PassportElementErrorSourceUnspecified extends PassportElementErrorSource {

        /**
         * The element contains an error in an unspecified place. The error will be considered resolved when new data is added.
         */
        public PassportElementErrorSourceUnspecified() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -378320830;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * One of the data fields contains an error. The error will be considered resolved when the value of the field changes.
     */
    public static class PassportElementErrorSourceDataField extends PassportElementErrorSource {
        /**
         * Field name.
         */
        public String fieldName;

        /**
         * One of the data fields contains an error. The error will be considered resolved when the value of the field changes.
         */
        public PassportElementErrorSourceDataField() {
        }

        /**
         * One of the data fields contains an error. The error will be considered resolved when the value of the field changes.
         *
         * @param fieldName Field name.
         */
        public PassportElementErrorSourceDataField(String fieldName) {
            this.fieldName = fieldName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -308650776;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The front side of the document contains an error. The error will be considered resolved when the file with the front side changes.
     */
    public static class PassportElementErrorSourceFrontSide extends PassportElementErrorSource {

        /**
         * The front side of the document contains an error. The error will be considered resolved when the file with the front side changes.
         */
        public PassportElementErrorSourceFrontSide() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1895658292;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The reverse side of the document contains an error. The error will be considered resolved when the file with the reverse side changes.
     */
    public static class PassportElementErrorSourceReverseSide extends PassportElementErrorSource {

        /**
         * The reverse side of the document contains an error. The error will be considered resolved when the file with the reverse side changes.
         */
        public PassportElementErrorSourceReverseSide() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1918630391;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The selfie with the document contains an error. The error will be considered resolved when the file with the selfie changes.
     */
    public static class PassportElementErrorSourceSelfie extends PassportElementErrorSource {

        /**
         * The selfie with the document contains an error. The error will be considered resolved when the file with the selfie changes.
         */
        public PassportElementErrorSourceSelfie() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -797043672;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * One of files with the translation of the document contains an error. The error will be considered resolved when the file changes.
     */
    public static class PassportElementErrorSourceTranslationFile extends PassportElementErrorSource {
        /**
         * Index of a file with the error.
         */
        public int fileIndex;

        /**
         * One of files with the translation of the document contains an error. The error will be considered resolved when the file changes.
         */
        public PassportElementErrorSourceTranslationFile() {
        }

        /**
         * One of files with the translation of the document contains an error. The error will be considered resolved when the file changes.
         *
         * @param fileIndex Index of a file with the error.
         */
        public PassportElementErrorSourceTranslationFile(int fileIndex) {
            this.fileIndex = fileIndex;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -689621228;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The translation of the document contains an error. The error will be considered resolved when the list of translation files changes.
     */
    public static class PassportElementErrorSourceTranslationFiles extends PassportElementErrorSource {

        /**
         * The translation of the document contains an error. The error will be considered resolved when the list of translation files changes.
         */
        public PassportElementErrorSourceTranslationFiles() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 581280796;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file contains an error. The error will be considered resolved when the file changes.
     */
    public static class PassportElementErrorSourceFile extends PassportElementErrorSource {
        /**
         * Index of a file with the error.
         */
        public int fileIndex;

        /**
         * The file contains an error. The error will be considered resolved when the file changes.
         */
        public PassportElementErrorSourceFile() {
        }

        /**
         * The file contains an error. The error will be considered resolved when the file changes.
         *
         * @param fileIndex Index of a file with the error.
         */
        public PassportElementErrorSourceFile(int fileIndex) {
            this.fileIndex = fileIndex;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2020358960;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of attached files contains an error. The error will be considered resolved when the list of files changes.
     */
    public static class PassportElementErrorSourceFiles extends PassportElementErrorSource {

        /**
         * The list of attached files contains an error. The error will be considered resolved when the list of files changes.
         */
        public PassportElementErrorSourceFiles() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1894164178;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains the type of Telegram Passport element.
     */
    public abstract static class PassportElementType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            PassportElementTypePersonalDetails.CONSTRUCTOR,
            PassportElementTypePassport.CONSTRUCTOR,
            PassportElementTypeDriverLicense.CONSTRUCTOR,
            PassportElementTypeIdentityCard.CONSTRUCTOR,
            PassportElementTypeInternalPassport.CONSTRUCTOR,
            PassportElementTypeAddress.CONSTRUCTOR,
            PassportElementTypeUtilityBill.CONSTRUCTOR,
            PassportElementTypeBankStatement.CONSTRUCTOR,
            PassportElementTypeRentalAgreement.CONSTRUCTOR,
            PassportElementTypePassportRegistration.CONSTRUCTOR,
            PassportElementTypeTemporaryRegistration.CONSTRUCTOR,
            PassportElementTypePhoneNumber.CONSTRUCTOR,
            PassportElementTypeEmailAddress.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public PassportElementType() {
        }
    }

    /**
     * A Telegram Passport element containing the user's personal details.
     */
    public static class PassportElementTypePersonalDetails extends PassportElementType {

        /**
         * A Telegram Passport element containing the user's personal details.
         */
        public PassportElementTypePersonalDetails() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1032136365;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's passport.
     */
    public static class PassportElementTypePassport extends PassportElementType {

        /**
         * A Telegram Passport element containing the user's passport.
         */
        public PassportElementTypePassport() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -436360376;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's driver license.
     */
    public static class PassportElementTypeDriverLicense extends PassportElementType {

        /**
         * A Telegram Passport element containing the user's driver license.
         */
        public PassportElementTypeDriverLicense() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1827298379;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's identity card.
     */
    public static class PassportElementTypeIdentityCard extends PassportElementType {

        /**
         * A Telegram Passport element containing the user's identity card.
         */
        public PassportElementTypeIdentityCard() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -502356132;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's internal passport.
     */
    public static class PassportElementTypeInternalPassport extends PassportElementType {

        /**
         * A Telegram Passport element containing the user's internal passport.
         */
        public PassportElementTypeInternalPassport() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -793781959;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's address.
     */
    public static class PassportElementTypeAddress extends PassportElementType {

        /**
         * A Telegram Passport element containing the user's address.
         */
        public PassportElementTypeAddress() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 496327874;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's utility bill.
     */
    public static class PassportElementTypeUtilityBill extends PassportElementType {

        /**
         * A Telegram Passport element containing the user's utility bill.
         */
        public PassportElementTypeUtilityBill() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 627084906;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's bank statement.
     */
    public static class PassportElementTypeBankStatement extends PassportElementType {

        /**
         * A Telegram Passport element containing the user's bank statement.
         */
        public PassportElementTypeBankStatement() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 574095667;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's rental agreement.
     */
    public static class PassportElementTypeRentalAgreement extends PassportElementType {

        /**
         * A Telegram Passport element containing the user's rental agreement.
         */
        public PassportElementTypeRentalAgreement() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2060583280;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the registration page of the user's passport.
     */
    public static class PassportElementTypePassportRegistration extends PassportElementType {

        /**
         * A Telegram Passport element containing the registration page of the user's passport.
         */
        public PassportElementTypePassportRegistration() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -159478209;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's temporary registration.
     */
    public static class PassportElementTypeTemporaryRegistration extends PassportElementType {

        /**
         * A Telegram Passport element containing the user's temporary registration.
         */
        public PassportElementTypeTemporaryRegistration() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1092498527;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's phone number.
     */
    public static class PassportElementTypePhoneNumber extends PassportElementType {

        /**
         * A Telegram Passport element containing the user's phone number.
         */
        public PassportElementTypePhoneNumber() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -995361172;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A Telegram Passport element containing the user's email address.
     */
    public static class PassportElementTypeEmailAddress extends PassportElementType {

        /**
         * A Telegram Passport element containing the user's email address.
         */
        public PassportElementTypeEmailAddress() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -79321405;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about saved Telegram Passport elements.
     */
    public static class PassportElements extends Object {
        /**
         * Telegram Passport elements.
         */
        public PassportElement[] elements;

        /**
         * Contains information about saved Telegram Passport elements.
         */
        public PassportElements() {
        }

        /**
         * Contains information about saved Telegram Passport elements.
         *
         * @param elements Telegram Passport elements.
         */
        public PassportElements(PassportElement[] elements) {
            this.elements = elements;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1264617556;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a Telegram Passport elements and corresponding errors.
     */
    public static class PassportElementsWithErrors extends Object {
        /**
         * Telegram Passport elements.
         */
        public PassportElement[] elements;
        /**
         * Errors in the elements that are already available.
         */
        public PassportElementError[] errors;

        /**
         * Contains information about a Telegram Passport elements and corresponding errors.
         */
        public PassportElementsWithErrors() {
        }

        /**
         * Contains information about a Telegram Passport elements and corresponding errors.
         *
         * @param elements Telegram Passport elements.
         * @param errors Errors in the elements that are already available.
         */
        public PassportElementsWithErrors(PassportElement[] elements, PassportElementError[] errors) {
            this.elements = elements;
            this.errors = errors;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1308923044;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a description of the required Telegram Passport element that was requested by a service.
     */
    public static class PassportRequiredElement extends Object {
        /**
         * List of Telegram Passport elements any of which is enough to provide.
         */
        public PassportSuitableElement[] suitableElements;

        /**
         * Contains a description of the required Telegram Passport element that was requested by a service.
         */
        public PassportRequiredElement() {
        }

        /**
         * Contains a description of the required Telegram Passport element that was requested by a service.
         *
         * @param suitableElements List of Telegram Passport elements any of which is enough to provide.
         */
        public PassportRequiredElement(PassportSuitableElement[] suitableElements) {
            this.suitableElements = suitableElements;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1983641651;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a Telegram Passport element that was requested by a service.
     */
    public static class PassportSuitableElement extends Object {
        /**
         * Type of the element.
         */
        public PassportElementType type;
        /**
         * True, if a selfie is required with the identity document.
         */
        public boolean isSelfieRequired;
        /**
         * True, if a certified English translation is required with the document.
         */
        public boolean isTranslationRequired;
        /**
         * True, if personal details must include the user's name in the language of their country of residence.
         */
        public boolean isNativeNameRequired;

        /**
         * Contains information about a Telegram Passport element that was requested by a service.
         */
        public PassportSuitableElement() {
        }

        /**
         * Contains information about a Telegram Passport element that was requested by a service.
         *
         * @param type Type of the element.
         * @param isSelfieRequired True, if a selfie is required with the identity document.
         * @param isTranslationRequired True, if a certified English translation is required with the document.
         * @param isNativeNameRequired True, if personal details must include the user's name in the language of their country of residence.
         */
        public PassportSuitableElement(PassportElementType type, boolean isSelfieRequired, boolean isTranslationRequired, boolean isNativeNameRequired) {
            this.type = type;
            this.isSelfieRequired = isSelfieRequired;
            this.isTranslationRequired = isTranslationRequired;
            this.isNativeNameRequired = isNativeNameRequired;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -789019876;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents the current state of 2-step verification.
     */
    public static class PasswordState extends Object {
        /**
         * True, if a 2-step verification password is set.
         */
        public boolean hasPassword;
        /**
         * Hint for the password; may be empty.
         */
        public String passwordHint;
        /**
         * True, if a recovery email is set.
         */
        public boolean hasRecoveryEmailAddress;
        /**
         * True, if some Telegram Passport elements were saved.
         */
        public boolean hasPassportData;
        /**
         * Information about the recovery email address to which the confirmation email was sent; may be null.
         */
        @Nullable public EmailAddressAuthenticationCodeInfo recoveryEmailAddressCodeInfo;
        /**
         * Pattern of the email address set up for logging in.
         */
        public String loginEmailAddressPattern;
        /**
         * If not 0, point in time (Unix timestamp) after which the 2-step verification password can be reset immediately using resetPassword.
         */
        public int pendingResetDate;

        /**
         * Represents the current state of 2-step verification.
         */
        public PasswordState() {
        }

        /**
         * Represents the current state of 2-step verification.
         *
         * @param hasPassword True, if a 2-step verification password is set.
         * @param passwordHint Hint for the password; may be empty.
         * @param hasRecoveryEmailAddress True, if a recovery email is set.
         * @param hasPassportData True, if some Telegram Passport elements were saved.
         * @param recoveryEmailAddressCodeInfo Information about the recovery email address to which the confirmation email was sent; may be null.
         * @param loginEmailAddressPattern Pattern of the email address set up for logging in.
         * @param pendingResetDate If not 0, point in time (Unix timestamp) after which the 2-step verification password can be reset immediately using resetPassword.
         */
        public PasswordState(boolean hasPassword, String passwordHint, boolean hasRecoveryEmailAddress, boolean hasPassportData, EmailAddressAuthenticationCodeInfo recoveryEmailAddressCodeInfo, String loginEmailAddressPattern, int pendingResetDate) {
            this.hasPassword = hasPassword;
            this.passwordHint = passwordHint;
            this.hasRecoveryEmailAddress = hasRecoveryEmailAddress;
            this.hasPassportData = hasPassportData;
            this.recoveryEmailAddressCodeInfo = recoveryEmailAddressCodeInfo;
            this.loginEmailAddressPattern = loginEmailAddressPattern;
            this.pendingResetDate = pendingResetDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 483801128;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about an invoice payment form.
     */
    public static class PaymentForm extends Object {
        /**
         * The payment form identifier.
         */
        public long id;
        /**
         * Type of the payment form.
         */
        public PaymentFormType type;
        /**
         * User identifier of the seller bot.
         */
        public long sellerBotUserId;
        /**
         * Information about the product.
         */
        public ProductInfo productInfo;

        /**
         * Contains information about an invoice payment form.
         */
        public PaymentForm() {
        }

        /**
         * Contains information about an invoice payment form.
         *
         * @param id The payment form identifier.
         * @param type Type of the payment form.
         * @param sellerBotUserId User identifier of the seller bot.
         * @param productInfo Information about the product.
         */
        public PaymentForm(long id, PaymentFormType type, long sellerBotUserId, ProductInfo productInfo) {
            this.id = id;
            this.type = type;
            this.sellerBotUserId = sellerBotUserId;
            this.productInfo = productInfo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1998651315;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes type of payment form.
     */
    public abstract static class PaymentFormType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            PaymentFormTypeRegular.CONSTRUCTOR,
            PaymentFormTypeStars.CONSTRUCTOR,
            PaymentFormTypeStarSubscription.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public PaymentFormType() {
        }
    }

    /**
     * The payment form is for a regular payment.
     */
    public static class PaymentFormTypeRegular extends PaymentFormType {
        /**
         * Full information about the invoice.
         */
        public Invoice invoice;
        /**
         * User identifier of the payment provider bot.
         */
        public long paymentProviderUserId;
        /**
         * Information about the payment provider.
         */
        public PaymentProvider paymentProvider;
        /**
         * The list of additional payment options.
         */
        public PaymentOption[] additionalPaymentOptions;
        /**
         * Saved server-side order information; may be null.
         */
        @Nullable public OrderInfo savedOrderInfo;
        /**
         * The list of saved payment credentials.
         */
        public SavedCredentials[] savedCredentials;
        /**
         * True, if the user can choose to save credentials.
         */
        public boolean canSaveCredentials;
        /**
         * True, if the user will be able to save credentials, if sets up a 2-step verification password.
         */
        public boolean needPassword;

        /**
         * The payment form is for a regular payment.
         */
        public PaymentFormTypeRegular() {
        }

        /**
         * The payment form is for a regular payment.
         *
         * @param invoice Full information about the invoice.
         * @param paymentProviderUserId User identifier of the payment provider bot.
         * @param paymentProvider Information about the payment provider.
         * @param additionalPaymentOptions The list of additional payment options.
         * @param savedOrderInfo Saved server-side order information; may be null.
         * @param savedCredentials The list of saved payment credentials.
         * @param canSaveCredentials True, if the user can choose to save credentials.
         * @param needPassword True, if the user will be able to save credentials, if sets up a 2-step verification password.
         */
        public PaymentFormTypeRegular(Invoice invoice, long paymentProviderUserId, PaymentProvider paymentProvider, PaymentOption[] additionalPaymentOptions, OrderInfo savedOrderInfo, SavedCredentials[] savedCredentials, boolean canSaveCredentials, boolean needPassword) {
            this.invoice = invoice;
            this.paymentProviderUserId = paymentProviderUserId;
            this.paymentProvider = paymentProvider;
            this.additionalPaymentOptions = additionalPaymentOptions;
            this.savedOrderInfo = savedOrderInfo;
            this.savedCredentials = savedCredentials;
            this.canSaveCredentials = canSaveCredentials;
            this.needPassword = needPassword;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -615089778;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The payment form is for a payment in Telegram Stars.
     */
    public static class PaymentFormTypeStars extends PaymentFormType {
        /**
         * Number of Telegram Stars that will be paid.
         */
        public long starCount;

        /**
         * The payment form is for a payment in Telegram Stars.
         */
        public PaymentFormTypeStars() {
        }

        /**
         * The payment form is for a payment in Telegram Stars.
         *
         * @param starCount Number of Telegram Stars that will be paid.
         */
        public PaymentFormTypeStars(long starCount) {
            this.starCount = starCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 90938685;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The payment form is for a payment in Telegram Stars for subscription.
     */
    public static class PaymentFormTypeStarSubscription extends PaymentFormType {
        /**
         * Information about subscription plan.
         */
        public StarSubscriptionPricing pricing;

        /**
         * The payment form is for a payment in Telegram Stars for subscription.
         */
        public PaymentFormTypeStarSubscription() {
        }

        /**
         * The payment form is for a payment in Telegram Stars for subscription.
         *
         * @param pricing Information about subscription plan.
         */
        public PaymentFormTypeStarSubscription(StarSubscriptionPricing pricing) {
            this.pricing = pricing;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 271444827;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an additional payment option.
     */
    public static class PaymentOption extends Object {
        /**
         * Title for the payment option.
         */
        public String title;
        /**
         * Payment form URL to be opened in a web view.
         */
        public String url;

        /**
         * Describes an additional payment option.
         */
        public PaymentOption() {
        }

        /**
         * Describes an additional payment option.
         *
         * @param title Title for the payment option.
         * @param url Payment form URL to be opened in a web view.
         */
        public PaymentOption(String title, String url) {
            this.title = title;
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -294020965;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains information about a payment provider.
     */
    public abstract static class PaymentProvider extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            PaymentProviderSmartGlocal.CONSTRUCTOR,
            PaymentProviderStripe.CONSTRUCTOR,
            PaymentProviderOther.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public PaymentProvider() {
        }
    }

    /**
     * Smart Glocal payment provider.
     */
    public static class PaymentProviderSmartGlocal extends PaymentProvider {
        /**
         * Public payment token.
         */
        public String publicToken;
        /**
         * URL for sending card tokenization requests.
         */
        public String tokenizeUrl;

        /**
         * Smart Glocal payment provider.
         */
        public PaymentProviderSmartGlocal() {
        }

        /**
         * Smart Glocal payment provider.
         *
         * @param publicToken Public payment token.
         * @param tokenizeUrl URL for sending card tokenization requests.
         */
        public PaymentProviderSmartGlocal(String publicToken, String tokenizeUrl) {
            this.publicToken = publicToken;
            this.tokenizeUrl = tokenizeUrl;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1174112396;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Stripe payment provider.
     */
    public static class PaymentProviderStripe extends PaymentProvider {
        /**
         * Stripe API publishable key.
         */
        public String publishableKey;
        /**
         * True, if the user country must be provided.
         */
        public boolean needCountry;
        /**
         * True, if the user ZIP/postal code must be provided.
         */
        public boolean needPostalCode;
        /**
         * True, if the cardholder name must be provided.
         */
        public boolean needCardholderName;

        /**
         * Stripe payment provider.
         */
        public PaymentProviderStripe() {
        }

        /**
         * Stripe payment provider.
         *
         * @param publishableKey Stripe API publishable key.
         * @param needCountry True, if the user country must be provided.
         * @param needPostalCode True, if the user ZIP/postal code must be provided.
         * @param needCardholderName True, if the cardholder name must be provided.
         */
        public PaymentProviderStripe(String publishableKey, boolean needCountry, boolean needPostalCode, boolean needCardholderName) {
            this.publishableKey = publishableKey;
            this.needCountry = needCountry;
            this.needPostalCode = needPostalCode;
            this.needCardholderName = needCardholderName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 370467227;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Some other payment provider, for which a web payment form must be shown.
     */
    public static class PaymentProviderOther extends PaymentProvider {
        /**
         * Payment form URL.
         */
        public String url;

        /**
         * Some other payment provider, for which a web payment form must be shown.
         */
        public PaymentProviderOther() {
        }

        /**
         * Some other payment provider, for which a web payment form must be shown.
         *
         * @param url Payment form URL.
         */
        public PaymentProviderOther(String url) {
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1336876828;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a successful payment.
     */
    public static class PaymentReceipt extends Object {
        /**
         * Information about the product.
         */
        public ProductInfo productInfo;
        /**
         * Point in time (Unix timestamp) when the payment was made.
         */
        public int date;
        /**
         * User identifier of the seller bot.
         */
        public long sellerBotUserId;
        /**
         * Type of the payment receipt.
         */
        public PaymentReceiptType type;

        /**
         * Contains information about a successful payment.
         */
        public PaymentReceipt() {
        }

        /**
         * Contains information about a successful payment.
         *
         * @param productInfo Information about the product.
         * @param date Point in time (Unix timestamp) when the payment was made.
         * @param sellerBotUserId User identifier of the seller bot.
         * @param type Type of the payment receipt.
         */
        public PaymentReceipt(ProductInfo productInfo, int date, long sellerBotUserId, PaymentReceiptType type) {
            this.productInfo = productInfo;
            this.date = date;
            this.sellerBotUserId = sellerBotUserId;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 758199186;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes type of successful payment.
     */
    public abstract static class PaymentReceiptType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            PaymentReceiptTypeRegular.CONSTRUCTOR,
            PaymentReceiptTypeStars.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public PaymentReceiptType() {
        }
    }

    /**
     * The payment was done using a third-party payment provider.
     */
    public static class PaymentReceiptTypeRegular extends PaymentReceiptType {
        /**
         * User identifier of the payment provider bot.
         */
        public long paymentProviderUserId;
        /**
         * Information about the invoice.
         */
        public Invoice invoice;
        /**
         * Order information; may be null.
         */
        @Nullable public OrderInfo orderInfo;
        /**
         * Chosen shipping option; may be null.
         */
        @Nullable public ShippingOption shippingOption;
        /**
         * Title of the saved credentials chosen by the buyer.
         */
        public String credentialsTitle;
        /**
         * The amount of tip chosen by the buyer in the smallest units of the currency.
         */
        public long tipAmount;

        /**
         * The payment was done using a third-party payment provider.
         */
        public PaymentReceiptTypeRegular() {
        }

        /**
         * The payment was done using a third-party payment provider.
         *
         * @param paymentProviderUserId User identifier of the payment provider bot.
         * @param invoice Information about the invoice.
         * @param orderInfo Order information; may be null.
         * @param shippingOption Chosen shipping option; may be null.
         * @param credentialsTitle Title of the saved credentials chosen by the buyer.
         * @param tipAmount The amount of tip chosen by the buyer in the smallest units of the currency.
         */
        public PaymentReceiptTypeRegular(long paymentProviderUserId, Invoice invoice, OrderInfo orderInfo, ShippingOption shippingOption, String credentialsTitle, long tipAmount) {
            this.paymentProviderUserId = paymentProviderUserId;
            this.invoice = invoice;
            this.orderInfo = orderInfo;
            this.shippingOption = shippingOption;
            this.credentialsTitle = credentialsTitle;
            this.tipAmount = tipAmount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1636362826;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The payment was done using Telegram Stars.
     */
    public static class PaymentReceiptTypeStars extends PaymentReceiptType {
        /**
         * Number of Telegram Stars that were paid.
         */
        public long starCount;
        /**
         * Unique identifier of the transaction that can be used to dispute it.
         */
        public String transactionId;

        /**
         * The payment was done using Telegram Stars.
         */
        public PaymentReceiptTypeStars() {
        }

        /**
         * The payment was done using Telegram Stars.
         *
         * @param starCount Number of Telegram Stars that were paid.
         * @param transactionId Unique identifier of the transaction that can be used to dispute it.
         */
        public PaymentReceiptTypeStars(long starCount, String transactionId) {
            this.starCount = starCount;
            this.transactionId = transactionId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 294913868;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains the result of a payment request.
     */
    public static class PaymentResult extends Object {
        /**
         * True, if the payment request was successful; otherwise, the verificationUrl will be non-empty.
         */
        public boolean success;
        /**
         * URL for additional payment credentials verification.
         */
        public String verificationUrl;

        /**
         * Contains the result of a payment request.
         */
        public PaymentResult() {
        }

        /**
         * Contains the result of a payment request.
         *
         * @param success True, if the payment request was successful; otherwise, the verificationUrl will be non-empty.
         * @param verificationUrl URL for additional payment credentials verification.
         */
        public PaymentResult(boolean success, String verificationUrl) {
            this.success = success;
            this.verificationUrl = verificationUrl;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -804263843;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains the user's personal details.
     */
    public static class PersonalDetails extends Object {
        /**
         * First name of the user written in English; 1-255 characters.
         */
        public String firstName;
        /**
         * Middle name of the user written in English; 0-255 characters.
         */
        public String middleName;
        /**
         * Last name of the user written in English; 1-255 characters.
         */
        public String lastName;
        /**
         * Native first name of the user; 1-255 characters.
         */
        public String nativeFirstName;
        /**
         * Native middle name of the user; 0-255 characters.
         */
        public String nativeMiddleName;
        /**
         * Native last name of the user; 1-255 characters.
         */
        public String nativeLastName;
        /**
         * Birthdate of the user.
         */
        public Date birthdate;
        /**
         * Gender of the user, &quot;male&quot; or &quot;female&quot;.
         */
        public String gender;
        /**
         * A two-letter ISO 3166-1 alpha-2 country code of the user's country.
         */
        public String countryCode;
        /**
         * A two-letter ISO 3166-1 alpha-2 country code of the user's residence country.
         */
        public String residenceCountryCode;

        /**
         * Contains the user's personal details.
         */
        public PersonalDetails() {
        }

        /**
         * Contains the user's personal details.
         *
         * @param firstName First name of the user written in English; 1-255 characters.
         * @param middleName Middle name of the user written in English; 0-255 characters.
         * @param lastName Last name of the user written in English; 1-255 characters.
         * @param nativeFirstName Native first name of the user; 1-255 characters.
         * @param nativeMiddleName Native middle name of the user; 0-255 characters.
         * @param nativeLastName Native last name of the user; 1-255 characters.
         * @param birthdate Birthdate of the user.
         * @param gender Gender of the user, &quot;male&quot; or &quot;female&quot;.
         * @param countryCode A two-letter ISO 3166-1 alpha-2 country code of the user's country.
         * @param residenceCountryCode A two-letter ISO 3166-1 alpha-2 country code of the user's residence country.
         */
        public PersonalDetails(String firstName, String middleName, String lastName, String nativeFirstName, String nativeMiddleName, String nativeLastName, Date birthdate, String gender, String countryCode, String residenceCountryCode) {
            this.firstName = firstName;
            this.middleName = middleName;
            this.lastName = lastName;
            this.nativeFirstName = nativeFirstName;
            this.nativeMiddleName = nativeMiddleName;
            this.nativeLastName = nativeLastName;
            this.birthdate = birthdate;
            this.gender = gender;
            this.countryCode = countryCode;
            this.residenceCountryCode = residenceCountryCode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1061656137;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A personal document, containing some information about a user.
     */
    public static class PersonalDocument extends Object {
        /**
         * List of files containing the pages of the document.
         */
        public DatedFile[] files;
        /**
         * List of files containing a certified English translation of the document.
         */
        public DatedFile[] translation;

        /**
         * A personal document, containing some information about a user.
         */
        public PersonalDocument() {
        }

        /**
         * A personal document, containing some information about a user.
         *
         * @param files List of files containing the pages of the document.
         * @param translation List of files containing a certified English translation of the document.
         */
        public PersonalDocument(DatedFile[] files, DatedFile[] translation) {
            this.files = files;
            this.translation = translation;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1011634661;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains settings for the authentication of the user's phone number.
     */
    public static class PhoneNumberAuthenticationSettings extends Object {
        /**
         * Pass true if the authentication code may be sent via a flash call to the specified phone number.
         */
        public boolean allowFlashCall;
        /**
         * Pass true if the authentication code may be sent via a missed call to the specified phone number.
         */
        public boolean allowMissedCall;
        /**
         * Pass true if the authenticated phone number is used on the current device.
         */
        public boolean isCurrentPhoneNumber;
        /**
         * Pass true if there is a SIM card in the current device, but it is not possible to check whether phone number matches.
         */
        public boolean hasUnknownPhoneNumber;
        /**
         * For official applications only. True, if the application can use Android SMS Retriever API (requires Google Play Services &gt;= 10.2) to automatically receive the authentication code from the SMS. See https://developers.google.com/identity/sms-retriever/ for more details.
         */
        public boolean allowSmsRetrieverApi;
        /**
         * For official Android and iOS applications only; pass null otherwise. Settings for Firebase Authentication.
         */
        public FirebaseAuthenticationSettings firebaseAuthenticationSettings;
        /**
         * List of up to 20 authentication tokens, recently received in updateOption(&quot;authentication_token&quot;) in previously logged out sessions; for setAuthenticationPhoneNumber only.
         */
        public String[] authenticationTokens;

        /**
         * Contains settings for the authentication of the user's phone number.
         */
        public PhoneNumberAuthenticationSettings() {
        }

        /**
         * Contains settings for the authentication of the user's phone number.
         *
         * @param allowFlashCall Pass true if the authentication code may be sent via a flash call to the specified phone number.
         * @param allowMissedCall Pass true if the authentication code may be sent via a missed call to the specified phone number.
         * @param isCurrentPhoneNumber Pass true if the authenticated phone number is used on the current device.
         * @param hasUnknownPhoneNumber Pass true if there is a SIM card in the current device, but it is not possible to check whether phone number matches.
         * @param allowSmsRetrieverApi For official applications only. True, if the application can use Android SMS Retriever API (requires Google Play Services &gt;= 10.2) to automatically receive the authentication code from the SMS. See https://developers.google.com/identity/sms-retriever/ for more details.
         * @param firebaseAuthenticationSettings For official Android and iOS applications only; pass null otherwise. Settings for Firebase Authentication.
         * @param authenticationTokens List of up to 20 authentication tokens, recently received in updateOption(&quot;authentication_token&quot;) in previously logged out sessions; for setAuthenticationPhoneNumber only.
         */
        public PhoneNumberAuthenticationSettings(boolean allowFlashCall, boolean allowMissedCall, boolean isCurrentPhoneNumber, boolean hasUnknownPhoneNumber, boolean allowSmsRetrieverApi, FirebaseAuthenticationSettings firebaseAuthenticationSettings, String[] authenticationTokens) {
            this.allowFlashCall = allowFlashCall;
            this.allowMissedCall = allowMissedCall;
            this.isCurrentPhoneNumber = isCurrentPhoneNumber;
            this.hasUnknownPhoneNumber = hasUnknownPhoneNumber;
            this.allowSmsRetrieverApi = allowSmsRetrieverApi;
            this.firebaseAuthenticationSettings = firebaseAuthenticationSettings;
            this.authenticationTokens = authenticationTokens;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1881885547;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes type of the request for which a code is sent to a phone number.
     */
    public abstract static class PhoneNumberCodeType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            PhoneNumberCodeTypeChange.CONSTRUCTOR,
            PhoneNumberCodeTypeVerify.CONSTRUCTOR,
            PhoneNumberCodeTypeConfirmOwnership.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public PhoneNumberCodeType() {
        }
    }

    /**
     * Checks ownership of a new phone number to change the user's authentication phone number; for official Android and iOS applications only.
     */
    public static class PhoneNumberCodeTypeChange extends PhoneNumberCodeType {

        /**
         * Checks ownership of a new phone number to change the user's authentication phone number; for official Android and iOS applications only.
         */
        public PhoneNumberCodeTypeChange() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 87144986;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Verifies ownership of a phone number to be added to the user's Telegram Passport.
     */
    public static class PhoneNumberCodeTypeVerify extends PhoneNumberCodeType {

        /**
         * Verifies ownership of a phone number to be added to the user's Telegram Passport.
         */
        public PhoneNumberCodeTypeVerify() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1029402661;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Confirms ownership of a phone number to prevent account deletion while handling links of the type internalLinkTypePhoneNumberConfirmation.
     */
    public static class PhoneNumberCodeTypeConfirmOwnership extends PhoneNumberCodeType {
        /**
         * Hash value from the link.
         */
        public String hash;

        /**
         * Confirms ownership of a phone number to prevent account deletion while handling links of the type internalLinkTypePhoneNumberConfirmation.
         */
        public PhoneNumberCodeTypeConfirmOwnership() {
        }

        /**
         * Confirms ownership of a phone number to prevent account deletion while handling links of the type internalLinkTypePhoneNumberConfirmation.
         *
         * @param hash Hash value from the link.
         */
        public PhoneNumberCodeTypeConfirmOwnership(String hash) {
            this.hash = hash;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -485404696;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a phone number.
     */
    public static class PhoneNumberInfo extends Object {
        /**
         * Information about the country to which the phone number belongs; may be null.
         */
        @Nullable public CountryInfo country;
        /**
         * The part of the phone number denoting country calling code or its part.
         */
        public String countryCallingCode;
        /**
         * The phone number without country calling code formatted accordingly to local rules. Expected digits are returned as '-', but even more digits might be entered by the user.
         */
        public String formattedPhoneNumber;
        /**
         * True, if the phone number was bought at https://fragment.com and isn't tied to a SIM card. Information about the phone number can be received using getCollectibleItemInfo.
         */
        public boolean isAnonymous;

        /**
         * Contains information about a phone number.
         */
        public PhoneNumberInfo() {
        }

        /**
         * Contains information about a phone number.
         *
         * @param country Information about the country to which the phone number belongs; may be null.
         * @param countryCallingCode The part of the phone number denoting country calling code or its part.
         * @param formattedPhoneNumber The phone number without country calling code formatted accordingly to local rules. Expected digits are returned as '-', but even more digits might be entered by the user.
         * @param isAnonymous True, if the phone number was bought at https://fragment.com and isn't tied to a SIM card. Information about the phone number can be received using getCollectibleItemInfo.
         */
        public PhoneNumberInfo(CountryInfo country, String countryCallingCode, String formattedPhoneNumber, boolean isAnonymous) {
            this.country = country;
            this.countryCallingCode = countryCallingCode;
            this.formattedPhoneNumber = formattedPhoneNumber;
            this.isAnonymous = isAnonymous;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -758933343;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a photo.
     */
    public static class Photo extends Object {
        /**
         * True, if stickers were added to the photo. The list of corresponding sticker sets can be received using getAttachedStickerSets.
         */
        public boolean hasStickers;
        /**
         * Photo minithumbnail; may be null.
         */
        @Nullable public Minithumbnail minithumbnail;
        /**
         * Available variants of the photo, in different sizes.
         */
        public PhotoSize[] sizes;

        /**
         * Describes a photo.
         */
        public Photo() {
        }

        /**
         * Describes a photo.
         *
         * @param hasStickers True, if stickers were added to the photo. The list of corresponding sticker sets can be received using getAttachedStickerSets.
         * @param minithumbnail Photo minithumbnail; may be null.
         * @param sizes Available variants of the photo, in different sizes.
         */
        public Photo(boolean hasStickers, Minithumbnail minithumbnail, PhotoSize[] sizes) {
            this.hasStickers = hasStickers;
            this.minithumbnail = minithumbnail;
            this.sizes = sizes;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2022871583;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an image in JPEG format.
     */
    public static class PhotoSize extends Object {
        /**
         * Image type (see https://core.telegram.org/constructor/photoSize).
         */
        public String type;
        /**
         * Information about the image file.
         */
        public File photo;
        /**
         * Image width.
         */
        public int width;
        /**
         * Image height.
         */
        public int height;
        /**
         * Sizes of progressive JPEG file prefixes, which can be used to preliminarily show the image; in bytes.
         */
        public int[] progressiveSizes;

        /**
         * Describes an image in JPEG format.
         */
        public PhotoSize() {
        }

        /**
         * Describes an image in JPEG format.
         *
         * @param type Image type (see https://core.telegram.org/constructor/photoSize).
         * @param photo Information about the image file.
         * @param width Image width.
         * @param height Image height.
         * @param progressiveSizes Sizes of progressive JPEG file prefixes, which can be used to preliminarily show the image; in bytes.
         */
        public PhotoSize(String type, File photo, int width, int height, int[] progressiveSizes) {
            this.type = type;
            this.photo = photo;
            this.width = width;
            this.height = height;
            this.progressiveSizes = progressiveSizes;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1609182352;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A point on a Cartesian plane.
     */
    public static class Point extends Object {
        /**
         * The point's first coordinate.
         */
        public double x;
        /**
         * The point's second coordinate.
         */
        public double y;

        /**
         * A point on a Cartesian plane.
         */
        public Point() {
        }

        /**
         * A point on a Cartesian plane.
         *
         * @param x The point's first coordinate.
         * @param y The point's second coordinate.
         */
        public Point(double x, double y) {
            this.x = x;
            this.y = y;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 437515705;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a poll.
     */
    public static class Poll extends Object {
        /**
         * Unique poll identifier.
         */
        public long id;
        /**
         * Poll question; 1-300 characters; may contain only custom emoji entities.
         */
        public FormattedText question;
        /**
         * List of poll answer options.
         */
        public PollOption[] options;
        /**
         * Total number of voters, participating in the poll.
         */
        public int totalVoterCount;
        /**
         * Identifiers of recent voters, if the poll is non-anonymous and poll results are available.
         */
        public MessageSender[] recentVoterIds;
        /**
         * True, if the current user can get voters in the poll using getPollVoters.
         */
        public boolean canGetVoters;
        /**
         * True, if the poll is anonymous.
         */
        public boolean isAnonymous;
        /**
         * True, if multiple answer options can be chosen simultaneously.
         */
        public boolean allowsMultipleAnswers;
        /**
         * True, if the poll can be answered multiple times.
         */
        public boolean allowsRevoting;
        /**
         * True, if only the users that are members of the chat for more than a day will be able to vote.
         */
        public boolean membersOnly;
        /**
         * The list of two-letter ISO 3166-1 alpha-2 codes of countries, users from which will be able to vote. If empty, then all users can participate in the poll.
         */
        public String[] countryCodes;
        /**
         * The list of 0-based poll identifiers in which the options of the poll must be shown; empty if the order of options must not be changed.
         */
        public int[] optionOrder;
        /**
         * Type of the poll.
         */
        public PollType type;
        /**
         * Amount of time the poll will be active after creation, in seconds.
         */
        public int openPeriod;
        /**
         * Point in time (Unix timestamp) when the poll will automatically be closed.
         */
        public int closeDate;
        /**
         * True, if the poll is closed.
         */
        public boolean isClosed;
        /**
         * The reason describing, why the current user can't vote in the poll; may be null if the user can vote in the poll.
         */
        @Nullable public PollVoteRestrictionReason voteRestrictionReason;

        /**
         * Describes a poll.
         */
        public Poll() {
        }

        /**
         * Describes a poll.
         *
         * @param id Unique poll identifier.
         * @param question Poll question; 1-300 characters; may contain only custom emoji entities.
         * @param options List of poll answer options.
         * @param totalVoterCount Total number of voters, participating in the poll.
         * @param recentVoterIds Identifiers of recent voters, if the poll is non-anonymous and poll results are available.
         * @param canGetVoters True, if the current user can get voters in the poll using getPollVoters.
         * @param isAnonymous True, if the poll is anonymous.
         * @param allowsMultipleAnswers True, if multiple answer options can be chosen simultaneously.
         * @param allowsRevoting True, if the poll can be answered multiple times.
         * @param membersOnly True, if only the users that are members of the chat for more than a day will be able to vote.
         * @param countryCodes The list of two-letter ISO 3166-1 alpha-2 codes of countries, users from which will be able to vote. If empty, then all users can participate in the poll.
         * @param optionOrder The list of 0-based poll identifiers in which the options of the poll must be shown; empty if the order of options must not be changed.
         * @param type Type of the poll.
         * @param openPeriod Amount of time the poll will be active after creation, in seconds.
         * @param closeDate Point in time (Unix timestamp) when the poll will automatically be closed.
         * @param isClosed True, if the poll is closed.
         * @param voteRestrictionReason The reason describing, why the current user can't vote in the poll; may be null if the user can vote in the poll.
         */
        public Poll(long id, FormattedText question, PollOption[] options, int totalVoterCount, MessageSender[] recentVoterIds, boolean canGetVoters, boolean isAnonymous, boolean allowsMultipleAnswers, boolean allowsRevoting, boolean membersOnly, String[] countryCodes, int[] optionOrder, PollType type, int openPeriod, int closeDate, boolean isClosed, PollVoteRestrictionReason voteRestrictionReason) {
            this.id = id;
            this.question = question;
            this.options = options;
            this.totalVoterCount = totalVoterCount;
            this.recentVoterIds = recentVoterIds;
            this.canGetVoters = canGetVoters;
            this.isAnonymous = isAnonymous;
            this.allowsMultipleAnswers = allowsMultipleAnswers;
            this.allowsRevoting = allowsRevoting;
            this.membersOnly = membersOnly;
            this.countryCodes = countryCodes;
            this.optionOrder = optionOrder;
            this.type = type;
            this.openPeriod = openPeriod;
            this.closeDate = closeDate;
            this.isClosed = isClosed;
            this.voteRestrictionReason = voteRestrictionReason;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 438560099;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes one answer option of a poll.
     */
    public static class PollOption extends Object {
        /**
         * Unique identifier of the option in the poll; may be empty if yet unassigned.
         */
        public String id;
        /**
         * Option text; 1-100 characters; may contain only custom emoji entities.
         */
        public FormattedText text;
        /**
         * Option media; may be null if none. If present, currently, can be only of the types messageAnimation, messageLocation, messagePhoto, messageSticker, messageVenue, or messageVideo without caption.
         */
        @Nullable public MessageContent media;
        /**
         * Number of voters for this option, available only for closed or voted polls, or if the current user is the creator of the poll.
         */
        public int voterCount;
        /**
         * The percentage of votes for this option; 0-100.
         */
        public int votePercentage;
        /**
         * Identifiers of recent voters for the option, if the poll is non-anonymous and poll results are available.
         */
        public MessageSender[] recentVoterIds;
        /**
         * True, if the option was chosen by the user.
         */
        public boolean isChosen;
        /**
         * True, if the option is being chosen by a pending setPollAnswer request.
         */
        public boolean isBeingChosen;
        /**
         * Identifier of the user or chat who added the option; may be null if the option existed from creation of the poll.
         */
        @Nullable public MessageSender author;
        /**
         * Point in time (Unix timestamp) when the option was added; 0 if the option existed from creation of the poll.
         */
        public int additionDate;

        /**
         * Describes one answer option of a poll.
         */
        public PollOption() {
        }

        /**
         * Describes one answer option of a poll.
         *
         * @param id Unique identifier of the option in the poll; may be empty if yet unassigned.
         * @param text Option text; 1-100 characters; may contain only custom emoji entities.
         * @param media Option media; may be null if none. If present, currently, can be only of the types messageAnimation, messageLocation, messagePhoto, messageSticker, messageVenue, or messageVideo without caption.
         * @param voterCount Number of voters for this option, available only for closed or voted polls, or if the current user is the creator of the poll.
         * @param votePercentage The percentage of votes for this option; 0-100.
         * @param recentVoterIds Identifiers of recent voters for the option, if the poll is non-anonymous and poll results are available.
         * @param isChosen True, if the option was chosen by the user.
         * @param isBeingChosen True, if the option is being chosen by a pending setPollAnswer request.
         * @param author Identifier of the user or chat who added the option; may be null if the option existed from creation of the poll.
         * @param additionDate Point in time (Unix timestamp) when the option was added; 0 if the option existed from creation of the poll.
         */
        public PollOption(String id, FormattedText text, MessageContent media, int voterCount, int votePercentage, MessageSender[] recentVoterIds, boolean isChosen, boolean isBeingChosen, MessageSender author, int additionDate) {
            this.id = id;
            this.text = text;
            this.media = media;
            this.voterCount = voterCount;
            this.votePercentage = votePercentage;
            this.recentVoterIds = recentVoterIds;
            this.isChosen = isChosen;
            this.isBeingChosen = isBeingChosen;
            this.author = author;
            this.additionDate = additionDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 94416337;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains properties of a poll option and describes actions that can be done with the option right now.
     */
    public static class PollOptionProperties extends Object {
        /**
         * True, if the option can be deleted using deletePollOption.
         */
        public boolean canBeDeleted;
        /**
         * True, if the poll option can be replied in the same chat and forum topic using inputMessageReplyToMessage.
         */
        public boolean canBeReplied;
        /**
         * True, if the poll option can be replied in another chat or forum topic using inputMessageReplyToExternalMessage.
         */
        public boolean canBeRepliedInAnotherChat;
        /**
         * True, if a link can be generated for the poll option using getMessageLink.
         */
        public boolean canGetLink;

        /**
         * Contains properties of a poll option and describes actions that can be done with the option right now.
         */
        public PollOptionProperties() {
        }

        /**
         * Contains properties of a poll option and describes actions that can be done with the option right now.
         *
         * @param canBeDeleted True, if the option can be deleted using deletePollOption.
         * @param canBeReplied True, if the poll option can be replied in the same chat and forum topic using inputMessageReplyToMessage.
         * @param canBeRepliedInAnotherChat True, if the poll option can be replied in another chat or forum topic using inputMessageReplyToExternalMessage.
         * @param canGetLink True, if a link can be generated for the poll option using getMessageLink.
         */
        public PollOptionProperties(boolean canBeDeleted, boolean canBeReplied, boolean canBeRepliedInAnotherChat, boolean canGetLink) {
            this.canBeDeleted = canBeDeleted;
            this.canBeReplied = canBeReplied;
            this.canBeRepliedInAnotherChat = canBeRepliedInAnotherChat;
            this.canGetLink = canGetLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -269854419;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the type of poll.
     */
    public abstract static class PollType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            PollTypeRegular.CONSTRUCTOR,
            PollTypeQuiz.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public PollType() {
        }
    }

    /**
     * A regular poll.
     */
    public static class PollTypeRegular extends PollType {

        /**
         * A regular poll.
         */
        public PollTypeRegular() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 823249292;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A poll in quiz mode, which has predefined correct answers.
     */
    public static class PollTypeQuiz extends PollType {
        /**
         * Increasing list of 0-based identifiers of the correct answer options; empty for a yet unanswered poll.
         */
        public int[] correctOptionIds;
        /**
         * Text that is shown when the user chooses an incorrect answer or taps on the lamp icon; empty for a yet unanswered poll.
         */
        public FormattedText explanation;
        /**
         * Media that is shown when the user chooses an incorrect answer or taps on the lamp icon; may be null if none or the poll is unanswered yet. If present, currently, can be only of the types messageAnimation, messageAudio, messageDocument, messageLocation, messagePhoto, messageVenue, or messageVideo without caption.
         */
        @Nullable public MessageContent explanationMedia;

        /**
         * A poll in quiz mode, which has predefined correct answers.
         */
        public PollTypeQuiz() {
        }

        /**
         * A poll in quiz mode, which has predefined correct answers.
         *
         * @param correctOptionIds Increasing list of 0-based identifiers of the correct answer options; empty for a yet unanswered poll.
         * @param explanation Text that is shown when the user chooses an incorrect answer or taps on the lamp icon; empty for a yet unanswered poll.
         * @param explanationMedia Media that is shown when the user chooses an incorrect answer or taps on the lamp icon; may be null if none or the poll is unanswered yet. If present, currently, can be only of the types messageAnimation, messageAudio, messageDocument, messageLocation, messagePhoto, messageVenue, or messageVideo without caption.
         */
        public PollTypeQuiz(int[] correctOptionIds, FormattedText explanation, MessageContent explanationMedia) {
            this.correctOptionIds = correctOptionIds;
            this.explanation = explanation;
            this.explanationMedia = explanationMedia;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1205882530;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Reason of vote restriction in the poll for the current user.
     */
    public abstract static class PollVoteRestrictionReason extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            PollVoteRestrictionReasonClosed.CONSTRUCTOR,
            PollVoteRestrictionReasonYetUnsent.CONSTRUCTOR,
            PollVoteRestrictionReasonScheduled.CONSTRUCTOR,
            PollVoteRestrictionReasonCountryRestricted.CONSTRUCTOR,
            PollVoteRestrictionReasonMembershipRequired.CONSTRUCTOR,
            PollVoteRestrictionReasonOther.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public PollVoteRestrictionReason() {
        }
    }

    /**
     * The poll is closed.
     */
    public static class PollVoteRestrictionReasonClosed extends PollVoteRestrictionReason {

        /**
         * The poll is closed.
         */
        public PollVoteRestrictionReasonClosed() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 650593758;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The poll isn't sent yet.
     */
    public static class PollVoteRestrictionReasonYetUnsent extends PollVoteRestrictionReason {

        /**
         * The poll isn't sent yet.
         */
        public PollVoteRestrictionReasonYetUnsent() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1322383969;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The poll is from a scheduled message.
     */
    public static class PollVoteRestrictionReasonScheduled extends PollVoteRestrictionReason {

        /**
         * The poll is from a scheduled message.
         */
        public PollVoteRestrictionReasonScheduled() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -693222354;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user is from a country, users from which aren't allowed to vote.
     */
    public static class PollVoteRestrictionReasonCountryRestricted extends PollVoteRestrictionReason {
        /**
         * Two-letter ISO 3166-1 alpha-2 code of the current user's country.
         */
        public String countryCode;

        /**
         * The user is from a country, users from which aren't allowed to vote.
         */
        public PollVoteRestrictionReasonCountryRestricted() {
        }

        /**
         * The user is from a country, users from which aren't allowed to vote.
         *
         * @param countryCode Two-letter ISO 3166-1 alpha-2 code of the current user's country.
         */
        public PollVoteRestrictionReasonCountryRestricted(String countryCode) {
            this.countryCode = countryCode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1009950456;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user must be a member of the chat for at least a day to vote.
     */
    public static class PollVoteRestrictionReasonMembershipRequired extends PollVoteRestrictionReason {
        /**
         * Identifier of the chat which must be joined for at least a day before the user can vote.
         */
        public long chatId;

        /**
         * The user must be a member of the chat for at least a day to vote.
         */
        public PollVoteRestrictionReasonMembershipRequired() {
        }

        /**
         * The user must be a member of the chat for at least a day to vote.
         *
         * @param chatId Identifier of the chat which must be joined for at least a day before the user can vote.
         */
        public PollVoteRestrictionReasonMembershipRequired(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1231796287;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The poll can't be voted by the user due to some other reason.
     */
    public static class PollVoteRestrictionReasonOther extends PollVoteRestrictionReason {

        /**
         * The poll can't be voted by the user due to some other reason.
         */
        public PollVoteRestrictionReasonOther() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1479377401;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A detailed statistics about poll votes.
     */
    public static class PollVoteStatistics extends Object {
        /**
         * A graph containing distribution of votes in the poll.
         */
        public StatisticalGraph voteGraph;

        /**
         * A detailed statistics about poll votes.
         */
        public PollVoteStatistics() {
        }

        /**
         * A detailed statistics about poll votes.
         *
         * @param voteGraph A graph containing distribution of votes in the poll.
         */
        public PollVoteStatistics(StatisticalGraph voteGraph) {
            this.voteGraph = voteGraph;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 323339087;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a poll voter.
     */
    public static class PollVoter extends Object {
        /**
         * The voter identifier.
         */
        public MessageSender voterId;
        /**
         * Point in time (Unix timestamp) when the vote was added.
         */
        public int date;

        /**
         * Represents a poll voter.
         */
        public PollVoter() {
        }

        /**
         * Represents a poll voter.
         *
         * @param voterId The voter identifier.
         * @param date Point in time (Unix timestamp) when the vote was added.
         */
        public PollVoter(MessageSender voterId, int date) {
            this.voterId = voterId;
            this.date = date;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1354417305;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of poll voters.
     */
    public static class PollVoters extends Object {
        /**
         * Approximate total number of poll voters found.
         */
        public int totalCount;
        /**
         * List of poll voters.
         */
        public PollVoter[] voters;

        /**
         * Represents a list of poll voters.
         */
        public PollVoters() {
        }

        /**
         * Represents a list of poll voters.
         *
         * @param totalCount Approximate total number of poll voters found.
         * @param voters List of poll voters.
         */
        public PollVoters(int totalCount, PollVoter[] voters) {
            this.totalCount = totalCount;
            this.voters = voters;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1255612789;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a feature available to Premium users.
     */
    public abstract static class PremiumFeature extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            PremiumFeatureIncreasedLimits.CONSTRUCTOR,
            PremiumFeatureIncreasedUploadFileSize.CONSTRUCTOR,
            PremiumFeatureImprovedDownloadSpeed.CONSTRUCTOR,
            PremiumFeatureVoiceRecognition.CONSTRUCTOR,
            PremiumFeatureDisabledAds.CONSTRUCTOR,
            PremiumFeatureUniqueReactions.CONSTRUCTOR,
            PremiumFeatureUniqueStickers.CONSTRUCTOR,
            PremiumFeatureCustomEmoji.CONSTRUCTOR,
            PremiumFeatureAdvancedChatManagement.CONSTRUCTOR,
            PremiumFeatureProfileBadge.CONSTRUCTOR,
            PremiumFeatureEmojiStatus.CONSTRUCTOR,
            PremiumFeatureAnimatedProfilePhoto.CONSTRUCTOR,
            PremiumFeatureForumTopicIcon.CONSTRUCTOR,
            PremiumFeatureAppIcons.CONSTRUCTOR,
            PremiumFeatureRealTimeChatTranslation.CONSTRUCTOR,
            PremiumFeatureUpgradedStories.CONSTRUCTOR,
            PremiumFeatureChatBoost.CONSTRUCTOR,
            PremiumFeatureAccentColor.CONSTRUCTOR,
            PremiumFeatureBackgroundForBoth.CONSTRUCTOR,
            PremiumFeatureSavedMessagesTags.CONSTRUCTOR,
            PremiumFeatureMessagePrivacy.CONSTRUCTOR,
            PremiumFeatureLastSeenTimes.CONSTRUCTOR,
            PremiumFeatureBusiness.CONSTRUCTOR,
            PremiumFeatureMessageEffects.CONSTRUCTOR,
            PremiumFeatureChecklists.CONSTRUCTOR,
            PremiumFeaturePaidMessages.CONSTRUCTOR,
            PremiumFeatureProtectPrivateChatContent.CONSTRUCTOR,
            PremiumFeatureTextComposition.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public PremiumFeature() {
        }
    }

    /**
     * Increased limits.
     */
    public static class PremiumFeatureIncreasedLimits extends PremiumFeature {

        /**
         * Increased limits.
         */
        public PremiumFeatureIncreasedLimits() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1785455031;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Increased maximum upload file size.
     */
    public static class PremiumFeatureIncreasedUploadFileSize extends PremiumFeature {

        /**
         * Increased maximum upload file size.
         */
        public PremiumFeatureIncreasedUploadFileSize() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1825367155;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Improved download speed.
     */
    public static class PremiumFeatureImprovedDownloadSpeed extends PremiumFeature {

        /**
         * Improved download speed.
         */
        public PremiumFeatureImprovedDownloadSpeed() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -267695554;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to convert voice notes to text.
     */
    public static class PremiumFeatureVoiceRecognition extends PremiumFeature {

        /**
         * The ability to convert voice notes to text.
         */
        public PremiumFeatureVoiceRecognition() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1288216542;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Disabled ads.
     */
    public static class PremiumFeatureDisabledAds extends PremiumFeature {

        /**
         * Disabled ads.
         */
        public PremiumFeatureDisabledAds() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2008587702;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Allowed to use more reactions.
     */
    public static class PremiumFeatureUniqueReactions extends PremiumFeature {

        /**
         * Allowed to use more reactions.
         */
        public PremiumFeatureUniqueReactions() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 766750743;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Allowed to use premium stickers with unique effects.
     */
    public static class PremiumFeatureUniqueStickers extends PremiumFeature {

        /**
         * Allowed to use premium stickers with unique effects.
         */
        public PremiumFeatureUniqueStickers() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2101773312;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Allowed to use custom emoji stickers in message texts and captions.
     */
    public static class PremiumFeatureCustomEmoji extends PremiumFeature {

        /**
         * Allowed to use custom emoji stickers in message texts and captions.
         */
        public PremiumFeatureCustomEmoji() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1332599628;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Ability to change position of the main chat list, archive and mute all new chats from non-contacts, and completely disable notifications about the user's contacts joined Telegram.
     */
    public static class PremiumFeatureAdvancedChatManagement extends PremiumFeature {

        /**
         * Ability to change position of the main chat list, archive and mute all new chats from non-contacts, and completely disable notifications about the user's contacts joined Telegram.
         */
        public PremiumFeatureAdvancedChatManagement() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 796347674;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A badge in the user's profile.
     */
    public static class PremiumFeatureProfileBadge extends PremiumFeature {

        /**
         * A badge in the user's profile.
         */
        public PremiumFeatureProfileBadge() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 233648322;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to show an emoji status along with the user's name.
     */
    public static class PremiumFeatureEmojiStatus extends PremiumFeature {

        /**
         * The ability to show an emoji status along with the user's name.
         */
        public PremiumFeatureEmojiStatus() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -36516639;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Profile photo animation on message and chat screens.
     */
    public static class PremiumFeatureAnimatedProfilePhoto extends PremiumFeature {

        /**
         * Profile photo animation on message and chat screens.
         */
        public PremiumFeatureAnimatedProfilePhoto() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -100741914;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to set a custom emoji as a forum topic icon.
     */
    public static class PremiumFeatureForumTopicIcon extends PremiumFeature {

        /**
         * The ability to set a custom emoji as a forum topic icon.
         */
        public PremiumFeatureForumTopicIcon() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -823172286;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Allowed to set a premium application icons.
     */
    public static class PremiumFeatureAppIcons extends PremiumFeature {

        /**
         * Allowed to set a premium application icons.
         */
        public PremiumFeatureAppIcons() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1585050761;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Allowed to translate chat messages real-time.
     */
    public static class PremiumFeatureRealTimeChatTranslation extends PremiumFeature {

        /**
         * Allowed to translate chat messages real-time.
         */
        public PremiumFeatureRealTimeChatTranslation() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1143471488;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Allowed to use many additional features for stories.
     */
    public static class PremiumFeatureUpgradedStories extends PremiumFeature {

        /**
         * Allowed to use many additional features for stories.
         */
        public PremiumFeatureUpgradedStories() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1878522597;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to boost chats.
     */
    public static class PremiumFeatureChatBoost extends PremiumFeature {

        /**
         * The ability to boost chats.
         */
        public PremiumFeatureChatBoost() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1576574747;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to choose accent color for replies and user profile.
     */
    public static class PremiumFeatureAccentColor extends PremiumFeature {

        /**
         * The ability to choose accent color for replies and user profile.
         */
        public PremiumFeatureAccentColor() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 907724190;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to set private chat background for both users.
     */
    public static class PremiumFeatureBackgroundForBoth extends PremiumFeature {

        /**
         * The ability to set private chat background for both users.
         */
        public PremiumFeatureBackgroundForBoth() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 575074042;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to use tags in Saved Messages.
     */
    public static class PremiumFeatureSavedMessagesTags extends PremiumFeature {

        /**
         * The ability to use tags in Saved Messages.
         */
        public PremiumFeatureSavedMessagesTags() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1003219334;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to disallow incoming voice and video note messages in private chats using setUserPrivacySettingRules with userPrivacySettingAllowPrivateVoiceAndVideoNoteMessages and to restrict incoming messages from non-contacts using setNewChatPrivacySettings.
     */
    public static class PremiumFeatureMessagePrivacy extends PremiumFeature {

        /**
         * The ability to disallow incoming voice and video note messages in private chats using setUserPrivacySettingRules with userPrivacySettingAllowPrivateVoiceAndVideoNoteMessages and to restrict incoming messages from non-contacts using setNewChatPrivacySettings.
         */
        public PremiumFeatureMessagePrivacy() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 802322678;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to view last seen and read times of other users even if they can't view last seen or read time for the current user.
     */
    public static class PremiumFeatureLastSeenTimes extends PremiumFeature {

        /**
         * The ability to view last seen and read times of other users even if they can't view last seen or read time for the current user.
         */
        public PremiumFeatureLastSeenTimes() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -762230129;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to use Business features.
     */
    public static class PremiumFeatureBusiness extends PremiumFeature {

        /**
         * The ability to use Business features.
         */
        public PremiumFeatureBusiness() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1503619324;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to use all available message effects.
     */
    public static class PremiumFeatureMessageEffects extends PremiumFeature {

        /**
         * The ability to use all available message effects.
         */
        public PremiumFeatureMessageEffects() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -723300255;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to create and use checklist messages.
     */
    public static class PremiumFeatureChecklists extends PremiumFeature {

        /**
         * The ability to create and use checklist messages.
         */
        public PremiumFeatureChecklists() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1128709251;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to require a payment for incoming messages in new chats.
     */
    public static class PremiumFeaturePaidMessages extends PremiumFeature {

        /**
         * The ability to require a payment for incoming messages in new chats.
         */
        public PremiumFeaturePaidMessages() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2063708431;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to enable content protection in private chats.
     */
    public static class PremiumFeatureProtectPrivateChatContent extends PremiumFeature {

        /**
         * The ability to enable content protection in private chats.
         */
        public PremiumFeatureProtectPrivateChatContent() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -565938675;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to compose text with AI.
     */
    public static class PremiumFeatureTextComposition extends PremiumFeature {

        /**
         * The ability to compose text with AI.
         */
        public PremiumFeatureTextComposition() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 210899877;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a promotion animation for a Premium feature.
     */
    public static class PremiumFeaturePromotionAnimation extends Object {
        /**
         * Premium feature.
         */
        public PremiumFeature feature;
        /**
         * Promotion animation for the feature.
         */
        public Animation animation;

        /**
         * Describes a promotion animation for a Premium feature.
         */
        public PremiumFeaturePromotionAnimation() {
        }

        /**
         * Describes a promotion animation for a Premium feature.
         *
         * @param feature Premium feature.
         * @param animation Promotion animation for the feature.
         */
        public PremiumFeaturePromotionAnimation(PremiumFeature feature, Animation animation) {
            this.feature = feature;
            this.animation = animation;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1986155748;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about features, available to Premium users.
     */
    public static class PremiumFeatures extends Object {
        /**
         * The list of available features.
         */
        public PremiumFeature[] features;
        /**
         * The list of limits, increased for Premium users.
         */
        public PremiumLimit[] limits;
        /**
         * An internal link to be opened to pay for Telegram Premium if store payment isn't possible; may be null if direct payment isn't available.
         */
        @Nullable public InternalLinkType paymentLink;

        /**
         * Contains information about features, available to Premium users.
         */
        public PremiumFeatures() {
        }

        /**
         * Contains information about features, available to Premium users.
         *
         * @param features The list of available features.
         * @param limits The list of limits, increased for Premium users.
         * @param paymentLink An internal link to be opened to pay for Telegram Premium if store payment isn't possible; may be null if direct payment isn't available.
         */
        public PremiumFeatures(PremiumFeature[] features, PremiumLimit[] limits, InternalLinkType paymentLink) {
            this.features = features;
            this.limits = limits;
            this.paymentLink = paymentLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1875162172;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a Telegram Premium gift code.
     */
    public static class PremiumGiftCodeInfo extends Object {
        /**
         * Identifier of a chat or a user who created the gift code; may be null if unknown. If null and the code is from messagePremiumGiftCode message, then creatorId from the message can be used.
         */
        @Nullable public MessageSender creatorId;
        /**
         * Point in time (Unix timestamp) when the code was created.
         */
        public int creationDate;
        /**
         * True, if the gift code was created for a giveaway.
         */
        public boolean isFromGiveaway;
        /**
         * Identifier of the corresponding giveaway message in the creatorId chat; may be 0 or an identifier of a deleted message.
         */
        public long giveawayMessageId;
        /**
         * Number of months the Telegram Premium subscription will be active after code activation; 0 if the number of months isn't integer.
         */
        public int monthCount;
        /**
         * Number of days the Telegram Premium subscription will be active after code activation.
         */
        public int dayCount;
        /**
         * Identifier of a user for which the code was created; 0 if none.
         */
        public long userId;
        /**
         * Point in time (Unix timestamp) when the code was activated; 0 if none.
         */
        public int useDate;

        /**
         * Contains information about a Telegram Premium gift code.
         */
        public PremiumGiftCodeInfo() {
        }

        /**
         * Contains information about a Telegram Premium gift code.
         *
         * @param creatorId Identifier of a chat or a user who created the gift code; may be null if unknown. If null and the code is from messagePremiumGiftCode message, then creatorId from the message can be used.
         * @param creationDate Point in time (Unix timestamp) when the code was created.
         * @param isFromGiveaway True, if the gift code was created for a giveaway.
         * @param giveawayMessageId Identifier of the corresponding giveaway message in the creatorId chat; may be 0 or an identifier of a deleted message.
         * @param monthCount Number of months the Telegram Premium subscription will be active after code activation; 0 if the number of months isn't integer.
         * @param dayCount Number of days the Telegram Premium subscription will be active after code activation.
         * @param userId Identifier of a user for which the code was created; 0 if none.
         * @param useDate Point in time (Unix timestamp) when the code was activated; 0 if none.
         */
        public PremiumGiftCodeInfo(MessageSender creatorId, int creationDate, boolean isFromGiveaway, long giveawayMessageId, int monthCount, int dayCount, long userId, int useDate) {
            this.creatorId = creatorId;
            this.creationDate = creationDate;
            this.isFromGiveaway = isFromGiveaway;
            this.giveawayMessageId = giveawayMessageId;
            this.monthCount = monthCount;
            this.dayCount = dayCount;
            this.userId = userId;
            this.useDate = useDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -262674203;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an option for gifting Telegram Premium to a user. Use telegramPaymentPurposePremiumGift for out-of-store payments or payments in Telegram Stars.
     */
    public static class PremiumGiftPaymentOption extends Object {
        /**
         * ISO 4217 currency code for the payment.
         */
        public String currency;
        /**
         * The amount to pay, in the smallest units of the currency.
         */
        public long amount;
        /**
         * The alternative Telegram Star amount to pay; 0 if payment in Telegram Stars is not possible.
         */
        public long starCount;
        /**
         * The discount associated with this option, as a percentage.
         */
        public int discountPercentage;
        /**
         * Number of months the Telegram Premium subscription will be active.
         */
        public int monthCount;
        /**
         * Identifier of the store product associated with the option.
         */
        public String storeProductId;
        /**
         * A sticker to be shown along with the option; may be null if unknown.
         */
        @Nullable public Sticker sticker;

        /**
         * Describes an option for gifting Telegram Premium to a user. Use telegramPaymentPurposePremiumGift for out-of-store payments or payments in Telegram Stars.
         */
        public PremiumGiftPaymentOption() {
        }

        /**
         * Describes an option for gifting Telegram Premium to a user. Use telegramPaymentPurposePremiumGift for out-of-store payments or payments in Telegram Stars.
         *
         * @param currency ISO 4217 currency code for the payment.
         * @param amount The amount to pay, in the smallest units of the currency.
         * @param starCount The alternative Telegram Star amount to pay; 0 if payment in Telegram Stars is not possible.
         * @param discountPercentage The discount associated with this option, as a percentage.
         * @param monthCount Number of months the Telegram Premium subscription will be active.
         * @param storeProductId Identifier of the store product associated with the option.
         * @param sticker A sticker to be shown along with the option; may be null if unknown.
         */
        public PremiumGiftPaymentOption(String currency, long amount, long starCount, int discountPercentage, int monthCount, String storeProductId, Sticker sticker) {
            this.currency = currency;
            this.amount = amount;
            this.starCount = starCount;
            this.discountPercentage = discountPercentage;
            this.monthCount = monthCount;
            this.storeProductId = storeProductId;
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -338085027;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of options for gifting Telegram Premium to a user.
     */
    public static class PremiumGiftPaymentOptions extends Object {
        /**
         * The list of options sorted by Telegram Premium subscription duration.
         */
        public PremiumGiftPaymentOption[] options;

        /**
         * Contains a list of options for gifting Telegram Premium to a user.
         */
        public PremiumGiftPaymentOptions() {
        }

        /**
         * Contains a list of options for gifting Telegram Premium to a user.
         *
         * @param options The list of options sorted by Telegram Premium subscription duration.
         */
        public PremiumGiftPaymentOptions(PremiumGiftPaymentOption[] options) {
            this.options = options;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1347543032;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an option for creating of Telegram Premium giveaway or manual distribution of Telegram Premium among chat members. Use telegramPaymentPurposePremiumGiftCodes or telegramPaymentPurposePremiumGiveaway for out-of-store payments.
     */
    public static class PremiumGiveawayPaymentOption extends Object {
        /**
         * ISO 4217 currency code for Telegram Premium gift code payment.
         */
        public String currency;
        /**
         * The amount to pay, in the smallest units of the currency.
         */
        public long amount;
        /**
         * Number of users which will be able to activate the gift codes.
         */
        public int winnerCount;
        /**
         * Number of months the Telegram Premium subscription will be active.
         */
        public int monthCount;
        /**
         * Identifier of the store product associated with the option; may be empty if none.
         */
        public String storeProductId;
        /**
         * Number of times the store product must be paid.
         */
        public int storeProductQuantity;

        /**
         * Describes an option for creating of Telegram Premium giveaway or manual distribution of Telegram Premium among chat members. Use telegramPaymentPurposePremiumGiftCodes or telegramPaymentPurposePremiumGiveaway for out-of-store payments.
         */
        public PremiumGiveawayPaymentOption() {
        }

        /**
         * Describes an option for creating of Telegram Premium giveaway or manual distribution of Telegram Premium among chat members. Use telegramPaymentPurposePremiumGiftCodes or telegramPaymentPurposePremiumGiveaway for out-of-store payments.
         *
         * @param currency ISO 4217 currency code for Telegram Premium gift code payment.
         * @param amount The amount to pay, in the smallest units of the currency.
         * @param winnerCount Number of users which will be able to activate the gift codes.
         * @param monthCount Number of months the Telegram Premium subscription will be active.
         * @param storeProductId Identifier of the store product associated with the option; may be empty if none.
         * @param storeProductQuantity Number of times the store product must be paid.
         */
        public PremiumGiveawayPaymentOption(String currency, long amount, int winnerCount, int monthCount, String storeProductId, int storeProductQuantity) {
            this.currency = currency;
            this.amount = amount;
            this.winnerCount = winnerCount;
            this.monthCount = monthCount;
            this.storeProductId = storeProductId;
            this.storeProductQuantity = storeProductQuantity;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1099221896;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of options for creating of Telegram Premium giveaway or manual distribution of Telegram Premium among chat members.
     */
    public static class PremiumGiveawayPaymentOptions extends Object {
        /**
         * The list of options.
         */
        public PremiumGiveawayPaymentOption[] options;

        /**
         * Contains a list of options for creating of Telegram Premium giveaway or manual distribution of Telegram Premium among chat members.
         */
        public PremiumGiveawayPaymentOptions() {
        }

        /**
         * Contains a list of options for creating of Telegram Premium giveaway or manual distribution of Telegram Premium among chat members.
         *
         * @param options The list of options.
         */
        public PremiumGiveawayPaymentOptions(PremiumGiveawayPaymentOption[] options) {
            this.options = options;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1587397823;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a limit, increased for Premium users.
     */
    public static class PremiumLimit extends Object {
        /**
         * The type of the limit.
         */
        public PremiumLimitType type;
        /**
         * Default value of the limit.
         */
        public int defaultValue;
        /**
         * Value of the limit for Premium users.
         */
        public int premiumValue;

        /**
         * Contains information about a limit, increased for Premium users.
         */
        public PremiumLimit() {
        }

        /**
         * Contains information about a limit, increased for Premium users.
         *
         * @param type The type of the limit.
         * @param defaultValue Default value of the limit.
         * @param premiumValue Value of the limit for Premium users.
         */
        public PremiumLimit(PremiumLimitType type, int defaultValue, int premiumValue) {
            this.type = type;
            this.defaultValue = defaultValue;
            this.premiumValue = premiumValue;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2127786726;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes type of limit, increased for Premium users.
     */
    public abstract static class PremiumLimitType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            PremiumLimitTypeSupergroupCount.CONSTRUCTOR,
            PremiumLimitTypePinnedChatCount.CONSTRUCTOR,
            PremiumLimitTypeCreatedPublicChatCount.CONSTRUCTOR,
            PremiumLimitTypeSavedAnimationCount.CONSTRUCTOR,
            PremiumLimitTypeFavoriteStickerCount.CONSTRUCTOR,
            PremiumLimitTypeChatFolderCount.CONSTRUCTOR,
            PremiumLimitTypeChatFolderChosenChatCount.CONSTRUCTOR,
            PremiumLimitTypePinnedArchivedChatCount.CONSTRUCTOR,
            PremiumLimitTypePinnedSavedMessagesTopicCount.CONSTRUCTOR,
            PremiumLimitTypeCaptionLength.CONSTRUCTOR,
            PremiumLimitTypeBioLength.CONSTRUCTOR,
            PremiumLimitTypeChatFolderInviteLinkCount.CONSTRUCTOR,
            PremiumLimitTypeShareableChatFolderCount.CONSTRUCTOR,
            PremiumLimitTypeActiveStoryCount.CONSTRUCTOR,
            PremiumLimitTypeWeeklyPostedStoryCount.CONSTRUCTOR,
            PremiumLimitTypeMonthlyPostedStoryCount.CONSTRUCTOR,
            PremiumLimitTypeStoryCaptionLength.CONSTRUCTOR,
            PremiumLimitTypeStorySuggestedReactionAreaCount.CONSTRUCTOR,
            PremiumLimitTypeSimilarChatCount.CONSTRUCTOR,
            PremiumLimitTypeOwnedBotCount.CONSTRUCTOR,
            PremiumLimitTypeCustomTextCompositionStyleCount.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public PremiumLimitType() {
        }
    }

    /**
     * The maximum number of joined supergroups and channels.
     */
    public static class PremiumLimitTypeSupergroupCount extends PremiumLimitType {

        /**
         * The maximum number of joined supergroups and channels.
         */
        public PremiumLimitTypeSupergroupCount() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -247467131;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The maximum number of pinned chats in the main chat list.
     */
    public static class PremiumLimitTypePinnedChatCount extends PremiumLimitType {

        /**
         * The maximum number of pinned chats in the main chat list.
         */
        public PremiumLimitTypePinnedChatCount() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -998947871;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The maximum number of created public chats.
     */
    public static class PremiumLimitTypeCreatedPublicChatCount extends PremiumLimitType {

        /**
         * The maximum number of created public chats.
         */
        public PremiumLimitTypeCreatedPublicChatCount() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 446086841;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The maximum number of saved animations.
     */
    public static class PremiumLimitTypeSavedAnimationCount extends PremiumLimitType {

        /**
         * The maximum number of saved animations.
         */
        public PremiumLimitTypeSavedAnimationCount() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -19759735;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The maximum number of favorite stickers.
     */
    public static class PremiumLimitTypeFavoriteStickerCount extends PremiumLimitType {

        /**
         * The maximum number of favorite stickers.
         */
        public PremiumLimitTypeFavoriteStickerCount() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 639754787;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The maximum number of chat folders.
     */
    public static class PremiumLimitTypeChatFolderCount extends PremiumLimitType {

        /**
         * The maximum number of chat folders.
         */
        public PremiumLimitTypeChatFolderCount() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 377489774;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The maximum number of pinned and always included, or always excluded chats in a chat folder.
     */
    public static class PremiumLimitTypeChatFolderChosenChatCount extends PremiumLimitType {

        /**
         * The maximum number of pinned and always included, or always excluded chats in a chat folder.
         */
        public PremiumLimitTypeChatFolderChosenChatCount() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1691435861;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The maximum number of pinned chats in the archive chat list.
     */
    public static class PremiumLimitTypePinnedArchivedChatCount extends PremiumLimitType {

        /**
         * The maximum number of pinned chats in the archive chat list.
         */
        public PremiumLimitTypePinnedArchivedChatCount() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1485515276;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The maximum number of pinned Saved Messages topics.
     */
    public static class PremiumLimitTypePinnedSavedMessagesTopicCount extends PremiumLimitType {

        /**
         * The maximum number of pinned Saved Messages topics.
         */
        public PremiumLimitTypePinnedSavedMessagesTopicCount() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1544854305;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The maximum length of sent media caption.
     */
    public static class PremiumLimitTypeCaptionLength extends PremiumLimitType {

        /**
         * The maximum length of sent media caption.
         */
        public PremiumLimitTypeCaptionLength() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 293984314;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The maximum length of the user's bio.
     */
    public static class PremiumLimitTypeBioLength extends PremiumLimitType {

        /**
         * The maximum length of the user's bio.
         */
        public PremiumLimitTypeBioLength() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1146976765;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The maximum number of invite links for a chat folder.
     */
    public static class PremiumLimitTypeChatFolderInviteLinkCount extends PremiumLimitType {

        /**
         * The maximum number of invite links for a chat folder.
         */
        public PremiumLimitTypeChatFolderInviteLinkCount() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -128702950;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The maximum number of added shareable chat folders.
     */
    public static class PremiumLimitTypeShareableChatFolderCount extends PremiumLimitType {

        /**
         * The maximum number of added shareable chat folders.
         */
        public PremiumLimitTypeShareableChatFolderCount() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1612625095;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The maximum number of active stories.
     */
    public static class PremiumLimitTypeActiveStoryCount extends PremiumLimitType {

        /**
         * The maximum number of active stories.
         */
        public PremiumLimitTypeActiveStoryCount() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1926486372;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The maximum number of stories posted per week.
     */
    public static class PremiumLimitTypeWeeklyPostedStoryCount extends PremiumLimitType {

        /**
         * The maximum number of stories posted per week.
         */
        public PremiumLimitTypeWeeklyPostedStoryCount() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -506354313;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The maximum number of stories posted per month.
     */
    public static class PremiumLimitTypeMonthlyPostedStoryCount extends PremiumLimitType {

        /**
         * The maximum number of stories posted per month.
         */
        public PremiumLimitTypeMonthlyPostedStoryCount() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 26329490;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The maximum length of captions of posted stories.
     */
    public static class PremiumLimitTypeStoryCaptionLength extends PremiumLimitType {

        /**
         * The maximum length of captions of posted stories.
         */
        public PremiumLimitTypeStoryCaptionLength() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1093324030;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The maximum number of suggested reaction areas on a story.
     */
    public static class PremiumLimitTypeStorySuggestedReactionAreaCount extends PremiumLimitType {

        /**
         * The maximum number of suggested reaction areas on a story.
         */
        public PremiumLimitTypeStorySuggestedReactionAreaCount() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1170032633;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The maximum number of received similar chats.
     */
    public static class PremiumLimitTypeSimilarChatCount extends PremiumLimitType {

        /**
         * The maximum number of received similar chats.
         */
        public PremiumLimitTypeSimilarChatCount() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1563549935;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The maximum number of owned bots.
     */
    public static class PremiumLimitTypeOwnedBotCount extends PremiumLimitType {

        /**
         * The maximum number of owned bots.
         */
        public PremiumLimitTypeOwnedBotCount() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -595906175;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The maximum number of added text composition styles.
     */
    public static class PremiumLimitTypeCustomTextCompositionStyleCount extends PremiumLimitType {

        /**
         * The maximum number of added text composition styles.
         */
        public PremiumLimitTypeCustomTextCompositionStyleCount() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -652894162;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an option for buying Telegram Premium to a user.
     */
    public static class PremiumPaymentOption extends Object {
        /**
         * ISO 4217 currency code for Telegram Premium subscription payment.
         */
        public String currency;
        /**
         * The amount to pay, in the smallest units of the currency.
         */
        public long amount;
        /**
         * The discount associated with this option, as a percentage.
         */
        public int discountPercentage;
        /**
         * Number of months the Telegram Premium subscription will be active. Use getPremiumInfoSticker to get the sticker to be used as representation of the Telegram Premium subscription.
         */
        public int monthCount;
        /**
         * Identifier of the store product associated with the option.
         */
        public String storeProductId;
        /**
         * An internal link to be opened for buying Telegram Premium to the user if store payment isn't possible; may be null if direct payment isn't available.
         */
        @Nullable public InternalLinkType paymentLink;

        /**
         * Describes an option for buying Telegram Premium to a user.
         */
        public PremiumPaymentOption() {
        }

        /**
         * Describes an option for buying Telegram Premium to a user.
         *
         * @param currency ISO 4217 currency code for Telegram Premium subscription payment.
         * @param amount The amount to pay, in the smallest units of the currency.
         * @param discountPercentage The discount associated with this option, as a percentage.
         * @param monthCount Number of months the Telegram Premium subscription will be active. Use getPremiumInfoSticker to get the sticker to be used as representation of the Telegram Premium subscription.
         * @param storeProductId Identifier of the store product associated with the option.
         * @param paymentLink An internal link to be opened for buying Telegram Premium to the user if store payment isn't possible; may be null if direct payment isn't available.
         */
        public PremiumPaymentOption(String currency, long amount, int discountPercentage, int monthCount, String storeProductId, InternalLinkType paymentLink) {
            this.currency = currency;
            this.amount = amount;
            this.discountPercentage = discountPercentage;
            this.monthCount = monthCount;
            this.storeProductId = storeProductId;
            this.paymentLink = paymentLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1945346126;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a source from which the Premium features screen is opened.
     */
    public abstract static class PremiumSource extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            PremiumSourceLimitExceeded.CONSTRUCTOR,
            PremiumSourceFeature.CONSTRUCTOR,
            PremiumSourceBusinessFeature.CONSTRUCTOR,
            PremiumSourceStoryFeature.CONSTRUCTOR,
            PremiumSourceLink.CONSTRUCTOR,
            PremiumSourceSettings.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public PremiumSource() {
        }
    }

    /**
     * A limit was exceeded.
     */
    public static class PremiumSourceLimitExceeded extends PremiumSource {
        /**
         * Type of the exceeded limit.
         */
        public PremiumLimitType limitType;

        /**
         * A limit was exceeded.
         */
        public PremiumSourceLimitExceeded() {
        }

        /**
         * A limit was exceeded.
         *
         * @param limitType Type of the exceeded limit.
         */
        public PremiumSourceLimitExceeded(PremiumLimitType limitType) {
            this.limitType = limitType;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2052159742;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A user tried to use a Premium feature.
     */
    public static class PremiumSourceFeature extends PremiumSource {
        /**
         * The used feature.
         */
        public PremiumFeature feature;

        /**
         * A user tried to use a Premium feature.
         */
        public PremiumSourceFeature() {
        }

        /**
         * A user tried to use a Premium feature.
         *
         * @param feature The used feature.
         */
        public PremiumSourceFeature(PremiumFeature feature) {
            this.feature = feature;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 445813541;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A user tried to use a Business feature.
     */
    public static class PremiumSourceBusinessFeature extends PremiumSource {
        /**
         * The used feature; pass null if none specific feature was used.
         */
        public BusinessFeature feature;

        /**
         * A user tried to use a Business feature.
         */
        public PremiumSourceBusinessFeature() {
        }

        /**
         * A user tried to use a Business feature.
         *
         * @param feature The used feature; pass null if none specific feature was used.
         */
        public PremiumSourceBusinessFeature(BusinessFeature feature) {
            this.feature = feature;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1492946340;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A user tried to use a Premium story feature.
     */
    public static class PremiumSourceStoryFeature extends PremiumSource {
        /**
         * The used feature.
         */
        public PremiumStoryFeature feature;

        /**
         * A user tried to use a Premium story feature.
         */
        public PremiumSourceStoryFeature() {
        }

        /**
         * A user tried to use a Premium story feature.
         *
         * @param feature The used feature.
         */
        public PremiumSourceStoryFeature(PremiumStoryFeature feature) {
            this.feature = feature;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1030737556;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A user opened an internal link of the type internalLinkTypePremiumFeaturesPage.
     */
    public static class PremiumSourceLink extends PremiumSource {
        /**
         * The referrer from the link.
         */
        public String referrer;

        /**
         * A user opened an internal link of the type internalLinkTypePremiumFeaturesPage.
         */
        public PremiumSourceLink() {
        }

        /**
         * A user opened an internal link of the type internalLinkTypePremiumFeaturesPage.
         *
         * @param referrer The referrer from the link.
         */
        public PremiumSourceLink(String referrer) {
            this.referrer = referrer;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2135071132;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A user opened the Premium features screen from settings.
     */
    public static class PremiumSourceSettings extends PremiumSource {

        /**
         * A user opened the Premium features screen from settings.
         */
        public PremiumSourceSettings() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -285702859;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains state of Telegram Premium subscription and promotion videos for Premium features.
     */
    public static class PremiumState extends Object {
        /**
         * Text description of the state of the current Premium subscription; may be empty if the current user has no Telegram Premium subscription.
         */
        public FormattedText state;
        /**
         * The list of available options for buying Telegram Premium.
         */
        public PremiumStatePaymentOption[] paymentOptions;
        /**
         * The list of available promotion animations for Premium features.
         */
        public PremiumFeaturePromotionAnimation[] animations;
        /**
         * The list of available promotion animations for Business features.
         */
        public BusinessFeaturePromotionAnimation[] businessAnimations;

        /**
         * Contains state of Telegram Premium subscription and promotion videos for Premium features.
         */
        public PremiumState() {
        }

        /**
         * Contains state of Telegram Premium subscription and promotion videos for Premium features.
         *
         * @param state Text description of the state of the current Premium subscription; may be empty if the current user has no Telegram Premium subscription.
         * @param paymentOptions The list of available options for buying Telegram Premium.
         * @param animations The list of available promotion animations for Premium features.
         * @param businessAnimations The list of available promotion animations for Business features.
         */
        public PremiumState(FormattedText state, PremiumStatePaymentOption[] paymentOptions, PremiumFeaturePromotionAnimation[] animations, BusinessFeaturePromotionAnimation[] businessAnimations) {
            this.state = state;
            this.paymentOptions = paymentOptions;
            this.animations = animations;
            this.businessAnimations = businessAnimations;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1772082178;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an option for buying or upgrading Telegram Premium for self.
     */
    public static class PremiumStatePaymentOption extends Object {
        /**
         * Information about the payment option.
         */
        public PremiumPaymentOption paymentOption;
        /**
         * True, if this is the currently used Telegram Premium subscription option.
         */
        public boolean isCurrent;
        /**
         * True, if the payment option can be used to upgrade the existing Telegram Premium subscription.
         */
        public boolean isUpgrade;
        /**
         * Identifier of the last in-store transaction for the currently used option.
         */
        public String lastTransactionId;

        /**
         * Describes an option for buying or upgrading Telegram Premium for self.
         */
        public PremiumStatePaymentOption() {
        }

        /**
         * Describes an option for buying or upgrading Telegram Premium for self.
         *
         * @param paymentOption Information about the payment option.
         * @param isCurrent True, if this is the currently used Telegram Premium subscription option.
         * @param isUpgrade True, if the payment option can be used to upgrade the existing Telegram Premium subscription.
         * @param lastTransactionId Identifier of the last in-store transaction for the currently used option.
         */
        public PremiumStatePaymentOption(PremiumPaymentOption paymentOption, boolean isCurrent, boolean isUpgrade, String lastTransactionId) {
            this.paymentOption = paymentOption;
            this.isCurrent = isCurrent;
            this.isUpgrade = isUpgrade;
            this.lastTransactionId = lastTransactionId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2097591673;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a story feature available to Premium users.
     */
    public abstract static class PremiumStoryFeature extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            PremiumStoryFeaturePriorityOrder.CONSTRUCTOR,
            PremiumStoryFeatureStealthMode.CONSTRUCTOR,
            PremiumStoryFeaturePermanentViewsHistory.CONSTRUCTOR,
            PremiumStoryFeatureCustomExpirationDuration.CONSTRUCTOR,
            PremiumStoryFeatureSaveStories.CONSTRUCTOR,
            PremiumStoryFeatureLinksAndFormatting.CONSTRUCTOR,
            PremiumStoryFeatureVideoQuality.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public PremiumStoryFeature() {
        }
    }

    /**
     * Stories of the current user are displayed before stories of non-Premium contacts, supergroups, and channels.
     */
    public static class PremiumStoryFeaturePriorityOrder extends PremiumStoryFeature {

        /**
         * Stories of the current user are displayed before stories of non-Premium contacts, supergroups, and channels.
         */
        public PremiumStoryFeaturePriorityOrder() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1880001849;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to hide the fact that the user viewed other's stories.
     */
    public static class PremiumStoryFeatureStealthMode extends PremiumStoryFeature {

        /**
         * The ability to hide the fact that the user viewed other's stories.
         */
        public PremiumStoryFeatureStealthMode() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1194605988;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to check who opened the current user's stories after they expire.
     */
    public static class PremiumStoryFeaturePermanentViewsHistory extends PremiumStoryFeature {

        /**
         * The ability to check who opened the current user's stories after they expire.
         */
        public PremiumStoryFeaturePermanentViewsHistory() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1029683296;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to set custom expiration duration for stories.
     */
    public static class PremiumStoryFeatureCustomExpirationDuration extends PremiumStoryFeature {

        /**
         * The ability to set custom expiration duration for stories.
         */
        public PremiumStoryFeatureCustomExpirationDuration() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -593229162;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to save other's unprotected stories.
     */
    public static class PremiumStoryFeatureSaveStories extends PremiumStoryFeature {

        /**
         * The ability to save other's unprotected stories.
         */
        public PremiumStoryFeatureSaveStories() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1501286467;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to use links and formatting in story caption, and use inputStoryAreaTypeLink areas.
     */
    public static class PremiumStoryFeatureLinksAndFormatting extends PremiumStoryFeature {

        /**
         * The ability to use links and formatting in story caption, and use inputStoryAreaTypeLink areas.
         */
        public PremiumStoryFeatureLinksAndFormatting() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -622623753;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The ability to choose better quality for viewed stories.
     */
    public static class PremiumStoryFeatureVideoQuality extends PremiumStoryFeature {

        /**
         * The ability to choose better quality for viewed stories.
         */
        public PremiumStoryFeatureVideoQuality() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1162887511;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a prepaid giveaway.
     */
    public static class PrepaidGiveaway extends Object {
        /**
         * Unique identifier of the prepaid giveaway.
         */
        public long id;
        /**
         * Number of users which will receive giveaway prize.
         */
        public int winnerCount;
        /**
         * Prize of the giveaway.
         */
        public GiveawayPrize prize;
        /**
         * The number of boosts received by the chat from the giveaway; for Telegram Star giveaways only.
         */
        public int boostCount;
        /**
         * Point in time (Unix timestamp) when the giveaway was paid.
         */
        public int paymentDate;

        /**
         * Describes a prepaid giveaway.
         */
        public PrepaidGiveaway() {
        }

        /**
         * Describes a prepaid giveaway.
         *
         * @param id Unique identifier of the prepaid giveaway.
         * @param winnerCount Number of users which will receive giveaway prize.
         * @param prize Prize of the giveaway.
         * @param boostCount The number of boosts received by the chat from the giveaway; for Telegram Star giveaways only.
         * @param paymentDate Point in time (Unix timestamp) when the giveaway was paid.
         */
        public PrepaidGiveaway(long id, int winnerCount, GiveawayPrize prize, int boostCount, int paymentDate) {
            this.id = id;
            this.winnerCount = winnerCount;
            this.prize = prize;
            this.boostCount = boostCount;
            this.paymentDate = paymentDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -277859441;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a ready to send inline message. Use sendInlineQueryResultMessage to send the message.
     */
    public static class PreparedInlineMessage extends Object {
        /**
         * Unique identifier of the inline query to pass to sendInlineQueryResultMessage.
         */
        public long inlineQueryId;
        /**
         * Resulted inline message of the query.
         */
        public InlineQueryResult result;
        /**
         * Types of the chats to which the message can be sent.
         */
        public TargetChatTypes chatTypes;

        /**
         * Represents a ready to send inline message. Use sendInlineQueryResultMessage to send the message.
         */
        public PreparedInlineMessage() {
        }

        /**
         * Represents a ready to send inline message. Use sendInlineQueryResultMessage to send the message.
         *
         * @param inlineQueryId Unique identifier of the inline query to pass to sendInlineQueryResultMessage.
         * @param result Resulted inline message of the query.
         * @param chatTypes Types of the chats to which the message can be sent.
         */
        public PreparedInlineMessage(long inlineQueryId, InlineQueryResult result, TargetChatTypes chatTypes) {
            this.inlineQueryId = inlineQueryId;
            this.result = result;
            this.chatTypes = chatTypes;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1808892734;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents an inline message that can be sent via the bot.
     */
    public static class PreparedInlineMessageId extends Object {
        /**
         * Unique identifier for the message.
         */
        public String id;
        /**
         * Point in time (Unix timestamp) when the message can't be used anymore.
         */
        public int expirationDate;

        /**
         * Represents an inline message that can be sent via the bot.
         */
        public PreparedInlineMessageId() {
        }

        /**
         * Represents an inline message that can be sent via the bot.
         *
         * @param id Unique identifier for the message.
         * @param expirationDate Point in time (Unix timestamp) when the message can't be used anymore.
         */
        public PreparedInlineMessageId(String id, int expirationDate) {
            this.id = id;
            this.expirationDate = expirationDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 940415972;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a product that can be paid with invoice.
     */
    public static class ProductInfo extends Object {
        /**
         * Product title.
         */
        public String title;
        /**
         * Product description.
         */
        public FormattedText description;
        /**
         * Product photo; may be null.
         */
        @Nullable public Photo photo;

        /**
         * Contains information about a product that can be paid with invoice.
         */
        public ProductInfo() {
        }

        /**
         * Contains information about a product that can be paid with invoice.
         *
         * @param title Product title.
         * @param description Product description.
         * @param photo Product photo; may be null.
         */
        public ProductInfo(String title, FormattedText description, Photo photo) {
            this.title = title;
            this.description = description;
            this.photo = photo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2015069020;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about supported accent color for user profile photo background.
     */
    public static class ProfileAccentColor extends Object {
        /**
         * Profile accent color identifier.
         */
        public int id;
        /**
         * Accent colors expected to be used in light themes.
         */
        public ProfileAccentColors lightThemeColors;
        /**
         * Accent colors expected to be used in dark themes.
         */
        public ProfileAccentColors darkThemeColors;
        /**
         * The minimum chat boost level required to use the color in a supergroup chat.
         */
        public int minSupergroupChatBoostLevel;
        /**
         * The minimum chat boost level required to use the color in a channel chat.
         */
        public int minChannelChatBoostLevel;

        /**
         * Contains information about supported accent color for user profile photo background.
         */
        public ProfileAccentColor() {
        }

        /**
         * Contains information about supported accent color for user profile photo background.
         *
         * @param id Profile accent color identifier.
         * @param lightThemeColors Accent colors expected to be used in light themes.
         * @param darkThemeColors Accent colors expected to be used in dark themes.
         * @param minSupergroupChatBoostLevel The minimum chat boost level required to use the color in a supergroup chat.
         * @param minChannelChatBoostLevel The minimum chat boost level required to use the color in a channel chat.
         */
        public ProfileAccentColor(int id, ProfileAccentColors lightThemeColors, ProfileAccentColors darkThemeColors, int minSupergroupChatBoostLevel, int minChannelChatBoostLevel) {
            this.id = id;
            this.lightThemeColors = lightThemeColors;
            this.darkThemeColors = darkThemeColors;
            this.minSupergroupChatBoostLevel = minSupergroupChatBoostLevel;
            this.minChannelChatBoostLevel = minChannelChatBoostLevel;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 557679253;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about supported accent colors for user profile photo background in RGB format.
     */
    public static class ProfileAccentColors extends Object {
        /**
         * The list of 1-2 colors in RGB format, describing the colors, as expected to be shown in the color palette settings.
         */
        public int[] paletteColors;
        /**
         * The list of 1-2 colors in RGB format, describing the colors, as expected to be used for the profile photo background.
         */
        public int[] backgroundColors;
        /**
         * The list of 2 colors in RGB format, describing the colors of the gradient to be used for the unread active story indicator around profile photo.
         */
        public int[] storyColors;

        /**
         * Contains information about supported accent colors for user profile photo background in RGB format.
         */
        public ProfileAccentColors() {
        }

        /**
         * Contains information about supported accent colors for user profile photo background in RGB format.
         *
         * @param paletteColors The list of 1-2 colors in RGB format, describing the colors, as expected to be shown in the color palette settings.
         * @param backgroundColors The list of 1-2 colors in RGB format, describing the colors, as expected to be used for the profile photo background.
         * @param storyColors The list of 2 colors in RGB format, describing the colors of the gradient to be used for the unread active story indicator around profile photo.
         */
        public ProfileAccentColors(int[] paletteColors, int[] backgroundColors, int[] storyColors) {
            this.paletteColors = paletteColors;
            this.backgroundColors = backgroundColors;
            this.storyColors = storyColors;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -596042431;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a user profile photo.
     */
    public static class ProfilePhoto extends Object {
        /**
         * Photo identifier; 0 for an empty photo. Can be used to find a photo in a list of user profile photos.
         */
        public long id;
        /**
         * A small (160x160) user profile photo. The file can be downloaded only before the photo is changed.
         */
        public File small;
        /**
         * A big (640x640) user profile photo. The file can be downloaded only before the photo is changed.
         */
        public File big;
        /**
         * User profile photo minithumbnail; may be null.
         */
        @Nullable public Minithumbnail minithumbnail;
        /**
         * True, if the photo has animated variant.
         */
        public boolean hasAnimation;
        /**
         * True, if the photo is visible only for the current user.
         */
        public boolean isPersonal;

        /**
         * Describes a user profile photo.
         */
        public ProfilePhoto() {
        }

        /**
         * Describes a user profile photo.
         *
         * @param id Photo identifier; 0 for an empty photo. Can be used to find a photo in a list of user profile photos.
         * @param small A small (160x160) user profile photo. The file can be downloaded only before the photo is changed.
         * @param big A big (640x640) user profile photo. The file can be downloaded only before the photo is changed.
         * @param minithumbnail User profile photo minithumbnail; may be null.
         * @param hasAnimation True, if the photo has animated variant.
         * @param isPersonal True, if the photo is visible only for the current user.
         */
        public ProfilePhoto(long id, File small, File big, Minithumbnail minithumbnail, boolean hasAnimation, boolean isPersonal) {
            this.id = id;
            this.small = small;
            this.big = big;
            this.minithumbnail = minithumbnail;
            this.hasAnimation = hasAnimation;
            this.isPersonal = isPersonal;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1025754018;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a tab shown in a user or a chat profile.
     */
    public abstract static class ProfileTab extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ProfileTabPosts.CONSTRUCTOR,
            ProfileTabGifts.CONSTRUCTOR,
            ProfileTabMedia.CONSTRUCTOR,
            ProfileTabFiles.CONSTRUCTOR,
            ProfileTabLinks.CONSTRUCTOR,
            ProfileTabMusic.CONSTRUCTOR,
            ProfileTabVoice.CONSTRUCTOR,
            ProfileTabGifs.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ProfileTab() {
        }
    }

    /**
     * A tab with stories posted by the user or the channel chat and saved to profile.
     */
    public static class ProfileTabPosts extends ProfileTab {

        /**
         * A tab with stories posted by the user or the channel chat and saved to profile.
         */
        public ProfileTabPosts() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1181952362;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A tab with gifts received by the user or the channel chat.
     */
    public static class ProfileTabGifts extends ProfileTab {

        /**
         * A tab with gifts received by the user or the channel chat.
         */
        public ProfileTabGifts() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1296815210;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A tab with photos and videos posted by the channel.
     */
    public static class ProfileTabMedia extends ProfileTab {

        /**
         * A tab with photos and videos posted by the channel.
         */
        public ProfileTabMedia() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1925597525;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A tab with documents posted by the channel.
     */
    public static class ProfileTabFiles extends ProfileTab {

        /**
         * A tab with documents posted by the channel.
         */
        public ProfileTabFiles() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1422681088;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A tab with messages posted by the channel and containing links.
     */
    public static class ProfileTabLinks extends ProfileTab {

        /**
         * A tab with messages posted by the channel and containing links.
         */
        public ProfileTabLinks() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -748329831;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A tab with audio messages posted by the channel.
     */
    public static class ProfileTabMusic extends ProfileTab {

        /**
         * A tab with audio messages posted by the channel.
         */
        public ProfileTabMusic() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1624780178;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A tab with voice notes posted by the channel.
     */
    public static class ProfileTabVoice extends ProfileTab {

        /**
         * A tab with voice notes posted by the channel.
         */
        public ProfileTabVoice() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -461960914;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A tab with animations posted by the channel.
     */
    public static class ProfileTabGifs extends ProfileTab {

        /**
         * A tab with animations posted by the channel.
         */
        public ProfileTabGifs() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1564412267;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a proxy server.
     */
    public static class Proxy extends Object {
        /**
         * Proxy server domain or IP address.
         */
        public String server;
        /**
         * Proxy server port.
         */
        public int port;
        /**
         * Type of the proxy.
         */
        public ProxyType type;

        /**
         * Describes a proxy server.
         */
        public Proxy() {
        }

        /**
         * Describes a proxy server.
         *
         * @param server Proxy server domain or IP address.
         * @param port Proxy server port.
         * @param type Type of the proxy.
         */
        public Proxy(String server, int port, ProxyType type) {
            this.server = server;
            this.port = port;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1636386947;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the type of proxy server.
     */
    public abstract static class ProxyType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ProxyTypeSocks5.CONSTRUCTOR,
            ProxyTypeHttp.CONSTRUCTOR,
            ProxyTypeMtproto.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ProxyType() {
        }
    }

    /**
     * A SOCKS5 proxy server.
     */
    public static class ProxyTypeSocks5 extends ProxyType {
        /**
         * Username for logging in; may be empty.
         */
        public String username;
        /**
         * Password for logging in; may be empty.
         */
        public String password;

        /**
         * A SOCKS5 proxy server.
         */
        public ProxyTypeSocks5() {
        }

        /**
         * A SOCKS5 proxy server.
         *
         * @param username Username for logging in; may be empty.
         * @param password Password for logging in; may be empty.
         */
        public ProxyTypeSocks5(String username, String password) {
            this.username = username;
            this.password = password;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -890027341;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A HTTP transparent proxy server.
     */
    public static class ProxyTypeHttp extends ProxyType {
        /**
         * Username for logging in; may be empty.
         */
        public String username;
        /**
         * Password for logging in; may be empty.
         */
        public String password;
        /**
         * Pass true if the proxy supports only HTTP requests and doesn't support transparent TCP connections via HTTP CONNECT method.
         */
        public boolean httpOnly;

        /**
         * A HTTP transparent proxy server.
         */
        public ProxyTypeHttp() {
        }

        /**
         * A HTTP transparent proxy server.
         *
         * @param username Username for logging in; may be empty.
         * @param password Password for logging in; may be empty.
         * @param httpOnly Pass true if the proxy supports only HTTP requests and doesn't support transparent TCP connections via HTTP CONNECT method.
         */
        public ProxyTypeHttp(String username, String password, boolean httpOnly) {
            this.username = username;
            this.password = password;
            this.httpOnly = httpOnly;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1547188361;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An MTProto proxy server.
     */
    public static class ProxyTypeMtproto extends ProxyType {
        /**
         * The proxy's secret in hexadecimal encoding.
         */
        public String secret;

        /**
         * An MTProto proxy server.
         */
        public ProxyTypeMtproto() {
        }

        /**
         * An MTProto proxy server.
         *
         * @param secret The proxy's secret in hexadecimal encoding.
         */
        public ProxyTypeMtproto(String secret) {
            this.secret = secret;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1964826627;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes type of public chat.
     */
    public abstract static class PublicChatType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            PublicChatTypeHasUsername.CONSTRUCTOR,
            PublicChatTypeIsLocationBased.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public PublicChatType() {
        }
    }

    /**
     * The chat is public, because it has an active username.
     */
    public static class PublicChatTypeHasUsername extends PublicChatType {

        /**
         * The chat is public, because it has an active username.
         */
        public PublicChatTypeHasUsername() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 350789758;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat is public, because it is a location-based supergroup.
     */
    public static class PublicChatTypeIsLocationBased extends PublicChatType {

        /**
         * The chat is public, because it is a location-based supergroup.
         */
        public PublicChatTypeIsLocationBased() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1183735952;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a public forward or repost of a story.
     */
    public abstract static class PublicForward extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            PublicForwardMessage.CONSTRUCTOR,
            PublicForwardStory.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public PublicForward() {
        }
    }

    /**
     * Contains a public forward as a message.
     */
    public static class PublicForwardMessage extends PublicForward {
        /**
         * Information about the message.
         */
        public Message message;

        /**
         * Contains a public forward as a message.
         */
        public PublicForwardMessage() {
        }

        /**
         * Contains a public forward as a message.
         *
         * @param message Information about the message.
         */
        public PublicForwardMessage(Message message) {
            this.message = message;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 51885010;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a public repost to a story.
     */
    public static class PublicForwardStory extends PublicForward {
        /**
         * Information about the story.
         */
        public Story story;

        /**
         * Contains a public repost to a story.
         */
        public PublicForwardStory() {
        }

        /**
         * Contains a public repost to a story.
         *
         * @param story Information about the story.
         */
        public PublicForwardStory(Story story) {
            this.story = story;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2145330863;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of public forwards and reposts as a story of a message or a story.
     */
    public static class PublicForwards extends Object {
        /**
         * Approximate total number of messages and stories found.
         */
        public int totalCount;
        /**
         * List of found public forwards and reposts.
         */
        public PublicForward[] forwards;
        /**
         * The offset for the next request. If empty, then there are no more results.
         */
        public String nextOffset;

        /**
         * Represents a list of public forwards and reposts as a story of a message or a story.
         */
        public PublicForwards() {
        }

        /**
         * Represents a list of public forwards and reposts as a story of a message or a story.
         *
         * @param totalCount Approximate total number of messages and stories found.
         * @param forwards List of found public forwards and reposts.
         * @param nextOffset The offset for the next request. If empty, then there are no more results.
         */
        public PublicForwards(int totalCount, PublicForward[] forwards, String nextOffset) {
            this.totalCount = totalCount;
            this.forwards = forwards;
            this.nextOffset = nextOffset;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2011272719;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about public post search limits.
     */
    public static class PublicPostSearchLimits extends Object {
        /**
         * Number of queries that can be sent daily for free.
         */
        public int dailyFreeQueryCount;
        /**
         * Number of remaining free queries today.
         */
        public int remainingFreeQueryCount;
        /**
         * Amount of time till the next free query can be sent; 0 if it can be sent now.
         */
        public int nextFreeQueryIn;
        /**
         * Number of Telegram Stars that must be paid for each non-free query.
         */
        public long starCount;
        /**
         * True, if the search for the specified query isn't charged.
         */
        public boolean isCurrentQueryFree;

        /**
         * Contains information about public post search limits.
         */
        public PublicPostSearchLimits() {
        }

        /**
         * Contains information about public post search limits.
         *
         * @param dailyFreeQueryCount Number of queries that can be sent daily for free.
         * @param remainingFreeQueryCount Number of remaining free queries today.
         * @param nextFreeQueryIn Amount of time till the next free query can be sent; 0 if it can be sent now.
         * @param starCount Number of Telegram Stars that must be paid for each non-free query.
         * @param isCurrentQueryFree True, if the search for the specified query isn't charged.
         */
        public PublicPostSearchLimits(int dailyFreeQueryCount, int remainingFreeQueryCount, int nextFreeQueryIn, long starCount, boolean isCurrentQueryFree) {
            this.dailyFreeQueryCount = dailyFreeQueryCount;
            this.remainingFreeQueryCount = remainingFreeQueryCount;
            this.nextFreeQueryIn = nextFreeQueryIn;
            this.starCount = starCount;
            this.isCurrentQueryFree = isCurrentQueryFree;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 42358064;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains content of a push message notification.
     */
    public abstract static class PushMessageContent extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            PushMessageContentHidden.CONSTRUCTOR,
            PushMessageContentAnimation.CONSTRUCTOR,
            PushMessageContentAudio.CONSTRUCTOR,
            PushMessageContentContact.CONSTRUCTOR,
            PushMessageContentContactRegistered.CONSTRUCTOR,
            PushMessageContentDocument.CONSTRUCTOR,
            PushMessageContentGame.CONSTRUCTOR,
            PushMessageContentGameScore.CONSTRUCTOR,
            PushMessageContentInvoice.CONSTRUCTOR,
            PushMessageContentLocation.CONSTRUCTOR,
            PushMessageContentPaidMedia.CONSTRUCTOR,
            PushMessageContentPhoto.CONSTRUCTOR,
            PushMessageContentPoll.CONSTRUCTOR,
            PushMessageContentPremiumGiftCode.CONSTRUCTOR,
            PushMessageContentGiveaway.CONSTRUCTOR,
            PushMessageContentGift.CONSTRUCTOR,
            PushMessageContentUpgradedGift.CONSTRUCTOR,
            PushMessageContentScreenshotTaken.CONSTRUCTOR,
            PushMessageContentSticker.CONSTRUCTOR,
            PushMessageContentStory.CONSTRUCTOR,
            PushMessageContentText.CONSTRUCTOR,
            PushMessageContentChecklist.CONSTRUCTOR,
            PushMessageContentVideo.CONSTRUCTOR,
            PushMessageContentVideoNote.CONSTRUCTOR,
            PushMessageContentVoiceNote.CONSTRUCTOR,
            PushMessageContentBasicGroupChatCreate.CONSTRUCTOR,
            PushMessageContentVideoChatStarted.CONSTRUCTOR,
            PushMessageContentVideoChatEnded.CONSTRUCTOR,
            PushMessageContentInviteVideoChatParticipants.CONSTRUCTOR,
            PushMessageContentChatAddMembers.CONSTRUCTOR,
            PushMessageContentChatChangePhoto.CONSTRUCTOR,
            PushMessageContentChatChangeTitle.CONSTRUCTOR,
            PushMessageContentChatSetBackground.CONSTRUCTOR,
            PushMessageContentChatSetTheme.CONSTRUCTOR,
            PushMessageContentChatDeleteMember.CONSTRUCTOR,
            PushMessageContentChatJoinByLink.CONSTRUCTOR,
            PushMessageContentChatJoinByRequest.CONSTRUCTOR,
            PushMessageContentRecurringPayment.CONSTRUCTOR,
            PushMessageContentSuggestProfilePhoto.CONSTRUCTOR,
            PushMessageContentSuggestBirthdate.CONSTRUCTOR,
            PushMessageContentProximityAlertTriggered.CONSTRUCTOR,
            PushMessageContentChecklistTasksAdded.CONSTRUCTOR,
            PushMessageContentChecklistTasksDone.CONSTRUCTOR,
            PushMessageContentPollOptionAdded.CONSTRUCTOR,
            PushMessageContentMessageForwards.CONSTRUCTOR,
            PushMessageContentMediaAlbum.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public PushMessageContent() {
        }
    }

    /**
     * A general message with hidden content.
     */
    public static class PushMessageContentHidden extends PushMessageContent {
        /**
         * True, if the message is a pinned message with the specified content.
         */
        public boolean isPinned;

        /**
         * A general message with hidden content.
         */
        public PushMessageContentHidden() {
        }

        /**
         * A general message with hidden content.
         *
         * @param isPinned True, if the message is a pinned message with the specified content.
         */
        public PushMessageContentHidden(boolean isPinned) {
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -316950436;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An animation message (GIF-style).
     */
    public static class PushMessageContentAnimation extends PushMessageContent {
        /**
         * Message content; may be null.
         */
        @Nullable public Animation animation;
        /**
         * Animation caption.
         */
        public String caption;
        /**
         * True, if the message is a pinned message with the specified content.
         */
        public boolean isPinned;

        /**
         * An animation message (GIF-style).
         */
        public PushMessageContentAnimation() {
        }

        /**
         * An animation message (GIF-style).
         *
         * @param animation Message content; may be null.
         * @param caption Animation caption.
         * @param isPinned True, if the message is a pinned message with the specified content.
         */
        public PushMessageContentAnimation(Animation animation, String caption, boolean isPinned) {
            this.animation = animation;
            this.caption = caption;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1034215396;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An audio message.
     */
    public static class PushMessageContentAudio extends PushMessageContent {
        /**
         * Message content; may be null.
         */
        @Nullable public Audio audio;
        /**
         * True, if the message is a pinned message with the specified content.
         */
        public boolean isPinned;

        /**
         * An audio message.
         */
        public PushMessageContentAudio() {
        }

        /**
         * An audio message.
         *
         * @param audio Message content; may be null.
         * @param isPinned True, if the message is a pinned message with the specified content.
         */
        public PushMessageContentAudio(Audio audio, boolean isPinned) {
            this.audio = audio;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 381581426;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with a user contact.
     */
    public static class PushMessageContentContact extends PushMessageContent {
        /**
         * Contact's name.
         */
        public String name;
        /**
         * True, if the message is a pinned message with the specified content.
         */
        public boolean isPinned;

        /**
         * A message with a user contact.
         */
        public PushMessageContentContact() {
        }

        /**
         * A message with a user contact.
         *
         * @param name Contact's name.
         * @param isPinned True, if the message is a pinned message with the specified content.
         */
        public PushMessageContentContact(String name, boolean isPinned) {
            this.name = name;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -12219820;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A contact has registered with Telegram.
     */
    public static class PushMessageContentContactRegistered extends PushMessageContent {
        /**
         * True, if the user joined Telegram as a Telegram Premium account.
         */
        public boolean asPremiumAccount;

        /**
         * A contact has registered with Telegram.
         */
        public PushMessageContentContactRegistered() {
        }

        /**
         * A contact has registered with Telegram.
         *
         * @param asPremiumAccount True, if the user joined Telegram as a Telegram Premium account.
         */
        public PushMessageContentContactRegistered(boolean asPremiumAccount) {
            this.asPremiumAccount = asPremiumAccount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1233778465;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A document message (a general file).
     */
    public static class PushMessageContentDocument extends PushMessageContent {
        /**
         * Message content; may be null.
         */
        @Nullable public Document document;
        /**
         * True, if the message is a pinned message with the specified content.
         */
        public boolean isPinned;

        /**
         * A document message (a general file).
         */
        public PushMessageContentDocument() {
        }

        /**
         * A document message (a general file).
         *
         * @param document Message content; may be null.
         * @param isPinned True, if the message is a pinned message with the specified content.
         */
        public PushMessageContentDocument(Document document, boolean isPinned) {
            this.document = document;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -458379775;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with a game.
     */
    public static class PushMessageContentGame extends PushMessageContent {
        /**
         * Game title, empty for pinned game message.
         */
        public String title;
        /**
         * True, if the message is a pinned message with the specified content.
         */
        public boolean isPinned;

        /**
         * A message with a game.
         */
        public PushMessageContentGame() {
        }

        /**
         * A message with a game.
         *
         * @param title Game title, empty for pinned game message.
         * @param isPinned True, if the message is a pinned message with the specified content.
         */
        public PushMessageContentGame(String title, boolean isPinned) {
            this.title = title;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -515131109;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new high score was achieved in a game.
     */
    public static class PushMessageContentGameScore extends PushMessageContent {
        /**
         * Game title, empty for pinned message.
         */
        public String title;
        /**
         * New score, 0 for pinned message.
         */
        public int score;
        /**
         * True, if the message is a pinned message with the specified content.
         */
        public boolean isPinned;

        /**
         * A new high score was achieved in a game.
         */
        public PushMessageContentGameScore() {
        }

        /**
         * A new high score was achieved in a game.
         *
         * @param title Game title, empty for pinned message.
         * @param score New score, 0 for pinned message.
         * @param isPinned True, if the message is a pinned message with the specified content.
         */
        public PushMessageContentGameScore(String title, int score, boolean isPinned) {
            this.title = title;
            this.score = score;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 901303688;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with an invoice from a bot.
     */
    public static class PushMessageContentInvoice extends PushMessageContent {
        /**
         * Product price.
         */
        public String price;
        /**
         * True, if the message is a pinned message with the specified content.
         */
        public boolean isPinned;

        /**
         * A message with an invoice from a bot.
         */
        public PushMessageContentInvoice() {
        }

        /**
         * A message with an invoice from a bot.
         *
         * @param price Product price.
         * @param isPinned True, if the message is a pinned message with the specified content.
         */
        public PushMessageContentInvoice(String price, boolean isPinned) {
            this.price = price;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1731687492;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with a location.
     */
    public static class PushMessageContentLocation extends PushMessageContent {
        /**
         * True, if the location is live.
         */
        public boolean isLive;
        /**
         * True, if the message is a pinned message with the specified content.
         */
        public boolean isPinned;

        /**
         * A message with a location.
         */
        public PushMessageContentLocation() {
        }

        /**
         * A message with a location.
         *
         * @param isLive True, if the location is live.
         * @param isPinned True, if the message is a pinned message with the specified content.
         */
        public PushMessageContentLocation(boolean isLive, boolean isPinned) {
            this.isLive = isLive;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1288005709;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with paid media.
     */
    public static class PushMessageContentPaidMedia extends PushMessageContent {
        /**
         * Number of Telegram Stars needed to buy access to the media in the message; 0 for pinned message.
         */
        public long starCount;
        /**
         * True, if the message is a pinned message with the specified content.
         */
        public boolean isPinned;

        /**
         * A message with paid media.
         */
        public PushMessageContentPaidMedia() {
        }

        /**
         * A message with paid media.
         *
         * @param starCount Number of Telegram Stars needed to buy access to the media in the message; 0 for pinned message.
         * @param isPinned True, if the message is a pinned message with the specified content.
         */
        public PushMessageContentPaidMedia(long starCount, boolean isPinned) {
            this.starCount = starCount;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1252595894;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A photo message.
     */
    public static class PushMessageContentPhoto extends PushMessageContent {
        /**
         * Message content; may be null.
         */
        @Nullable public Photo photo;
        /**
         * Photo caption.
         */
        public String caption;
        /**
         * True, if the photo is secret.
         */
        public boolean isSecret;
        /**
         * True, if the message is a pinned message with the specified content.
         */
        public boolean isPinned;

        /**
         * A photo message.
         */
        public PushMessageContentPhoto() {
        }

        /**
         * A photo message.
         *
         * @param photo Message content; may be null.
         * @param caption Photo caption.
         * @param isSecret True, if the photo is secret.
         * @param isPinned True, if the message is a pinned message with the specified content.
         */
        public PushMessageContentPhoto(Photo photo, String caption, boolean isSecret, boolean isPinned) {
            this.photo = photo;
            this.caption = caption;
            this.isSecret = isSecret;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 140631122;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with a poll.
     */
    public static class PushMessageContentPoll extends PushMessageContent {
        /**
         * Poll question.
         */
        public String question;
        /**
         * True, if the poll is regular and not in quiz mode.
         */
        public boolean isRegular;
        /**
         * True, if the message is a pinned message with the specified content.
         */
        public boolean isPinned;

        /**
         * A message with a poll.
         */
        public PushMessageContentPoll() {
        }

        /**
         * A message with a poll.
         *
         * @param question Poll question.
         * @param isRegular True, if the poll is regular and not in quiz mode.
         * @param isPinned True, if the message is a pinned message with the specified content.
         */
        public PushMessageContentPoll(String question, boolean isRegular, boolean isPinned) {
            this.question = question;
            this.isRegular = isRegular;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -44403654;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with a Telegram Premium gift code created for the user.
     */
    public static class PushMessageContentPremiumGiftCode extends PushMessageContent {
        /**
         * Number of months the Telegram Premium subscription will be active after code activation.
         */
        public int monthCount;

        /**
         * A message with a Telegram Premium gift code created for the user.
         */
        public PushMessageContentPremiumGiftCode() {
        }

        /**
         * A message with a Telegram Premium gift code created for the user.
         *
         * @param monthCount Number of months the Telegram Premium subscription will be active after code activation.
         */
        public PushMessageContentPremiumGiftCode(int monthCount) {
            this.monthCount = monthCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 413224997;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with a giveaway.
     */
    public static class PushMessageContentGiveaway extends PushMessageContent {
        /**
         * Number of users which will receive giveaway prizes; 0 for pinned message.
         */
        public int winnerCount;
        /**
         * Prize of the giveaway; may be null for pinned message.
         */
        @Nullable public GiveawayPrize prize;
        /**
         * True, if the message is a pinned message with the specified content.
         */
        public boolean isPinned;

        /**
         * A message with a giveaway.
         */
        public PushMessageContentGiveaway() {
        }

        /**
         * A message with a giveaway.
         *
         * @param winnerCount Number of users which will receive giveaway prizes; 0 for pinned message.
         * @param prize Prize of the giveaway; may be null for pinned message.
         * @param isPinned True, if the message is a pinned message with the specified content.
         */
        public PushMessageContentGiveaway(int winnerCount, GiveawayPrize prize, boolean isPinned) {
            this.winnerCount = winnerCount;
            this.prize = prize;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -700547186;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with a gift.
     */
    public static class PushMessageContentGift extends PushMessageContent {
        /**
         * Number of Telegram Stars that sender paid for the gift.
         */
        public long starCount;
        /**
         * True, if the message is about prepaid upgrade of the gift by another user instead of actual receiving of a new gift.
         */
        public boolean isPrepaidUpgrade;

        /**
         * A message with a gift.
         */
        public PushMessageContentGift() {
        }

        /**
         * A message with a gift.
         *
         * @param starCount Number of Telegram Stars that sender paid for the gift.
         * @param isPrepaidUpgrade True, if the message is about prepaid upgrade of the gift by another user instead of actual receiving of a new gift.
         */
        public PushMessageContentGift(long starCount, boolean isPrepaidUpgrade) {
            this.starCount = starCount;
            this.isPrepaidUpgrade = isPrepaidUpgrade;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1721859295;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with an upgraded gift.
     */
    public static class PushMessageContentUpgradedGift extends PushMessageContent {
        /**
         * True, if the gift was obtained by upgrading of a previously received gift; otherwise, if isPrepaidUpgrade == false, then this is a transferred or resold gift.
         */
        public boolean isUpgrade;
        /**
         * True, if the message is about completion of prepaid upgrade of the gift instead of actual receiving of a new gift.
         */
        public boolean isPrepaidUpgrade;

        /**
         * A message with an upgraded gift.
         */
        public PushMessageContentUpgradedGift() {
        }

        /**
         * A message with an upgraded gift.
         *
         * @param isUpgrade True, if the gift was obtained by upgrading of a previously received gift; otherwise, if isPrepaidUpgrade == false, then this is a transferred or resold gift.
         * @param isPrepaidUpgrade True, if the message is about completion of prepaid upgrade of the gift instead of actual receiving of a new gift.
         */
        public PushMessageContentUpgradedGift(boolean isUpgrade, boolean isPrepaidUpgrade) {
            this.isUpgrade = isUpgrade;
            this.isPrepaidUpgrade = isPrepaidUpgrade;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1287092226;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A screenshot of a message in the chat has been taken.
     */
    public static class PushMessageContentScreenshotTaken extends PushMessageContent {

        /**
         * A screenshot of a message in the chat has been taken.
         */
        public PushMessageContentScreenshotTaken() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 214245369;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with a sticker.
     */
    public static class PushMessageContentSticker extends PushMessageContent {
        /**
         * Message content; may be null.
         */
        @Nullable public Sticker sticker;
        /**
         * Emoji corresponding to the sticker; may be empty.
         */
        public String emoji;
        /**
         * True, if the message is a pinned message with the specified content.
         */
        public boolean isPinned;

        /**
         * A message with a sticker.
         */
        public PushMessageContentSticker() {
        }

        /**
         * A message with a sticker.
         *
         * @param sticker Message content; may be null.
         * @param emoji Emoji corresponding to the sticker; may be empty.
         * @param isPinned True, if the message is a pinned message with the specified content.
         */
        public PushMessageContentSticker(Sticker sticker, String emoji, boolean isPinned) {
            this.sticker = sticker;
            this.emoji = emoji;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1553513939;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with a story.
     */
    public static class PushMessageContentStory extends PushMessageContent {
        /**
         * True, if the user was mentioned in the story.
         */
        public boolean isMention;
        /**
         * True, if the message is a pinned message with the specified content.
         */
        public boolean isPinned;

        /**
         * A message with a story.
         */
        public PushMessageContentStory() {
        }

        /**
         * A message with a story.
         *
         * @param isMention True, if the user was mentioned in the story.
         * @param isPinned True, if the message is a pinned message with the specified content.
         */
        public PushMessageContentStory(boolean isMention, boolean isPinned) {
            this.isMention = isMention;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 599622223;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A text message.
     */
    public static class PushMessageContentText extends PushMessageContent {
        /**
         * Message text.
         */
        public String text;
        /**
         * True, if the message is a pinned message with the specified content.
         */
        public boolean isPinned;

        /**
         * A text message.
         */
        public PushMessageContentText() {
        }

        /**
         * A text message.
         *
         * @param text Message text.
         * @param isPinned True, if the message is a pinned message with the specified content.
         */
        public PushMessageContentText(String text, boolean isPinned) {
            this.text = text;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 274587305;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with a checklist.
     */
    public static class PushMessageContentChecklist extends PushMessageContent {
        /**
         * Checklist title.
         */
        public String title;
        /**
         * True, if the message is a pinned message with the specified content.
         */
        public boolean isPinned;

        /**
         * A message with a checklist.
         */
        public PushMessageContentChecklist() {
        }

        /**
         * A message with a checklist.
         *
         * @param title Checklist title.
         * @param isPinned True, if the message is a pinned message with the specified content.
         */
        public PushMessageContentChecklist(String title, boolean isPinned) {
            this.title = title;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 212274252;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A video message.
     */
    public static class PushMessageContentVideo extends PushMessageContent {
        /**
         * Message content; may be null.
         */
        @Nullable public Video video;
        /**
         * Video caption.
         */
        public String caption;
        /**
         * True, if the video is secret.
         */
        public boolean isSecret;
        /**
         * True, if the message is a pinned message with the specified content.
         */
        public boolean isPinned;

        /**
         * A video message.
         */
        public PushMessageContentVideo() {
        }

        /**
         * A video message.
         *
         * @param video Message content; may be null.
         * @param caption Video caption.
         * @param isSecret True, if the video is secret.
         * @param isPinned True, if the message is a pinned message with the specified content.
         */
        public PushMessageContentVideo(Video video, String caption, boolean isSecret, boolean isPinned) {
            this.video = video;
            this.caption = caption;
            this.isSecret = isSecret;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 310038831;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A video note message.
     */
    public static class PushMessageContentVideoNote extends PushMessageContent {
        /**
         * Message content; may be null.
         */
        @Nullable public VideoNote videoNote;
        /**
         * True, if the message is a pinned message with the specified content.
         */
        public boolean isPinned;

        /**
         * A video note message.
         */
        public PushMessageContentVideoNote() {
        }

        /**
         * A video note message.
         *
         * @param videoNote Message content; may be null.
         * @param isPinned True, if the message is a pinned message with the specified content.
         */
        public PushMessageContentVideoNote(VideoNote videoNote, boolean isPinned) {
            this.videoNote = videoNote;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1122764417;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A voice note message.
     */
    public static class PushMessageContentVoiceNote extends PushMessageContent {
        /**
         * Message content; may be null.
         */
        @Nullable public VoiceNote voiceNote;
        /**
         * True, if the message is a pinned message with the specified content.
         */
        public boolean isPinned;

        /**
         * A voice note message.
         */
        public PushMessageContentVoiceNote() {
        }

        /**
         * A voice note message.
         *
         * @param voiceNote Message content; may be null.
         * @param isPinned True, if the message is a pinned message with the specified content.
         */
        public PushMessageContentVoiceNote(VoiceNote voiceNote, boolean isPinned) {
            this.voiceNote = voiceNote;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 88910987;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A newly created basic group.
     */
    public static class PushMessageContentBasicGroupChatCreate extends PushMessageContent {

        /**
         * A newly created basic group.
         */
        public PushMessageContentBasicGroupChatCreate() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2114855172;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A video chat or live stream was started.
     */
    public static class PushMessageContentVideoChatStarted extends PushMessageContent {

        /**
         * A video chat or live stream was started.
         */
        public PushMessageContentVideoChatStarted() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -566547393;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A video chat or live stream has ended.
     */
    public static class PushMessageContentVideoChatEnded extends PushMessageContent {

        /**
         * A video chat or live stream has ended.
         */
        public PushMessageContentVideoChatEnded() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1250265885;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An invitation of participants to a video chat or live stream.
     */
    public static class PushMessageContentInviteVideoChatParticipants extends PushMessageContent {
        /**
         * True, if the current user was invited to the video chat or the live stream.
         */
        public boolean isCurrentUser;

        /**
         * An invitation of participants to a video chat or live stream.
         */
        public PushMessageContentInviteVideoChatParticipants() {
        }

        /**
         * An invitation of participants to a video chat or live stream.
         *
         * @param isCurrentUser True, if the current user was invited to the video chat or the live stream.
         */
        public PushMessageContentInviteVideoChatParticipants(boolean isCurrentUser) {
            this.isCurrentUser = isCurrentUser;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 517620365;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * New chat members were invited to a group.
     */
    public static class PushMessageContentChatAddMembers extends PushMessageContent {
        /**
         * Name of the added member.
         */
        public String memberName;
        /**
         * True, if the current user was added to the group.
         */
        public boolean isCurrentUser;
        /**
         * True, if the user has returned to the group themselves.
         */
        public boolean isReturned;

        /**
         * New chat members were invited to a group.
         */
        public PushMessageContentChatAddMembers() {
        }

        /**
         * New chat members were invited to a group.
         *
         * @param memberName Name of the added member.
         * @param isCurrentUser True, if the current user was added to the group.
         * @param isReturned True, if the user has returned to the group themselves.
         */
        public PushMessageContentChatAddMembers(String memberName, boolean isCurrentUser, boolean isReturned) {
            this.memberName = memberName;
            this.isCurrentUser = isCurrentUser;
            this.isReturned = isReturned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1087145158;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat photo was edited.
     */
    public static class PushMessageContentChatChangePhoto extends PushMessageContent {

        /**
         * A chat photo was edited.
         */
        public PushMessageContentChatChangePhoto() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1114222051;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat title was edited.
     */
    public static class PushMessageContentChatChangeTitle extends PushMessageContent {
        /**
         * New chat title.
         */
        public String title;

        /**
         * A chat title was edited.
         */
        public PushMessageContentChatChangeTitle() {
        }

        /**
         * A chat title was edited.
         *
         * @param title New chat title.
         */
        public PushMessageContentChatChangeTitle(String title) {
            this.title = title;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1964902749;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat background was edited.
     */
    public static class PushMessageContentChatSetBackground extends PushMessageContent {
        /**
         * True, if the set background is the same as the background of the current user.
         */
        public boolean isSame;

        /**
         * A chat background was edited.
         */
        public PushMessageContentChatSetBackground() {
        }

        /**
         * A chat background was edited.
         *
         * @param isSame True, if the set background is the same as the background of the current user.
         */
        public PushMessageContentChatSetBackground(boolean isSame) {
            this.isSame = isSame;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1490331933;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat theme was edited.
     */
    public static class PushMessageContentChatSetTheme extends PushMessageContent {
        /**
         * If non-empty, human-readable name of the new theme. Otherwise, the chat theme was reset to the default one.
         */
        public String name;

        /**
         * A chat theme was edited.
         */
        public PushMessageContentChatSetTheme() {
        }

        /**
         * A chat theme was edited.
         *
         * @param name If non-empty, human-readable name of the new theme. Otherwise, the chat theme was reset to the default one.
         */
        public PushMessageContentChatSetTheme(String name) {
            this.name = name;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1605251024;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat member was deleted.
     */
    public static class PushMessageContentChatDeleteMember extends PushMessageContent {
        /**
         * Name of the deleted member.
         */
        public String memberName;
        /**
         * True, if the current user was deleted from the group.
         */
        public boolean isCurrentUser;
        /**
         * True, if the user has left the group themselves.
         */
        public boolean isLeft;

        /**
         * A chat member was deleted.
         */
        public PushMessageContentChatDeleteMember() {
        }

        /**
         * A chat member was deleted.
         *
         * @param memberName Name of the deleted member.
         * @param isCurrentUser True, if the current user was deleted from the group.
         * @param isLeft True, if the user has left the group themselves.
         */
        public PushMessageContentChatDeleteMember(String memberName, boolean isCurrentUser, boolean isLeft) {
            this.memberName = memberName;
            this.isCurrentUser = isCurrentUser;
            this.isLeft = isLeft;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 598714783;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new member joined the chat via an invite link.
     */
    public static class PushMessageContentChatJoinByLink extends PushMessageContent {

        /**
         * A new member joined the chat via an invite link.
         */
        public PushMessageContentChatJoinByLink() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1553719113;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new member was accepted to the chat by an administrator.
     */
    public static class PushMessageContentChatJoinByRequest extends PushMessageContent {

        /**
         * A new member was accepted to the chat by an administrator.
         */
        public PushMessageContentChatJoinByRequest() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -205823627;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new recurring payment was made by the current user.
     */
    public static class PushMessageContentRecurringPayment extends PushMessageContent {
        /**
         * The paid amount.
         */
        public String amount;

        /**
         * A new recurring payment was made by the current user.
         */
        public PushMessageContentRecurringPayment() {
        }

        /**
         * A new recurring payment was made by the current user.
         *
         * @param amount The paid amount.
         */
        public PushMessageContentRecurringPayment(String amount) {
            this.amount = amount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1619211802;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A profile photo was suggested to the user.
     */
    public static class PushMessageContentSuggestProfilePhoto extends PushMessageContent {

        /**
         * A profile photo was suggested to the user.
         */
        public PushMessageContentSuggestProfilePhoto() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2104225963;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A birthdate was suggested to be set.
     */
    public static class PushMessageContentSuggestBirthdate extends PushMessageContent {

        /**
         * A birthdate was suggested to be set.
         */
        public PushMessageContentSuggestBirthdate() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -899891750;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A user in the chat came within proximity alert range from the current user.
     */
    public static class PushMessageContentProximityAlertTriggered extends PushMessageContent {
        /**
         * The distance to the user.
         */
        public int distance;

        /**
         * A user in the chat came within proximity alert range from the current user.
         */
        public PushMessageContentProximityAlertTriggered() {
        }

        /**
         * A user in the chat came within proximity alert range from the current user.
         *
         * @param distance The distance to the user.
         */
        public PushMessageContentProximityAlertTriggered(int distance) {
            this.distance = distance;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -264601594;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Some tasks were added to a checklist.
     */
    public static class PushMessageContentChecklistTasksAdded extends PushMessageContent {
        /**
         * Number of added tasks.
         */
        public int taskCount;

        /**
         * Some tasks were added to a checklist.
         */
        public PushMessageContentChecklistTasksAdded() {
        }

        /**
         * Some tasks were added to a checklist.
         *
         * @param taskCount Number of added tasks.
         */
        public PushMessageContentChecklistTasksAdded(int taskCount) {
            this.taskCount = taskCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2141595022;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Some tasks from a checklist were marked as done or not done.
     */
    public static class PushMessageContentChecklistTasksDone extends PushMessageContent {
        /**
         * Number of changed tasks.
         */
        public int taskCount;

        /**
         * Some tasks from a checklist were marked as done or not done.
         */
        public PushMessageContentChecklistTasksDone() {
        }

        /**
         * Some tasks from a checklist were marked as done or not done.
         *
         * @param taskCount Number of changed tasks.
         */
        public PushMessageContentChecklistTasksDone(int taskCount) {
            this.taskCount = taskCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1187614554;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An option was added to a poll.
     */
    public static class PushMessageContentPollOptionAdded extends PushMessageContent {
        /**
         * Text of the option.
         */
        public String text;

        /**
         * An option was added to a poll.
         */
        public PushMessageContentPollOptionAdded() {
        }

        /**
         * An option was added to a poll.
         *
         * @param text Text of the option.
         */
        public PushMessageContentPollOptionAdded(String text) {
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -86122207;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A forwarded messages.
     */
    public static class PushMessageContentMessageForwards extends PushMessageContent {
        /**
         * Number of forwarded messages.
         */
        public int totalCount;

        /**
         * A forwarded messages.
         */
        public PushMessageContentMessageForwards() {
        }

        /**
         * A forwarded messages.
         *
         * @param totalCount Number of forwarded messages.
         */
        public PushMessageContentMessageForwards(int totalCount) {
            this.totalCount = totalCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1913083876;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A media album.
     */
    public static class PushMessageContentMediaAlbum extends PushMessageContent {
        /**
         * Number of messages in the album.
         */
        public int totalCount;
        /**
         * True, if the album has at least one photo.
         */
        public boolean hasPhotos;
        /**
         * True, if the album has at least one video file.
         */
        public boolean hasVideos;
        /**
         * True, if the album has at least one audio file.
         */
        public boolean hasAudios;
        /**
         * True, if the album has at least one document.
         */
        public boolean hasDocuments;

        /**
         * A media album.
         */
        public PushMessageContentMediaAlbum() {
        }

        /**
         * A media album.
         *
         * @param totalCount Number of messages in the album.
         * @param hasPhotos True, if the album has at least one photo.
         * @param hasVideos True, if the album has at least one video file.
         * @param hasAudios True, if the album has at least one audio file.
         * @param hasDocuments True, if the album has at least one document.
         */
        public PushMessageContentMediaAlbum(int totalCount, boolean hasPhotos, boolean hasVideos, boolean hasAudios, boolean hasDocuments) {
            this.totalCount = totalCount;
            this.hasPhotos = hasPhotos;
            this.hasVideos = hasVideos;
            this.hasAudios = hasAudios;
            this.hasDocuments = hasDocuments;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -748426897;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a globally unique push receiver identifier, which can be used to identify which account has received a push notification.
     */
    public static class PushReceiverId extends Object {
        /**
         * The globally unique identifier of push notification subscription.
         */
        public long id;

        /**
         * Contains a globally unique push receiver identifier, which can be used to identify which account has received a push notification.
         */
        public PushReceiverId() {
        }

        /**
         * Contains a globally unique push receiver identifier, which can be used to identify which account has received a push notification.
         *
         * @param id The globally unique identifier of push notification subscription.
         */
        public PushReceiverId(long id) {
            this.id = id;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 371056428;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a message that can be used for quick reply.
     */
    public static class QuickReplyMessage extends Object {
        /**
         * Unique message identifier among all quick replies.
         */
        public long id;
        /**
         * The sending state of the message; may be null if the message isn't being sent and didn't fail to be sent.
         */
        @Nullable public MessageSendingState sendingState;
        /**
         * True, if the message can be edited.
         */
        public boolean canBeEdited;
        /**
         * The identifier of the quick reply message to which the message replies; 0 if none.
         */
        public long replyToMessageId;
        /**
         * If non-zero, the user identifier of the bot through which this message was sent.
         */
        public long viaBotUserId;
        /**
         * Unique identifier of an album this message belongs to; 0 if none. Only audios, documents, photos and videos can be grouped together in albums.
         */
        public long mediaAlbumId;
        /**
         * Content of the message.
         */
        public MessageContent content;
        /**
         * Inline keyboard reply markup for the message; may be null if none.
         */
        @Nullable public ReplyMarkup replyMarkup;

        /**
         * Describes a message that can be used for quick reply.
         */
        public QuickReplyMessage() {
        }

        /**
         * Describes a message that can be used for quick reply.
         *
         * @param id Unique message identifier among all quick replies.
         * @param sendingState The sending state of the message; may be null if the message isn't being sent and didn't fail to be sent.
         * @param canBeEdited True, if the message can be edited.
         * @param replyToMessageId The identifier of the quick reply message to which the message replies; 0 if none.
         * @param viaBotUserId If non-zero, the user identifier of the bot through which this message was sent.
         * @param mediaAlbumId Unique identifier of an album this message belongs to; 0 if none. Only audios, documents, photos and videos can be grouped together in albums.
         * @param content Content of the message.
         * @param replyMarkup Inline keyboard reply markup for the message; may be null if none.
         */
        public QuickReplyMessage(long id, MessageSendingState sendingState, boolean canBeEdited, long replyToMessageId, long viaBotUserId, long mediaAlbumId, MessageContent content, ReplyMarkup replyMarkup) {
            this.id = id;
            this.sendingState = sendingState;
            this.canBeEdited = canBeEdited;
            this.replyToMessageId = replyToMessageId;
            this.viaBotUserId = viaBotUserId;
            this.mediaAlbumId = mediaAlbumId;
            this.content = content;
            this.replyMarkup = replyMarkup;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1090965757;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of quick reply messages.
     */
    public static class QuickReplyMessages extends Object {
        /**
         * List of quick reply messages; messages may be null.
         */
        public QuickReplyMessage[] messages;

        /**
         * Contains a list of quick reply messages.
         */
        public QuickReplyMessages() {
        }

        /**
         * Contains a list of quick reply messages.
         *
         * @param messages List of quick reply messages; messages may be null.
         */
        public QuickReplyMessages(QuickReplyMessage[] messages) {
            this.messages = messages;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 743214375;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a shortcut that can be used for a quick reply.
     */
    public static class QuickReplyShortcut extends Object {
        /**
         * Unique shortcut identifier.
         */
        public int id;
        /**
         * The name of the shortcut that can be used to use the shortcut.
         */
        public String name;
        /**
         * The first shortcut message.
         */
        public QuickReplyMessage firstMessage;
        /**
         * The total number of messages in the shortcut.
         */
        public int messageCount;

        /**
         * Describes a shortcut that can be used for a quick reply.
         */
        public QuickReplyShortcut() {
        }

        /**
         * Describes a shortcut that can be used for a quick reply.
         *
         * @param id Unique shortcut identifier.
         * @param name The name of the shortcut that can be used to use the shortcut.
         * @param firstMessage The first shortcut message.
         * @param messageCount The total number of messages in the shortcut.
         */
        public QuickReplyShortcut(int id, String name, QuickReplyMessage firstMessage, int messageCount) {
            this.id = id;
            this.name = name;
            this.firstMessage = firstMessage;
            this.messageCount = messageCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1107453291;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about notification settings for reactions and poll votes.
     */
    public static class ReactionNotificationSettings extends Object {
        /**
         * Source of message reactions for which notifications are shown.
         */
        public ReactionNotificationSource messageReactionSource;
        /**
         * Source of story reactions for which notifications are shown.
         */
        public ReactionNotificationSource storyReactionSource;
        /**
         * Source of poll votes for which notifications are shown.
         */
        public ReactionNotificationSource pollVoteSource;
        /**
         * Identifier of the notification sound to be played; 0 if sound is disabled; pass -1 to use the app-dependent default sound.
         */
        public long soundId;
        /**
         * True, if reaction sender and emoji must be displayed in notifications.
         */
        public boolean showPreview;

        /**
         * Contains information about notification settings for reactions and poll votes.
         */
        public ReactionNotificationSettings() {
        }

        /**
         * Contains information about notification settings for reactions and poll votes.
         *
         * @param messageReactionSource Source of message reactions for which notifications are shown.
         * @param storyReactionSource Source of story reactions for which notifications are shown.
         * @param pollVoteSource Source of poll votes for which notifications are shown.
         * @param soundId Identifier of the notification sound to be played; 0 if sound is disabled; pass -1 to use the app-dependent default sound.
         * @param showPreview True, if reaction sender and emoji must be displayed in notifications.
         */
        public ReactionNotificationSettings(ReactionNotificationSource messageReactionSource, ReactionNotificationSource storyReactionSource, ReactionNotificationSource pollVoteSource, long soundId, boolean showPreview) {
            this.messageReactionSource = messageReactionSource;
            this.storyReactionSource = storyReactionSource;
            this.pollVoteSource = pollVoteSource;
            this.soundId = soundId;
            this.showPreview = showPreview;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2074932258;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes sources of reactions for which notifications will be shown.
     */
    public abstract static class ReactionNotificationSource extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ReactionNotificationSourceNone.CONSTRUCTOR,
            ReactionNotificationSourceContacts.CONSTRUCTOR,
            ReactionNotificationSourceAll.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ReactionNotificationSource() {
        }
    }

    /**
     * Notifications for reactions are disabled.
     */
    public static class ReactionNotificationSourceNone extends ReactionNotificationSource {

        /**
         * Notifications for reactions are disabled.
         */
        public ReactionNotificationSourceNone() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 366374940;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Notifications for reactions are shown only for reactions from contacts.
     */
    public static class ReactionNotificationSourceContacts extends ReactionNotificationSource {

        /**
         * Notifications for reactions are shown only for reactions from contacts.
         */
        public ReactionNotificationSourceContacts() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 555501621;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Notifications for reactions are shown for all reactions.
     */
    public static class ReactionNotificationSourceAll extends ReactionNotificationSource {

        /**
         * Notifications for reactions are shown for all reactions.
         */
        public ReactionNotificationSourceAll() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1241689234;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes type of message reaction.
     */
    public abstract static class ReactionType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ReactionTypeEmoji.CONSTRUCTOR,
            ReactionTypeCustomEmoji.CONSTRUCTOR,
            ReactionTypePaid.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ReactionType() {
        }
    }

    /**
     * A reaction with an emoji.
     */
    public static class ReactionTypeEmoji extends ReactionType {
        /**
         * Text representation of the reaction.
         */
        public String emoji;

        /**
         * A reaction with an emoji.
         */
        public ReactionTypeEmoji() {
        }

        /**
         * A reaction with an emoji.
         *
         * @param emoji Text representation of the reaction.
         */
        public ReactionTypeEmoji(String emoji) {
            this.emoji = emoji;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1942084920;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A reaction with a custom emoji.
     */
    public static class ReactionTypeCustomEmoji extends ReactionType {
        /**
         * Unique identifier of the custom emoji.
         */
        public long customEmojiId;

        /**
         * A reaction with a custom emoji.
         */
        public ReactionTypeCustomEmoji() {
        }

        /**
         * A reaction with a custom emoji.
         *
         * @param customEmojiId Unique identifier of the custom emoji.
         */
        public ReactionTypeCustomEmoji(long customEmojiId) {
            this.customEmojiId = customEmojiId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -989117709;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The paid reaction in a channel chat.
     */
    public static class ReactionTypePaid extends ReactionType {

        /**
         * The paid reaction in a channel chat.
         */
        public ReactionTypePaid() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 436294381;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes why the current user can't add reactions to the message, despite some other users can.
     */
    public abstract static class ReactionUnavailabilityReason extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ReactionUnavailabilityReasonAnonymousAdministrator.CONSTRUCTOR,
            ReactionUnavailabilityReasonGuest.CONSTRUCTOR,
            ReactionUnavailabilityReasonRestricted.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ReactionUnavailabilityReason() {
        }
    }

    /**
     * The user is an anonymous administrator in the supergroup, but isn't a creator of it, so they can't vote on behalf of the supergroup.
     */
    public static class ReactionUnavailabilityReasonAnonymousAdministrator extends ReactionUnavailabilityReason {

        /**
         * The user is an anonymous administrator in the supergroup, but isn't a creator of it, so they can't vote on behalf of the supergroup.
         */
        public ReactionUnavailabilityReasonAnonymousAdministrator() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -499612677;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user isn't a member of the supergroup and can't send messages and reactions there without joining.
     */
    public static class ReactionUnavailabilityReasonGuest extends ReactionUnavailabilityReason {

        /**
         * The user isn't a member of the supergroup and can't send messages and reactions there without joining.
         */
        public ReactionUnavailabilityReasonGuest() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1357861444;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user is restricted in the chat.
     */
    public static class ReactionUnavailabilityReasonRestricted extends ReactionUnavailabilityReason {

        /**
         * The user is restricted in the chat.
         */
        public ReactionUnavailabilityReasonRestricted() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1836882716;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains privacy settings for message read date in private chats. Read dates are always shown to the users that can see online status of the current user regardless of this setting.
     */
    public static class ReadDatePrivacySettings extends Object {
        /**
         * True, if message read date is shown to other users in private chats. If false and the current user isn't a Telegram Premium user, then they will not be able to see other's message read date.
         */
        public boolean showReadDate;

        /**
         * Contains privacy settings for message read date in private chats. Read dates are always shown to the users that can see online status of the current user regardless of this setting.
         */
        public ReadDatePrivacySettings() {
        }

        /**
         * Contains privacy settings for message read date in private chats. Read dates are always shown to the users that can see online status of the current user regardless of this setting.
         *
         * @param showReadDate True, if message read date is shown to other users in private chats. If false and the current user isn't a Telegram Premium user, then they will not be able to see other's message read date.
         */
        public ReadDatePrivacySettings(boolean showReadDate) {
            this.showReadDate = showReadDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1654842920;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a gift received by a user or a chat.
     */
    public static class ReceivedGift extends Object {
        /**
         * Unique identifier of the received gift for the current user; only for the receiver of the gift.
         */
        public String receivedGiftId;
        /**
         * Identifier of a user or a chat that sent the gift; may be null if unknown.
         */
        @Nullable public MessageSender senderId;
        /**
         * Message added to the gift.
         */
        public FormattedText text;
        /**
         * Unique number of the gift among gifts upgraded from the same gift after upgrade; 0 if yet unassigned.
         */
        public int uniqueGiftNumber;
        /**
         * True, if the sender and gift text are shown only to the gift receiver; otherwise, everyone are able to see them.
         */
        public boolean isPrivate;
        /**
         * True, if the gift is displayed on the chat's profile page; only for the receiver of the gift.
         */
        public boolean isSaved;
        /**
         * True, if the gift is pinned to the top of the chat's profile page.
         */
        public boolean isPinned;
        /**
         * True, if the gift is a regular gift that can be upgraded to a unique gift; only for the receiver of the gift.
         */
        public boolean canBeUpgraded;
        /**
         * True, if the gift is an upgraded gift that can be transferred to another owner; only for the receiver of the gift.
         */
        public boolean canBeTransferred;
        /**
         * True, if the gift was refunded and isn't available anymore.
         */
        public boolean wasRefunded;
        /**
         * Point in time (Unix timestamp) when the gift was sent.
         */
        public int date;
        /**
         * The gift.
         */
        public SentGift gift;
        /**
         * Identifiers of collections to which the gift is added; only for the receiver of the gift.
         */
        public int[] collectionIds;
        /**
         * Number of Telegram Stars that can be claimed by the receiver instead of the regular gift; 0 if the gift can't be sold by the current user.
         */
        public long sellStarCount;
        /**
         * Number of Telegram Stars that were paid by the sender for the ability to upgrade the gift.
         */
        public long prepaidUpgradeStarCount;
        /**
         * True, if the upgrade was bought after the gift was sent. In this case, prepaid upgrade cost must not be added to the gift cost.
         */
        public boolean isUpgradeSeparate;
        /**
         * Number of Telegram Stars that must be paid to transfer the upgraded gift; only for the receiver of the gift.
         */
        public long transferStarCount;
        /**
         * Number of Telegram Stars that must be paid to drop original details of the upgraded gift; 0 if not available; only for the receiver of the gift.
         */
        public long dropOriginalDetailsStarCount;
        /**
         * Point in time (Unix timestamp) when the gift can be transferred to another owner; can be in the past; 0 if the gift can be transferred immediately or transfer isn't possible; only for the receiver of the gift.
         */
        public int nextTransferDate;
        /**
         * Point in time (Unix timestamp) when the gift can be resold to another user; can be in the past; 0 if the gift can't be resold; only for the receiver of the gift.
         */
        public int nextResaleDate;
        /**
         * Point in time (Unix timestamp) when the upgraded gift can be transferred to the TON blockchain as an NFT; can be in the past; 0 if NFT export isn't possible; only for the receiver of the gift.
         */
        public int exportDate;
        /**
         * If non-empty, then the user can pay for an upgrade of the gift using buyGiftUpgrade.
         */
        public String prepaidUpgradeHash;
        /**
         * Point in time (Unix timestamp) when the gift can be used to craft another gift can be in the past; only for the receiver of the gift.
         */
        public int craftDate;

        /**
         * Represents a gift received by a user or a chat.
         */
        public ReceivedGift() {
        }

        /**
         * Represents a gift received by a user or a chat.
         *
         * @param receivedGiftId Unique identifier of the received gift for the current user; only for the receiver of the gift.
         * @param senderId Identifier of a user or a chat that sent the gift; may be null if unknown.
         * @param text Message added to the gift.
         * @param uniqueGiftNumber Unique number of the gift among gifts upgraded from the same gift after upgrade; 0 if yet unassigned.
         * @param isPrivate True, if the sender and gift text are shown only to the gift receiver; otherwise, everyone are able to see them.
         * @param isSaved True, if the gift is displayed on the chat's profile page; only for the receiver of the gift.
         * @param isPinned True, if the gift is pinned to the top of the chat's profile page.
         * @param canBeUpgraded True, if the gift is a regular gift that can be upgraded to a unique gift; only for the receiver of the gift.
         * @param canBeTransferred True, if the gift is an upgraded gift that can be transferred to another owner; only for the receiver of the gift.
         * @param wasRefunded True, if the gift was refunded and isn't available anymore.
         * @param date Point in time (Unix timestamp) when the gift was sent.
         * @param gift The gift.
         * @param collectionIds Identifiers of collections to which the gift is added; only for the receiver of the gift.
         * @param sellStarCount Number of Telegram Stars that can be claimed by the receiver instead of the regular gift; 0 if the gift can't be sold by the current user.
         * @param prepaidUpgradeStarCount Number of Telegram Stars that were paid by the sender for the ability to upgrade the gift.
         * @param isUpgradeSeparate True, if the upgrade was bought after the gift was sent. In this case, prepaid upgrade cost must not be added to the gift cost.
         * @param transferStarCount Number of Telegram Stars that must be paid to transfer the upgraded gift; only for the receiver of the gift.
         * @param dropOriginalDetailsStarCount Number of Telegram Stars that must be paid to drop original details of the upgraded gift; 0 if not available; only for the receiver of the gift.
         * @param nextTransferDate Point in time (Unix timestamp) when the gift can be transferred to another owner; can be in the past; 0 if the gift can be transferred immediately or transfer isn't possible; only for the receiver of the gift.
         * @param nextResaleDate Point in time (Unix timestamp) when the gift can be resold to another user; can be in the past; 0 if the gift can't be resold; only for the receiver of the gift.
         * @param exportDate Point in time (Unix timestamp) when the upgraded gift can be transferred to the TON blockchain as an NFT; can be in the past; 0 if NFT export isn't possible; only for the receiver of the gift.
         * @param prepaidUpgradeHash If non-empty, then the user can pay for an upgrade of the gift using buyGiftUpgrade.
         * @param craftDate Point in time (Unix timestamp) when the gift can be used to craft another gift can be in the past; only for the receiver of the gift.
         */
        public ReceivedGift(String receivedGiftId, MessageSender senderId, FormattedText text, int uniqueGiftNumber, boolean isPrivate, boolean isSaved, boolean isPinned, boolean canBeUpgraded, boolean canBeTransferred, boolean wasRefunded, int date, SentGift gift, int[] collectionIds, long sellStarCount, long prepaidUpgradeStarCount, boolean isUpgradeSeparate, long transferStarCount, long dropOriginalDetailsStarCount, int nextTransferDate, int nextResaleDate, int exportDate, String prepaidUpgradeHash, int craftDate) {
            this.receivedGiftId = receivedGiftId;
            this.senderId = senderId;
            this.text = text;
            this.uniqueGiftNumber = uniqueGiftNumber;
            this.isPrivate = isPrivate;
            this.isSaved = isSaved;
            this.isPinned = isPinned;
            this.canBeUpgraded = canBeUpgraded;
            this.canBeTransferred = canBeTransferred;
            this.wasRefunded = wasRefunded;
            this.date = date;
            this.gift = gift;
            this.collectionIds = collectionIds;
            this.sellStarCount = sellStarCount;
            this.prepaidUpgradeStarCount = prepaidUpgradeStarCount;
            this.isUpgradeSeparate = isUpgradeSeparate;
            this.transferStarCount = transferStarCount;
            this.dropOriginalDetailsStarCount = dropOriginalDetailsStarCount;
            this.nextTransferDate = nextTransferDate;
            this.nextResaleDate = nextResaleDate;
            this.exportDate = exportDate;
            this.prepaidUpgradeHash = prepaidUpgradeHash;
            this.craftDate = craftDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -389770324;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of gifts received by a user or a chat.
     */
    public static class ReceivedGifts extends Object {
        /**
         * The total number of received gifts.
         */
        public int totalCount;
        /**
         * The list of gifts.
         */
        public ReceivedGift[] gifts;
        /**
         * True, if notifications about new gifts of the owner are enabled.
         */
        public boolean areNotificationsEnabled;
        /**
         * The offset for the next request. If empty, then there are no more results.
         */
        public String nextOffset;

        /**
         * Represents a list of gifts received by a user or a chat.
         */
        public ReceivedGifts() {
        }

        /**
         * Represents a list of gifts received by a user or a chat.
         *
         * @param totalCount The total number of received gifts.
         * @param gifts The list of gifts.
         * @param areNotificationsEnabled True, if notifications about new gifts of the owner are enabled.
         * @param nextOffset The offset for the next request. If empty, then there are no more results.
         */
        public ReceivedGifts(int totalCount, ReceivedGift[] gifts, boolean areNotificationsEnabled, String nextOffset) {
            this.totalCount = totalCount;
            this.gifts = gifts;
            this.areNotificationsEnabled = areNotificationsEnabled;
            this.nextOffset = nextOffset;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1237114400;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a recommended chat folder.
     */
    public static class RecommendedChatFolder extends Object {
        /**
         * The chat folder.
         */
        public ChatFolder folder;
        /**
         * Chat folder description.
         */
        public String description;

        /**
         * Describes a recommended chat folder.
         */
        public RecommendedChatFolder() {
        }

        /**
         * Describes a recommended chat folder.
         *
         * @param folder The chat folder.
         * @param description Chat folder description.
         */
        public RecommendedChatFolder(ChatFolder folder, String description) {
            this.folder = folder;
            this.description = description;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2116569930;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of recommended chat folders.
     */
    public static class RecommendedChatFolders extends Object {
        /**
         * List of recommended chat folders.
         */
        public RecommendedChatFolder[] chatFolders;

        /**
         * Contains a list of recommended chat folders.
         */
        public RecommendedChatFolders() {
        }

        /**
         * Contains a list of recommended chat folders.
         *
         * @param chatFolders List of recommended chat folders.
         */
        public RecommendedChatFolders(RecommendedChatFolder[] chatFolders) {
            this.chatFolders = chatFolders;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -739217656;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about the current recovery email address.
     */
    public static class RecoveryEmailAddress extends Object {
        /**
         * Recovery email address.
         */
        public String recoveryEmailAddress;

        /**
         * Contains information about the current recovery email address.
         */
        public RecoveryEmailAddress() {
        }

        /**
         * Contains information about the current recovery email address.
         *
         * @param recoveryEmailAddress Recovery email address.
         */
        public RecoveryEmailAddress(String recoveryEmailAddress) {
            this.recoveryEmailAddress = recoveryEmailAddress;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1290526187;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a remote file.
     */
    public static class RemoteFile extends Object {
        /**
         * Remote file identifier; may be empty. Can be used by the current user across application restarts or even from other devices. Uniquely identifies a file, but a file can have a lot of different valid identifiers. If the identifier starts with &quot;http://&quot; or &quot;https://&quot;, it represents the HTTP URL of the file. TDLib is currently unable to download files if only their URL is known. If downloadFile/addFileToDownloads is called on such a file or if it is sent to a secret chat, TDLib starts a file generation process by sending updateFileGenerationStart to the application with the HTTP URL in the originalPath and &quot;#url#&quot; as the conversion string. Application must generate the file by downloading it to the specified location.
         */
        public String id;
        /**
         * Unique file identifier; may be empty if unknown. The unique file identifier which is the same for the same file even for different users and is persistent over time.
         */
        public String uniqueId;
        /**
         * True, if the file is currently being uploaded (or a remote copy is being generated by some other means).
         */
        public boolean isUploadingActive;
        /**
         * True, if a remote copy is fully available.
         */
        public boolean isUploadingCompleted;
        /**
         * Size of the remote available part of the file, in bytes; 0 if unknown.
         */
        public long uploadedSize;

        /**
         * Represents a remote file.
         */
        public RemoteFile() {
        }

        /**
         * Represents a remote file.
         *
         * @param id Remote file identifier; may be empty. Can be used by the current user across application restarts or even from other devices. Uniquely identifies a file, but a file can have a lot of different valid identifiers. If the identifier starts with &quot;http://&quot; or &quot;https://&quot;, it represents the HTTP URL of the file. TDLib is currently unable to download files if only their URL is known. If downloadFile/addFileToDownloads is called on such a file or if it is sent to a secret chat, TDLib starts a file generation process by sending updateFileGenerationStart to the application with the HTTP URL in the originalPath and &quot;#url#&quot; as the conversion string. Application must generate the file by downloading it to the specified location.
         * @param uniqueId Unique file identifier; may be empty if unknown. The unique file identifier which is the same for the same file even for different users and is persistent over time.
         * @param isUploadingActive True, if the file is currently being uploaded (or a remote copy is being generated by some other means).
         * @param isUploadingCompleted True, if a remote copy is fully available.
         * @param uploadedSize Size of the remote available part of the file, in bytes; 0 if unknown.
         */
        public RemoteFile(String id, String uniqueId, boolean isUploadingActive, boolean isUploadingCompleted, long uploadedSize) {
            this.id = id;
            this.uniqueId = uniqueId;
            this.isUploadingActive = isUploadingActive;
            this.isUploadingCompleted = isUploadingCompleted;
            this.uploadedSize = uploadedSize;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 747731030;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains a description of a custom keyboard and actions that can be done with it to quickly reply to bots.
     */
    public abstract static class ReplyMarkup extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ReplyMarkupRemoveKeyboard.CONSTRUCTOR,
            ReplyMarkupForceReply.CONSTRUCTOR,
            ReplyMarkupShowKeyboard.CONSTRUCTOR,
            ReplyMarkupInlineKeyboard.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ReplyMarkup() {
        }
    }

    /**
     * Instructs application to remove the keyboard once this message has been received. This kind of keyboard can't be received in an incoming message; instead, updateChatReplyMarkup with replyMarkupMessage == null will be sent.
     */
    public static class ReplyMarkupRemoveKeyboard extends ReplyMarkup {
        /**
         * True, if the keyboard is removed only for the mentioned users or the target user of a reply.
         */
        public boolean isPersonal;

        /**
         * Instructs application to remove the keyboard once this message has been received. This kind of keyboard can't be received in an incoming message; instead, updateChatReplyMarkup with replyMarkupMessage == null will be sent.
         */
        public ReplyMarkupRemoveKeyboard() {
        }

        /**
         * Instructs application to remove the keyboard once this message has been received. This kind of keyboard can't be received in an incoming message; instead, updateChatReplyMarkup with replyMarkupMessage == null will be sent.
         *
         * @param isPersonal True, if the keyboard is removed only for the mentioned users or the target user of a reply.
         */
        public ReplyMarkupRemoveKeyboard(boolean isPersonal) {
            this.isPersonal = isPersonal;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -691252879;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Instructs application to force a reply to this message.
     */
    public static class ReplyMarkupForceReply extends ReplyMarkup {
        /**
         * True, if a forced reply must automatically be shown to the current user. For outgoing messages, specify true to show the forced reply only for the mentioned users and for the target user of a reply.
         */
        public boolean isPersonal;
        /**
         * If non-empty, the placeholder to be shown in the input field when the reply is active; 0-64 characters.
         */
        public String inputFieldPlaceholder;

        /**
         * Instructs application to force a reply to this message.
         */
        public ReplyMarkupForceReply() {
        }

        /**
         * Instructs application to force a reply to this message.
         *
         * @param isPersonal True, if a forced reply must automatically be shown to the current user. For outgoing messages, specify true to show the forced reply only for the mentioned users and for the target user of a reply.
         * @param inputFieldPlaceholder If non-empty, the placeholder to be shown in the input field when the reply is active; 0-64 characters.
         */
        public ReplyMarkupForceReply(boolean isPersonal, String inputFieldPlaceholder) {
            this.isPersonal = isPersonal;
            this.inputFieldPlaceholder = inputFieldPlaceholder;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1101461919;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a custom keyboard layout to quickly reply to bots.
     */
    public static class ReplyMarkupShowKeyboard extends ReplyMarkup {
        /**
         * A list of rows of bot keyboard buttons.
         */
        public KeyboardButton[][] rows;
        /**
         * True, if the keyboard is expected to always be shown when the ordinary keyboard is hidden.
         */
        public boolean isPersistent;
        /**
         * True, if the application needs to resize the keyboard vertically.
         */
        public boolean resizeKeyboard;
        /**
         * True, if the application needs to hide the keyboard after use.
         */
        public boolean oneTime;
        /**
         * True, if the keyboard must automatically be shown to the current user. For outgoing messages, specify true to show the keyboard only for the mentioned users and for the target user of a reply.
         */
        public boolean isPersonal;
        /**
         * If non-empty, the placeholder to be shown in the input field when the keyboard is active; 0-64 characters.
         */
        public String inputFieldPlaceholder;

        /**
         * Contains a custom keyboard layout to quickly reply to bots.
         */
        public ReplyMarkupShowKeyboard() {
        }

        /**
         * Contains a custom keyboard layout to quickly reply to bots.
         *
         * @param rows A list of rows of bot keyboard buttons.
         * @param isPersistent True, if the keyboard is expected to always be shown when the ordinary keyboard is hidden.
         * @param resizeKeyboard True, if the application needs to resize the keyboard vertically.
         * @param oneTime True, if the application needs to hide the keyboard after use.
         * @param isPersonal True, if the keyboard must automatically be shown to the current user. For outgoing messages, specify true to show the keyboard only for the mentioned users and for the target user of a reply.
         * @param inputFieldPlaceholder If non-empty, the placeholder to be shown in the input field when the keyboard is active; 0-64 characters.
         */
        public ReplyMarkupShowKeyboard(KeyboardButton[][] rows, boolean isPersistent, boolean resizeKeyboard, boolean oneTime, boolean isPersonal, String inputFieldPlaceholder) {
            this.rows = rows;
            this.isPersistent = isPersistent;
            this.resizeKeyboard = resizeKeyboard;
            this.oneTime = oneTime;
            this.isPersonal = isPersonal;
            this.inputFieldPlaceholder = inputFieldPlaceholder;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -791495984;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains an inline keyboard layout.
     */
    public static class ReplyMarkupInlineKeyboard extends ReplyMarkup {
        /**
         * A list of rows of inline keyboard buttons.
         */
        public InlineKeyboardButton[][] rows;

        /**
         * Contains an inline keyboard layout.
         */
        public ReplyMarkupInlineKeyboard() {
        }

        /**
         * Contains an inline keyboard layout.
         *
         * @param rows A list of rows of inline keyboard buttons.
         */
        public ReplyMarkupInlineKeyboard(InlineKeyboardButton[][] rows) {
            this.rows = rows;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -619317658;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes result of chat report.
     */
    public abstract static class ReportChatResult extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ReportChatResultOk.CONSTRUCTOR,
            ReportChatResultOptionRequired.CONSTRUCTOR,
            ReportChatResultTextRequired.CONSTRUCTOR,
            ReportChatResultMessagesRequired.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ReportChatResult() {
        }
    }

    /**
     * The chat was reported successfully.
     */
    public static class ReportChatResultOk extends ReportChatResult {

        /**
         * The chat was reported successfully.
         */
        public ReportChatResultOk() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1209685373;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user must choose an option to report the chat and repeat request with the chosen option.
     */
    public static class ReportChatResultOptionRequired extends ReportChatResult {
        /**
         * Title for the option choice.
         */
        public String title;
        /**
         * List of available options.
         */
        public ReportOption[] options;

        /**
         * The user must choose an option to report the chat and repeat request with the chosen option.
         */
        public ReportChatResultOptionRequired() {
        }

        /**
         * The user must choose an option to report the chat and repeat request with the chosen option.
         *
         * @param title Title for the option choice.
         * @param options List of available options.
         */
        public ReportChatResultOptionRequired(String title, ReportOption[] options) {
            this.title = title;
            this.options = options;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -881375669;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user must add additional text details to the report.
     */
    public static class ReportChatResultTextRequired extends ReportChatResult {
        /**
         * Option identifier for the next reportChat request.
         */
        public byte[] optionId;
        /**
         * True, if the user can skip text adding.
         */
        public boolean isOptional;

        /**
         * The user must add additional text details to the report.
         */
        public ReportChatResultTextRequired() {
        }

        /**
         * The user must add additional text details to the report.
         *
         * @param optionId Option identifier for the next reportChat request.
         * @param isOptional True, if the user can skip text adding.
         */
        public ReportChatResultTextRequired(byte[] optionId, boolean isOptional) {
            this.optionId = optionId;
            this.isOptional = isOptional;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1949552447;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user must choose messages to report and repeat the reportChat request with the chosen messages.
     */
    public static class ReportChatResultMessagesRequired extends ReportChatResult {

        /**
         * The user must choose messages to report and repeat the reportChat request with the chosen messages.
         */
        public ReportChatResultMessagesRequired() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 106043280;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an option to report an entity to Telegram.
     */
    public static class ReportOption extends Object {
        /**
         * Unique identifier of the option.
         */
        public byte[] id;
        /**
         * Text of the option.
         */
        public String text;

        /**
         * Describes an option to report an entity to Telegram.
         */
        public ReportOption() {
        }

        /**
         * Describes an option to report an entity to Telegram.
         *
         * @param id Unique identifier of the option.
         * @param text Text of the option.
         */
        public ReportOption(byte[] id, String text) {
            this.id = id;
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1106390048;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the reason why a chat is reported.
     */
    public abstract static class ReportReason extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ReportReasonSpam.CONSTRUCTOR,
            ReportReasonViolence.CONSTRUCTOR,
            ReportReasonPornography.CONSTRUCTOR,
            ReportReasonChildAbuse.CONSTRUCTOR,
            ReportReasonCopyright.CONSTRUCTOR,
            ReportReasonUnrelatedLocation.CONSTRUCTOR,
            ReportReasonFake.CONSTRUCTOR,
            ReportReasonIllegalDrugs.CONSTRUCTOR,
            ReportReasonPersonalDetails.CONSTRUCTOR,
            ReportReasonCustom.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ReportReason() {
        }
    }

    /**
     * The chat contains spam messages.
     */
    public static class ReportReasonSpam extends ReportReason {

        /**
         * The chat contains spam messages.
         */
        public ReportReasonSpam() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1207032897;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat promotes violence.
     */
    public static class ReportReasonViolence extends ReportReason {

        /**
         * The chat promotes violence.
         */
        public ReportReasonViolence() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2038679353;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat contains pornographic messages.
     */
    public static class ReportReasonPornography extends ReportReason {

        /**
         * The chat contains pornographic messages.
         */
        public ReportReasonPornography() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1306467575;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat has child abuse related content.
     */
    public static class ReportReasonChildAbuse extends ReportReason {

        /**
         * The chat has child abuse related content.
         */
        public ReportReasonChildAbuse() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 761086718;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat contains copyrighted content.
     */
    public static class ReportReasonCopyright extends ReportReason {

        /**
         * The chat contains copyrighted content.
         */
        public ReportReasonCopyright() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1474441135;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The location-based chat is unrelated to its stated location.
     */
    public static class ReportReasonUnrelatedLocation extends ReportReason {

        /**
         * The location-based chat is unrelated to its stated location.
         */
        public ReportReasonUnrelatedLocation() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 87562288;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat represents a fake account.
     */
    public static class ReportReasonFake extends ReportReason {

        /**
         * The chat represents a fake account.
         */
        public ReportReasonFake() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 352862176;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat has illegal drugs related content.
     */
    public static class ReportReasonIllegalDrugs extends ReportReason {

        /**
         * The chat has illegal drugs related content.
         */
        public ReportReasonIllegalDrugs() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -61599200;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat contains messages with personal details.
     */
    public static class ReportReasonPersonalDetails extends ReportReason {

        /**
         * The chat contains messages with personal details.
         */
        public ReportReasonPersonalDetails() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1588882414;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A custom reason provided by the user.
     */
    public static class ReportReasonCustom extends ReportReason {

        /**
         * A custom reason provided by the user.
         */
        public ReportReasonCustom() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1380459917;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes result of sponsored message or chat report.
     */
    public abstract static class ReportSponsoredResult extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ReportSponsoredResultOk.CONSTRUCTOR,
            ReportSponsoredResultFailed.CONSTRUCTOR,
            ReportSponsoredResultOptionRequired.CONSTRUCTOR,
            ReportSponsoredResultAdsHidden.CONSTRUCTOR,
            ReportSponsoredResultPremiumRequired.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ReportSponsoredResult() {
        }
    }

    /**
     * The message was reported successfully.
     */
    public static class ReportSponsoredResultOk extends ReportSponsoredResult {

        /**
         * The message was reported successfully.
         */
        public ReportSponsoredResultOk() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -128473456;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The sponsored message is too old or not found.
     */
    public static class ReportSponsoredResultFailed extends ReportSponsoredResult {

        /**
         * The sponsored message is too old or not found.
         */
        public ReportSponsoredResultFailed() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1231714278;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user must choose an option to report the message and repeat request with the chosen option.
     */
    public static class ReportSponsoredResultOptionRequired extends ReportSponsoredResult {
        /**
         * Title for the option choice.
         */
        public String title;
        /**
         * List of available options.
         */
        public ReportOption[] options;

        /**
         * The user must choose an option to report the message and repeat request with the chosen option.
         */
        public ReportSponsoredResultOptionRequired() {
        }

        /**
         * The user must choose an option to report the message and repeat request with the chosen option.
         *
         * @param title Title for the option choice.
         * @param options List of available options.
         */
        public ReportSponsoredResultOptionRequired(String title, ReportOption[] options) {
            this.title = title;
            this.options = options;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1646687318;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sponsored messages were hidden for the user in all chats.
     */
    public static class ReportSponsoredResultAdsHidden extends ReportSponsoredResult {

        /**
         * Sponsored messages were hidden for the user in all chats.
         */
        public ReportSponsoredResultAdsHidden() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -372279531;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user asked to hide sponsored messages, but Telegram Premium is required for this.
     */
    public static class ReportSponsoredResultPremiumRequired extends ReportSponsoredResult {

        /**
         * The user asked to hide sponsored messages, but Telegram Premium is required for this.
         */
        public ReportSponsoredResultPremiumRequired() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -55411887;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes result of story report.
     */
    public abstract static class ReportStoryResult extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ReportStoryResultOk.CONSTRUCTOR,
            ReportStoryResultOptionRequired.CONSTRUCTOR,
            ReportStoryResultTextRequired.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ReportStoryResult() {
        }
    }

    /**
     * The story was reported successfully.
     */
    public static class ReportStoryResultOk extends ReportStoryResult {

        /**
         * The story was reported successfully.
         */
        public ReportStoryResultOk() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1405328461;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user must choose an option to report the story and repeat request with the chosen option.
     */
    public static class ReportStoryResultOptionRequired extends ReportStoryResult {
        /**
         * Title for the option choice.
         */
        public String title;
        /**
         * List of available options.
         */
        public ReportOption[] options;

        /**
         * The user must choose an option to report the story and repeat request with the chosen option.
         */
        public ReportStoryResultOptionRequired() {
        }

        /**
         * The user must choose an option to report the story and repeat request with the chosen option.
         *
         * @param title Title for the option choice.
         * @param options List of available options.
         */
        public ReportStoryResultOptionRequired(String title, ReportOption[] options) {
            this.title = title;
            this.options = options;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1632974839;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user must add additional text details to the report.
     */
    public static class ReportStoryResultTextRequired extends ReportStoryResult {
        /**
         * Option identifier for the next reportStory request.
         */
        public byte[] optionId;
        /**
         * True, if the user can skip text adding.
         */
        public boolean isOptional;

        /**
         * The user must add additional text details to the report.
         */
        public ReportStoryResultTextRequired() {
        }

        /**
         * The user must add additional text details to the report.
         *
         * @param optionId Option identifier for the next reportStory request.
         * @param isOptional True, if the user can skip text adding.
         */
        public ReportStoryResultTextRequired(byte[] optionId, boolean isOptional) {
            this.optionId = optionId;
            this.isOptional = isOptional;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 334339473;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the reason why a code needs to be re-sent.
     */
    public abstract static class ResendCodeReason extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ResendCodeReasonUserRequest.CONSTRUCTOR,
            ResendCodeReasonVerificationFailed.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ResendCodeReason() {
        }
    }

    /**
     * The user requested to resend the code.
     */
    public static class ResendCodeReasonUserRequest extends ResendCodeReason {

        /**
         * The user requested to resend the code.
         */
        public ResendCodeReasonUserRequest() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -441923456;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The code is re-sent, because device verification has failed.
     */
    public static class ResendCodeReasonVerificationFailed extends ResendCodeReason {
        /**
         * Cause of the verification failure, for example, &quot;PLAY_SERVICES_NOT_AVAILABLE&quot;, &quot;APNS_RECEIVE_TIMEOUT&quot;, or &quot;APNS_INIT_FAILED&quot;.
         */
        public String errorMessage;

        /**
         * The code is re-sent, because device verification has failed.
         */
        public ResendCodeReasonVerificationFailed() {
        }

        /**
         * The code is re-sent, because device verification has failed.
         *
         * @param errorMessage Cause of the verification failure, for example, &quot;PLAY_SERVICES_NOT_AVAILABLE&quot;, &quot;APNS_RECEIVE_TIMEOUT&quot;, or &quot;APNS_INIT_FAILED&quot;.
         */
        public ResendCodeReasonVerificationFailed(String errorMessage) {
            this.errorMessage = errorMessage;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 529870273;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents result of 2-step verification password reset.
     */
    public abstract static class ResetPasswordResult extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ResetPasswordResultOk.CONSTRUCTOR,
            ResetPasswordResultPending.CONSTRUCTOR,
            ResetPasswordResultDeclined.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ResetPasswordResult() {
        }
    }

    /**
     * The password was reset.
     */
    public static class ResetPasswordResultOk extends ResetPasswordResult {

        /**
         * The password was reset.
         */
        public ResetPasswordResultOk() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1397267463;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The password reset request is pending.
     */
    public static class ResetPasswordResultPending extends ResetPasswordResult {
        /**
         * Point in time (Unix timestamp) after which the password can be reset immediately using resetPassword.
         */
        public int pendingResetDate;

        /**
         * The password reset request is pending.
         */
        public ResetPasswordResultPending() {
        }

        /**
         * The password reset request is pending.
         *
         * @param pendingResetDate Point in time (Unix timestamp) after which the password can be reset immediately using resetPassword.
         */
        public ResetPasswordResultPending(int pendingResetDate) {
            this.pendingResetDate = pendingResetDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1193925721;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The password reset request was declined.
     */
    public static class ResetPasswordResultDeclined extends ResetPasswordResult {
        /**
         * Point in time (Unix timestamp) when the password reset can be retried.
         */
        public int retryDate;

        /**
         * The password reset request was declined.
         */
        public ResetPasswordResultDeclined() {
        }

        /**
         * The password reset request was declined.
         *
         * @param retryDate Point in time (Unix timestamp) when the password reset can be retried.
         */
        public ResetPasswordResultDeclined(int retryDate) {
            this.retryDate = retryDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1202200373;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about restrictions that must be applied to a chat or a message.
     */
    public static class RestrictionInfo extends Object {
        /**
         * A human-readable description of the reason why access to the content must be restricted. If empty, then the content can be accessed, but may be covered by hidden with 18+ spoiler anyway.
         */
        public String restrictionReason;
        /**
         * True, if media content of the messages must be hidden with 18+ spoiler. Use value of the option &quot;can_ignore_sensitive_content_restrictions&quot; to check whether the current user can ignore the restriction. If age verification parameters were received in updateAgeVerificationParameters, then the user must complete age verification to ignore the restriction. Set the option &quot;ignore_sensitive_content_restrictions&quot; to true if the user passes age verification.
         */
        public boolean hasSensitiveContent;

        /**
         * Contains information about restrictions that must be applied to a chat or a message.
         */
        public RestrictionInfo() {
        }

        /**
         * Contains information about restrictions that must be applied to a chat or a message.
         *
         * @param restrictionReason A human-readable description of the reason why access to the content must be restricted. If empty, then the content can be accessed, but may be covered by hidden with 18+ spoiler anyway.
         * @param hasSensitiveContent True, if media content of the messages must be hidden with 18+ spoiler. Use value of the option &quot;can_ignore_sensitive_content_restrictions&quot; to check whether the current user can ignore the restriction. If age verification parameters were received in updateAgeVerificationParameters, then the user must complete age verification to ignore the restriction. Set the option &quot;ignore_sensitive_content_restrictions&quot; to true if the user passes age verification.
         */
        public RestrictionInfo(String restrictionReason, boolean hasSensitiveContent) {
            this.restrictionReason = restrictionReason;
            this.hasSensitiveContent = hasSensitiveContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1980541683;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes state of a revenue withdrawal.
     */
    public abstract static class RevenueWithdrawalState extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            RevenueWithdrawalStatePending.CONSTRUCTOR,
            RevenueWithdrawalStateSucceeded.CONSTRUCTOR,
            RevenueWithdrawalStateFailed.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public RevenueWithdrawalState() {
        }
    }

    /**
     * Withdrawal is pending.
     */
    public static class RevenueWithdrawalStatePending extends RevenueWithdrawalState {

        /**
         * Withdrawal is pending.
         */
        public RevenueWithdrawalStatePending() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1563512741;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Withdrawal succeeded.
     */
    public static class RevenueWithdrawalStateSucceeded extends RevenueWithdrawalState {
        /**
         * Point in time (Unix timestamp) when the withdrawal was completed.
         */
        public int date;
        /**
         * The URL where the withdrawal transaction can be viewed.
         */
        public String url;

        /**
         * Withdrawal succeeded.
         */
        public RevenueWithdrawalStateSucceeded() {
        }

        /**
         * Withdrawal succeeded.
         *
         * @param date Point in time (Unix timestamp) when the withdrawal was completed.
         * @param url The URL where the withdrawal transaction can be viewed.
         */
        public RevenueWithdrawalStateSucceeded(int date, String url) {
            this.date = date;
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 265375242;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Withdrawal failed.
     */
    public static class RevenueWithdrawalStateFailed extends RevenueWithdrawalState {

        /**
         * Withdrawal failed.
         */
        public RevenueWithdrawalStateFailed() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -12504951;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a formatted text object.
     */
    public abstract static class RichText extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            RichTextPlain.CONSTRUCTOR,
            RichTextBold.CONSTRUCTOR,
            RichTextItalic.CONSTRUCTOR,
            RichTextUnderline.CONSTRUCTOR,
            RichTextStrikethrough.CONSTRUCTOR,
            RichTextFixed.CONSTRUCTOR,
            RichTextUrl.CONSTRUCTOR,
            RichTextEmailAddress.CONSTRUCTOR,
            RichTextSubscript.CONSTRUCTOR,
            RichTextSuperscript.CONSTRUCTOR,
            RichTextMarked.CONSTRUCTOR,
            RichTextPhoneNumber.CONSTRUCTOR,
            RichTextIcon.CONSTRUCTOR,
            RichTextReference.CONSTRUCTOR,
            RichTextAnchor.CONSTRUCTOR,
            RichTextAnchorLink.CONSTRUCTOR,
            RichTexts.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public RichText() {
        }
    }

    /**
     * A plain text.
     */
    public static class RichTextPlain extends RichText {
        /**
         * Text.
         */
        public String text;

        /**
         * A plain text.
         */
        public RichTextPlain() {
        }

        /**
         * A plain text.
         *
         * @param text Text.
         */
        public RichTextPlain(String text) {
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 482617702;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A bold rich text.
     */
    public static class RichTextBold extends RichText {
        /**
         * Text.
         */
        public RichText text;

        /**
         * A bold rich text.
         */
        public RichTextBold() {
        }

        /**
         * A bold rich text.
         *
         * @param text Text.
         */
        public RichTextBold(RichText text) {
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1670844268;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An italicized rich text.
     */
    public static class RichTextItalic extends RichText {
        /**
         * Text.
         */
        public RichText text;

        /**
         * An italicized rich text.
         */
        public RichTextItalic() {
        }

        /**
         * An italicized rich text.
         *
         * @param text Text.
         */
        public RichTextItalic(RichText text) {
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1853354047;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An underlined rich text.
     */
    public static class RichTextUnderline extends RichText {
        /**
         * Text.
         */
        public RichText text;

        /**
         * An underlined rich text.
         */
        public RichTextUnderline() {
        }

        /**
         * An underlined rich text.
         *
         * @param text Text.
         */
        public RichTextUnderline(RichText text) {
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -536019572;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A strikethrough rich text.
     */
    public static class RichTextStrikethrough extends RichText {
        /**
         * Text.
         */
        public RichText text;

        /**
         * A strikethrough rich text.
         */
        public RichTextStrikethrough() {
        }

        /**
         * A strikethrough rich text.
         *
         * @param text Text.
         */
        public RichTextStrikethrough(RichText text) {
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 723413585;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A fixed-width rich text.
     */
    public static class RichTextFixed extends RichText {
        /**
         * Text.
         */
        public RichText text;

        /**
         * A fixed-width rich text.
         */
        public RichTextFixed() {
        }

        /**
         * A fixed-width rich text.
         *
         * @param text Text.
         */
        public RichTextFixed(RichText text) {
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1271496249;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A rich text URL link.
     */
    public static class RichTextUrl extends RichText {
        /**
         * Text.
         */
        public RichText text;
        /**
         * URL.
         */
        public String url;
        /**
         * True, if the URL has cached instant view server-side.
         */
        public boolean isCached;

        /**
         * A rich text URL link.
         */
        public RichTextUrl() {
        }

        /**
         * A rich text URL link.
         *
         * @param text Text.
         * @param url URL.
         * @param isCached True, if the URL has cached instant view server-side.
         */
        public RichTextUrl(RichText text, String url, boolean isCached) {
            this.text = text;
            this.url = url;
            this.isCached = isCached;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 83939092;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A rich text email link.
     */
    public static class RichTextEmailAddress extends RichText {
        /**
         * Text.
         */
        public RichText text;
        /**
         * Email address.
         */
        public String emailAddress;

        /**
         * A rich text email link.
         */
        public RichTextEmailAddress() {
        }

        /**
         * A rich text email link.
         *
         * @param text Text.
         * @param emailAddress Email address.
         */
        public RichTextEmailAddress(RichText text, String emailAddress) {
            this.text = text;
            this.emailAddress = emailAddress;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 40018679;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A subscript rich text.
     */
    public static class RichTextSubscript extends RichText {
        /**
         * Text.
         */
        public RichText text;

        /**
         * A subscript rich text.
         */
        public RichTextSubscript() {
        }

        /**
         * A subscript rich text.
         *
         * @param text Text.
         */
        public RichTextSubscript(RichText text) {
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -868197812;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A superscript rich text.
     */
    public static class RichTextSuperscript extends RichText {
        /**
         * Text.
         */
        public RichText text;

        /**
         * A superscript rich text.
         */
        public RichTextSuperscript() {
        }

        /**
         * A superscript rich text.
         *
         * @param text Text.
         */
        public RichTextSuperscript(RichText text) {
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -382241437;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A marked rich text.
     */
    public static class RichTextMarked extends RichText {
        /**
         * Text.
         */
        public RichText text;

        /**
         * A marked rich text.
         */
        public RichTextMarked() {
        }

        /**
         * A marked rich text.
         *
         * @param text Text.
         */
        public RichTextMarked(RichText text) {
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1271999614;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A rich text phone number.
     */
    public static class RichTextPhoneNumber extends RichText {
        /**
         * Text.
         */
        public RichText text;
        /**
         * Phone number.
         */
        public String phoneNumber;

        /**
         * A rich text phone number.
         */
        public RichTextPhoneNumber() {
        }

        /**
         * A rich text phone number.
         *
         * @param text Text.
         * @param phoneNumber Phone number.
         */
        public RichTextPhoneNumber(RichText text, String phoneNumber) {
            this.text = text;
            this.phoneNumber = phoneNumber;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 128521539;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A small image inside the text.
     */
    public static class RichTextIcon extends RichText {
        /**
         * The image represented as a document. The image can be in GIF, JPEG or PNG format.
         */
        public Document document;
        /**
         * Width of a bounding box in which the image must be shown; 0 if unknown.
         */
        public int width;
        /**
         * Height of a bounding box in which the image must be shown; 0 if unknown.
         */
        public int height;

        /**
         * A small image inside the text.
         */
        public RichTextIcon() {
        }

        /**
         * A small image inside the text.
         *
         * @param document The image represented as a document. The image can be in GIF, JPEG or PNG format.
         * @param width Width of a bounding box in which the image must be shown; 0 if unknown.
         * @param height Height of a bounding box in which the image must be shown; 0 if unknown.
         */
        public RichTextIcon(Document document, int width, int height) {
            this.document = document;
            this.width = width;
            this.height = height;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1480316158;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A reference to a richTexts object on the same page.
     */
    public static class RichTextReference extends RichText {
        /**
         * The text.
         */
        public RichText text;
        /**
         * The name of a richTextAnchor object, which is the first element of the target richTexts object.
         */
        public String anchorName;
        /**
         * An HTTP URL, opening the reference.
         */
        public String url;

        /**
         * A reference to a richTexts object on the same page.
         */
        public RichTextReference() {
        }

        /**
         * A reference to a richTexts object on the same page.
         *
         * @param text The text.
         * @param anchorName The name of a richTextAnchor object, which is the first element of the target richTexts object.
         * @param url An HTTP URL, opening the reference.
         */
        public RichTextReference(RichText text, String anchorName, String url) {
            this.text = text;
            this.anchorName = anchorName;
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1147530634;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An anchor.
     */
    public static class RichTextAnchor extends RichText {
        /**
         * Anchor name.
         */
        public String name;

        /**
         * An anchor.
         */
        public RichTextAnchor() {
        }

        /**
         * An anchor.
         *
         * @param name Anchor name.
         */
        public RichTextAnchor(String name) {
            this.name = name;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1316950068;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A link to an anchor on the same page.
     */
    public static class RichTextAnchorLink extends RichText {
        /**
         * The link text.
         */
        public RichText text;
        /**
         * The anchor name. If the name is empty, the link must bring back to top.
         */
        public String anchorName;
        /**
         * An HTTP URL, opening the anchor.
         */
        public String url;

        /**
         * A link to an anchor on the same page.
         */
        public RichTextAnchorLink() {
        }

        /**
         * A link to an anchor on the same page.
         *
         * @param text The link text.
         * @param anchorName The anchor name. If the name is empty, the link must bring back to top.
         * @param url An HTTP URL, opening the anchor.
         */
        public RichTextAnchorLink(RichText text, String anchorName, String url) {
            this.text = text;
            this.anchorName = anchorName;
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1541418282;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A concatenation of rich texts.
     */
    public static class RichTexts extends RichText {
        /**
         * Texts.
         */
        public RichText[] texts;

        /**
         * A concatenation of rich texts.
         */
        public RichTexts() {
        }

        /**
         * A concatenation of rich texts.
         *
         * @param texts Texts.
         */
        public RichTexts(RichText[] texts) {
            this.texts = texts;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1647457821;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents an RTMP URL.
     */
    public static class RtmpUrl extends Object {
        /**
         * The URL.
         */
        public String url;
        /**
         * Stream key.
         */
        public String streamKey;

        /**
         * Represents an RTMP URL.
         */
        public RtmpUrl() {
        }

        /**
         * Represents an RTMP URL.
         *
         * @param url The URL.
         * @param streamKey Stream key.
         */
        public RtmpUrl(String url, String streamKey) {
            this.url = url;
            this.streamKey = streamKey;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1009302613;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about saved payment credentials.
     */
    public static class SavedCredentials extends Object {
        /**
         * Unique identifier of the saved credentials.
         */
        public String id;
        /**
         * Title of the saved credentials.
         */
        public String title;

        /**
         * Contains information about saved payment credentials.
         */
        public SavedCredentials() {
        }

        /**
         * Contains information about saved payment credentials.
         *
         * @param id Unique identifier of the saved credentials.
         * @param title Title of the saved credentials.
         */
        public SavedCredentials(String id, String title) {
            this.id = id;
            this.title = title;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -370273060;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a tag used in Saved Messages or a Saved Messages topic.
     */
    public static class SavedMessagesTag extends Object {
        /**
         * The tag.
         */
        public ReactionType tag;
        /**
         * Label of the tag; 0-12 characters. Always empty if the tag is returned for a Saved Messages topic.
         */
        public String label;
        /**
         * Number of times the tag was used; may be 0 if the tag has non-empty label.
         */
        public int count;

        /**
         * Represents a tag used in Saved Messages or a Saved Messages topic.
         */
        public SavedMessagesTag() {
        }

        /**
         * Represents a tag used in Saved Messages or a Saved Messages topic.
         *
         * @param tag The tag.
         * @param label Label of the tag; 0-12 characters. Always empty if the tag is returned for a Saved Messages topic.
         * @param count Number of times the tag was used; may be 0 if the tag has non-empty label.
         */
        public SavedMessagesTag(ReactionType tag, String label, int count) {
            this.tag = tag;
            this.label = label;
            this.count = count;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1785183329;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of tags used in Saved Messages.
     */
    public static class SavedMessagesTags extends Object {
        /**
         * List of tags.
         */
        public SavedMessagesTag[] tags;

        /**
         * Contains a list of tags used in Saved Messages.
         */
        public SavedMessagesTags() {
        }

        /**
         * Contains a list of tags used in Saved Messages.
         *
         * @param tags List of tags.
         */
        public SavedMessagesTags(SavedMessagesTag[] tags) {
            this.tags = tags;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1749291430;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a Saved Messages topic.
     */
    public static class SavedMessagesTopic extends Object {
        /**
         * Unique topic identifier.
         */
        public long id;
        /**
         * Type of the topic.
         */
        public SavedMessagesTopicType type;
        /**
         * True, if the topic is pinned.
         */
        public boolean isPinned;
        /**
         * A parameter used to determine order of the topic in the topic list. Topics must be sorted by the order in descending order.
         */
        public long order;
        /**
         * Last message in the topic; may be null if none or unknown.
         */
        @Nullable public Message lastMessage;
        /**
         * A draft of a message in the topic; may be null if none.
         */
        @Nullable public DraftMessage draftMessage;

        /**
         * Contains information about a Saved Messages topic.
         */
        public SavedMessagesTopic() {
        }

        /**
         * Contains information about a Saved Messages topic.
         *
         * @param id Unique topic identifier.
         * @param type Type of the topic.
         * @param isPinned True, if the topic is pinned.
         * @param order A parameter used to determine order of the topic in the topic list. Topics must be sorted by the order in descending order.
         * @param lastMessage Last message in the topic; may be null if none or unknown.
         * @param draftMessage A draft of a message in the topic; may be null if none.
         */
        public SavedMessagesTopic(long id, SavedMessagesTopicType type, boolean isPinned, long order, Message lastMessage, DraftMessage draftMessage) {
            this.id = id;
            this.type = type;
            this.isPinned = isPinned;
            this.order = order;
            this.lastMessage = lastMessage;
            this.draftMessage = draftMessage;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -760684124;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes type of Saved Messages topic.
     */
    public abstract static class SavedMessagesTopicType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            SavedMessagesTopicTypeMyNotes.CONSTRUCTOR,
            SavedMessagesTopicTypeAuthorHidden.CONSTRUCTOR,
            SavedMessagesTopicTypeSavedFromChat.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public SavedMessagesTopicType() {
        }
    }

    /**
     * Topic containing messages sent by the current user of forwarded from an unknown chat.
     */
    public static class SavedMessagesTopicTypeMyNotes extends SavedMessagesTopicType {

        /**
         * Topic containing messages sent by the current user of forwarded from an unknown chat.
         */
        public SavedMessagesTopicTypeMyNotes() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1282784779;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Topic containing messages forwarded from a user with hidden privacy.
     */
    public static class SavedMessagesTopicTypeAuthorHidden extends SavedMessagesTopicType {

        /**
         * Topic containing messages forwarded from a user with hidden privacy.
         */
        public SavedMessagesTopicTypeAuthorHidden() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1882997141;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Topic containing messages forwarded from a specific chat.
     */
    public static class SavedMessagesTopicTypeSavedFromChat extends SavedMessagesTopicType {
        /**
         * Identifier of the chat.
         */
        public long chatId;

        /**
         * Topic containing messages forwarded from a specific chat.
         */
        public SavedMessagesTopicTypeSavedFromChat() {
        }

        /**
         * Topic containing messages forwarded from a specific chat.
         *
         * @param chatId Identifier of the chat.
         */
        public SavedMessagesTopicTypeSavedFromChat(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1723880104;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains autosave settings for an autosave settings scope.
     */
    public static class ScopeAutosaveSettings extends Object {
        /**
         * True, if photo autosave is enabled.
         */
        public boolean autosavePhotos;
        /**
         * True, if video autosave is enabled.
         */
        public boolean autosaveVideos;
        /**
         * The maximum size of a video file to be autosaved, in bytes; 512 KB - 4000 MB.
         */
        public long maxVideoFileSize;

        /**
         * Contains autosave settings for an autosave settings scope.
         */
        public ScopeAutosaveSettings() {
        }

        /**
         * Contains autosave settings for an autosave settings scope.
         *
         * @param autosavePhotos True, if photo autosave is enabled.
         * @param autosaveVideos True, if video autosave is enabled.
         * @param maxVideoFileSize The maximum size of a video file to be autosaved, in bytes; 512 KB - 4000 MB.
         */
        public ScopeAutosaveSettings(boolean autosavePhotos, boolean autosaveVideos, long maxVideoFileSize) {
            this.autosavePhotos = autosavePhotos;
            this.autosaveVideos = autosaveVideos;
            this.maxVideoFileSize = maxVideoFileSize;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1546821427;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about notification settings for several chats.
     */
    public static class ScopeNotificationSettings extends Object {
        /**
         * Time left before notifications will be unmuted, in seconds.
         */
        public int muteFor;
        /**
         * Identifier of the notification sound to be played; 0 if sound is disabled; pass -1 to use the app-dependent default sound.
         */
        public long soundId;
        /**
         * True, if message content must be displayed in notifications.
         */
        public boolean showPreview;
        /**
         * If true, story notifications are received only for the first 5 chats from topChatCategoryUsers regardless of the value of muteStories.
         */
        public boolean useDefaultMuteStories;
        /**
         * True, if story notifications are disabled.
         */
        public boolean muteStories;
        /**
         * Identifier of the notification sound to be played for stories; 0 if sound is disabled; pass -1 to use the app-dependent default sound.
         */
        public long storySoundId;
        /**
         * True, if the chat that posted a story must be displayed in notifications.
         */
        public boolean showStoryPoster;
        /**
         * True, if notifications for incoming pinned messages will be created as for an ordinary unread message.
         */
        public boolean disablePinnedMessageNotifications;
        /**
         * True, if notifications for messages with mentions will be created as for an ordinary unread message.
         */
        public boolean disableMentionNotifications;

        /**
         * Contains information about notification settings for several chats.
         */
        public ScopeNotificationSettings() {
        }

        /**
         * Contains information about notification settings for several chats.
         *
         * @param muteFor Time left before notifications will be unmuted, in seconds.
         * @param soundId Identifier of the notification sound to be played; 0 if sound is disabled; pass -1 to use the app-dependent default sound.
         * @param showPreview True, if message content must be displayed in notifications.
         * @param useDefaultMuteStories If true, story notifications are received only for the first 5 chats from topChatCategoryUsers regardless of the value of muteStories.
         * @param muteStories True, if story notifications are disabled.
         * @param storySoundId Identifier of the notification sound to be played for stories; 0 if sound is disabled; pass -1 to use the app-dependent default sound.
         * @param showStoryPoster True, if the chat that posted a story must be displayed in notifications.
         * @param disablePinnedMessageNotifications True, if notifications for incoming pinned messages will be created as for an ordinary unread message.
         * @param disableMentionNotifications True, if notifications for messages with mentions will be created as for an ordinary unread message.
         */
        public ScopeNotificationSettings(int muteFor, long soundId, boolean showPreview, boolean useDefaultMuteStories, boolean muteStories, long storySoundId, boolean showStoryPoster, boolean disablePinnedMessageNotifications, boolean disableMentionNotifications) {
            this.muteFor = muteFor;
            this.soundId = soundId;
            this.showPreview = showPreview;
            this.useDefaultMuteStories = useDefaultMuteStories;
            this.muteStories = muteStories;
            this.storySoundId = storySoundId;
            this.showStoryPoster = showStoryPoster;
            this.disablePinnedMessageNotifications = disablePinnedMessageNotifications;
            this.disableMentionNotifications = disableMentionNotifications;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 88369150;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents a filter for type of the chats in which to search messages.
     */
    public abstract static class SearchMessagesChatTypeFilter extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            SearchMessagesChatTypeFilterPrivate.CONSTRUCTOR,
            SearchMessagesChatTypeFilterGroup.CONSTRUCTOR,
            SearchMessagesChatTypeFilterChannel.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public SearchMessagesChatTypeFilter() {
        }
    }

    /**
     * Returns only messages in private chats.
     */
    public static class SearchMessagesChatTypeFilterPrivate extends SearchMessagesChatTypeFilter {

        /**
         * Returns only messages in private chats.
         */
        public SearchMessagesChatTypeFilterPrivate() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1169248975;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns only messages in basic group and supergroup chats.
     */
    public static class SearchMessagesChatTypeFilterGroup extends SearchMessagesChatTypeFilter {

        /**
         * Returns only messages in basic group and supergroup chats.
         */
        public SearchMessagesChatTypeFilterGroup() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2059426022;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns only messages in channel chats.
     */
    public static class SearchMessagesChatTypeFilterChannel extends SearchMessagesChatTypeFilter {

        /**
         * Returns only messages in channel chats.
         */
        public SearchMessagesChatTypeFilterChannel() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -773540139;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents a filter for message search results.
     */
    public abstract static class SearchMessagesFilter extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            SearchMessagesFilterEmpty.CONSTRUCTOR,
            SearchMessagesFilterAnimation.CONSTRUCTOR,
            SearchMessagesFilterAudio.CONSTRUCTOR,
            SearchMessagesFilterDocument.CONSTRUCTOR,
            SearchMessagesFilterPhoto.CONSTRUCTOR,
            SearchMessagesFilterPoll.CONSTRUCTOR,
            SearchMessagesFilterVideo.CONSTRUCTOR,
            SearchMessagesFilterVoiceNote.CONSTRUCTOR,
            SearchMessagesFilterPhotoAndVideo.CONSTRUCTOR,
            SearchMessagesFilterUrl.CONSTRUCTOR,
            SearchMessagesFilterChatPhoto.CONSTRUCTOR,
            SearchMessagesFilterVideoNote.CONSTRUCTOR,
            SearchMessagesFilterVoiceAndVideoNote.CONSTRUCTOR,
            SearchMessagesFilterMention.CONSTRUCTOR,
            SearchMessagesFilterUnreadMention.CONSTRUCTOR,
            SearchMessagesFilterUnreadReaction.CONSTRUCTOR,
            SearchMessagesFilterUnreadPollVote.CONSTRUCTOR,
            SearchMessagesFilterFailedToSend.CONSTRUCTOR,
            SearchMessagesFilterPinned.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public SearchMessagesFilter() {
        }
    }

    /**
     * Returns all found messages, no filter is applied.
     */
    public static class SearchMessagesFilterEmpty extends SearchMessagesFilter {

        /**
         * Returns all found messages, no filter is applied.
         */
        public SearchMessagesFilterEmpty() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -869395657;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns only animation messages.
     */
    public static class SearchMessagesFilterAnimation extends SearchMessagesFilter {

        /**
         * Returns only animation messages.
         */
        public SearchMessagesFilterAnimation() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -155713339;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns only audio messages.
     */
    public static class SearchMessagesFilterAudio extends SearchMessagesFilter {

        /**
         * Returns only audio messages.
         */
        public SearchMessagesFilterAudio() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 867505275;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns only document messages.
     */
    public static class SearchMessagesFilterDocument extends SearchMessagesFilter {

        /**
         * Returns only document messages.
         */
        public SearchMessagesFilterDocument() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1526331215;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns only photo messages.
     */
    public static class SearchMessagesFilterPhoto extends SearchMessagesFilter {

        /**
         * Returns only photo messages.
         */
        public SearchMessagesFilterPhoto() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 925932293;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns only poll messages.
     */
    public static class SearchMessagesFilterPoll extends SearchMessagesFilter {

        /**
         * Returns only poll messages.
         */
        public SearchMessagesFilterPoll() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -891598785;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns only video messages.
     */
    public static class SearchMessagesFilterVideo extends SearchMessagesFilter {

        /**
         * Returns only video messages.
         */
        public SearchMessagesFilterVideo() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 115538222;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns only voice note messages.
     */
    public static class SearchMessagesFilterVoiceNote extends SearchMessagesFilter {

        /**
         * Returns only voice note messages.
         */
        public SearchMessagesFilterVoiceNote() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1841439357;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns only photo and video messages.
     */
    public static class SearchMessagesFilterPhotoAndVideo extends SearchMessagesFilter {

        /**
         * Returns only photo and video messages.
         */
        public SearchMessagesFilterPhotoAndVideo() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1352130963;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns only messages containing URLs.
     */
    public static class SearchMessagesFilterUrl extends SearchMessagesFilter {

        /**
         * Returns only messages containing URLs.
         */
        public SearchMessagesFilterUrl() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1828724341;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns only messages containing chat photos.
     */
    public static class SearchMessagesFilterChatPhoto extends SearchMessagesFilter {

        /**
         * Returns only messages containing chat photos.
         */
        public SearchMessagesFilterChatPhoto() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1247751329;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns only video note messages.
     */
    public static class SearchMessagesFilterVideoNote extends SearchMessagesFilter {

        /**
         * Returns only video note messages.
         */
        public SearchMessagesFilterVideoNote() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 564323321;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns only voice and video note messages.
     */
    public static class SearchMessagesFilterVoiceAndVideoNote extends SearchMessagesFilter {

        /**
         * Returns only voice and video note messages.
         */
        public SearchMessagesFilterVoiceAndVideoNote() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 664174819;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns only messages with mentions of the current user, or messages that are replies to their messages.
     */
    public static class SearchMessagesFilterMention extends SearchMessagesFilter {

        /**
         * Returns only messages with mentions of the current user, or messages that are replies to their messages.
         */
        public SearchMessagesFilterMention() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2001258652;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns only messages with unread mentions of the current user, or messages that are replies to their messages. When using this filter the results can't be additionally filtered by a query or by the sending user.
     */
    public static class SearchMessagesFilterUnreadMention extends SearchMessagesFilter {

        /**
         * Returns only messages with unread mentions of the current user, or messages that are replies to their messages. When using this filter the results can't be additionally filtered by a query or by the sending user.
         */
        public SearchMessagesFilterUnreadMention() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -95769149;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns only messages with unread reactions for the current user. When using this filter the results can't be additionally filtered by a query or by the sending user.
     */
    public static class SearchMessagesFilterUnreadReaction extends SearchMessagesFilter {

        /**
         * Returns only messages with unread reactions for the current user. When using this filter the results can't be additionally filtered by a query or by the sending user.
         */
        public SearchMessagesFilterUnreadReaction() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1379651328;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns only messages with unread poll votes for the current user. When using this filter the results can't be additionally filtered by a query or by the sending user.
     */
    public static class SearchMessagesFilterUnreadPollVote extends SearchMessagesFilter {

        /**
         * Returns only messages with unread poll votes for the current user. When using this filter the results can't be additionally filtered by a query or by the sending user.
         */
        public SearchMessagesFilterUnreadPollVote() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -161318950;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns only failed to send messages. This filter can be used only if the message database is used.
     */
    public static class SearchMessagesFilterFailedToSend extends SearchMessagesFilter {

        /**
         * Returns only failed to send messages. This filter can be used only if the message database is used.
         */
        public SearchMessagesFilterFailedToSend() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -596322564;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns only pinned messages.
     */
    public static class SearchMessagesFilterPinned extends SearchMessagesFilter {

        /**
         * Returns only pinned messages.
         */
        public SearchMessagesFilterPinned() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 371805512;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a value representing a number of seconds.
     */
    public static class Seconds extends Object {
        /**
         * Number of seconds.
         */
        public double seconds;

        /**
         * Contains a value representing a number of seconds.
         */
        public Seconds() {
        }

        /**
         * Contains a value representing a number of seconds.
         *
         * @param seconds Number of seconds.
         */
        public Seconds(double seconds) {
            this.seconds = seconds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 959899022;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a secret chat.
     */
    public static class SecretChat extends Object {
        /**
         * Secret chat identifier.
         */
        public int id;
        /**
         * Identifier of the chat partner.
         */
        public long userId;
        /**
         * State of the secret chat.
         */
        public SecretChatState state;
        /**
         * True, if the chat was created by the current user; false otherwise.
         */
        public boolean isOutbound;
        /**
         * Hash of the currently used key for comparison with the hash of the chat partner's key. This is a string of 36 little-endian bytes, which must be split into groups of 2 bits, each denoting a pixel of one of 4 colors FFFFFF, D5E6F3, 2D5775, and 2F99C9. The pixels must be used to make a 12x12 square image filled from left to right, top to bottom. Alternatively, the first 32 bytes of the hash can be converted to the hexadecimal format and printed as 32 2-digit hex numbers.
         */
        public byte[] keyHash;
        /**
         * Secret chat layer; determines features supported by the chat partner's application. Nested text entities and underline and strikethrough entities are supported if the layer &gt;= 101, files bigger than 2000MB are supported if the layer &gt;= 143, spoiler and custom emoji text entities are supported if the layer &gt;= 144.
         */
        public int layer;

        /**
         * Represents a secret chat.
         */
        public SecretChat() {
        }

        /**
         * Represents a secret chat.
         *
         * @param id Secret chat identifier.
         * @param userId Identifier of the chat partner.
         * @param state State of the secret chat.
         * @param isOutbound True, if the chat was created by the current user; false otherwise.
         * @param keyHash Hash of the currently used key for comparison with the hash of the chat partner's key. This is a string of 36 little-endian bytes, which must be split into groups of 2 bits, each denoting a pixel of one of 4 colors FFFFFF, D5E6F3, 2D5775, and 2F99C9. The pixels must be used to make a 12x12 square image filled from left to right, top to bottom. Alternatively, the first 32 bytes of the hash can be converted to the hexadecimal format and printed as 32 2-digit hex numbers.
         * @param layer Secret chat layer; determines features supported by the chat partner's application. Nested text entities and underline and strikethrough entities are supported if the layer &gt;= 101, files bigger than 2000MB are supported if the layer &gt;= 143, spoiler and custom emoji text entities are supported if the layer &gt;= 144.
         */
        public SecretChat(int id, long userId, SecretChatState state, boolean isOutbound, byte[] keyHash, int layer) {
            this.id = id;
            this.userId = userId;
            this.state = state;
            this.isOutbound = isOutbound;
            this.keyHash = keyHash;
            this.layer = layer;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -676918325;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the current secret chat state.
     */
    public abstract static class SecretChatState extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            SecretChatStatePending.CONSTRUCTOR,
            SecretChatStateReady.CONSTRUCTOR,
            SecretChatStateClosed.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public SecretChatState() {
        }
    }

    /**
     * The secret chat is not yet created; waiting for the other user to get online.
     */
    public static class SecretChatStatePending extends SecretChatState {

        /**
         * The secret chat is not yet created; waiting for the other user to get online.
         */
        public SecretChatStatePending() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1637050756;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The secret chat is ready to use.
     */
    public static class SecretChatStateReady extends SecretChatState {

        /**
         * The secret chat is ready to use.
         */
        public SecretChatStateReady() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1611352087;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The secret chat is closed.
     */
    public static class SecretChatStateClosed extends SecretChatState {

        /**
         * The secret chat is closed.
         */
        public SecretChatStateClosed() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1945106707;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents content of a gift received by a user or a channel chat.
     */
    public abstract static class SentGift extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            SentGiftRegular.CONSTRUCTOR,
            SentGiftUpgraded.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public SentGift() {
        }
    }

    /**
     * Regular gift.
     */
    public static class SentGiftRegular extends SentGift {
        /**
         * The gift.
         */
        public Gift gift;

        /**
         * Regular gift.
         */
        public SentGiftRegular() {
        }

        /**
         * Regular gift.
         *
         * @param gift The gift.
         */
        public SentGiftRegular(Gift gift) {
            this.gift = gift;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 594062617;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Upgraded gift.
     */
    public static class SentGiftUpgraded extends SentGift {
        /**
         * The gift.
         */
        public UpgradedGift gift;

        /**
         * Upgraded gift.
         */
        public SentGiftUpgraded() {
        }

        /**
         * Upgraded gift.
         *
         * @param gift The gift.
         */
        public SentGiftUpgraded(UpgradedGift gift) {
            this.gift = gift;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 627524736;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about one session in a Telegram application used by the current user. Sessions must be shown to the user in the returned order.
     */
    public static class Session extends Object {
        /**
         * Session identifier.
         */
        public long id;
        /**
         * True, if this session is the current session.
         */
        public boolean isCurrent;
        /**
         * True, if a 2-step verification password is needed to complete authorization of the session.
         */
        public boolean isPasswordPending;
        /**
         * True, if the session wasn't confirmed from another session.
         */
        public boolean isUnconfirmed;
        /**
         * True, if incoming secret chats can be accepted by the session.
         */
        public boolean canAcceptSecretChats;
        /**
         * True, if incoming calls can be accepted by the session.
         */
        public boolean canAcceptCalls;
        /**
         * Session type based on the system and application version, which can be used to display a corresponding icon.
         */
        public SessionType type;
        /**
         * Telegram API identifier, as provided by the application.
         */
        public int apiId;
        /**
         * Name of the application, as provided by the application.
         */
        public String applicationName;
        /**
         * The version of the application, as provided by the application.
         */
        public String applicationVersion;
        /**
         * True, if the application is an official application or uses the apiId of an official application.
         */
        public boolean isOfficialApplication;
        /**
         * Model of the device the application has been run or is running on, as provided by the application.
         */
        public String deviceModel;
        /**
         * Operating system the application has been run or is running on, as provided by the application.
         */
        public String platform;
        /**
         * Version of the operating system the application has been run or is running on, as provided by the application.
         */
        public String systemVersion;
        /**
         * Point in time (Unix timestamp) when the user has logged in.
         */
        public int logInDate;
        /**
         * Point in time (Unix timestamp) when the session was last used.
         */
        public int lastActiveDate;
        /**
         * IP address from which the session was created, in human-readable format.
         */
        public String ipAddress;
        /**
         * A human-readable description of the location from which the session was created, based on the IP address.
         */
        public String location;

        /**
         * Contains information about one session in a Telegram application used by the current user. Sessions must be shown to the user in the returned order.
         */
        public Session() {
        }

        /**
         * Contains information about one session in a Telegram application used by the current user. Sessions must be shown to the user in the returned order.
         *
         * @param id Session identifier.
         * @param isCurrent True, if this session is the current session.
         * @param isPasswordPending True, if a 2-step verification password is needed to complete authorization of the session.
         * @param isUnconfirmed True, if the session wasn't confirmed from another session.
         * @param canAcceptSecretChats True, if incoming secret chats can be accepted by the session.
         * @param canAcceptCalls True, if incoming calls can be accepted by the session.
         * @param type Session type based on the system and application version, which can be used to display a corresponding icon.
         * @param apiId Telegram API identifier, as provided by the application.
         * @param applicationName Name of the application, as provided by the application.
         * @param applicationVersion The version of the application, as provided by the application.
         * @param isOfficialApplication True, if the application is an official application or uses the apiId of an official application.
         * @param deviceModel Model of the device the application has been run or is running on, as provided by the application.
         * @param platform Operating system the application has been run or is running on, as provided by the application.
         * @param systemVersion Version of the operating system the application has been run or is running on, as provided by the application.
         * @param logInDate Point in time (Unix timestamp) when the user has logged in.
         * @param lastActiveDate Point in time (Unix timestamp) when the session was last used.
         * @param ipAddress IP address from which the session was created, in human-readable format.
         * @param location A human-readable description of the location from which the session was created, based on the IP address.
         */
        public Session(long id, boolean isCurrent, boolean isPasswordPending, boolean isUnconfirmed, boolean canAcceptSecretChats, boolean canAcceptCalls, SessionType type, int apiId, String applicationName, String applicationVersion, boolean isOfficialApplication, String deviceModel, String platform, String systemVersion, int logInDate, int lastActiveDate, String ipAddress, String location) {
            this.id = id;
            this.isCurrent = isCurrent;
            this.isPasswordPending = isPasswordPending;
            this.isUnconfirmed = isUnconfirmed;
            this.canAcceptSecretChats = canAcceptSecretChats;
            this.canAcceptCalls = canAcceptCalls;
            this.type = type;
            this.apiId = apiId;
            this.applicationName = applicationName;
            this.applicationVersion = applicationVersion;
            this.isOfficialApplication = isOfficialApplication;
            this.deviceModel = deviceModel;
            this.platform = platform;
            this.systemVersion = systemVersion;
            this.logInDate = logInDate;
            this.lastActiveDate = lastActiveDate;
            this.ipAddress = ipAddress;
            this.location = location;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 158702140;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents the type of session.
     */
    public abstract static class SessionType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            SessionTypeAndroid.CONSTRUCTOR,
            SessionTypeApple.CONSTRUCTOR,
            SessionTypeBrave.CONSTRUCTOR,
            SessionTypeChrome.CONSTRUCTOR,
            SessionTypeEdge.CONSTRUCTOR,
            SessionTypeFirefox.CONSTRUCTOR,
            SessionTypeIpad.CONSTRUCTOR,
            SessionTypeIphone.CONSTRUCTOR,
            SessionTypeLinux.CONSTRUCTOR,
            SessionTypeMac.CONSTRUCTOR,
            SessionTypeOpera.CONSTRUCTOR,
            SessionTypeSafari.CONSTRUCTOR,
            SessionTypeUbuntu.CONSTRUCTOR,
            SessionTypeUnknown.CONSTRUCTOR,
            SessionTypeVivaldi.CONSTRUCTOR,
            SessionTypeWindows.CONSTRUCTOR,
            SessionTypeXbox.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public SessionType() {
        }
    }

    /**
     * The session is running on an Android device.
     */
    public static class SessionTypeAndroid extends SessionType {

        /**
         * The session is running on an Android device.
         */
        public SessionTypeAndroid() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2071764840;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The session is running on a generic Apple device.
     */
    public static class SessionTypeApple extends SessionType {

        /**
         * The session is running on a generic Apple device.
         */
        public SessionTypeApple() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1818635701;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The session is running on the Brave browser.
     */
    public static class SessionTypeBrave extends SessionType {

        /**
         * The session is running on the Brave browser.
         */
        public SessionTypeBrave() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1216812563;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The session is running on the Chrome browser.
     */
    public static class SessionTypeChrome extends SessionType {

        /**
         * The session is running on the Chrome browser.
         */
        public SessionTypeChrome() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1573464425;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The session is running on the Edge browser.
     */
    public static class SessionTypeEdge extends SessionType {

        /**
         * The session is running on the Edge browser.
         */
        public SessionTypeEdge() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -538916005;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The session is running on the Firefox browser.
     */
    public static class SessionTypeFirefox extends SessionType {

        /**
         * The session is running on the Firefox browser.
         */
        public SessionTypeFirefox() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2122579364;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The session is running on an iPad device.
     */
    public static class SessionTypeIpad extends SessionType {

        /**
         * The session is running on an iPad device.
         */
        public SessionTypeIpad() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1294647023;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The session is running on an iPhone device.
     */
    public static class SessionTypeIphone extends SessionType {

        /**
         * The session is running on an iPhone device.
         */
        public SessionTypeIphone() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 97616573;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The session is running on a Linux device.
     */
    public static class SessionTypeLinux extends SessionType {

        /**
         * The session is running on a Linux device.
         */
        public SessionTypeLinux() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1487422871;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The session is running on a Mac device.
     */
    public static class SessionTypeMac extends SessionType {

        /**
         * The session is running on a Mac device.
         */
        public SessionTypeMac() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -612250975;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The session is running on the Opera browser.
     */
    public static class SessionTypeOpera extends SessionType {

        /**
         * The session is running on the Opera browser.
         */
        public SessionTypeOpera() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1463673734;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The session is running on the Safari browser.
     */
    public static class SessionTypeSafari extends SessionType {

        /**
         * The session is running on the Safari browser.
         */
        public SessionTypeSafari() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 710646873;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The session is running on an Ubuntu device.
     */
    public static class SessionTypeUbuntu extends SessionType {

        /**
         * The session is running on an Ubuntu device.
         */
        public SessionTypeUbuntu() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1569680069;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The session is running on an unknown type of device.
     */
    public static class SessionTypeUnknown extends SessionType {

        /**
         * The session is running on an unknown type of device.
         */
        public SessionTypeUnknown() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 233926704;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The session is running on the Vivaldi browser.
     */
    public static class SessionTypeVivaldi extends SessionType {

        /**
         * The session is running on the Vivaldi browser.
         */
        public SessionTypeVivaldi() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1120503279;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The session is running on a Windows device.
     */
    public static class SessionTypeWindows extends SessionType {

        /**
         * The session is running on a Windows device.
         */
        public SessionTypeWindows() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1676512600;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The session is running on an Xbox console.
     */
    public static class SessionTypeXbox extends SessionType {

        /**
         * The session is running on an Xbox console.
         */
        public SessionTypeXbox() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1856216492;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of sessions.
     */
    public static class Sessions extends Object {
        /**
         * List of sessions.
         */
        public Session[] sessions;
        /**
         * Number of days of inactivity before sessions will automatically be terminated; 1-366 days.
         */
        public int inactiveSessionTtlDays;

        /**
         * Contains a list of sessions.
         */
        public Sessions() {
        }

        /**
         * Contains a list of sessions.
         *
         * @param sessions List of sessions.
         * @param inactiveSessionTtlDays Number of days of inactivity before sessions will automatically be terminated; 1-366 days.
         */
        public Sessions(Session[] sessions, int inactiveSessionTtlDays) {
            this.sessions = sessions;
            this.inactiveSessionTtlDays = inactiveSessionTtlDays;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 842912274;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a section of the application settings.
     */
    public abstract static class SettingsSection extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            SettingsSectionAppearance.CONSTRUCTOR,
            SettingsSectionAskQuestion.CONSTRUCTOR,
            SettingsSectionBusiness.CONSTRUCTOR,
            SettingsSectionChatFolders.CONSTRUCTOR,
            SettingsSectionDataAndStorage.CONSTRUCTOR,
            SettingsSectionDevices.CONSTRUCTOR,
            SettingsSectionEditProfile.CONSTRUCTOR,
            SettingsSectionFaq.CONSTRUCTOR,
            SettingsSectionFeatures.CONSTRUCTOR,
            SettingsSectionInAppBrowser.CONSTRUCTOR,
            SettingsSectionLanguage.CONSTRUCTOR,
            SettingsSectionMyStars.CONSTRUCTOR,
            SettingsSectionMyToncoins.CONSTRUCTOR,
            SettingsSectionNotifications.CONSTRUCTOR,
            SettingsSectionPowerSaving.CONSTRUCTOR,
            SettingsSectionPremium.CONSTRUCTOR,
            SettingsSectionPrivacyAndSecurity.CONSTRUCTOR,
            SettingsSectionPrivacyPolicy.CONSTRUCTOR,
            SettingsSectionQrCode.CONSTRUCTOR,
            SettingsSectionSearch.CONSTRUCTOR,
            SettingsSectionSendGift.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public SettingsSection() {
        }
    }

    /**
     * The appearance section.
     */
    public static class SettingsSectionAppearance extends SettingsSection {
        /**
         * Subsection of the section; may be one of &quot;&quot;, &quot;themes&quot;, &quot;themes/edit&quot;, &quot;themes/create&quot;, &quot;wallpapers&quot;, &quot;wallpapers/edit&quot;, &quot;wallpapers/set&quot;, &quot;wallpapers/choose-photo&quot;, &quot;your-color/profile&quot;, &quot;your-color/profile/add-icons&quot;, &quot;your-color/profile/use-gift&quot;, &quot;your-color/profile/reset&quot;, &quot;your-color/name&quot;, &quot;your-color/name/add-icons&quot;, &quot;your-color/name/use-gift&quot;, &quot;night-mode&quot;, &quot;auto-night-mode&quot;, &quot;text-size&quot;, &quot;text-size/use-system&quot;, &quot;message-corners&quot;, &quot;animations&quot;, &quot;stickers-and-emoji&quot;, &quot;stickers-and-emoji/edit&quot;, &quot;stickers-and-emoji/trending&quot;, &quot;stickers-and-emoji/archived&quot;, &quot;stickers-and-emoji/archived/edit&quot;, &quot;stickers-and-emoji/emoji&quot;, &quot;stickers-and-emoji/emoji/edit&quot;, &quot;stickers-and-emoji/emoji/archived&quot;, &quot;stickers-and-emoji/emoji/archived/edit&quot;, &quot;stickers-and-emoji/emoji/suggest&quot;, &quot;stickers-and-emoji/emoji/quick-reaction&quot;, &quot;stickers-and-emoji/emoji/quick-reaction/choose&quot;, &quot;stickers-and-emoji/suggest-by-emoji&quot;, &quot;stickers-and-emoji/large-emoji&quot;, &quot;stickers-and-emoji/dynamic-order&quot;, &quot;stickers-and-emoji/emoji/show-more&quot;, &quot;app-icon&quot;, &quot;tap-for-next-media&quot;.
         */
        public String subsection;

        /**
         * The appearance section.
         */
        public SettingsSectionAppearance() {
        }

        /**
         * The appearance section.
         *
         * @param subsection Subsection of the section; may be one of &quot;&quot;, &quot;themes&quot;, &quot;themes/edit&quot;, &quot;themes/create&quot;, &quot;wallpapers&quot;, &quot;wallpapers/edit&quot;, &quot;wallpapers/set&quot;, &quot;wallpapers/choose-photo&quot;, &quot;your-color/profile&quot;, &quot;your-color/profile/add-icons&quot;, &quot;your-color/profile/use-gift&quot;, &quot;your-color/profile/reset&quot;, &quot;your-color/name&quot;, &quot;your-color/name/add-icons&quot;, &quot;your-color/name/use-gift&quot;, &quot;night-mode&quot;, &quot;auto-night-mode&quot;, &quot;text-size&quot;, &quot;text-size/use-system&quot;, &quot;message-corners&quot;, &quot;animations&quot;, &quot;stickers-and-emoji&quot;, &quot;stickers-and-emoji/edit&quot;, &quot;stickers-and-emoji/trending&quot;, &quot;stickers-and-emoji/archived&quot;, &quot;stickers-and-emoji/archived/edit&quot;, &quot;stickers-and-emoji/emoji&quot;, &quot;stickers-and-emoji/emoji/edit&quot;, &quot;stickers-and-emoji/emoji/archived&quot;, &quot;stickers-and-emoji/emoji/archived/edit&quot;, &quot;stickers-and-emoji/emoji/suggest&quot;, &quot;stickers-and-emoji/emoji/quick-reaction&quot;, &quot;stickers-and-emoji/emoji/quick-reaction/choose&quot;, &quot;stickers-and-emoji/suggest-by-emoji&quot;, &quot;stickers-and-emoji/large-emoji&quot;, &quot;stickers-and-emoji/dynamic-order&quot;, &quot;stickers-and-emoji/emoji/show-more&quot;, &quot;app-icon&quot;, &quot;tap-for-next-media&quot;.
         */
        public SettingsSectionAppearance(String subsection) {
            this.subsection = subsection;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 946479657;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The &quot;Ask a question&quot; section.
     */
    public static class SettingsSectionAskQuestion extends SettingsSection {

        /**
         * The &quot;Ask a question&quot; section.
         */
        public SettingsSectionAskQuestion() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -977295684;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The &quot;Telegram Business&quot; section.
     */
    public static class SettingsSectionBusiness extends SettingsSection {
        /**
         * Subsection of the section; may be one of &quot;&quot;, &quot;do-not-hide-ads&quot;.
         */
        public String subsection;

        /**
         * The &quot;Telegram Business&quot; section.
         */
        public SettingsSectionBusiness() {
        }

        /**
         * The &quot;Telegram Business&quot; section.
         *
         * @param subsection Subsection of the section; may be one of &quot;&quot;, &quot;do-not-hide-ads&quot;.
         */
        public SettingsSectionBusiness(String subsection) {
            this.subsection = subsection;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2035727714;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat folder settings section.
     */
    public static class SettingsSectionChatFolders extends SettingsSection {
        /**
         * Subsection of the section; may be one of &quot;&quot;, &quot;edit&quot;, &quot;create&quot;, &quot;add-recommended&quot;, &quot;show-tags&quot;, &quot;tab-view&quot;.
         */
        public String subsection;

        /**
         * The chat folder settings section.
         */
        public SettingsSectionChatFolders() {
        }

        /**
         * The chat folder settings section.
         *
         * @param subsection Subsection of the section; may be one of &quot;&quot;, &quot;edit&quot;, &quot;create&quot;, &quot;add-recommended&quot;, &quot;show-tags&quot;, &quot;tab-view&quot;.
         */
        public SettingsSectionChatFolders(String subsection) {
            this.subsection = subsection;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1689092795;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The data and storage settings section.
     */
    public static class SettingsSectionDataAndStorage extends SettingsSection {
        /**
         * Subsection of the section; may be one of &quot;&quot;, &quot;storage&quot;, &quot;storage/edit&quot;, &quot;storage/auto-remove&quot;, &quot;storage/clear-cache&quot;, &quot;storage/max-cache&quot;, &quot;usage&quot;, &quot;usage/mobile&quot;, &quot;usage/wifi&quot;, &quot;usage/reset&quot;, &quot;usage/roaming&quot;, &quot;auto-download/mobile&quot;, &quot;auto-download/mobile/enable&quot;, &quot;auto-download/mobile/usage&quot;, &quot;auto-download/mobile/photos&quot;, &quot;auto-download/mobile/stories&quot;, &quot;auto-download/mobile/videos&quot;, &quot;auto-download/mobile/files&quot;, &quot;auto-download/wifi&quot;, &quot;auto-download/wifi/enable&quot;, &quot;auto-download/wifi/usage&quot;, &quot;auto-download/wifi/photos&quot;, &quot;auto-download/wifi/stories&quot;, &quot;auto-download/wifi/videos&quot;, &quot;auto-download/wifi/files&quot;, &quot;auto-download/roaming&quot;, &quot;auto-download/roaming/enable&quot;, &quot;auto-download/roaming/usage&quot;, &quot;auto-download/roaming/photos&quot;, &quot;auto-download/roaming/stories&quot;, &quot;auto-download/roaming/videos&quot;, &quot;auto-download/roaming/files&quot;, &quot;auto-download/reset&quot;, &quot;save-to-photos/chats&quot;, &quot;save-to-photos/chats/max-video-size&quot;, &quot;save-to-photos/chats/add-exception&quot;, &quot;save-to-photos/chats/delete-all&quot;, &quot;save-to-photos/groups&quot;, &quot;save-to-photos/groups/max-video-size&quot;, &quot;save-to-photos/groups/add-exception&quot;, &quot;save-to-photos/groups/delete-all&quot;, &quot;save-to-photos/channels&quot;, &quot;save-to-photos/channels/max-video-size&quot;, &quot;save-to-photos/channels/add-exception&quot;, &quot;save-to-photos/channels/delete-all&quot;, &quot;less-data-calls&quot;, &quot;open-links&quot;, &quot;share-sheet&quot;, &quot;share-sheet/suggested-chats&quot;, &quot;share-sheet/suggest-by&quot;, &quot;share-sheet/reset&quot;, &quot;saved-edited-photos&quot;, &quot;pause-music&quot;, &quot;raise-to-listen&quot;, &quot;raise-to-speak&quot;, &quot;show-18-content&quot;, &quot;proxy&quot;, &quot;proxy/edit&quot;, &quot;proxy/use-proxy&quot;, &quot;proxy/add-proxy&quot;, &quot;proxy/share-list&quot;, &quot;proxy/use-for-calls&quot;.
         */
        public String subsection;

        /**
         * The data and storage settings section.
         */
        public SettingsSectionDataAndStorage() {
        }

        /**
         * The data and storage settings section.
         *
         * @param subsection Subsection of the section; may be one of &quot;&quot;, &quot;storage&quot;, &quot;storage/edit&quot;, &quot;storage/auto-remove&quot;, &quot;storage/clear-cache&quot;, &quot;storage/max-cache&quot;, &quot;usage&quot;, &quot;usage/mobile&quot;, &quot;usage/wifi&quot;, &quot;usage/reset&quot;, &quot;usage/roaming&quot;, &quot;auto-download/mobile&quot;, &quot;auto-download/mobile/enable&quot;, &quot;auto-download/mobile/usage&quot;, &quot;auto-download/mobile/photos&quot;, &quot;auto-download/mobile/stories&quot;, &quot;auto-download/mobile/videos&quot;, &quot;auto-download/mobile/files&quot;, &quot;auto-download/wifi&quot;, &quot;auto-download/wifi/enable&quot;, &quot;auto-download/wifi/usage&quot;, &quot;auto-download/wifi/photos&quot;, &quot;auto-download/wifi/stories&quot;, &quot;auto-download/wifi/videos&quot;, &quot;auto-download/wifi/files&quot;, &quot;auto-download/roaming&quot;, &quot;auto-download/roaming/enable&quot;, &quot;auto-download/roaming/usage&quot;, &quot;auto-download/roaming/photos&quot;, &quot;auto-download/roaming/stories&quot;, &quot;auto-download/roaming/videos&quot;, &quot;auto-download/roaming/files&quot;, &quot;auto-download/reset&quot;, &quot;save-to-photos/chats&quot;, &quot;save-to-photos/chats/max-video-size&quot;, &quot;save-to-photos/chats/add-exception&quot;, &quot;save-to-photos/chats/delete-all&quot;, &quot;save-to-photos/groups&quot;, &quot;save-to-photos/groups/max-video-size&quot;, &quot;save-to-photos/groups/add-exception&quot;, &quot;save-to-photos/groups/delete-all&quot;, &quot;save-to-photos/channels&quot;, &quot;save-to-photos/channels/max-video-size&quot;, &quot;save-to-photos/channels/add-exception&quot;, &quot;save-to-photos/channels/delete-all&quot;, &quot;less-data-calls&quot;, &quot;open-links&quot;, &quot;share-sheet&quot;, &quot;share-sheet/suggested-chats&quot;, &quot;share-sheet/suggest-by&quot;, &quot;share-sheet/reset&quot;, &quot;saved-edited-photos&quot;, &quot;pause-music&quot;, &quot;raise-to-listen&quot;, &quot;raise-to-speak&quot;, &quot;show-18-content&quot;, &quot;proxy&quot;, &quot;proxy/edit&quot;, &quot;proxy/use-proxy&quot;, &quot;proxy/add-proxy&quot;, &quot;proxy/share-list&quot;, &quot;proxy/use-for-calls&quot;.
         */
        public SettingsSectionDataAndStorage(String subsection) {
            this.subsection = subsection;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -677345873;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The Devices section.
     */
    public static class SettingsSectionDevices extends SettingsSection {
        /**
         * Subsection of the section; may be one of &quot;&quot;, &quot;edit&quot;, &quot;link-desktop&quot;, &quot;terminate-sessions&quot;, &quot;auto-terminate&quot;.
         */
        public String subsection;

        /**
         * The Devices section.
         */
        public SettingsSectionDevices() {
        }

        /**
         * The Devices section.
         *
         * @param subsection Subsection of the section; may be one of &quot;&quot;, &quot;edit&quot;, &quot;link-desktop&quot;, &quot;terminate-sessions&quot;, &quot;auto-terminate&quot;.
         */
        public SettingsSectionDevices(String subsection) {
            this.subsection = subsection;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1987641411;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The profile edit section.
     */
    public static class SettingsSectionEditProfile extends SettingsSection {
        /**
         * Subsection of the section; may be one of &quot;&quot;, &quot;set-photo&quot;, &quot;first-name&quot;, &quot;last-name&quot;, &quot;emoji-status&quot;, &quot;bio&quot;, &quot;birthday&quot;, &quot;change-number&quot;, &quot;username&quot;, &quot;your-color&quot;, &quot;channel&quot;, &quot;add-account&quot;, &quot;log-out&quot;, &quot;profile-color/profile&quot;, &quot;profile-color/profile/add-icons&quot;, &quot;profile-color/profile/use-gift&quot;, &quot;profile-color/name&quot;, &quot;profile-color/name/add-icons&quot;, &quot;profile-color/name/use-gift&quot;, &quot;profile-photo/use-emoji&quot;.
         */
        public String subsection;

        /**
         * The profile edit section.
         */
        public SettingsSectionEditProfile() {
        }

        /**
         * The profile edit section.
         *
         * @param subsection Subsection of the section; may be one of &quot;&quot;, &quot;set-photo&quot;, &quot;first-name&quot;, &quot;last-name&quot;, &quot;emoji-status&quot;, &quot;bio&quot;, &quot;birthday&quot;, &quot;change-number&quot;, &quot;username&quot;, &quot;your-color&quot;, &quot;channel&quot;, &quot;add-account&quot;, &quot;log-out&quot;, &quot;profile-color/profile&quot;, &quot;profile-color/profile/add-icons&quot;, &quot;profile-color/profile/use-gift&quot;, &quot;profile-color/name&quot;, &quot;profile-color/name/add-icons&quot;, &quot;profile-color/name/use-gift&quot;, &quot;profile-photo/use-emoji&quot;.
         */
        public SettingsSectionEditProfile(String subsection) {
            this.subsection = subsection;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 654959232;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The FAQ section.
     */
    public static class SettingsSectionFaq extends SettingsSection {

        /**
         * The FAQ section.
         */
        public SettingsSectionFaq() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 689162381;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The &quot;Telegram Features&quot; section.
     */
    public static class SettingsSectionFeatures extends SettingsSection {

        /**
         * The &quot;Telegram Features&quot; section.
         */
        public SettingsSectionFeatures() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 434930782;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The in-app browser settings section.
     */
    public static class SettingsSectionInAppBrowser extends SettingsSection {
        /**
         * Subsection of the section; may be one of &quot;&quot;, &quot;enable-browser&quot;, &quot;clear-cookies&quot;, &quot;clear-cache&quot;, &quot;history&quot;, &quot;clear-history&quot;, &quot;never-open&quot;, &quot;clear-list&quot;, &quot;search&quot;.
         */
        public String subsection;

        /**
         * The in-app browser settings section.
         */
        public SettingsSectionInAppBrowser() {
        }

        /**
         * The in-app browser settings section.
         *
         * @param subsection Subsection of the section; may be one of &quot;&quot;, &quot;enable-browser&quot;, &quot;clear-cookies&quot;, &quot;clear-cache&quot;, &quot;history&quot;, &quot;clear-history&quot;, &quot;never-open&quot;, &quot;clear-list&quot;, &quot;search&quot;.
         */
        public SettingsSectionInAppBrowser(String subsection) {
            this.subsection = subsection;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1762505859;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The application language section.
     */
    public static class SettingsSectionLanguage extends SettingsSection {
        /**
         * Subsection of the section; may be one of &quot;&quot;, &quot;show-button&quot; for Show Translate Button toggle, &quot;translate-chats&quot; for Translate Entire Chats toggle, &quot;do-not-translate&quot; - for Do Not Translate language list.
         */
        public String subsection;

        /**
         * The application language section.
         */
        public SettingsSectionLanguage() {
        }

        /**
         * The application language section.
         *
         * @param subsection Subsection of the section; may be one of &quot;&quot;, &quot;show-button&quot; for Show Translate Button toggle, &quot;translate-chats&quot; for Translate Entire Chats toggle, &quot;do-not-translate&quot; - for Do Not Translate language list.
         */
        public SettingsSectionLanguage(String subsection) {
            this.subsection = subsection;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2102087062;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The Telegram Star balance and transaction section.
     */
    public static class SettingsSectionMyStars extends SettingsSection {
        /**
         * Subsection of the section; may be one of &quot;&quot;, &quot;top-up&quot;, &quot;stats&quot;, &quot;gift&quot;, &quot;earn&quot;.
         */
        public String subsection;

        /**
         * The Telegram Star balance and transaction section.
         */
        public SettingsSectionMyStars() {
        }

        /**
         * The Telegram Star balance and transaction section.
         *
         * @param subsection Subsection of the section; may be one of &quot;&quot;, &quot;top-up&quot;, &quot;stats&quot;, &quot;gift&quot;, &quot;earn&quot;.
         */
        public SettingsSectionMyStars(String subsection) {
            this.subsection = subsection;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 324987676;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The Toncoin balance and transaction section.
     */
    public static class SettingsSectionMyToncoins extends SettingsSection {

        /**
         * The Toncoin balance and transaction section.
         */
        public SettingsSectionMyToncoins() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1628818474;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The notification settings section.
     */
    public static class SettingsSectionNotifications extends SettingsSection {
        /**
         * Subsection of the section; may be one of &quot;&quot;, &quot;accounts&quot;, &quot;private-chats&quot;, &quot;private-chats/edit&quot;, &quot;private-chats/show&quot;, &quot;private-chats/preview&quot;, &quot;private-chats/sound&quot;, &quot;private-chats/add-exception&quot;, &quot;private-chats/delete-exceptions&quot;, &quot;private-chats/light-color&quot;, &quot;private-chats/vibrate&quot;, &quot;private-chats/priority&quot;, &quot;groups&quot;, &quot;groups/edit&quot;, &quot;groups/show&quot;, &quot;groups/preview&quot;, &quot;groups/sound&quot;, &quot;groups/add-exception&quot;, &quot;groups/delete-exceptions&quot;, &quot;groups/light-color&quot;, &quot;groups/vibrate&quot;, &quot;groups/priority&quot;, &quot;channels&quot;, &quot;channels/edit&quot;, &quot;channels/show&quot;, &quot;channels/preview&quot;, &quot;channels/sound&quot;, &quot;channels/add-exception&quot;, &quot;channels/delete-exceptions&quot;, &quot;channels/light-color&quot;, &quot;channels/vibrate&quot;, &quot;channels/priority&quot;, &quot;stories&quot;, &quot;stories/new&quot;, &quot;stories/important&quot;, &quot;stories/show-sender&quot;, &quot;stories/sound&quot;, &quot;stories/add-exception&quot;, &quot;stories/delete-exceptions&quot;, &quot;stories/light-color&quot;, &quot;stories/vibrate&quot;, &quot;stories/priority&quot;, &quot;reactions&quot;, &quot;reactions/messages&quot;, &quot;reactions/stories&quot;, &quot;reactions/show-sender&quot;, &quot;reactions/sound&quot;, &quot;reactions/light-color&quot;, &quot;reactions/vibrate&quot;, &quot;reactions/priority&quot;, &quot;in-app-sounds&quot;, &quot;in-app-vibrate&quot;, &quot;in-app-preview&quot;, &quot;in-chat-sounds&quot;, &quot;in-app-popup&quot;, &quot;lock-screen-names&quot;, &quot;include-channels&quot;, &quot;include-muted-chats&quot;, &quot;count-unread-messages&quot;, &quot;new-contacts&quot;, &quot;pinned-messages&quot;, &quot;reset&quot;, &quot;web&quot;.
         */
        public String subsection;

        /**
         * The notification settings section.
         */
        public SettingsSectionNotifications() {
        }

        /**
         * The notification settings section.
         *
         * @param subsection Subsection of the section; may be one of &quot;&quot;, &quot;accounts&quot;, &quot;private-chats&quot;, &quot;private-chats/edit&quot;, &quot;private-chats/show&quot;, &quot;private-chats/preview&quot;, &quot;private-chats/sound&quot;, &quot;private-chats/add-exception&quot;, &quot;private-chats/delete-exceptions&quot;, &quot;private-chats/light-color&quot;, &quot;private-chats/vibrate&quot;, &quot;private-chats/priority&quot;, &quot;groups&quot;, &quot;groups/edit&quot;, &quot;groups/show&quot;, &quot;groups/preview&quot;, &quot;groups/sound&quot;, &quot;groups/add-exception&quot;, &quot;groups/delete-exceptions&quot;, &quot;groups/light-color&quot;, &quot;groups/vibrate&quot;, &quot;groups/priority&quot;, &quot;channels&quot;, &quot;channels/edit&quot;, &quot;channels/show&quot;, &quot;channels/preview&quot;, &quot;channels/sound&quot;, &quot;channels/add-exception&quot;, &quot;channels/delete-exceptions&quot;, &quot;channels/light-color&quot;, &quot;channels/vibrate&quot;, &quot;channels/priority&quot;, &quot;stories&quot;, &quot;stories/new&quot;, &quot;stories/important&quot;, &quot;stories/show-sender&quot;, &quot;stories/sound&quot;, &quot;stories/add-exception&quot;, &quot;stories/delete-exceptions&quot;, &quot;stories/light-color&quot;, &quot;stories/vibrate&quot;, &quot;stories/priority&quot;, &quot;reactions&quot;, &quot;reactions/messages&quot;, &quot;reactions/stories&quot;, &quot;reactions/show-sender&quot;, &quot;reactions/sound&quot;, &quot;reactions/light-color&quot;, &quot;reactions/vibrate&quot;, &quot;reactions/priority&quot;, &quot;in-app-sounds&quot;, &quot;in-app-vibrate&quot;, &quot;in-app-preview&quot;, &quot;in-chat-sounds&quot;, &quot;in-app-popup&quot;, &quot;lock-screen-names&quot;, &quot;include-channels&quot;, &quot;include-muted-chats&quot;, &quot;count-unread-messages&quot;, &quot;new-contacts&quot;, &quot;pinned-messages&quot;, &quot;reset&quot;, &quot;web&quot;.
         */
        public SettingsSectionNotifications(String subsection) {
            this.subsection = subsection;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1517744502;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The power saving settings section.
     */
    public static class SettingsSectionPowerSaving extends SettingsSection {
        /**
         * Subsection of the section; may be one of &quot;&quot;, &quot;videos&quot;, &quot;gifs&quot;, &quot;stickers&quot;, &quot;emoji&quot;, &quot;effects&quot;, &quot;preload&quot;, &quot;background&quot;, &quot;call-animations&quot;, &quot;particles&quot;, &quot;transitions&quot;.
         */
        public String subsection;

        /**
         * The power saving settings section.
         */
        public SettingsSectionPowerSaving() {
        }

        /**
         * The power saving settings section.
         *
         * @param subsection Subsection of the section; may be one of &quot;&quot;, &quot;videos&quot;, &quot;gifs&quot;, &quot;stickers&quot;, &quot;emoji&quot;, &quot;effects&quot;, &quot;preload&quot;, &quot;background&quot;, &quot;call-animations&quot;, &quot;particles&quot;, &quot;transitions&quot;.
         */
        public SettingsSectionPowerSaving(String subsection) {
            this.subsection = subsection;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1041090092;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The &quot;Telegram Premium&quot; section.
     */
    public static class SettingsSectionPremium extends SettingsSection {

        /**
         * The &quot;Telegram Premium&quot; section.
         */
        public SettingsSectionPremium() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1635573221;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The privacy and security section.
     */
    public static class SettingsSectionPrivacyAndSecurity extends SettingsSection {
        /**
         * Subsection of the section; may be one of &quot;&quot;, &quot;blocked&quot;, &quot;blocked/edit&quot;, &quot;blocked/block-user&quot;, &quot;blocked/block-user/chats&quot;, &quot;blocked/block-user/contacts&quot;, &quot;active-websites&quot;, &quot;active-websites/edit&quot;, &quot;active-websites/disconnect-all&quot;, &quot;passcode&quot;, &quot;passcode/disable&quot;, &quot;passcode/change&quot;, &quot;passcode/auto-lock&quot;, &quot;passcode/face-id&quot;, &quot;passcode/fingerprint&quot;, &quot;2sv&quot;, &quot;2sv/change&quot;, &quot;2sv/disable&quot;, &quot;2sv/change-email&quot;, &quot;passkey&quot;, &quot;passkey/create&quot;, &quot;auto-delete&quot;, &quot;auto-delete/set-custom&quot;, &quot;login-email&quot;, &quot;phone-number&quot;, &quot;phone-number/never&quot;, &quot;phone-number/always&quot;, &quot;last-seen&quot;, &quot;last-seen/never&quot;, &quot;last-seen/always&quot;, &quot;last-seen/hide-read-time&quot;, &quot;profile-photos&quot;, &quot;profile-photos/never&quot;, &quot;profile-photos/always&quot;, &quot;profile-photos/set-public&quot;, &quot;profile-photos/update-public&quot;, &quot;profile-photos/remove-public&quot;, &quot;bio&quot;, &quot;bio/never&quot;, &quot;bio/always&quot;, &quot;gifts&quot;, &quot;gifts/show-icon&quot;, &quot;gifts/never&quot;, &quot;gifts/always&quot;, &quot;gifts/accepted-types&quot;, &quot;birthday&quot;, &quot;birthday/add&quot;, &quot;birthday/never&quot;, &quot;birthday/always&quot;, &quot;saved-music&quot;, &quot;saved-music/never&quot;, &quot;saved-music/always&quot;, &quot;forwards&quot;, &quot;forwards/never&quot;, &quot;forwards/always&quot;, &quot;calls&quot;, &quot;calls/never&quot;, &quot;calls/always&quot;, &quot;calls/p2p&quot;, &quot;calls/p2p/never&quot;, &quot;calls/p2p/always&quot;, &quot;calls/ios-integration&quot;, &quot;voice&quot;, &quot;voice/never&quot;, &quot;voice/always&quot;, &quot;messages&quot;, &quot;messages/set-price&quot;, &quot;messages/exceptions&quot;, &quot;invites&quot;, &quot;invites/never&quot;, &quot;invites/always&quot;, &quot;self-destruct&quot;, &quot;data-settings&quot;, &quot;data-settings/sync-contacts&quot;, &quot;data-settings/delete-synced&quot;, &quot;data-settings/suggest-contacts&quot;, &quot;data-settings/delete-cloud-drafts&quot;, &quot;data-settings/clear-payment-info&quot;, &quot;data-settings/link-previews&quot;, &quot;data-settings/bot-settings&quot;, &quot;data-settings/map-provider&quot;, &quot;archive-and-mute&quot;.
         */
        public String subsection;

        /**
         * The privacy and security section.
         */
        public SettingsSectionPrivacyAndSecurity() {
        }

        /**
         * The privacy and security section.
         *
         * @param subsection Subsection of the section; may be one of &quot;&quot;, &quot;blocked&quot;, &quot;blocked/edit&quot;, &quot;blocked/block-user&quot;, &quot;blocked/block-user/chats&quot;, &quot;blocked/block-user/contacts&quot;, &quot;active-websites&quot;, &quot;active-websites/edit&quot;, &quot;active-websites/disconnect-all&quot;, &quot;passcode&quot;, &quot;passcode/disable&quot;, &quot;passcode/change&quot;, &quot;passcode/auto-lock&quot;, &quot;passcode/face-id&quot;, &quot;passcode/fingerprint&quot;, &quot;2sv&quot;, &quot;2sv/change&quot;, &quot;2sv/disable&quot;, &quot;2sv/change-email&quot;, &quot;passkey&quot;, &quot;passkey/create&quot;, &quot;auto-delete&quot;, &quot;auto-delete/set-custom&quot;, &quot;login-email&quot;, &quot;phone-number&quot;, &quot;phone-number/never&quot;, &quot;phone-number/always&quot;, &quot;last-seen&quot;, &quot;last-seen/never&quot;, &quot;last-seen/always&quot;, &quot;last-seen/hide-read-time&quot;, &quot;profile-photos&quot;, &quot;profile-photos/never&quot;, &quot;profile-photos/always&quot;, &quot;profile-photos/set-public&quot;, &quot;profile-photos/update-public&quot;, &quot;profile-photos/remove-public&quot;, &quot;bio&quot;, &quot;bio/never&quot;, &quot;bio/always&quot;, &quot;gifts&quot;, &quot;gifts/show-icon&quot;, &quot;gifts/never&quot;, &quot;gifts/always&quot;, &quot;gifts/accepted-types&quot;, &quot;birthday&quot;, &quot;birthday/add&quot;, &quot;birthday/never&quot;, &quot;birthday/always&quot;, &quot;saved-music&quot;, &quot;saved-music/never&quot;, &quot;saved-music/always&quot;, &quot;forwards&quot;, &quot;forwards/never&quot;, &quot;forwards/always&quot;, &quot;calls&quot;, &quot;calls/never&quot;, &quot;calls/always&quot;, &quot;calls/p2p&quot;, &quot;calls/p2p/never&quot;, &quot;calls/p2p/always&quot;, &quot;calls/ios-integration&quot;, &quot;voice&quot;, &quot;voice/never&quot;, &quot;voice/always&quot;, &quot;messages&quot;, &quot;messages/set-price&quot;, &quot;messages/exceptions&quot;, &quot;invites&quot;, &quot;invites/never&quot;, &quot;invites/always&quot;, &quot;self-destruct&quot;, &quot;data-settings&quot;, &quot;data-settings/sync-contacts&quot;, &quot;data-settings/delete-synced&quot;, &quot;data-settings/suggest-contacts&quot;, &quot;data-settings/delete-cloud-drafts&quot;, &quot;data-settings/clear-payment-info&quot;, &quot;data-settings/link-previews&quot;, &quot;data-settings/bot-settings&quot;, &quot;data-settings/map-provider&quot;, &quot;archive-and-mute&quot;.
         */
        public SettingsSectionPrivacyAndSecurity(String subsection) {
            this.subsection = subsection;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1251665482;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The &quot;Privacy Policy&quot; section.
     */
    public static class SettingsSectionPrivacyPolicy extends SettingsSection {

        /**
         * The &quot;Privacy Policy&quot; section.
         */
        public SettingsSectionPrivacyPolicy() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2068087969;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The current user's QR code section.
     */
    public static class SettingsSectionQrCode extends SettingsSection {
        /**
         * Subsection of the section; may be one of &quot;&quot;, &quot;share&quot;, &quot;scan&quot;.
         */
        public String subsection;

        /**
         * The current user's QR code section.
         */
        public SettingsSectionQrCode() {
        }

        /**
         * The current user's QR code section.
         *
         * @param subsection Subsection of the section; may be one of &quot;&quot;, &quot;share&quot;, &quot;scan&quot;.
         */
        public SettingsSectionQrCode(String subsection) {
            this.subsection = subsection;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1816314456;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Search in Settings.
     */
    public static class SettingsSectionSearch extends SettingsSection {

        /**
         * Search in Settings.
         */
        public SettingsSectionSearch() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 686700184;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The &quot;Send a gift&quot; section.
     */
    public static class SettingsSectionSendGift extends SettingsSection {
        /**
         * Subsection of the section; may be one of &quot;&quot;, &quot;self&quot;.
         */
        public String subsection;

        /**
         * The &quot;Send a gift&quot; section.
         */
        public SettingsSectionSendGift() {
        }

        /**
         * The &quot;Send a gift&quot; section.
         *
         * @param subsection Subsection of the section; may be one of &quot;&quot;, &quot;self&quot;.
         */
        public SettingsSectionSendGift(String subsection) {
            this.subsection = subsection;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -326078;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a chat shared with a bot.
     */
    public static class SharedChat extends Object {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Title of the chat; for bots only.
         */
        public String title;
        /**
         * Username of the chat; for bots only.
         */
        public String username;
        /**
         * Photo of the chat; for bots only; may be null.
         */
        @Nullable public Photo photo;

        /**
         * Contains information about a chat shared with a bot.
         */
        public SharedChat() {
        }

        /**
         * Contains information about a chat shared with a bot.
         *
         * @param chatId Chat identifier.
         * @param title Title of the chat; for bots only.
         * @param username Username of the chat; for bots only.
         * @param photo Photo of the chat; for bots only; may be null.
         */
        public SharedChat(long chatId, String title, String username, Photo photo) {
            this.chatId = chatId;
            this.title = title;
            this.username = username;
            this.photo = photo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1250406426;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a user shared with a bot.
     */
    public static class SharedUser extends Object {
        /**
         * User identifier.
         */
        public long userId;
        /**
         * First name of the user; for bots only.
         */
        public String firstName;
        /**
         * Last name of the user; for bots only.
         */
        public String lastName;
        /**
         * Username of the user; for bots only.
         */
        public String username;
        /**
         * Profile photo of the user; for bots only; may be null.
         */
        @Nullable public Photo photo;

        /**
         * Contains information about a user shared with a bot.
         */
        public SharedUser() {
        }

        /**
         * Contains information about a user shared with a bot.
         *
         * @param userId User identifier.
         * @param firstName First name of the user; for bots only.
         * @param lastName Last name of the user; for bots only.
         * @param username Username of the user; for bots only.
         * @param photo Profile photo of the user; for bots only; may be null.
         */
        public SharedUser(long userId, String firstName, String lastName, String username, Photo photo) {
            this.userId = userId;
            this.firstName = firstName;
            this.lastName = lastName;
            this.username = username;
            this.photo = photo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 293020919;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * One shipping option.
     */
    public static class ShippingOption extends Object {
        /**
         * Shipping option identifier.
         */
        public String id;
        /**
         * Option title.
         */
        public String title;
        /**
         * A list of objects used to calculate the total shipping costs.
         */
        public LabeledPricePart[] priceParts;

        /**
         * One shipping option.
         */
        public ShippingOption() {
        }

        /**
         * One shipping option.
         *
         * @param id Shipping option identifier.
         * @param title Option title.
         * @param priceParts A list of objects used to calculate the total shipping costs.
         */
        public ShippingOption(String id, String title, LabeledPricePart[] priceParts) {
            this.id = id;
            this.title = title;
            this.priceParts = priceParts;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1425690001;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes result of speech recognition in a voice note.
     */
    public abstract static class SpeechRecognitionResult extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            SpeechRecognitionResultPending.CONSTRUCTOR,
            SpeechRecognitionResultText.CONSTRUCTOR,
            SpeechRecognitionResultError.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public SpeechRecognitionResult() {
        }
    }

    /**
     * The speech recognition is ongoing.
     */
    public static class SpeechRecognitionResultPending extends SpeechRecognitionResult {
        /**
         * Partially recognized text.
         */
        public String partialText;

        /**
         * The speech recognition is ongoing.
         */
        public SpeechRecognitionResultPending() {
        }

        /**
         * The speech recognition is ongoing.
         *
         * @param partialText Partially recognized text.
         */
        public SpeechRecognitionResultPending(String partialText) {
            this.partialText = partialText;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1631810048;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The speech recognition successfully finished.
     */
    public static class SpeechRecognitionResultText extends SpeechRecognitionResult {
        /**
         * Recognized text.
         */
        public String text;

        /**
         * The speech recognition successfully finished.
         */
        public SpeechRecognitionResultText() {
        }

        /**
         * The speech recognition successfully finished.
         *
         * @param text Recognized text.
         */
        public SpeechRecognitionResultText(String text) {
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2132377123;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The speech recognition failed.
     */
    public static class SpeechRecognitionResultError extends SpeechRecognitionResult {
        /**
         * Recognition error. An error with a message &quot;MSG_VOICE_TOO_LONG&quot; is returned when media duration is too big to be recognized.
         */
        public Error error;

        /**
         * The speech recognition failed.
         */
        public SpeechRecognitionResultError() {
        }

        /**
         * The speech recognition failed.
         *
         * @param error Recognition error. An error with a message &quot;MSG_VOICE_TOO_LONG&quot; is returned when media duration is too big to be recognized.
         */
        public SpeechRecognitionResultError(Error error) {
            this.error = error;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 164774908;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a sponsored chat.
     */
    public static class SponsoredChat extends Object {
        /**
         * Unique identifier of this result.
         */
        public long uniqueId;
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Additional optional information about the sponsor to be shown along with the chat.
         */
        public String sponsorInfo;
        /**
         * If non-empty, additional information about the sponsored chat to be shown along with the chat.
         */
        public String additionalInfo;

        /**
         * Describes a sponsored chat.
         */
        public SponsoredChat() {
        }

        /**
         * Describes a sponsored chat.
         *
         * @param uniqueId Unique identifier of this result.
         * @param chatId Chat identifier.
         * @param sponsorInfo Additional optional information about the sponsor to be shown along with the chat.
         * @param additionalInfo If non-empty, additional information about the sponsored chat to be shown along with the chat.
         */
        public SponsoredChat(long uniqueId, long chatId, String sponsorInfo, String additionalInfo) {
            this.uniqueId = uniqueId;
            this.chatId = chatId;
            this.sponsorInfo = sponsorInfo;
            this.additionalInfo = additionalInfo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -325763489;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of sponsored chats.
     */
    public static class SponsoredChats extends Object {
        /**
         * List of sponsored chats.
         */
        public SponsoredChat[] chats;

        /**
         * Contains a list of sponsored chats.
         */
        public SponsoredChats() {
        }

        /**
         * Contains a list of sponsored chats.
         *
         * @param chats List of sponsored chats.
         */
        public SponsoredChats(SponsoredChat[] chats) {
            this.chats = chats;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 536300641;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a sponsored message.
     */
    public static class SponsoredMessage extends Object {
        /**
         * Message identifier; unique for the chat to which the sponsored message belongs among both ordinary and sponsored messages.
         */
        public long messageId;
        /**
         * True, if the message needs to be labeled as &quot;recommended&quot; instead of &quot;sponsored&quot;.
         */
        public boolean isRecommended;
        /**
         * True, if the message can be reported to Telegram moderators through reportChatSponsoredMessage.
         */
        public boolean canBeReported;
        /**
         * Content of the message. Currently, can be only of the types messageText, messageAnimation, messagePhoto, or messageVideo. Video messages can be viewed fullscreen. The content must be fully downloaded before the message is shown.
         */
        public MessageContent content;
        /**
         * Information about the sponsor of the message.
         */
        public AdvertisementSponsor sponsor;
        /**
         * Title of the sponsored message.
         */
        public String title;
        /**
         * Text for the message action button.
         */
        public String buttonText;
        /**
         * Identifier of the accent color for title, button text and message background.
         */
        public int accentColorId;
        /**
         * Identifier of a custom emoji to be shown on the message background; 0 if none.
         */
        public long backgroundCustomEmojiId;
        /**
         * If non-empty, additional information about the sponsored message to be shown along with the message.
         */
        public String additionalInfo;

        /**
         * Describes a sponsored message.
         */
        public SponsoredMessage() {
        }

        /**
         * Describes a sponsored message.
         *
         * @param messageId Message identifier; unique for the chat to which the sponsored message belongs among both ordinary and sponsored messages.
         * @param isRecommended True, if the message needs to be labeled as &quot;recommended&quot; instead of &quot;sponsored&quot;.
         * @param canBeReported True, if the message can be reported to Telegram moderators through reportChatSponsoredMessage.
         * @param content Content of the message. Currently, can be only of the types messageText, messageAnimation, messagePhoto, or messageVideo. Video messages can be viewed fullscreen. The content must be fully downloaded before the message is shown.
         * @param sponsor Information about the sponsor of the message.
         * @param title Title of the sponsored message.
         * @param buttonText Text for the message action button.
         * @param accentColorId Identifier of the accent color for title, button text and message background.
         * @param backgroundCustomEmojiId Identifier of a custom emoji to be shown on the message background; 0 if none.
         * @param additionalInfo If non-empty, additional information about the sponsored message to be shown along with the message.
         */
        public SponsoredMessage(long messageId, boolean isRecommended, boolean canBeReported, MessageContent content, AdvertisementSponsor sponsor, String title, String buttonText, int accentColorId, long backgroundCustomEmojiId, String additionalInfo) {
            this.messageId = messageId;
            this.isRecommended = isRecommended;
            this.canBeReported = canBeReported;
            this.content = content;
            this.sponsor = sponsor;
            this.title = title;
            this.buttonText = buttonText;
            this.accentColorId = accentColorId;
            this.backgroundCustomEmojiId = backgroundCustomEmojiId;
            this.additionalInfo = additionalInfo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1521782216;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of sponsored messages.
     */
    public static class SponsoredMessages extends Object {
        /**
         * List of sponsored messages.
         */
        public SponsoredMessage[] messages;
        /**
         * The minimum number of messages between shown sponsored messages, or 0 if only one sponsored message must be shown after all ordinary messages.
         */
        public int messagesBetween;

        /**
         * Contains a list of sponsored messages.
         */
        public SponsoredMessages() {
        }

        /**
         * Contains a list of sponsored messages.
         *
         * @param messages List of sponsored messages.
         * @param messagesBetween The minimum number of messages between shown sponsored messages, or 0 if only one sponsored message must be shown after all ordinary messages.
         */
        public SponsoredMessages(SponsoredMessage[] messages, int messagesBetween) {
            this.messages = messages;
            this.messagesBetween = messagesBetween;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -537674389;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes state of the stake dice.
     */
    public static class StakeDiceState extends Object {
        /**
         * Hash of the state to use for sending the next dice; may be empty if the stake dice can't be sent by the current user.
         */
        public String stateHash;
        /**
         * The Toncoin amount that was staked in the previous roll; in the smallest units of the currency.
         */
        public long stakeToncoinAmount;
        /**
         * The amounts of Toncoins that are suggested to be staked; in the smallest units of the currency.
         */
        public long[] suggestedStakeToncoinAmounts;
        /**
         * The number of rolled sixes towards the streak; 0-2.
         */
        public int currentStreak;
        /**
         * The number of Toncoins received by the user for each 1000 Toncoins staked if the dice outcome is 1-6 correspondingly; may be empty if the stake dice can't be sent by the current user.
         */
        public int[] prizePerMille;
        /**
         * The number of Toncoins received by the user for each 1000 Toncoins staked if the dice outcome is 6 three times in a row with the same stake.
         */
        public int streakPrizePerMille;

        /**
         * Describes state of the stake dice.
         */
        public StakeDiceState() {
        }

        /**
         * Describes state of the stake dice.
         *
         * @param stateHash Hash of the state to use for sending the next dice; may be empty if the stake dice can't be sent by the current user.
         * @param stakeToncoinAmount The Toncoin amount that was staked in the previous roll; in the smallest units of the currency.
         * @param suggestedStakeToncoinAmounts The amounts of Toncoins that are suggested to be staked; in the smallest units of the currency.
         * @param currentStreak The number of rolled sixes towards the streak; 0-2.
         * @param prizePerMille The number of Toncoins received by the user for each 1000 Toncoins staked if the dice outcome is 1-6 correspondingly; may be empty if the stake dice can't be sent by the current user.
         * @param streakPrizePerMille The number of Toncoins received by the user for each 1000 Toncoins staked if the dice outcome is 6 three times in a row with the same stake.
         */
        public StakeDiceState(String stateHash, long stakeToncoinAmount, long[] suggestedStakeToncoinAmounts, int currentStreak, int[] prizePerMille, int streakPrizePerMille) {
            this.stateHash = stateHash;
            this.stakeToncoinAmount = stakeToncoinAmount;
            this.suggestedStakeToncoinAmounts = suggestedStakeToncoinAmounts;
            this.currentStreak = currentStreak;
            this.prizePerMille = prizePerMille;
            this.streakPrizePerMille = streakPrizePerMille;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2004711564;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a possibly non-integer Telegram Star amount.
     */
    public static class StarAmount extends Object {
        /**
         * The integer Telegram Star amount rounded to 0.
         */
        public long starCount;
        /**
         * The number of 1/1000000000 shares of Telegram Stars; from -999999999 to 999999999.
         */
        public int nanostarCount;

        /**
         * Describes a possibly non-integer Telegram Star amount.
         */
        public StarAmount() {
        }

        /**
         * Describes a possibly non-integer Telegram Star amount.
         *
         * @param starCount The integer Telegram Star amount rounded to 0.
         * @param nanostarCount The number of 1/1000000000 shares of Telegram Stars; from -999999999 to 999999999.
         */
        public StarAmount(long starCount, int nanostarCount) {
            this.starCount = starCount;
            this.nanostarCount = nanostarCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1863216512;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a number of Telegram Stars.
     */
    public static class StarCount extends Object {
        /**
         * Number of Telegram Stars.
         */
        public long starCount;

        /**
         * Contains a number of Telegram Stars.
         */
        public StarCount() {
        }

        /**
         * Contains a number of Telegram Stars.
         *
         * @param starCount Number of Telegram Stars.
         */
        public StarCount(long starCount) {
            this.starCount = starCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1566395144;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an option for creating of Telegram Star giveaway. Use telegramPaymentPurposeStarGiveaway for out-of-store payments.
     */
    public static class StarGiveawayPaymentOption extends Object {
        /**
         * ISO 4217 currency code for the payment.
         */
        public String currency;
        /**
         * The amount to pay, in the smallest units of the currency.
         */
        public long amount;
        /**
         * Number of Telegram Stars that will be distributed among winners.
         */
        public long starCount;
        /**
         * Identifier of the store product associated with the option; may be empty if none.
         */
        public String storeProductId;
        /**
         * Number of times the chat will be boosted for one year if the option is chosen.
         */
        public int yearlyBoostCount;
        /**
         * Allowed options for the number of giveaway winners.
         */
        public StarGiveawayWinnerOption[] winnerOptions;
        /**
         * True, if the option must be chosen by default.
         */
        public boolean isDefault;
        /**
         * True, if the option must be shown only in the full list of payment options.
         */
        public boolean isAdditional;

        /**
         * Describes an option for creating of Telegram Star giveaway. Use telegramPaymentPurposeStarGiveaway for out-of-store payments.
         */
        public StarGiveawayPaymentOption() {
        }

        /**
         * Describes an option for creating of Telegram Star giveaway. Use telegramPaymentPurposeStarGiveaway for out-of-store payments.
         *
         * @param currency ISO 4217 currency code for the payment.
         * @param amount The amount to pay, in the smallest units of the currency.
         * @param starCount Number of Telegram Stars that will be distributed among winners.
         * @param storeProductId Identifier of the store product associated with the option; may be empty if none.
         * @param yearlyBoostCount Number of times the chat will be boosted for one year if the option is chosen.
         * @param winnerOptions Allowed options for the number of giveaway winners.
         * @param isDefault True, if the option must be chosen by default.
         * @param isAdditional True, if the option must be shown only in the full list of payment options.
         */
        public StarGiveawayPaymentOption(String currency, long amount, long starCount, String storeProductId, int yearlyBoostCount, StarGiveawayWinnerOption[] winnerOptions, boolean isDefault, boolean isAdditional) {
            this.currency = currency;
            this.amount = amount;
            this.starCount = starCount;
            this.storeProductId = storeProductId;
            this.yearlyBoostCount = yearlyBoostCount;
            this.winnerOptions = winnerOptions;
            this.isDefault = isDefault;
            this.isAdditional = isAdditional;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 565089625;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of options for creating of Telegram Star giveaway.
     */
    public static class StarGiveawayPaymentOptions extends Object {
        /**
         * The list of options.
         */
        public StarGiveawayPaymentOption[] options;

        /**
         * Contains a list of options for creating of Telegram Star giveaway.
         */
        public StarGiveawayPaymentOptions() {
        }

        /**
         * Contains a list of options for creating of Telegram Star giveaway.
         *
         * @param options The list of options.
         */
        public StarGiveawayPaymentOptions(StarGiveawayPaymentOption[] options) {
            this.options = options;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1216716679;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an option for the number of winners of a Telegram Star giveaway.
     */
    public static class StarGiveawayWinnerOption extends Object {
        /**
         * The number of users that will be chosen as winners.
         */
        public int winnerCount;
        /**
         * The number of Telegram Stars that will be won by the winners of the giveaway.
         */
        public long wonStarCount;
        /**
         * True, if the option must be chosen by default.
         */
        public boolean isDefault;

        /**
         * Describes an option for the number of winners of a Telegram Star giveaway.
         */
        public StarGiveawayWinnerOption() {
        }

        /**
         * Describes an option for the number of winners of a Telegram Star giveaway.
         *
         * @param winnerCount The number of users that will be chosen as winners.
         * @param wonStarCount The number of Telegram Stars that will be won by the winners of the giveaway.
         * @param isDefault True, if the option must be chosen by default.
         */
        public StarGiveawayWinnerOption(int winnerCount, long wonStarCount, boolean isDefault) {
            this.winnerCount = winnerCount;
            this.wonStarCount = wonStarCount;
            this.isDefault = isDefault;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -865888761;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an option for buying Telegram Stars. Use telegramPaymentPurposeStars for out-of-store payments.
     */
    public static class StarPaymentOption extends Object {
        /**
         * ISO 4217 currency code for the payment.
         */
        public String currency;
        /**
         * The amount to pay, in the smallest units of the currency.
         */
        public long amount;
        /**
         * Number of Telegram Stars that will be purchased.
         */
        public long starCount;
        /**
         * Identifier of the store product associated with the option; may be empty if none.
         */
        public String storeProductId;
        /**
         * True, if the option must be shown only in the full list of payment options.
         */
        public boolean isAdditional;

        /**
         * Describes an option for buying Telegram Stars. Use telegramPaymentPurposeStars for out-of-store payments.
         */
        public StarPaymentOption() {
        }

        /**
         * Describes an option for buying Telegram Stars. Use telegramPaymentPurposeStars for out-of-store payments.
         *
         * @param currency ISO 4217 currency code for the payment.
         * @param amount The amount to pay, in the smallest units of the currency.
         * @param starCount Number of Telegram Stars that will be purchased.
         * @param storeProductId Identifier of the store product associated with the option; may be empty if none.
         * @param isAdditional True, if the option must be shown only in the full list of payment options.
         */
        public StarPaymentOption(String currency, long amount, long starCount, String storeProductId, boolean isAdditional) {
            this.currency = currency;
            this.amount = amount;
            this.starCount = starCount;
            this.storeProductId = storeProductId;
            this.isAdditional = isAdditional;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1364056047;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of options for buying Telegram Stars.
     */
    public static class StarPaymentOptions extends Object {
        /**
         * The list of options.
         */
        public StarPaymentOption[] options;

        /**
         * Contains a list of options for buying Telegram Stars.
         */
        public StarPaymentOptions() {
        }

        /**
         * Contains a list of options for buying Telegram Stars.
         *
         * @param options The list of options.
         */
        public StarPaymentOptions(StarPaymentOption[] options) {
            this.options = options;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -423720498;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A detailed statistics about Telegram Stars earned by a user or a chat.
     */
    public static class StarRevenueStatistics extends Object {
        /**
         * A graph containing amount of revenue in a given day.
         */
        public StatisticalGraph revenueByDayGraph;
        /**
         * Telegram Star revenue status.
         */
        public StarRevenueStatus status;
        /**
         * Current conversion rate of a Telegram Star to USD.
         */
        public double usdRate;

        /**
         * A detailed statistics about Telegram Stars earned by a user or a chat.
         */
        public StarRevenueStatistics() {
        }

        /**
         * A detailed statistics about Telegram Stars earned by a user or a chat.
         *
         * @param revenueByDayGraph A graph containing amount of revenue in a given day.
         * @param status Telegram Star revenue status.
         * @param usdRate Current conversion rate of a Telegram Star to USD.
         */
        public StarRevenueStatistics(StatisticalGraph revenueByDayGraph, StarRevenueStatus status, double usdRate) {
            this.revenueByDayGraph = revenueByDayGraph;
            this.status = status;
            this.usdRate = usdRate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1121086889;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about Telegram Stars earned by a user or a chat.
     */
    public static class StarRevenueStatus extends Object {
        /**
         * Total Telegram Star amount earned.
         */
        public StarAmount totalAmount;
        /**
         * The Telegram Star amount that isn't withdrawn yet.
         */
        public StarAmount currentAmount;
        /**
         * The Telegram Star amount that is available for withdrawal.
         */
        public StarAmount availableAmount;
        /**
         * True, if Telegram Stars can be withdrawn now or later.
         */
        public boolean withdrawalEnabled;
        /**
         * Time left before the next withdrawal can be started, in seconds; 0 if withdrawal can be started now.
         */
        public int nextWithdrawalIn;

        /**
         * Contains information about Telegram Stars earned by a user or a chat.
         */
        public StarRevenueStatus() {
        }

        /**
         * Contains information about Telegram Stars earned by a user or a chat.
         *
         * @param totalAmount Total Telegram Star amount earned.
         * @param currentAmount The Telegram Star amount that isn't withdrawn yet.
         * @param availableAmount The Telegram Star amount that is available for withdrawal.
         * @param withdrawalEnabled True, if Telegram Stars can be withdrawn now or later.
         * @param nextWithdrawalIn Time left before the next withdrawal can be started, in seconds; 0 if withdrawal can be started now.
         */
        public StarRevenueStatus(StarAmount totalAmount, StarAmount currentAmount, StarAmount availableAmount, boolean withdrawalEnabled, int nextWithdrawalIn) {
            this.totalAmount = totalAmount;
            this.currentAmount = currentAmount;
            this.availableAmount = availableAmount;
            this.withdrawalEnabled = withdrawalEnabled;
            this.nextWithdrawalIn = nextWithdrawalIn;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2006266600;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about subscription to a channel chat, a bot, or a business account that was paid in Telegram Stars.
     */
    public static class StarSubscription extends Object {
        /**
         * Unique identifier of the subscription.
         */
        public String id;
        /**
         * Identifier of the chat that is subscribed.
         */
        public long chatId;
        /**
         * Point in time (Unix timestamp) when the subscription will expire or expired.
         */
        public int expirationDate;
        /**
         * True, if the subscription was canceled.
         */
        public boolean isCanceled;
        /**
         * True, if the subscription expires soon and there are no enough Telegram Stars on the user's balance to extend it.
         */
        public boolean isExpiring;
        /**
         * The subscription plan.
         */
        public StarSubscriptionPricing pricing;
        /**
         * Type of the subscription.
         */
        public StarSubscriptionType type;

        /**
         * Contains information about subscription to a channel chat, a bot, or a business account that was paid in Telegram Stars.
         */
        public StarSubscription() {
        }

        /**
         * Contains information about subscription to a channel chat, a bot, or a business account that was paid in Telegram Stars.
         *
         * @param id Unique identifier of the subscription.
         * @param chatId Identifier of the chat that is subscribed.
         * @param expirationDate Point in time (Unix timestamp) when the subscription will expire or expired.
         * @param isCanceled True, if the subscription was canceled.
         * @param isExpiring True, if the subscription expires soon and there are no enough Telegram Stars on the user's balance to extend it.
         * @param pricing The subscription plan.
         * @param type Type of the subscription.
         */
        public StarSubscription(String id, long chatId, int expirationDate, boolean isCanceled, boolean isExpiring, StarSubscriptionPricing pricing, StarSubscriptionType type) {
            this.id = id;
            this.chatId = chatId;
            this.expirationDate = expirationDate;
            this.isCanceled = isCanceled;
            this.isExpiring = isExpiring;
            this.pricing = pricing;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 976753141;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes subscription plan paid in Telegram Stars.
     */
    public static class StarSubscriptionPricing extends Object {
        /**
         * The number of seconds between consecutive Telegram Star debiting.
         */
        public int period;
        /**
         * The Telegram Star amount that must be paid for each period.
         */
        public long starCount;

        /**
         * Describes subscription plan paid in Telegram Stars.
         */
        public StarSubscriptionPricing() {
        }

        /**
         * Describes subscription plan paid in Telegram Stars.
         *
         * @param period The number of seconds between consecutive Telegram Star debiting.
         * @param starCount The Telegram Star amount that must be paid for each period.
         */
        public StarSubscriptionPricing(int period, long starCount) {
            this.period = period;
            this.starCount = starCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1767733162;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes type of subscription paid in Telegram Stars.
     */
    public abstract static class StarSubscriptionType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            StarSubscriptionTypeChannel.CONSTRUCTOR,
            StarSubscriptionTypeBot.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public StarSubscriptionType() {
        }
    }

    /**
     * Describes a subscription to a channel chat.
     */
    public static class StarSubscriptionTypeChannel extends StarSubscriptionType {
        /**
         * True, if the subscription is active and the user can use the method reuseStarSubscription to join the subscribed chat again.
         */
        public boolean canReuse;
        /**
         * The invite link that can be used to renew the subscription if it has been expired; may be empty, if the link isn't available anymore.
         */
        public String inviteLink;

        /**
         * Describes a subscription to a channel chat.
         */
        public StarSubscriptionTypeChannel() {
        }

        /**
         * Describes a subscription to a channel chat.
         *
         * @param canReuse True, if the subscription is active and the user can use the method reuseStarSubscription to join the subscribed chat again.
         * @param inviteLink The invite link that can be used to renew the subscription if it has been expired; may be empty, if the link isn't available anymore.
         */
        public StarSubscriptionTypeChannel(boolean canReuse, String inviteLink) {
            this.canReuse = canReuse;
            this.inviteLink = inviteLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1030048011;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a subscription in a bot or a business account.
     */
    public static class StarSubscriptionTypeBot extends StarSubscriptionType {
        /**
         * True, if the subscription was canceled by the bot and can't be extended.
         */
        public boolean isCanceledByBot;
        /**
         * Subscription invoice title.
         */
        public String title;
        /**
         * Subscription invoice photo.
         */
        public Photo photo;
        /**
         * The link to the subscription invoice.
         */
        public String invoiceLink;

        /**
         * Describes a subscription in a bot or a business account.
         */
        public StarSubscriptionTypeBot() {
        }

        /**
         * Describes a subscription in a bot or a business account.
         *
         * @param isCanceledByBot True, if the subscription was canceled by the bot and can't be extended.
         * @param title Subscription invoice title.
         * @param photo Subscription invoice photo.
         * @param invoiceLink The link to the subscription invoice.
         */
        public StarSubscriptionTypeBot(boolean isCanceledByBot, String title, Photo photo, String invoiceLink) {
            this.isCanceledByBot = isCanceledByBot;
            this.title = title;
            this.photo = photo;
            this.invoiceLink = invoiceLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 226024914;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of Telegram Star subscriptions.
     */
    public static class StarSubscriptions extends Object {
        /**
         * The amount of owned Telegram Stars.
         */
        public StarAmount starAmount;
        /**
         * List of subscriptions for Telegram Stars.
         */
        public StarSubscription[] subscriptions;
        /**
         * The number of Telegram Stars required to buy to extend subscriptions expiring soon.
         */
        public long requiredStarCount;
        /**
         * The offset for the next request. If empty, then there are no more results.
         */
        public String nextOffset;

        /**
         * Represents a list of Telegram Star subscriptions.
         */
        public StarSubscriptions() {
        }

        /**
         * Represents a list of Telegram Star subscriptions.
         *
         * @param starAmount The amount of owned Telegram Stars.
         * @param subscriptions List of subscriptions for Telegram Stars.
         * @param requiredStarCount The number of Telegram Stars required to buy to extend subscriptions expiring soon.
         * @param nextOffset The offset for the next request. If empty, then there are no more results.
         */
        public StarSubscriptions(StarAmount starAmount, StarSubscription[] subscriptions, long requiredStarCount, String nextOffset) {
            this.starAmount = starAmount;
            this.subscriptions = subscriptions;
            this.requiredStarCount = requiredStarCount;
            this.nextOffset = nextOffset;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 151169395;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a transaction changing the amount of owned Telegram Stars.
     */
    public static class StarTransaction extends Object {
        /**
         * Unique identifier of the transaction.
         */
        public String id;
        /**
         * The amount of added owned Telegram Stars; negative for outgoing transactions.
         */
        public StarAmount starAmount;
        /**
         * True, if the transaction is a refund of a previous transaction.
         */
        public boolean isRefund;
        /**
         * Point in time (Unix timestamp) when the transaction was completed.
         */
        public int date;
        /**
         * Type of the transaction.
         */
        public StarTransactionType type;

        /**
         * Represents a transaction changing the amount of owned Telegram Stars.
         */
        public StarTransaction() {
        }

        /**
         * Represents a transaction changing the amount of owned Telegram Stars.
         *
         * @param id Unique identifier of the transaction.
         * @param starAmount The amount of added owned Telegram Stars; negative for outgoing transactions.
         * @param isRefund True, if the transaction is a refund of a previous transaction.
         * @param date Point in time (Unix timestamp) when the transaction was completed.
         * @param type Type of the transaction.
         */
        public StarTransaction(String id, StarAmount starAmount, boolean isRefund, int date, StarTransactionType type) {
            this.id = id;
            this.starAmount = starAmount;
            this.isRefund = isRefund;
            this.date = date;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2139228816;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes type of transaction with Telegram Stars.
     */
    public abstract static class StarTransactionType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            StarTransactionTypePremiumBotDeposit.CONSTRUCTOR,
            StarTransactionTypeAppStoreDeposit.CONSTRUCTOR,
            StarTransactionTypeGooglePlayDeposit.CONSTRUCTOR,
            StarTransactionTypeFragmentDeposit.CONSTRUCTOR,
            StarTransactionTypeUserDeposit.CONSTRUCTOR,
            StarTransactionTypeGiveawayDeposit.CONSTRUCTOR,
            StarTransactionTypeFragmentWithdrawal.CONSTRUCTOR,
            StarTransactionTypeTelegramAdsWithdrawal.CONSTRUCTOR,
            StarTransactionTypeTelegramApiUsage.CONSTRUCTOR,
            StarTransactionTypeBotPaidMediaPurchase.CONSTRUCTOR,
            StarTransactionTypeBotPaidMediaSale.CONSTRUCTOR,
            StarTransactionTypeChannelPaidMediaPurchase.CONSTRUCTOR,
            StarTransactionTypeChannelPaidMediaSale.CONSTRUCTOR,
            StarTransactionTypeBotInvoicePurchase.CONSTRUCTOR,
            StarTransactionTypeBotInvoiceSale.CONSTRUCTOR,
            StarTransactionTypeBotSubscriptionPurchase.CONSTRUCTOR,
            StarTransactionTypeBotSubscriptionSale.CONSTRUCTOR,
            StarTransactionTypeChannelSubscriptionPurchase.CONSTRUCTOR,
            StarTransactionTypeChannelSubscriptionSale.CONSTRUCTOR,
            StarTransactionTypeGiftAuctionBid.CONSTRUCTOR,
            StarTransactionTypeGiftPurchase.CONSTRUCTOR,
            StarTransactionTypeGiftPurchaseOffer.CONSTRUCTOR,
            StarTransactionTypeGiftTransfer.CONSTRUCTOR,
            StarTransactionTypeGiftOriginalDetailsDrop.CONSTRUCTOR,
            StarTransactionTypeGiftSale.CONSTRUCTOR,
            StarTransactionTypeGiftUpgrade.CONSTRUCTOR,
            StarTransactionTypeGiftUpgradePurchase.CONSTRUCTOR,
            StarTransactionTypeUpgradedGiftPurchase.CONSTRUCTOR,
            StarTransactionTypeUpgradedGiftSale.CONSTRUCTOR,
            StarTransactionTypeChannelPaidReactionSend.CONSTRUCTOR,
            StarTransactionTypeChannelPaidReactionReceive.CONSTRUCTOR,
            StarTransactionTypeAffiliateProgramCommission.CONSTRUCTOR,
            StarTransactionTypePaidMessageSend.CONSTRUCTOR,
            StarTransactionTypePaidMessageReceive.CONSTRUCTOR,
            StarTransactionTypePaidGroupCallMessageSend.CONSTRUCTOR,
            StarTransactionTypePaidGroupCallMessageReceive.CONSTRUCTOR,
            StarTransactionTypePaidGroupCallReactionSend.CONSTRUCTOR,
            StarTransactionTypePaidGroupCallReactionReceive.CONSTRUCTOR,
            StarTransactionTypeSuggestedPostPaymentSend.CONSTRUCTOR,
            StarTransactionTypeSuggestedPostPaymentReceive.CONSTRUCTOR,
            StarTransactionTypePremiumPurchase.CONSTRUCTOR,
            StarTransactionTypeBusinessBotTransferSend.CONSTRUCTOR,
            StarTransactionTypeBusinessBotTransferReceive.CONSTRUCTOR,
            StarTransactionTypePublicPostSearch.CONSTRUCTOR,
            StarTransactionTypeUnsupported.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public StarTransactionType() {
        }
    }

    /**
     * The transaction is a deposit of Telegram Stars from the Premium bot; relevant for regular users only.
     */
    public static class StarTransactionTypePremiumBotDeposit extends StarTransactionType {

        /**
         * The transaction is a deposit of Telegram Stars from the Premium bot; relevant for regular users only.
         */
        public StarTransactionTypePremiumBotDeposit() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -663156466;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a deposit of Telegram Stars from App Store; relevant for regular users only.
     */
    public static class StarTransactionTypeAppStoreDeposit extends StarTransactionType {

        /**
         * The transaction is a deposit of Telegram Stars from App Store; relevant for regular users only.
         */
        public StarTransactionTypeAppStoreDeposit() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 136853825;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a deposit of Telegram Stars from Google Play; relevant for regular users only.
     */
    public static class StarTransactionTypeGooglePlayDeposit extends StarTransactionType {

        /**
         * The transaction is a deposit of Telegram Stars from Google Play; relevant for regular users only.
         */
        public StarTransactionTypeGooglePlayDeposit() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -323111338;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a deposit of Telegram Stars from Fragment; relevant for regular users and bots only.
     */
    public static class StarTransactionTypeFragmentDeposit extends StarTransactionType {

        /**
         * The transaction is a deposit of Telegram Stars from Fragment; relevant for regular users and bots only.
         */
        public StarTransactionTypeFragmentDeposit() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 123887172;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a deposit of Telegram Stars by another user; relevant for regular users only.
     */
    public static class StarTransactionTypeUserDeposit extends StarTransactionType {
        /**
         * Identifier of the user who gifted Telegram Stars; 0 if the user was anonymous.
         */
        public long userId;
        /**
         * The sticker to be shown in the transaction information; may be null if unknown.
         */
        @Nullable public Sticker sticker;

        /**
         * The transaction is a deposit of Telegram Stars by another user; relevant for regular users only.
         */
        public StarTransactionTypeUserDeposit() {
        }

        /**
         * The transaction is a deposit of Telegram Stars by another user; relevant for regular users only.
         *
         * @param userId Identifier of the user who gifted Telegram Stars; 0 if the user was anonymous.
         * @param sticker The sticker to be shown in the transaction information; may be null if unknown.
         */
        public StarTransactionTypeUserDeposit(long userId, Sticker sticker) {
            this.userId = userId;
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 204085481;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a deposit of Telegram Stars from a giveaway; relevant for regular users only.
     */
    public static class StarTransactionTypeGiveawayDeposit extends StarTransactionType {
        /**
         * Identifier of a supergroup or a channel chat that created the giveaway.
         */
        public long chatId;
        /**
         * Identifier of the message with the giveaway; may be 0 or an identifier of a deleted message.
         */
        public long giveawayMessageId;

        /**
         * The transaction is a deposit of Telegram Stars from a giveaway; relevant for regular users only.
         */
        public StarTransactionTypeGiveawayDeposit() {
        }

        /**
         * The transaction is a deposit of Telegram Stars from a giveaway; relevant for regular users only.
         *
         * @param chatId Identifier of a supergroup or a channel chat that created the giveaway.
         * @param giveawayMessageId Identifier of the message with the giveaway; may be 0 or an identifier of a deleted message.
         */
        public StarTransactionTypeGiveawayDeposit(long chatId, long giveawayMessageId) {
            this.chatId = chatId;
            this.giveawayMessageId = giveawayMessageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1318977338;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a withdrawal of earned Telegram Stars to Fragment; relevant for regular users, bots, supergroup and channel chats only.
     */
    public static class StarTransactionTypeFragmentWithdrawal extends StarTransactionType {
        /**
         * State of the withdrawal; may be null for refunds from Fragment.
         */
        @Nullable public RevenueWithdrawalState withdrawalState;

        /**
         * The transaction is a withdrawal of earned Telegram Stars to Fragment; relevant for regular users, bots, supergroup and channel chats only.
         */
        public StarTransactionTypeFragmentWithdrawal() {
        }

        /**
         * The transaction is a withdrawal of earned Telegram Stars to Fragment; relevant for regular users, bots, supergroup and channel chats only.
         *
         * @param withdrawalState State of the withdrawal; may be null for refunds from Fragment.
         */
        public StarTransactionTypeFragmentWithdrawal(RevenueWithdrawalState withdrawalState) {
            this.withdrawalState = withdrawalState;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1355142766;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a withdrawal of earned Telegram Stars to Telegram Ad platform; relevant for bots and channel chats only.
     */
    public static class StarTransactionTypeTelegramAdsWithdrawal extends StarTransactionType {

        /**
         * The transaction is a withdrawal of earned Telegram Stars to Telegram Ad platform; relevant for bots and channel chats only.
         */
        public StarTransactionTypeTelegramAdsWithdrawal() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1517386647;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a payment for Telegram API usage; relevant for bots only.
     */
    public static class StarTransactionTypeTelegramApiUsage extends StarTransactionType {
        /**
         * The number of billed requests.
         */
        public int requestCount;

        /**
         * The transaction is a payment for Telegram API usage; relevant for bots only.
         */
        public StarTransactionTypeTelegramApiUsage() {
        }

        /**
         * The transaction is a payment for Telegram API usage; relevant for bots only.
         *
         * @param requestCount The number of billed requests.
         */
        public StarTransactionTypeTelegramApiUsage(int requestCount) {
            this.requestCount = requestCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 665332478;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a purchase of paid media from a bot or a business account by the current user; relevant for regular users only.
     */
    public static class StarTransactionTypeBotPaidMediaPurchase extends StarTransactionType {
        /**
         * Identifier of the bot or the business account user who sent the paid media.
         */
        public long userId;
        /**
         * The bought media if the transaction wasn't refunded.
         */
        public PaidMedia[] media;

        /**
         * The transaction is a purchase of paid media from a bot or a business account by the current user; relevant for regular users only.
         */
        public StarTransactionTypeBotPaidMediaPurchase() {
        }

        /**
         * The transaction is a purchase of paid media from a bot or a business account by the current user; relevant for regular users only.
         *
         * @param userId Identifier of the bot or the business account user who sent the paid media.
         * @param media The bought media if the transaction wasn't refunded.
         */
        public StarTransactionTypeBotPaidMediaPurchase(long userId, PaidMedia[] media) {
            this.userId = userId;
            this.media = media;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 976645509;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a sale of paid media by the bot or a business account managed by the bot; relevant for bots only.
     */
    public static class StarTransactionTypeBotPaidMediaSale extends StarTransactionType {
        /**
         * Identifier of the user who bought the media.
         */
        public long userId;
        /**
         * The bought media.
         */
        public PaidMedia[] media;
        /**
         * Bot-provided payload.
         */
        public String payload;
        /**
         * Information about the affiliate which received commission from the transaction; may be null if none.
         */
        @Nullable public AffiliateInfo affiliate;

        /**
         * The transaction is a sale of paid media by the bot or a business account managed by the bot; relevant for bots only.
         */
        public StarTransactionTypeBotPaidMediaSale() {
        }

        /**
         * The transaction is a sale of paid media by the bot or a business account managed by the bot; relevant for bots only.
         *
         * @param userId Identifier of the user who bought the media.
         * @param media The bought media.
         * @param payload Bot-provided payload.
         * @param affiliate Information about the affiliate which received commission from the transaction; may be null if none.
         */
        public StarTransactionTypeBotPaidMediaSale(long userId, PaidMedia[] media, String payload, AffiliateInfo affiliate) {
            this.userId = userId;
            this.media = media;
            this.payload = payload;
            this.affiliate = affiliate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1034408372;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a purchase of paid media from a channel by the current user; relevant for regular users only.
     */
    public static class StarTransactionTypeChannelPaidMediaPurchase extends StarTransactionType {
        /**
         * Identifier of the channel chat that sent the paid media.
         */
        public long chatId;
        /**
         * Identifier of the corresponding message with paid media; may be 0 or an identifier of a deleted message.
         */
        public long messageId;
        /**
         * The bought media if the transaction wasn't refunded.
         */
        public PaidMedia[] media;

        /**
         * The transaction is a purchase of paid media from a channel by the current user; relevant for regular users only.
         */
        public StarTransactionTypeChannelPaidMediaPurchase() {
        }

        /**
         * The transaction is a purchase of paid media from a channel by the current user; relevant for regular users only.
         *
         * @param chatId Identifier of the channel chat that sent the paid media.
         * @param messageId Identifier of the corresponding message with paid media; may be 0 or an identifier of a deleted message.
         * @param media The bought media if the transaction wasn't refunded.
         */
        public StarTransactionTypeChannelPaidMediaPurchase(long chatId, long messageId, PaidMedia[] media) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.media = media;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1321281338;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a sale of paid media by the channel chat; relevant for channel chats only.
     */
    public static class StarTransactionTypeChannelPaidMediaSale extends StarTransactionType {
        /**
         * Identifier of the user who bought the media.
         */
        public long userId;
        /**
         * Identifier of the corresponding message with paid media; may be 0 or an identifier of a deleted message.
         */
        public long messageId;
        /**
         * The bought media.
         */
        public PaidMedia[] media;

        /**
         * The transaction is a sale of paid media by the channel chat; relevant for channel chats only.
         */
        public StarTransactionTypeChannelPaidMediaSale() {
        }

        /**
         * The transaction is a sale of paid media by the channel chat; relevant for channel chats only.
         *
         * @param userId Identifier of the user who bought the media.
         * @param messageId Identifier of the corresponding message with paid media; may be 0 or an identifier of a deleted message.
         * @param media The bought media.
         */
        public StarTransactionTypeChannelPaidMediaSale(long userId, long messageId, PaidMedia[] media) {
            this.userId = userId;
            this.messageId = messageId;
            this.media = media;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 52587085;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a purchase of a product from a bot or a business account by the current user; relevant for regular users only.
     */
    public static class StarTransactionTypeBotInvoicePurchase extends StarTransactionType {
        /**
         * Identifier of the bot or the business account user who created the invoice.
         */
        public long userId;
        /**
         * Information about the bought product.
         */
        public ProductInfo productInfo;

        /**
         * The transaction is a purchase of a product from a bot or a business account by the current user; relevant for regular users only.
         */
        public StarTransactionTypeBotInvoicePurchase() {
        }

        /**
         * The transaction is a purchase of a product from a bot or a business account by the current user; relevant for regular users only.
         *
         * @param userId Identifier of the bot or the business account user who created the invoice.
         * @param productInfo Information about the bought product.
         */
        public StarTransactionTypeBotInvoicePurchase(long userId, ProductInfo productInfo) {
            this.userId = userId;
            this.productInfo = productInfo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 501066764;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a sale of a product by the bot; relevant for bots only.
     */
    public static class StarTransactionTypeBotInvoiceSale extends StarTransactionType {
        /**
         * Identifier of the user who bought the product.
         */
        public long userId;
        /**
         * Information about the bought product.
         */
        public ProductInfo productInfo;
        /**
         * Invoice payload.
         */
        public byte[] invoicePayload;
        /**
         * Information about the affiliate which received commission from the transaction; may be null if none.
         */
        @Nullable public AffiliateInfo affiliate;

        /**
         * The transaction is a sale of a product by the bot; relevant for bots only.
         */
        public StarTransactionTypeBotInvoiceSale() {
        }

        /**
         * The transaction is a sale of a product by the bot; relevant for bots only.
         *
         * @param userId Identifier of the user who bought the product.
         * @param productInfo Information about the bought product.
         * @param invoicePayload Invoice payload.
         * @param affiliate Information about the affiliate which received commission from the transaction; may be null if none.
         */
        public StarTransactionTypeBotInvoiceSale(long userId, ProductInfo productInfo, byte[] invoicePayload, AffiliateInfo affiliate) {
            this.userId = userId;
            this.productInfo = productInfo;
            this.invoicePayload = invoicePayload;
            this.affiliate = affiliate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1534954799;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a purchase of a subscription from a bot or a business account by the current user; relevant for regular users only.
     */
    public static class StarTransactionTypeBotSubscriptionPurchase extends StarTransactionType {
        /**
         * Identifier of the bot or the business account user who created the subscription link.
         */
        public long userId;
        /**
         * The number of seconds between consecutive Telegram Star debitings.
         */
        public int subscriptionPeriod;
        /**
         * Information about the bought subscription.
         */
        public ProductInfo productInfo;

        /**
         * The transaction is a purchase of a subscription from a bot or a business account by the current user; relevant for regular users only.
         */
        public StarTransactionTypeBotSubscriptionPurchase() {
        }

        /**
         * The transaction is a purchase of a subscription from a bot or a business account by the current user; relevant for regular users only.
         *
         * @param userId Identifier of the bot or the business account user who created the subscription link.
         * @param subscriptionPeriod The number of seconds between consecutive Telegram Star debitings.
         * @param productInfo Information about the bought subscription.
         */
        public StarTransactionTypeBotSubscriptionPurchase(long userId, int subscriptionPeriod, ProductInfo productInfo) {
            this.userId = userId;
            this.subscriptionPeriod = subscriptionPeriod;
            this.productInfo = productInfo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1086264149;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a sale of a subscription by the bot; relevant for bots only.
     */
    public static class StarTransactionTypeBotSubscriptionSale extends StarTransactionType {
        /**
         * Identifier of the user who bought the subscription.
         */
        public long userId;
        /**
         * The number of seconds between consecutive Telegram Star debitings.
         */
        public int subscriptionPeriod;
        /**
         * Information about the bought subscription.
         */
        public ProductInfo productInfo;
        /**
         * Invoice payload.
         */
        public byte[] invoicePayload;
        /**
         * Information about the affiliate which received commission from the transaction; may be null if none.
         */
        @Nullable public AffiliateInfo affiliate;

        /**
         * The transaction is a sale of a subscription by the bot; relevant for bots only.
         */
        public StarTransactionTypeBotSubscriptionSale() {
        }

        /**
         * The transaction is a sale of a subscription by the bot; relevant for bots only.
         *
         * @param userId Identifier of the user who bought the subscription.
         * @param subscriptionPeriod The number of seconds between consecutive Telegram Star debitings.
         * @param productInfo Information about the bought subscription.
         * @param invoicePayload Invoice payload.
         * @param affiliate Information about the affiliate which received commission from the transaction; may be null if none.
         */
        public StarTransactionTypeBotSubscriptionSale(long userId, int subscriptionPeriod, ProductInfo productInfo, byte[] invoicePayload, AffiliateInfo affiliate) {
            this.userId = userId;
            this.subscriptionPeriod = subscriptionPeriod;
            this.productInfo = productInfo;
            this.invoicePayload = invoicePayload;
            this.affiliate = affiliate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 526936201;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a purchase of a subscription to a channel chat by the current user; relevant for regular users only.
     */
    public static class StarTransactionTypeChannelSubscriptionPurchase extends StarTransactionType {
        /**
         * Identifier of the channel chat that created the subscription.
         */
        public long chatId;
        /**
         * The number of seconds between consecutive Telegram Star debitings.
         */
        public int subscriptionPeriod;

        /**
         * The transaction is a purchase of a subscription to a channel chat by the current user; relevant for regular users only.
         */
        public StarTransactionTypeChannelSubscriptionPurchase() {
        }

        /**
         * The transaction is a purchase of a subscription to a channel chat by the current user; relevant for regular users only.
         *
         * @param chatId Identifier of the channel chat that created the subscription.
         * @param subscriptionPeriod The number of seconds between consecutive Telegram Star debitings.
         */
        public StarTransactionTypeChannelSubscriptionPurchase(long chatId, int subscriptionPeriod) {
            this.chatId = chatId;
            this.subscriptionPeriod = subscriptionPeriod;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 940487633;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a sale of a subscription by the channel chat; relevant for channel chats only.
     */
    public static class StarTransactionTypeChannelSubscriptionSale extends StarTransactionType {
        /**
         * Identifier of the user who bought the subscription.
         */
        public long userId;
        /**
         * The number of seconds between consecutive Telegram Star debitings.
         */
        public int subscriptionPeriod;

        /**
         * The transaction is a sale of a subscription by the channel chat; relevant for channel chats only.
         */
        public StarTransactionTypeChannelSubscriptionSale() {
        }

        /**
         * The transaction is a sale of a subscription by the channel chat; relevant for channel chats only.
         *
         * @param userId Identifier of the user who bought the subscription.
         * @param subscriptionPeriod The number of seconds between consecutive Telegram Star debitings.
         */
        public StarTransactionTypeChannelSubscriptionSale(long userId, int subscriptionPeriod) {
            this.userId = userId;
            this.subscriptionPeriod = subscriptionPeriod;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -32342910;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a bid on a gift auction; relevant for regular users only.
     */
    public static class StarTransactionTypeGiftAuctionBid extends StarTransactionType {
        /**
         * Identifier of the user who will receive the gift.
         */
        public MessageSender ownerId;
        /**
         * The gift.
         */
        public Gift gift;

        /**
         * The transaction is a bid on a gift auction; relevant for regular users only.
         */
        public StarTransactionTypeGiftAuctionBid() {
        }

        /**
         * The transaction is a bid on a gift auction; relevant for regular users only.
         *
         * @param ownerId Identifier of the user who will receive the gift.
         * @param gift The gift.
         */
        public StarTransactionTypeGiftAuctionBid(MessageSender ownerId, Gift gift) {
            this.ownerId = ownerId;
            this.gift = gift;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1557306224;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a purchase of a regular gift; relevant for regular users and bots only.
     */
    public static class StarTransactionTypeGiftPurchase extends StarTransactionType {
        /**
         * Identifier of the user or the channel that received the gift.
         */
        public MessageSender ownerId;
        /**
         * The gift.
         */
        public Gift gift;

        /**
         * The transaction is a purchase of a regular gift; relevant for regular users and bots only.
         */
        public StarTransactionTypeGiftPurchase() {
        }

        /**
         * The transaction is a purchase of a regular gift; relevant for regular users and bots only.
         *
         * @param ownerId Identifier of the user or the channel that received the gift.
         * @param gift The gift.
         */
        public StarTransactionTypeGiftPurchase(MessageSender ownerId, Gift gift) {
            this.ownerId = ownerId;
            this.gift = gift;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1819045664;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is an offer of gift purchase; relevant for regular users only.
     */
    public static class StarTransactionTypeGiftPurchaseOffer extends StarTransactionType {
        /**
         * The gift.
         */
        public UpgradedGift gift;

        /**
         * The transaction is an offer of gift purchase; relevant for regular users only.
         */
        public StarTransactionTypeGiftPurchaseOffer() {
        }

        /**
         * The transaction is an offer of gift purchase; relevant for regular users only.
         *
         * @param gift The gift.
         */
        public StarTransactionTypeGiftPurchaseOffer(UpgradedGift gift) {
            this.gift = gift;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1220117354;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a transfer of an upgraded gift; relevant for regular users only.
     */
    public static class StarTransactionTypeGiftTransfer extends StarTransactionType {
        /**
         * Identifier of the user or the channel that received the gift.
         */
        public MessageSender ownerId;
        /**
         * The gift.
         */
        public UpgradedGift gift;

        /**
         * The transaction is a transfer of an upgraded gift; relevant for regular users only.
         */
        public StarTransactionTypeGiftTransfer() {
        }

        /**
         * The transaction is a transfer of an upgraded gift; relevant for regular users only.
         *
         * @param ownerId Identifier of the user or the channel that received the gift.
         * @param gift The gift.
         */
        public StarTransactionTypeGiftTransfer(MessageSender ownerId, UpgradedGift gift) {
            this.ownerId = ownerId;
            this.gift = gift;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 9835767;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a drop of original details of an upgraded gift; relevant for regular users only.
     */
    public static class StarTransactionTypeGiftOriginalDetailsDrop extends StarTransactionType {
        /**
         * Identifier of the user or the channel that owns the gift.
         */
        public MessageSender ownerId;
        /**
         * The gift.
         */
        public UpgradedGift gift;

        /**
         * The transaction is a drop of original details of an upgraded gift; relevant for regular users only.
         */
        public StarTransactionTypeGiftOriginalDetailsDrop() {
        }

        /**
         * The transaction is a drop of original details of an upgraded gift; relevant for regular users only.
         *
         * @param ownerId Identifier of the user or the channel that owns the gift.
         * @param gift The gift.
         */
        public StarTransactionTypeGiftOriginalDetailsDrop(MessageSender ownerId, UpgradedGift gift) {
            this.ownerId = ownerId;
            this.gift = gift;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1676911485;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a sale of a received gift; relevant for regular users and channel chats only.
     */
    public static class StarTransactionTypeGiftSale extends StarTransactionType {
        /**
         * Identifier of the user who sent the gift.
         */
        public long userId;
        /**
         * The gift.
         */
        public Gift gift;

        /**
         * The transaction is a sale of a received gift; relevant for regular users and channel chats only.
         */
        public StarTransactionTypeGiftSale() {
        }

        /**
         * The transaction is a sale of a received gift; relevant for regular users and channel chats only.
         *
         * @param userId Identifier of the user who sent the gift.
         * @param gift The gift.
         */
        public StarTransactionTypeGiftSale(long userId, Gift gift) {
            this.userId = userId;
            this.gift = gift;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1691750743;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is an upgrade of a gift; relevant for regular users only.
     */
    public static class StarTransactionTypeGiftUpgrade extends StarTransactionType {
        /**
         * Identifier of the user who initially sent the gift.
         */
        public long userId;
        /**
         * The upgraded gift.
         */
        public UpgradedGift gift;

        /**
         * The transaction is an upgrade of a gift; relevant for regular users only.
         */
        public StarTransactionTypeGiftUpgrade() {
        }

        /**
         * The transaction is an upgrade of a gift; relevant for regular users only.
         *
         * @param userId Identifier of the user who initially sent the gift.
         * @param gift The upgraded gift.
         */
        public StarTransactionTypeGiftUpgrade(long userId, UpgradedGift gift) {
            this.userId = userId;
            this.gift = gift;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -632388839;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a purchase of an upgrade of a gift owned by another user or channel; relevant for regular users only.
     */
    public static class StarTransactionTypeGiftUpgradePurchase extends StarTransactionType {
        /**
         * Owner of the upgraded gift.
         */
        public MessageSender ownerId;
        /**
         * The gift.
         */
        public Gift gift;

        /**
         * The transaction is a purchase of an upgrade of a gift owned by another user or channel; relevant for regular users only.
         */
        public StarTransactionTypeGiftUpgradePurchase() {
        }

        /**
         * The transaction is a purchase of an upgrade of a gift owned by another user or channel; relevant for regular users only.
         *
         * @param ownerId Owner of the upgraded gift.
         * @param gift The gift.
         */
        public StarTransactionTypeGiftUpgradePurchase(MessageSender ownerId, Gift gift) {
            this.ownerId = ownerId;
            this.gift = gift;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -869970174;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a purchase of an upgraded gift for some user or channel; relevant for regular users only.
     */
    public static class StarTransactionTypeUpgradedGiftPurchase extends StarTransactionType {
        /**
         * Identifier of the user who sold the gift.
         */
        public long userId;
        /**
         * The gift.
         */
        public UpgradedGift gift;

        /**
         * The transaction is a purchase of an upgraded gift for some user or channel; relevant for regular users only.
         */
        public StarTransactionTypeUpgradedGiftPurchase() {
        }

        /**
         * The transaction is a purchase of an upgraded gift for some user or channel; relevant for regular users only.
         *
         * @param userId Identifier of the user who sold the gift.
         * @param gift The gift.
         */
        public StarTransactionTypeUpgradedGiftPurchase(long userId, UpgradedGift gift) {
            this.userId = userId;
            this.gift = gift;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -59050247;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a sale of an upgraded gift; relevant for regular users only.
     */
    public static class StarTransactionTypeUpgradedGiftSale extends StarTransactionType {
        /**
         * Identifier of the user who bought the gift.
         */
        public long userId;
        /**
         * The gift.
         */
        public UpgradedGift gift;
        /**
         * The number of Telegram Stars received by the Telegram for each 1000 Telegram Stars received by the seller of the gift.
         */
        public int commissionPerMille;
        /**
         * The Telegram Star amount that was received by Telegram; can be negative for refunds.
         */
        public StarAmount commissionStarAmount;
        /**
         * True, if the gift was sold through a purchase offer.
         */
        public boolean viaOffer;

        /**
         * The transaction is a sale of an upgraded gift; relevant for regular users only.
         */
        public StarTransactionTypeUpgradedGiftSale() {
        }

        /**
         * The transaction is a sale of an upgraded gift; relevant for regular users only.
         *
         * @param userId Identifier of the user who bought the gift.
         * @param gift The gift.
         * @param commissionPerMille The number of Telegram Stars received by the Telegram for each 1000 Telegram Stars received by the seller of the gift.
         * @param commissionStarAmount The Telegram Star amount that was received by Telegram; can be negative for refunds.
         * @param viaOffer True, if the gift was sold through a purchase offer.
         */
        public StarTransactionTypeUpgradedGiftSale(long userId, UpgradedGift gift, int commissionPerMille, StarAmount commissionStarAmount, boolean viaOffer) {
            this.userId = userId;
            this.gift = gift;
            this.commissionPerMille = commissionPerMille;
            this.commissionStarAmount = commissionStarAmount;
            this.viaOffer = viaOffer;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1004166760;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a sending of a paid reaction to a message in a channel chat by the current user; relevant for regular users only.
     */
    public static class StarTransactionTypeChannelPaidReactionSend extends StarTransactionType {
        /**
         * Identifier of the channel chat.
         */
        public long chatId;
        /**
         * Identifier of the reacted message; may be 0 or an identifier of a deleted message.
         */
        public long messageId;

        /**
         * The transaction is a sending of a paid reaction to a message in a channel chat by the current user; relevant for regular users only.
         */
        public StarTransactionTypeChannelPaidReactionSend() {
        }

        /**
         * The transaction is a sending of a paid reaction to a message in a channel chat by the current user; relevant for regular users only.
         *
         * @param chatId Identifier of the channel chat.
         * @param messageId Identifier of the reacted message; may be 0 or an identifier of a deleted message.
         */
        public StarTransactionTypeChannelPaidReactionSend(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1071224896;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a receiving of a paid reaction to a message by the channel chat; relevant for channel chats only.
     */
    public static class StarTransactionTypeChannelPaidReactionReceive extends StarTransactionType {
        /**
         * Identifier of the user who added the paid reaction.
         */
        public long userId;
        /**
         * Identifier of the reacted message; may be 0 or an identifier of a deleted message.
         */
        public long messageId;

        /**
         * The transaction is a receiving of a paid reaction to a message by the channel chat; relevant for channel chats only.
         */
        public StarTransactionTypeChannelPaidReactionReceive() {
        }

        /**
         * The transaction is a receiving of a paid reaction to a message by the channel chat; relevant for channel chats only.
         *
         * @param userId Identifier of the user who added the paid reaction.
         * @param messageId Identifier of the reacted message; may be 0 or an identifier of a deleted message.
         */
        public StarTransactionTypeChannelPaidReactionReceive(long userId, long messageId) {
            this.userId = userId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 601291243;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a receiving of a commission from an affiliate program; relevant for regular users, bots and channel chats only.
     */
    public static class StarTransactionTypeAffiliateProgramCommission extends StarTransactionType {
        /**
         * Identifier of the chat that created the affiliate program.
         */
        public long chatId;
        /**
         * The number of Telegram Stars received by the affiliate for each 1000 Telegram Stars received by the program owner.
         */
        public int commissionPerMille;

        /**
         * The transaction is a receiving of a commission from an affiliate program; relevant for regular users, bots and channel chats only.
         */
        public StarTransactionTypeAffiliateProgramCommission() {
        }

        /**
         * The transaction is a receiving of a commission from an affiliate program; relevant for regular users, bots and channel chats only.
         *
         * @param chatId Identifier of the chat that created the affiliate program.
         * @param commissionPerMille The number of Telegram Stars received by the affiliate for each 1000 Telegram Stars received by the program owner.
         */
        public StarTransactionTypeAffiliateProgramCommission(long chatId, int commissionPerMille) {
            this.chatId = chatId;
            this.commissionPerMille = commissionPerMille;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1704757901;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a sending of a paid message; relevant for regular users only.
     */
    public static class StarTransactionTypePaidMessageSend extends StarTransactionType {
        /**
         * Identifier of the chat that received the payment.
         */
        public long chatId;
        /**
         * Number of sent paid messages.
         */
        public int messageCount;

        /**
         * The transaction is a sending of a paid message; relevant for regular users only.
         */
        public StarTransactionTypePaidMessageSend() {
        }

        /**
         * The transaction is a sending of a paid message; relevant for regular users only.
         *
         * @param chatId Identifier of the chat that received the payment.
         * @param messageCount Number of sent paid messages.
         */
        public StarTransactionTypePaidMessageSend(long chatId, int messageCount) {
            this.chatId = chatId;
            this.messageCount = messageCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1709611931;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a receiving of a paid message; relevant for regular users, supergroup and channel chats only.
     */
    public static class StarTransactionTypePaidMessageReceive extends StarTransactionType {
        /**
         * Identifier of the sender of the message.
         */
        public MessageSender senderId;
        /**
         * Number of received paid messages.
         */
        public int messageCount;
        /**
         * The number of Telegram Stars received by the Telegram for each 1000 Telegram Stars paid for message sending.
         */
        public int commissionPerMille;
        /**
         * The Telegram Star amount that was received by Telegram; can be negative for refunds.
         */
        public StarAmount commissionStarAmount;

        /**
         * The transaction is a receiving of a paid message; relevant for regular users, supergroup and channel chats only.
         */
        public StarTransactionTypePaidMessageReceive() {
        }

        /**
         * The transaction is a receiving of a paid message; relevant for regular users, supergroup and channel chats only.
         *
         * @param senderId Identifier of the sender of the message.
         * @param messageCount Number of received paid messages.
         * @param commissionPerMille The number of Telegram Stars received by the Telegram for each 1000 Telegram Stars paid for message sending.
         * @param commissionStarAmount The Telegram Star amount that was received by Telegram; can be negative for refunds.
         */
        public StarTransactionTypePaidMessageReceive(MessageSender senderId, int messageCount, int commissionPerMille, StarAmount commissionStarAmount) {
            this.senderId = senderId;
            this.messageCount = messageCount;
            this.commissionPerMille = commissionPerMille;
            this.commissionStarAmount = commissionStarAmount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -676839994;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a sending of a paid group call message; relevant for regular users only.
     */
    public static class StarTransactionTypePaidGroupCallMessageSend extends StarTransactionType {
        /**
         * Identifier of the chat that received the payment.
         */
        public long chatId;

        /**
         * The transaction is a sending of a paid group call message; relevant for regular users only.
         */
        public StarTransactionTypePaidGroupCallMessageSend() {
        }

        /**
         * The transaction is a sending of a paid group call message; relevant for regular users only.
         *
         * @param chatId Identifier of the chat that received the payment.
         */
        public StarTransactionTypePaidGroupCallMessageSend(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -655578726;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a receiving of a paid group call message; relevant for regular users and channel chats only.
     */
    public static class StarTransactionTypePaidGroupCallMessageReceive extends StarTransactionType {
        /**
         * Identifier of the sender of the message.
         */
        public MessageSender senderId;
        /**
         * The number of Telegram Stars received by the Telegram for each 1000 Telegram Stars paid for message sending.
         */
        public int commissionPerMille;
        /**
         * The Telegram Star amount that was received by Telegram; can be negative for refunds.
         */
        public StarAmount commissionStarAmount;

        /**
         * The transaction is a receiving of a paid group call message; relevant for regular users and channel chats only.
         */
        public StarTransactionTypePaidGroupCallMessageReceive() {
        }

        /**
         * The transaction is a receiving of a paid group call message; relevant for regular users and channel chats only.
         *
         * @param senderId Identifier of the sender of the message.
         * @param commissionPerMille The number of Telegram Stars received by the Telegram for each 1000 Telegram Stars paid for message sending.
         * @param commissionStarAmount The Telegram Star amount that was received by Telegram; can be negative for refunds.
         */
        public StarTransactionTypePaidGroupCallMessageReceive(MessageSender senderId, int commissionPerMille, StarAmount commissionStarAmount) {
            this.senderId = senderId;
            this.commissionPerMille = commissionPerMille;
            this.commissionStarAmount = commissionStarAmount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 197238067;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a sending of a paid group reaction; relevant for regular users only.
     */
    public static class StarTransactionTypePaidGroupCallReactionSend extends StarTransactionType {
        /**
         * Identifier of the chat that received the payment.
         */
        public long chatId;

        /**
         * The transaction is a sending of a paid group reaction; relevant for regular users only.
         */
        public StarTransactionTypePaidGroupCallReactionSend() {
        }

        /**
         * The transaction is a sending of a paid group reaction; relevant for regular users only.
         *
         * @param chatId Identifier of the chat that received the payment.
         */
        public StarTransactionTypePaidGroupCallReactionSend(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1410716443;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a receiving of a paid group call reaction; relevant for regular users and channel chats only.
     */
    public static class StarTransactionTypePaidGroupCallReactionReceive extends StarTransactionType {
        /**
         * Identifier of the sender of the reaction.
         */
        public MessageSender senderId;
        /**
         * The number of Telegram Stars received by the Telegram for each 1000 Telegram Stars paid for reaction sending.
         */
        public int commissionPerMille;
        /**
         * The Telegram Star amount that was received by Telegram; can be negative for refunds.
         */
        public StarAmount commissionStarAmount;

        /**
         * The transaction is a receiving of a paid group call reaction; relevant for regular users and channel chats only.
         */
        public StarTransactionTypePaidGroupCallReactionReceive() {
        }

        /**
         * The transaction is a receiving of a paid group call reaction; relevant for regular users and channel chats only.
         *
         * @param senderId Identifier of the sender of the reaction.
         * @param commissionPerMille The number of Telegram Stars received by the Telegram for each 1000 Telegram Stars paid for reaction sending.
         * @param commissionStarAmount The Telegram Star amount that was received by Telegram; can be negative for refunds.
         */
        public StarTransactionTypePaidGroupCallReactionReceive(MessageSender senderId, int commissionPerMille, StarAmount commissionStarAmount) {
            this.senderId = senderId;
            this.commissionPerMille = commissionPerMille;
            this.commissionStarAmount = commissionStarAmount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1410001679;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a payment for a suggested post; relevant for regular users only.
     */
    public static class StarTransactionTypeSuggestedPostPaymentSend extends StarTransactionType {
        /**
         * Identifier of the channel chat that posted the post.
         */
        public long chatId;

        /**
         * The transaction is a payment for a suggested post; relevant for regular users only.
         */
        public StarTransactionTypeSuggestedPostPaymentSend() {
        }

        /**
         * The transaction is a payment for a suggested post; relevant for regular users only.
         *
         * @param chatId Identifier of the channel chat that posted the post.
         */
        public StarTransactionTypeSuggestedPostPaymentSend(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 508845173;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a receiving of a payment for a suggested post by the channel chat; relevant for channel chats only.
     */
    public static class StarTransactionTypeSuggestedPostPaymentReceive extends StarTransactionType {
        /**
         * Identifier of the user who paid for the suggested post.
         */
        public long userId;

        /**
         * The transaction is a receiving of a payment for a suggested post by the channel chat; relevant for channel chats only.
         */
        public StarTransactionTypeSuggestedPostPaymentReceive() {
        }

        /**
         * The transaction is a receiving of a payment for a suggested post by the channel chat; relevant for channel chats only.
         *
         * @param userId Identifier of the user who paid for the suggested post.
         */
        public StarTransactionTypeSuggestedPostPaymentReceive(long userId) {
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 480833401;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a purchase of Telegram Premium subscription; relevant for regular users and bots only.
     */
    public static class StarTransactionTypePremiumPurchase extends StarTransactionType {
        /**
         * Identifier of the user who received the Telegram Premium subscription.
         */
        public long userId;
        /**
         * Number of months the Telegram Premium subscription will be active.
         */
        public int monthCount;
        /**
         * A sticker to be shown in the transaction information; may be null if unknown.
         */
        @Nullable public Sticker sticker;

        /**
         * The transaction is a purchase of Telegram Premium subscription; relevant for regular users and bots only.
         */
        public StarTransactionTypePremiumPurchase() {
        }

        /**
         * The transaction is a purchase of Telegram Premium subscription; relevant for regular users and bots only.
         *
         * @param userId Identifier of the user who received the Telegram Premium subscription.
         * @param monthCount Number of months the Telegram Premium subscription will be active.
         * @param sticker A sticker to be shown in the transaction information; may be null if unknown.
         */
        public StarTransactionTypePremiumPurchase(long userId, int monthCount, Sticker sticker) {
            this.userId = userId;
            this.monthCount = monthCount;
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 998094851;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a transfer of Telegram Stars to a business bot; relevant for regular users only.
     */
    public static class StarTransactionTypeBusinessBotTransferSend extends StarTransactionType {
        /**
         * Identifier of the bot that received Telegram Stars.
         */
        public long userId;

        /**
         * The transaction is a transfer of Telegram Stars to a business bot; relevant for regular users only.
         */
        public StarTransactionTypeBusinessBotTransferSend() {
        }

        /**
         * The transaction is a transfer of Telegram Stars to a business bot; relevant for regular users only.
         *
         * @param userId Identifier of the bot that received Telegram Stars.
         */
        public StarTransactionTypeBusinessBotTransferSend(long userId) {
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1221227814;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a transfer of Telegram Stars from a business account; relevant for bots only.
     */
    public static class StarTransactionTypeBusinessBotTransferReceive extends StarTransactionType {
        /**
         * Identifier of the user who sent Telegram Stars.
         */
        public long userId;

        /**
         * The transaction is a transfer of Telegram Stars from a business account; relevant for bots only.
         */
        public StarTransactionTypeBusinessBotTransferReceive() {
        }

        /**
         * The transaction is a transfer of Telegram Stars from a business account; relevant for bots only.
         *
         * @param userId Identifier of the user who sent Telegram Stars.
         */
        public StarTransactionTypeBusinessBotTransferReceive(long userId) {
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 532496778;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a payment for search of posts in public Telegram channels; relevant for regular users only.
     */
    public static class StarTransactionTypePublicPostSearch extends StarTransactionType {

        /**
         * The transaction is a payment for search of posts in public Telegram channels; relevant for regular users only.
         */
        public StarTransactionTypePublicPostSearch() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1390533454;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a transaction of an unsupported type.
     */
    public static class StarTransactionTypeUnsupported extends StarTransactionType {

        /**
         * The transaction is a transaction of an unsupported type.
         */
        public StarTransactionTypeUnsupported() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1993329330;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of Telegram Star transactions.
     */
    public static class StarTransactions extends Object {
        /**
         * The amount of owned Telegram Stars.
         */
        public StarAmount starAmount;
        /**
         * List of transactions with Telegram Stars.
         */
        public StarTransaction[] transactions;
        /**
         * The offset for the next request. If empty, then there are no more results.
         */
        public String nextOffset;

        /**
         * Represents a list of Telegram Star transactions.
         */
        public StarTransactions() {
        }

        /**
         * Represents a list of Telegram Star transactions.
         *
         * @param starAmount The amount of owned Telegram Stars.
         * @param transactions List of transactions with Telegram Stars.
         * @param nextOffset The offset for the next request. If empty, then there are no more results.
         */
        public StarTransactions(StarAmount starAmount, StarTransaction[] transactions, String nextOffset) {
            this.starAmount = starAmount;
            this.transactions = transactions;
            this.nextOffset = nextOffset;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1218437859;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents result of starting a live story.
     */
    public abstract static class StartLiveStoryResult extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            StartLiveStoryResultOk.CONSTRUCTOR,
            StartLiveStoryResultFail.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public StartLiveStoryResult() {
        }
    }

    /**
     * The live story was successfully posted.
     */
    public static class StartLiveStoryResultOk extends StartLiveStoryResult {
        /**
         * The live story.
         */
        public Story story;

        /**
         * The live story was successfully posted.
         */
        public StartLiveStoryResultOk() {
        }

        /**
         * The live story was successfully posted.
         *
         * @param story The live story.
         */
        public StartLiveStoryResultOk(Story story) {
            this.story = story;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -387759428;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The live story failed to post with an error to be handled.
     */
    public static class StartLiveStoryResultFail extends StartLiveStoryResult {
        /**
         * Type of the error; other error types may be returned as regular errors.
         */
        public CanPostStoryResult errorType;

        /**
         * The live story failed to post with an error to be handled.
         */
        public StartLiveStoryResultFail() {
        }

        /**
         * The live story failed to post with an error to be handled.
         *
         * @param errorType Type of the error; other error types may be returned as regular errors.
         */
        public StartLiveStoryResultFail(CanPostStoryResult errorType) {
            this.errorType = errorType;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 495261112;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a statistical graph.
     */
    public abstract static class StatisticalGraph extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            StatisticalGraphData.CONSTRUCTOR,
            StatisticalGraphAsync.CONSTRUCTOR,
            StatisticalGraphError.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public StatisticalGraph() {
        }
    }

    /**
     * A graph data.
     */
    public static class StatisticalGraphData extends StatisticalGraph {
        /**
         * Graph data in JSON format.
         */
        public String jsonData;
        /**
         * If non-empty, a token which can be used to receive a zoomed in graph.
         */
        public String zoomToken;

        /**
         * A graph data.
         */
        public StatisticalGraphData() {
        }

        /**
         * A graph data.
         *
         * @param jsonData Graph data in JSON format.
         * @param zoomToken If non-empty, a token which can be used to receive a zoomed in graph.
         */
        public StatisticalGraphData(String jsonData, String zoomToken) {
            this.jsonData = jsonData;
            this.zoomToken = zoomToken;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1988940244;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The graph data to be asynchronously loaded through getStatisticalGraph.
     */
    public static class StatisticalGraphAsync extends StatisticalGraph {
        /**
         * The token to use for data loading.
         */
        public String token;

        /**
         * The graph data to be asynchronously loaded through getStatisticalGraph.
         */
        public StatisticalGraphAsync() {
        }

        /**
         * The graph data to be asynchronously loaded through getStatisticalGraph.
         *
         * @param token The token to use for data loading.
         */
        public StatisticalGraphAsync(String token) {
            this.token = token;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 435891103;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An error message to be shown to the user instead of the graph.
     */
    public static class StatisticalGraphError extends StatisticalGraph {
        /**
         * The error message.
         */
        public String errorMessage;

        /**
         * An error message to be shown to the user instead of the graph.
         */
        public StatisticalGraphError() {
        }

        /**
         * An error message to be shown to the user instead of the graph.
         *
         * @param errorMessage The error message.
         */
        public StatisticalGraphError(String errorMessage) {
            this.errorMessage = errorMessage;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1006788526;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A value with information about its recent changes.
     */
    public static class StatisticalValue extends Object {
        /**
         * The current value.
         */
        public double value;
        /**
         * The value for the previous day.
         */
        public double previousValue;
        /**
         * The growth rate of the value, as a percentage.
         */
        public double growthRatePercentage;

        /**
         * A value with information about its recent changes.
         */
        public StatisticalValue() {
        }

        /**
         * A value with information about its recent changes.
         *
         * @param value The current value.
         * @param previousValue The value for the previous day.
         * @param growthRatePercentage The growth rate of the value, as a percentage.
         */
        public StatisticalValue(double value, double previousValue, double growthRatePercentage) {
            this.value = value;
            this.previousValue = previousValue;
            this.growthRatePercentage = growthRatePercentage;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1651337846;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a sticker.
     */
    public static class Sticker extends Object {
        /**
         * Unique sticker identifier within the set; 0 if none.
         */
        public long id;
        /**
         * Identifier of the sticker set to which the sticker belongs; 0 if none.
         */
        public long setId;
        /**
         * Sticker width; as defined by the sender.
         */
        public int width;
        /**
         * Sticker height; as defined by the sender.
         */
        public int height;
        /**
         * Emoji corresponding to the sticker; may be empty if unknown.
         */
        public String emoji;
        /**
         * Sticker format.
         */
        public StickerFormat format;
        /**
         * Sticker's full type.
         */
        public StickerFullType fullType;
        /**
         * Sticker thumbnail in WEBP or JPEG format; may be null.
         */
        @Nullable public Thumbnail thumbnail;
        /**
         * File containing the sticker.
         */
        public File sticker;

        /**
         * Describes a sticker.
         */
        public Sticker() {
        }

        /**
         * Describes a sticker.
         *
         * @param id Unique sticker identifier within the set; 0 if none.
         * @param setId Identifier of the sticker set to which the sticker belongs; 0 if none.
         * @param width Sticker width; as defined by the sender.
         * @param height Sticker height; as defined by the sender.
         * @param emoji Emoji corresponding to the sticker; may be empty if unknown.
         * @param format Sticker format.
         * @param fullType Sticker's full type.
         * @param thumbnail Sticker thumbnail in WEBP or JPEG format; may be null.
         * @param sticker File containing the sticker.
         */
        public Sticker(long id, long setId, int width, int height, String emoji, StickerFormat format, StickerFullType fullType, Thumbnail thumbnail, File sticker) {
            this.id = id;
            this.setId = setId;
            this.width = width;
            this.height = height;
            this.emoji = emoji;
            this.format = format;
            this.fullType = fullType;
            this.thumbnail = thumbnail;
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -647013057;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes format of a sticker.
     */
    public abstract static class StickerFormat extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            StickerFormatWebp.CONSTRUCTOR,
            StickerFormatTgs.CONSTRUCTOR,
            StickerFormatWebm.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public StickerFormat() {
        }
    }

    /**
     * The sticker is an image in WEBP format.
     */
    public static class StickerFormatWebp extends StickerFormat {

        /**
         * The sticker is an image in WEBP format.
         */
        public StickerFormatWebp() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2123043040;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The sticker is an animation in TGS format.
     */
    public static class StickerFormatTgs extends StickerFormat {

        /**
         * The sticker is an animation in TGS format.
         */
        public StickerFormatTgs() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1614588662;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The sticker is a video in WEBM format.
     */
    public static class StickerFormatWebm extends StickerFormat {

        /**
         * The sticker is a video in WEBM format.
         */
        public StickerFormatWebm() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2070162097;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains full information about sticker type.
     */
    public abstract static class StickerFullType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            StickerFullTypeRegular.CONSTRUCTOR,
            StickerFullTypeMask.CONSTRUCTOR,
            StickerFullTypeCustomEmoji.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public StickerFullType() {
        }
    }

    /**
     * The sticker is a regular sticker.
     */
    public static class StickerFullTypeRegular extends StickerFullType {
        /**
         * Premium animation of the sticker; may be null. If present, only Telegram Premium users can use the sticker.
         */
        @Nullable public File premiumAnimation;

        /**
         * The sticker is a regular sticker.
         */
        public StickerFullTypeRegular() {
        }

        /**
         * The sticker is a regular sticker.
         *
         * @param premiumAnimation Premium animation of the sticker; may be null. If present, only Telegram Premium users can use the sticker.
         */
        public StickerFullTypeRegular(File premiumAnimation) {
            this.premiumAnimation = premiumAnimation;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2006425865;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The sticker is a mask in WEBP format to be placed on photos or videos.
     */
    public static class StickerFullTypeMask extends StickerFullType {
        /**
         * Position where the mask is placed; may be null.
         */
        @Nullable public MaskPosition maskPosition;

        /**
         * The sticker is a mask in WEBP format to be placed on photos or videos.
         */
        public StickerFullTypeMask() {
        }

        /**
         * The sticker is a mask in WEBP format to be placed on photos or videos.
         *
         * @param maskPosition Position where the mask is placed; may be null.
         */
        public StickerFullTypeMask(MaskPosition maskPosition) {
            this.maskPosition = maskPosition;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 652197687;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The sticker is a custom emoji to be used inside message text and caption. Currently, only Telegram Premium users can use custom emoji.
     */
    public static class StickerFullTypeCustomEmoji extends StickerFullType {
        /**
         * Identifier of the custom emoji.
         */
        public long customEmojiId;
        /**
         * True, if the sticker must be repainted to a text color in messages, the color of the Telegram Premium badge in emoji status, white color on chat photos, or another appropriate color in other places.
         */
        public boolean needsRepainting;

        /**
         * The sticker is a custom emoji to be used inside message text and caption. Currently, only Telegram Premium users can use custom emoji.
         */
        public StickerFullTypeCustomEmoji() {
        }

        /**
         * The sticker is a custom emoji to be used inside message text and caption. Currently, only Telegram Premium users can use custom emoji.
         *
         * @param customEmojiId Identifier of the custom emoji.
         * @param needsRepainting True, if the sticker must be repainted to a text color in messages, the color of the Telegram Premium badge in emoji status, white color on chat photos, or another appropriate color in other places.
         */
        public StickerFullTypeCustomEmoji(long customEmojiId, boolean needsRepainting) {
            this.customEmojiId = customEmojiId;
            this.needsRepainting = needsRepainting;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1015085653;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a sticker set.
     */
    public static class StickerSet extends Object {
        /**
         * Identifier of the sticker set.
         */
        public long id;
        /**
         * Title of the sticker set.
         */
        public String title;
        /**
         * Name of the sticker set.
         */
        public String name;
        /**
         * Sticker set thumbnail in WEBP, TGS, or WEBM format with width and height 100; may be null. The file can be downloaded only before the thumbnail is changed.
         */
        @Nullable public Thumbnail thumbnail;
        /**
         * Sticker set thumbnail's outline; may be null if unknown.
         */
        @Nullable public Outline thumbnailOutline;
        /**
         * True, if the sticker set is owned by the current user.
         */
        public boolean isOwned;
        /**
         * True, if the sticker set has been installed by the current user.
         */
        public boolean isInstalled;
        /**
         * True, if the sticker set has been archived. A sticker set can't be installed and archived simultaneously.
         */
        public boolean isArchived;
        /**
         * True, if the sticker set is official.
         */
        public boolean isOfficial;
        /**
         * Type of the stickers in the set.
         */
        public StickerType stickerType;
        /**
         * True, if stickers in the sticker set are custom emoji that must be repainted; for custom emoji sticker sets only.
         */
        public boolean needsRepainting;
        /**
         * True, if stickers in the sticker set are custom emoji that can be used as chat emoji status; for custom emoji sticker sets only.
         */
        public boolean isAllowedAsChatEmojiStatus;
        /**
         * True for already viewed trending sticker sets.
         */
        public boolean isViewed;
        /**
         * List of stickers in this set.
         */
        public Sticker[] stickers;
        /**
         * A list of emojis corresponding to the stickers in the same order. The list is only for informational purposes, because a sticker is always sent with a fixed emoji from the corresponding Sticker object.
         */
        public Emojis[] emojis;

        /**
         * Represents a sticker set.
         */
        public StickerSet() {
        }

        /**
         * Represents a sticker set.
         *
         * @param id Identifier of the sticker set.
         * @param title Title of the sticker set.
         * @param name Name of the sticker set.
         * @param thumbnail Sticker set thumbnail in WEBP, TGS, or WEBM format with width and height 100; may be null. The file can be downloaded only before the thumbnail is changed.
         * @param thumbnailOutline Sticker set thumbnail's outline; may be null if unknown.
         * @param isOwned True, if the sticker set is owned by the current user.
         * @param isInstalled True, if the sticker set has been installed by the current user.
         * @param isArchived True, if the sticker set has been archived. A sticker set can't be installed and archived simultaneously.
         * @param isOfficial True, if the sticker set is official.
         * @param stickerType Type of the stickers in the set.
         * @param needsRepainting True, if stickers in the sticker set are custom emoji that must be repainted; for custom emoji sticker sets only.
         * @param isAllowedAsChatEmojiStatus True, if stickers in the sticker set are custom emoji that can be used as chat emoji status; for custom emoji sticker sets only.
         * @param isViewed True for already viewed trending sticker sets.
         * @param stickers List of stickers in this set.
         * @param emojis A list of emojis corresponding to the stickers in the same order. The list is only for informational purposes, because a sticker is always sent with a fixed emoji from the corresponding Sticker object.
         */
        public StickerSet(long id, String title, String name, Thumbnail thumbnail, Outline thumbnailOutline, boolean isOwned, boolean isInstalled, boolean isArchived, boolean isOfficial, StickerType stickerType, boolean needsRepainting, boolean isAllowedAsChatEmojiStatus, boolean isViewed, Sticker[] stickers, Emojis[] emojis) {
            this.id = id;
            this.title = title;
            this.name = name;
            this.thumbnail = thumbnail;
            this.thumbnailOutline = thumbnailOutline;
            this.isOwned = isOwned;
            this.isInstalled = isInstalled;
            this.isArchived = isArchived;
            this.isOfficial = isOfficial;
            this.stickerType = stickerType;
            this.needsRepainting = needsRepainting;
            this.isAllowedAsChatEmojiStatus = isAllowedAsChatEmojiStatus;
            this.isViewed = isViewed;
            this.stickers = stickers;
            this.emojis = emojis;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1783150210;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents short information about a sticker set.
     */
    public static class StickerSetInfo extends Object {
        /**
         * Identifier of the sticker set.
         */
        public long id;
        /**
         * Title of the sticker set.
         */
        public String title;
        /**
         * Name of the sticker set.
         */
        public String name;
        /**
         * Sticker set thumbnail in WEBP, TGS, or WEBM format with width and height 100; may be null. The file can be downloaded only before the thumbnail is changed.
         */
        @Nullable public Thumbnail thumbnail;
        /**
         * Sticker set thumbnail's outline; may be null if unknown.
         */
        @Nullable public Outline thumbnailOutline;
        /**
         * True, if the sticker set is owned by the current user.
         */
        public boolean isOwned;
        /**
         * True, if the sticker set has been installed by the current user.
         */
        public boolean isInstalled;
        /**
         * True, if the sticker set has been archived. A sticker set can't be installed and archived simultaneously.
         */
        public boolean isArchived;
        /**
         * True, if the sticker set is official.
         */
        public boolean isOfficial;
        /**
         * Type of the stickers in the set.
         */
        public StickerType stickerType;
        /**
         * True, if stickers in the sticker set are custom emoji that must be repainted; for custom emoji sticker sets only.
         */
        public boolean needsRepainting;
        /**
         * True, if stickers in the sticker set are custom emoji that can be used as chat emoji status; for custom emoji sticker sets only.
         */
        public boolean isAllowedAsChatEmojiStatus;
        /**
         * True for already viewed trending sticker sets.
         */
        public boolean isViewed;
        /**
         * Total number of stickers in the set.
         */
        public int size;
        /**
         * Up to the first 5 stickers from the set, depending on the context. If the application needs more stickers the full sticker set needs to be requested.
         */
        public Sticker[] covers;

        /**
         * Represents short information about a sticker set.
         */
        public StickerSetInfo() {
        }

        /**
         * Represents short information about a sticker set.
         *
         * @param id Identifier of the sticker set.
         * @param title Title of the sticker set.
         * @param name Name of the sticker set.
         * @param thumbnail Sticker set thumbnail in WEBP, TGS, or WEBM format with width and height 100; may be null. The file can be downloaded only before the thumbnail is changed.
         * @param thumbnailOutline Sticker set thumbnail's outline; may be null if unknown.
         * @param isOwned True, if the sticker set is owned by the current user.
         * @param isInstalled True, if the sticker set has been installed by the current user.
         * @param isArchived True, if the sticker set has been archived. A sticker set can't be installed and archived simultaneously.
         * @param isOfficial True, if the sticker set is official.
         * @param stickerType Type of the stickers in the set.
         * @param needsRepainting True, if stickers in the sticker set are custom emoji that must be repainted; for custom emoji sticker sets only.
         * @param isAllowedAsChatEmojiStatus True, if stickers in the sticker set are custom emoji that can be used as chat emoji status; for custom emoji sticker sets only.
         * @param isViewed True for already viewed trending sticker sets.
         * @param size Total number of stickers in the set.
         * @param covers Up to the first 5 stickers from the set, depending on the context. If the application needs more stickers the full sticker set needs to be requested.
         */
        public StickerSetInfo(long id, String title, String name, Thumbnail thumbnail, Outline thumbnailOutline, boolean isOwned, boolean isInstalled, boolean isArchived, boolean isOfficial, StickerType stickerType, boolean needsRepainting, boolean isAllowedAsChatEmojiStatus, boolean isViewed, int size, Sticker[] covers) {
            this.id = id;
            this.title = title;
            this.name = name;
            this.thumbnail = thumbnail;
            this.thumbnailOutline = thumbnailOutline;
            this.isOwned = isOwned;
            this.isInstalled = isInstalled;
            this.isArchived = isArchived;
            this.isOfficial = isOfficial;
            this.stickerType = stickerType;
            this.needsRepainting = needsRepainting;
            this.isAllowedAsChatEmojiStatus = isAllowedAsChatEmojiStatus;
            this.isViewed = isViewed;
            this.size = size;
            this.covers = covers;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1649074729;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of sticker sets.
     */
    public static class StickerSets extends Object {
        /**
         * Approximate total number of sticker sets found.
         */
        public int totalCount;
        /**
         * List of sticker sets.
         */
        public StickerSetInfo[] sets;

        /**
         * Represents a list of sticker sets.
         */
        public StickerSets() {
        }

        /**
         * Represents a list of sticker sets.
         *
         * @param totalCount Approximate total number of sticker sets found.
         * @param sets List of sticker sets.
         */
        public StickerSets(int totalCount, StickerSetInfo[] sets) {
            this.totalCount = totalCount;
            this.sets = sets;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1883828812;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes type of sticker.
     */
    public abstract static class StickerType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            StickerTypeRegular.CONSTRUCTOR,
            StickerTypeMask.CONSTRUCTOR,
            StickerTypeCustomEmoji.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public StickerType() {
        }
    }

    /**
     * The sticker is a regular sticker.
     */
    public static class StickerTypeRegular extends StickerType {

        /**
         * The sticker is a regular sticker.
         */
        public StickerTypeRegular() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 56345973;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The sticker is a mask in WEBP format to be placed on photos or videos.
     */
    public static class StickerTypeMask extends StickerType {

        /**
         * The sticker is a mask in WEBP format to be placed on photos or videos.
         */
        public StickerTypeMask() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1765394796;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The sticker is a custom emoji to be used inside message text and caption.
     */
    public static class StickerTypeCustomEmoji extends StickerType {

        /**
         * The sticker is a custom emoji to be used inside message text and caption.
         */
        public StickerTypeCustomEmoji() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -120752249;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of stickers.
     */
    public static class Stickers extends Object {
        /**
         * List of stickers.
         */
        public Sticker[] stickers;

        /**
         * Represents a list of stickers.
         */
        public Stickers() {
        }

        /**
         * Represents a list of stickers.
         *
         * @param stickers List of stickers.
         */
        public Stickers(Sticker[] stickers) {
            this.stickers = stickers;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1974859260;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains the exact storage usage statistics split by chats and file type.
     */
    public static class StorageStatistics extends Object {
        /**
         * Total size of files, in bytes.
         */
        public long size;
        /**
         * Total number of files.
         */
        public int count;
        /**
         * Statistics split by chats.
         */
        public StorageStatisticsByChat[] byChat;

        /**
         * Contains the exact storage usage statistics split by chats and file type.
         */
        public StorageStatistics() {
        }

        /**
         * Contains the exact storage usage statistics split by chats and file type.
         *
         * @param size Total size of files, in bytes.
         * @param count Total number of files.
         * @param byChat Statistics split by chats.
         */
        public StorageStatistics(long size, int count, StorageStatisticsByChat[] byChat) {
            this.size = size;
            this.count = count;
            this.byChat = byChat;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 217237013;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains the storage usage statistics for a specific chat.
     */
    public static class StorageStatisticsByChat extends Object {
        /**
         * Chat identifier; 0 if none.
         */
        public long chatId;
        /**
         * Total size of the files in the chat, in bytes.
         */
        public long size;
        /**
         * Total number of files in the chat.
         */
        public int count;
        /**
         * Statistics split by file types.
         */
        public StorageStatisticsByFileType[] byFileType;

        /**
         * Contains the storage usage statistics for a specific chat.
         */
        public StorageStatisticsByChat() {
        }

        /**
         * Contains the storage usage statistics for a specific chat.
         *
         * @param chatId Chat identifier; 0 if none.
         * @param size Total size of the files in the chat, in bytes.
         * @param count Total number of files in the chat.
         * @param byFileType Statistics split by file types.
         */
        public StorageStatisticsByChat(long chatId, long size, int count, StorageStatisticsByFileType[] byFileType) {
            this.chatId = chatId;
            this.size = size;
            this.count = count;
            this.byFileType = byFileType;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 635434531;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains the storage usage statistics for a specific file type.
     */
    public static class StorageStatisticsByFileType extends Object {
        /**
         * File type.
         */
        public FileType fileType;
        /**
         * Total size of the files, in bytes.
         */
        public long size;
        /**
         * Total number of files.
         */
        public int count;

        /**
         * Contains the storage usage statistics for a specific file type.
         */
        public StorageStatisticsByFileType() {
        }

        /**
         * Contains the storage usage statistics for a specific file type.
         *
         * @param fileType File type.
         * @param size Total size of the files, in bytes.
         * @param count Total number of files.
         */
        public StorageStatisticsByFileType(FileType fileType, long size, int count) {
            this.fileType = fileType;
            this.size = size;
            this.count = count;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 714012840;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains approximate storage usage statistics, excluding files of unknown file type.
     */
    public static class StorageStatisticsFast extends Object {
        /**
         * Approximate total size of files, in bytes.
         */
        public long filesSize;
        /**
         * Approximate number of files.
         */
        public int fileCount;
        /**
         * Size of the database.
         */
        public long databaseSize;
        /**
         * Size of the language pack database.
         */
        public long languagePackDatabaseSize;
        /**
         * Size of the TDLib internal log.
         */
        public long logSize;

        /**
         * Contains approximate storage usage statistics, excluding files of unknown file type.
         */
        public StorageStatisticsFast() {
        }

        /**
         * Contains approximate storage usage statistics, excluding files of unknown file type.
         *
         * @param filesSize Approximate total size of files, in bytes.
         * @param fileCount Approximate number of files.
         * @param databaseSize Size of the database.
         * @param languagePackDatabaseSize Size of the language pack database.
         * @param logSize Size of the TDLib internal log.
         */
        public StorageStatisticsFast(long filesSize, int fileCount, long databaseSize, long languagePackDatabaseSize, long logSize) {
            this.filesSize = filesSize;
            this.fileCount = fileCount;
            this.databaseSize = databaseSize;
            this.languagePackDatabaseSize = languagePackDatabaseSize;
            this.logSize = logSize;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -884922271;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a purpose of an in-store payment.
     */
    public abstract static class StorePaymentPurpose extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            StorePaymentPurposePremiumSubscription.CONSTRUCTOR,
            StorePaymentPurposePremiumGift.CONSTRUCTOR,
            StorePaymentPurposePremiumGiftCodes.CONSTRUCTOR,
            StorePaymentPurposePremiumGiveaway.CONSTRUCTOR,
            StorePaymentPurposeStarGiveaway.CONSTRUCTOR,
            StorePaymentPurposeStars.CONSTRUCTOR,
            StorePaymentPurposeGiftedStars.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public StorePaymentPurpose() {
        }
    }

    /**
     * The user subscribing to Telegram Premium.
     */
    public static class StorePaymentPurposePremiumSubscription extends StorePaymentPurpose {
        /**
         * Pass true if this is a restore of a Telegram Premium purchase; only for App Store.
         */
        public boolean isRestore;
        /**
         * Pass true if this is an upgrade from a monthly subscription to early subscription; only for App Store.
         */
        public boolean isUpgrade;

        /**
         * The user subscribing to Telegram Premium.
         */
        public StorePaymentPurposePremiumSubscription() {
        }

        /**
         * The user subscribing to Telegram Premium.
         *
         * @param isRestore Pass true if this is a restore of a Telegram Premium purchase; only for App Store.
         * @param isUpgrade Pass true if this is an upgrade from a monthly subscription to early subscription; only for App Store.
         */
        public StorePaymentPurposePremiumSubscription(boolean isRestore, boolean isUpgrade) {
            this.isRestore = isRestore;
            this.isUpgrade = isUpgrade;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1263894804;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user gifting Telegram Premium to another user.
     */
    public static class StorePaymentPurposePremiumGift extends StorePaymentPurpose {
        /**
         * ISO 4217 currency code of the payment currency.
         */
        public String currency;
        /**
         * Paid amount, in the smallest units of the currency.
         */
        public long amount;
        /**
         * Identifiers of the user which will receive Telegram Premium.
         */
        public long userId;
        /**
         * Text to show along with the gift codes; 0-getOption(&quot;gift_text_length_max&quot;) characters. Only Bold, Italic, Underline, Strikethrough, Spoiler, CustomEmoji, and DateTime entities are allowed.
         */
        public FormattedText text;

        /**
         * The user gifting Telegram Premium to another user.
         */
        public StorePaymentPurposePremiumGift() {
        }

        /**
         * The user gifting Telegram Premium to another user.
         *
         * @param currency ISO 4217 currency code of the payment currency.
         * @param amount Paid amount, in the smallest units of the currency.
         * @param userId Identifiers of the user which will receive Telegram Premium.
         * @param text Text to show along with the gift codes; 0-getOption(&quot;gift_text_length_max&quot;) characters. Only Bold, Italic, Underline, Strikethrough, Spoiler, CustomEmoji, and DateTime entities are allowed.
         */
        public StorePaymentPurposePremiumGift(String currency, long amount, long userId, FormattedText text) {
            this.currency = currency;
            this.amount = amount;
            this.userId = userId;
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -39502443;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user boosting a chat by creating Telegram Premium gift codes for other users.
     */
    public static class StorePaymentPurposePremiumGiftCodes extends StorePaymentPurpose {
        /**
         * Identifier of the supergroup or channel chat, which will be automatically boosted by the users for duration of the Premium subscription and which is administered by the user.
         */
        public long boostedChatId;
        /**
         * ISO 4217 currency code of the payment currency.
         */
        public String currency;
        /**
         * Paid amount, in the smallest units of the currency.
         */
        public long amount;
        /**
         * Identifiers of the users which can activate the gift codes.
         */
        public long[] userIds;
        /**
         * Text to show along with the gift codes; 0-getOption(&quot;gift_text_length_max&quot;) characters. Only Bold, Italic, Underline, Strikethrough, Spoiler, CustomEmoji, and DateTime entities are allowed.
         */
        public FormattedText text;

        /**
         * The user boosting a chat by creating Telegram Premium gift codes for other users.
         */
        public StorePaymentPurposePremiumGiftCodes() {
        }

        /**
         * The user boosting a chat by creating Telegram Premium gift codes for other users.
         *
         * @param boostedChatId Identifier of the supergroup or channel chat, which will be automatically boosted by the users for duration of the Premium subscription and which is administered by the user.
         * @param currency ISO 4217 currency code of the payment currency.
         * @param amount Paid amount, in the smallest units of the currency.
         * @param userIds Identifiers of the users which can activate the gift codes.
         * @param text Text to show along with the gift codes; 0-getOption(&quot;gift_text_length_max&quot;) characters. Only Bold, Italic, Underline, Strikethrough, Spoiler, CustomEmoji, and DateTime entities are allowed.
         */
        public StorePaymentPurposePremiumGiftCodes(long boostedChatId, String currency, long amount, long[] userIds, FormattedText text) {
            this.boostedChatId = boostedChatId;
            this.currency = currency;
            this.amount = amount;
            this.userIds = userIds;
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1072286736;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user creating a Telegram Premium giveaway.
     */
    public static class StorePaymentPurposePremiumGiveaway extends StorePaymentPurpose {
        /**
         * Giveaway parameters.
         */
        public GiveawayParameters parameters;
        /**
         * ISO 4217 currency code of the payment currency.
         */
        public String currency;
        /**
         * Paid amount, in the smallest units of the currency.
         */
        public long amount;

        /**
         * The user creating a Telegram Premium giveaway.
         */
        public StorePaymentPurposePremiumGiveaway() {
        }

        /**
         * The user creating a Telegram Premium giveaway.
         *
         * @param parameters Giveaway parameters.
         * @param currency ISO 4217 currency code of the payment currency.
         * @param amount Paid amount, in the smallest units of the currency.
         */
        public StorePaymentPurposePremiumGiveaway(GiveawayParameters parameters, String currency, long amount) {
            this.parameters = parameters;
            this.currency = currency;
            this.amount = amount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1302624938;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user creating a Telegram Star giveaway.
     */
    public static class StorePaymentPurposeStarGiveaway extends StorePaymentPurpose {
        /**
         * Giveaway parameters.
         */
        public GiveawayParameters parameters;
        /**
         * ISO 4217 currency code of the payment currency.
         */
        public String currency;
        /**
         * Paid amount, in the smallest units of the currency.
         */
        public long amount;
        /**
         * The number of users to receive Telegram Stars.
         */
        public int winnerCount;
        /**
         * The number of Telegram Stars to be distributed through the giveaway.
         */
        public long starCount;

        /**
         * The user creating a Telegram Star giveaway.
         */
        public StorePaymentPurposeStarGiveaway() {
        }

        /**
         * The user creating a Telegram Star giveaway.
         *
         * @param parameters Giveaway parameters.
         * @param currency ISO 4217 currency code of the payment currency.
         * @param amount Paid amount, in the smallest units of the currency.
         * @param winnerCount The number of users to receive Telegram Stars.
         * @param starCount The number of Telegram Stars to be distributed through the giveaway.
         */
        public StorePaymentPurposeStarGiveaway(GiveawayParameters parameters, String currency, long amount, int winnerCount, long starCount) {
            this.parameters = parameters;
            this.currency = currency;
            this.amount = amount;
            this.winnerCount = winnerCount;
            this.starCount = starCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 211212441;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user buying Telegram Stars.
     */
    public static class StorePaymentPurposeStars extends StorePaymentPurpose {
        /**
         * ISO 4217 currency code of the payment currency.
         */
        public String currency;
        /**
         * Paid amount, in the smallest units of the currency.
         */
        public long amount;
        /**
         * Number of bought Telegram Stars.
         */
        public long starCount;
        /**
         * Identifier of the chat that is supposed to receive the Telegram Stars; pass 0 if none.
         */
        public long chatId;

        /**
         * The user buying Telegram Stars.
         */
        public StorePaymentPurposeStars() {
        }

        /**
         * The user buying Telegram Stars.
         *
         * @param currency ISO 4217 currency code of the payment currency.
         * @param amount Paid amount, in the smallest units of the currency.
         * @param starCount Number of bought Telegram Stars.
         * @param chatId Identifier of the chat that is supposed to receive the Telegram Stars; pass 0 if none.
         */
        public StorePaymentPurposeStars(String currency, long amount, long starCount, long chatId) {
            this.currency = currency;
            this.amount = amount;
            this.starCount = starCount;
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 410189263;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user buying Telegram Stars for other users.
     */
    public static class StorePaymentPurposeGiftedStars extends StorePaymentPurpose {
        /**
         * Identifier of the user to which Telegram Stars are gifted.
         */
        public long userId;
        /**
         * ISO 4217 currency code of the payment currency.
         */
        public String currency;
        /**
         * Paid amount, in the smallest units of the currency.
         */
        public long amount;
        /**
         * Number of bought Telegram Stars.
         */
        public long starCount;

        /**
         * The user buying Telegram Stars for other users.
         */
        public StorePaymentPurposeGiftedStars() {
        }

        /**
         * The user buying Telegram Stars for other users.
         *
         * @param userId Identifier of the user to which Telegram Stars are gifted.
         * @param currency ISO 4217 currency code of the payment currency.
         * @param amount Paid amount, in the smallest units of the currency.
         * @param starCount Number of bought Telegram Stars.
         */
        public StorePaymentPurposeGiftedStars(long userId, String currency, long amount, long starCount) {
            this.userId = userId;
            this.currency = currency;
            this.amount = amount;
            this.starCount = starCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 893691428;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes an in-store transaction.
     */
    public abstract static class StoreTransaction extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            StoreTransactionAppStore.CONSTRUCTOR,
            StoreTransactionGooglePlay.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public StoreTransaction() {
        }
    }

    /**
     * A purchase through App Store.
     */
    public static class StoreTransactionAppStore extends StoreTransaction {
        /**
         * App Store receipt.
         */
        public byte[] receipt;

        /**
         * A purchase through App Store.
         */
        public StoreTransactionAppStore() {
        }

        /**
         * A purchase through App Store.
         *
         * @param receipt App Store receipt.
         */
        public StoreTransactionAppStore(byte[] receipt) {
            this.receipt = receipt;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1625562441;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A purchase through Google Play.
     */
    public static class StoreTransactionGooglePlay extends StoreTransaction {
        /**
         * Application package name.
         */
        public String packageName;
        /**
         * Identifier of the purchased store product.
         */
        public String storeProductId;
        /**
         * Google Play purchase token.
         */
        public String purchaseToken;

        /**
         * A purchase through Google Play.
         */
        public StoreTransactionGooglePlay() {
        }

        /**
         * A purchase through Google Play.
         *
         * @param packageName Application package name.
         * @param storeProductId Identifier of the purchased store product.
         * @param purchaseToken Google Play purchase token.
         */
        public StoreTransactionGooglePlay(String packageName, String storeProductId, String purchaseToken) {
            this.packageName = packageName;
            this.storeProductId = storeProductId;
            this.purchaseToken = purchaseToken;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1094018617;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of stories.
     */
    public static class Stories extends Object {
        /**
         * Approximate total number of stories found.
         */
        public int totalCount;
        /**
         * The list of stories.
         */
        public Story[] stories;
        /**
         * Identifiers of the pinned stories; returned only in getChatPostedToChatPageStories with fromStoryId == 0.
         */
        public int[] pinnedStoryIds;

        /**
         * Represents a list of stories.
         */
        public Stories() {
        }

        /**
         * Represents a list of stories.
         *
         * @param totalCount Approximate total number of stories found.
         * @param stories The list of stories.
         * @param pinnedStoryIds Identifiers of the pinned stories; returned only in getChatPostedToChatPageStories with fromStoryId == 0.
         */
        public Stories(int totalCount, Story[] stories, int[] pinnedStoryIds) {
            this.totalCount = totalCount;
            this.stories = stories;
            this.pinnedStoryIds = pinnedStoryIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 670157595;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a story.
     */
    public static class Story extends Object {
        /**
         * Unique story identifier among stories posted by the given chat.
         */
        public int id;
        /**
         * Identifier of the chat that posted the story.
         */
        public long posterChatId;
        /**
         * Identifier of the user or chat that posted the story; may be null if the story is posted on behalf of the posterChatId.
         */
        @Nullable public MessageSender posterId;
        /**
         * Point in time (Unix timestamp) when the story was published.
         */
        public int date;
        /**
         * True, if the story is being posted by the current user.
         */
        public boolean isBeingPosted;
        /**
         * True, if the story is being edited by the current user.
         */
        public boolean isBeingEdited;
        /**
         * True, if the story was edited.
         */
        public boolean isEdited;
        /**
         * True, if the story is saved in the profile of the chat that posted it and will be available there after expiration.
         */
        public boolean isPostedToChatPage;
        /**
         * True, if the story is visible only for the current user.
         */
        public boolean isVisibleOnlyForSelf;
        /**
         * True, if the story can be added to an album using createStoryAlbum and addStoryAlbumStories.
         */
        public boolean canBeAddedToAlbum;
        /**
         * True, if the story can be deleted.
         */
        public boolean canBeDeleted;
        /**
         * True, if the story can be edited.
         */
        public boolean canBeEdited;
        /**
         * True, if the story can be forwarded as a message or reposted as a story. Otherwise, screenshotting and saving of the story content must be also forbidden.
         */
        public boolean canBeForwarded;
        /**
         * True, if the story can be replied in the chat with the user who posted the story.
         */
        public boolean canBeReplied;
        /**
         * True, if the story privacy settings can be changed.
         */
        public boolean canSetPrivacySettings;
        /**
         * True, if the story's isPostedToChatPage value can be changed.
         */
        public boolean canToggleIsPostedToChatPage;
        /**
         * True, if the story statistics are available through getStoryStatistics.
         */
        public boolean canGetStatistics;
        /**
         * True, if interactions with the story can be received through getStoryInteractions.
         */
        public boolean canGetInteractions;
        /**
         * True, if users viewed the story can't be received, because the story has expired more than getOption(&quot;story_viewers_expiration_delay&quot;) seconds ago.
         */
        public boolean hasExpiredViewers;
        /**
         * Information about the original story; may be null if the story wasn't reposted.
         */
        @Nullable public StoryRepostInfo repostInfo;
        /**
         * Information about interactions with the story; may be null if the story isn't owned or there were no interactions.
         */
        @Nullable public StoryInteractionInfo interactionInfo;
        /**
         * Type of the chosen reaction; may be null if none.
         */
        @Nullable public ReactionType chosenReactionType;
        /**
         * Privacy rules affecting story visibility; may be approximate for non-owned stories.
         */
        public StoryPrivacySettings privacySettings;
        /**
         * Content of the story.
         */
        public StoryContent content;
        /**
         * Clickable areas to be shown on the story content.
         */
        public StoryArea[] areas;
        /**
         * Caption of the story.
         */
        public FormattedText caption;
        /**
         * Identifiers of story albums to which the story is added; only for manageable stories.
         */
        public int[] albumIds;

        /**
         * Represents a story.
         */
        public Story() {
        }

        /**
         * Represents a story.
         *
         * @param id Unique story identifier among stories posted by the given chat.
         * @param posterChatId Identifier of the chat that posted the story.
         * @param posterId Identifier of the user or chat that posted the story; may be null if the story is posted on behalf of the posterChatId.
         * @param date Point in time (Unix timestamp) when the story was published.
         * @param isBeingPosted True, if the story is being posted by the current user.
         * @param isBeingEdited True, if the story is being edited by the current user.
         * @param isEdited True, if the story was edited.
         * @param isPostedToChatPage True, if the story is saved in the profile of the chat that posted it and will be available there after expiration.
         * @param isVisibleOnlyForSelf True, if the story is visible only for the current user.
         * @param canBeAddedToAlbum True, if the story can be added to an album using createStoryAlbum and addStoryAlbumStories.
         * @param canBeDeleted True, if the story can be deleted.
         * @param canBeEdited True, if the story can be edited.
         * @param canBeForwarded True, if the story can be forwarded as a message or reposted as a story. Otherwise, screenshotting and saving of the story content must be also forbidden.
         * @param canBeReplied True, if the story can be replied in the chat with the user who posted the story.
         * @param canSetPrivacySettings True, if the story privacy settings can be changed.
         * @param canToggleIsPostedToChatPage True, if the story's isPostedToChatPage value can be changed.
         * @param canGetStatistics True, if the story statistics are available through getStoryStatistics.
         * @param canGetInteractions True, if interactions with the story can be received through getStoryInteractions.
         * @param hasExpiredViewers True, if users viewed the story can't be received, because the story has expired more than getOption(&quot;story_viewers_expiration_delay&quot;) seconds ago.
         * @param repostInfo Information about the original story; may be null if the story wasn't reposted.
         * @param interactionInfo Information about interactions with the story; may be null if the story isn't owned or there were no interactions.
         * @param chosenReactionType Type of the chosen reaction; may be null if none.
         * @param privacySettings Privacy rules affecting story visibility; may be approximate for non-owned stories.
         * @param content Content of the story.
         * @param areas Clickable areas to be shown on the story content.
         * @param caption Caption of the story.
         * @param albumIds Identifiers of story albums to which the story is added; only for manageable stories.
         */
        public Story(int id, long posterChatId, MessageSender posterId, int date, boolean isBeingPosted, boolean isBeingEdited, boolean isEdited, boolean isPostedToChatPage, boolean isVisibleOnlyForSelf, boolean canBeAddedToAlbum, boolean canBeDeleted, boolean canBeEdited, boolean canBeForwarded, boolean canBeReplied, boolean canSetPrivacySettings, boolean canToggleIsPostedToChatPage, boolean canGetStatistics, boolean canGetInteractions, boolean hasExpiredViewers, StoryRepostInfo repostInfo, StoryInteractionInfo interactionInfo, ReactionType chosenReactionType, StoryPrivacySettings privacySettings, StoryContent content, StoryArea[] areas, FormattedText caption, int[] albumIds) {
            this.id = id;
            this.posterChatId = posterChatId;
            this.posterId = posterId;
            this.date = date;
            this.isBeingPosted = isBeingPosted;
            this.isBeingEdited = isBeingEdited;
            this.isEdited = isEdited;
            this.isPostedToChatPage = isPostedToChatPage;
            this.isVisibleOnlyForSelf = isVisibleOnlyForSelf;
            this.canBeAddedToAlbum = canBeAddedToAlbum;
            this.canBeDeleted = canBeDeleted;
            this.canBeEdited = canBeEdited;
            this.canBeForwarded = canBeForwarded;
            this.canBeReplied = canBeReplied;
            this.canSetPrivacySettings = canSetPrivacySettings;
            this.canToggleIsPostedToChatPage = canToggleIsPostedToChatPage;
            this.canGetStatistics = canGetStatistics;
            this.canGetInteractions = canGetInteractions;
            this.hasExpiredViewers = hasExpiredViewers;
            this.repostInfo = repostInfo;
            this.interactionInfo = interactionInfo;
            this.chosenReactionType = chosenReactionType;
            this.privacySettings = privacySettings;
            this.content = content;
            this.areas = areas;
            this.caption = caption;
            this.albumIds = albumIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1551193142;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes album of stories.
     */
    public static class StoryAlbum extends Object {
        /**
         * Unique identifier of the album.
         */
        public int id;
        /**
         * Name of the album.
         */
        public String name;
        /**
         * Icon of the album; may be null if none.
         */
        @Nullable public Photo photoIcon;
        /**
         * Video icon of the album; may be null if none.
         */
        @Nullable public Video videoIcon;

        /**
         * Describes album of stories.
         */
        public StoryAlbum() {
        }

        /**
         * Describes album of stories.
         *
         * @param id Unique identifier of the album.
         * @param name Name of the album.
         * @param photoIcon Icon of the album; may be null if none.
         * @param videoIcon Video icon of the album; may be null if none.
         */
        public StoryAlbum(int id, String name, Photo photoIcon, Video videoIcon) {
            this.id = id;
            this.name = name;
            this.photoIcon = photoIcon;
            this.videoIcon = videoIcon;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -346189829;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of story albums.
     */
    public static class StoryAlbums extends Object {
        /**
         * List of story albums.
         */
        public StoryAlbum[] albums;

        /**
         * Represents a list of story albums.
         */
        public StoryAlbums() {
        }

        /**
         * Represents a list of story albums.
         *
         * @param albums List of story albums.
         */
        public StoryAlbums(StoryAlbum[] albums) {
            this.albums = albums;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2123240062;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a clickable rectangle area on a story media.
     */
    public static class StoryArea extends Object {
        /**
         * Position of the area.
         */
        public StoryAreaPosition position;
        /**
         * Type of the area.
         */
        public StoryAreaType type;

        /**
         * Describes a clickable rectangle area on a story media.
         */
        public StoryArea() {
        }

        /**
         * Describes a clickable rectangle area on a story media.
         *
         * @param position Position of the area.
         * @param type Type of the area.
         */
        public StoryArea(StoryAreaPosition position, StoryAreaType type) {
            this.position = position;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -906033314;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes position of a clickable rectangle area on a story media.
     */
    public static class StoryAreaPosition extends Object {
        /**
         * The abscissa of the rectangle's center, as a percentage of the media width.
         */
        public double xPercentage;
        /**
         * The ordinate of the rectangle's center, as a percentage of the media height.
         */
        public double yPercentage;
        /**
         * The width of the rectangle, as a percentage of the media width.
         */
        public double widthPercentage;
        /**
         * The height of the rectangle, as a percentage of the media height.
         */
        public double heightPercentage;
        /**
         * Clockwise rotation angle of the rectangle, in degrees; 0-360.
         */
        public double rotationAngle;
        /**
         * The radius of the rectangle corner rounding, as a percentage of the media width.
         */
        public double cornerRadiusPercentage;

        /**
         * Describes position of a clickable rectangle area on a story media.
         */
        public StoryAreaPosition() {
        }

        /**
         * Describes position of a clickable rectangle area on a story media.
         *
         * @param xPercentage The abscissa of the rectangle's center, as a percentage of the media width.
         * @param yPercentage The ordinate of the rectangle's center, as a percentage of the media height.
         * @param widthPercentage The width of the rectangle, as a percentage of the media width.
         * @param heightPercentage The height of the rectangle, as a percentage of the media height.
         * @param rotationAngle Clockwise rotation angle of the rectangle, in degrees; 0-360.
         * @param cornerRadiusPercentage The radius of the rectangle corner rounding, as a percentage of the media width.
         */
        public StoryAreaPosition(double xPercentage, double yPercentage, double widthPercentage, double heightPercentage, double rotationAngle, double cornerRadiusPercentage) {
            this.xPercentage = xPercentage;
            this.yPercentage = yPercentage;
            this.widthPercentage = widthPercentage;
            this.heightPercentage = heightPercentage;
            this.rotationAngle = rotationAngle;
            this.cornerRadiusPercentage = cornerRadiusPercentage;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1533023124;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes type of clickable area on a story media.
     */
    public abstract static class StoryAreaType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            StoryAreaTypeLocation.CONSTRUCTOR,
            StoryAreaTypeVenue.CONSTRUCTOR,
            StoryAreaTypeSuggestedReaction.CONSTRUCTOR,
            StoryAreaTypeMessage.CONSTRUCTOR,
            StoryAreaTypeLink.CONSTRUCTOR,
            StoryAreaTypeWeather.CONSTRUCTOR,
            StoryAreaTypeUpgradedGift.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public StoryAreaType() {
        }
    }

    /**
     * An area pointing to a location.
     */
    public static class StoryAreaTypeLocation extends StoryAreaType {
        /**
         * The location.
         */
        public Location location;
        /**
         * Address of the location; may be null if unknown.
         */
        @Nullable public LocationAddress address;

        /**
         * An area pointing to a location.
         */
        public StoryAreaTypeLocation() {
        }

        /**
         * An area pointing to a location.
         *
         * @param location The location.
         * @param address Address of the location; may be null if unknown.
         */
        public StoryAreaTypeLocation(Location location, LocationAddress address) {
            this.location = location;
            this.address = address;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1464612189;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An area pointing to a venue.
     */
    public static class StoryAreaTypeVenue extends StoryAreaType {
        /**
         * Information about the venue.
         */
        public Venue venue;

        /**
         * An area pointing to a venue.
         */
        public StoryAreaTypeVenue() {
        }

        /**
         * An area pointing to a venue.
         *
         * @param venue Information about the venue.
         */
        public StoryAreaTypeVenue(Venue venue) {
            this.venue = venue;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 414076166;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An area pointing to a suggested reaction. App needs to show a clickable reaction on the area and call setStoryReaction when the are is clicked.
     */
    public static class StoryAreaTypeSuggestedReaction extends StoryAreaType {
        /**
         * Type of the reaction.
         */
        public ReactionType reactionType;
        /**
         * Number of times the reaction was added.
         */
        public int totalCount;
        /**
         * True, if reaction has a dark background.
         */
        public boolean isDark;
        /**
         * True, if reaction corner is flipped.
         */
        public boolean isFlipped;

        /**
         * An area pointing to a suggested reaction. App needs to show a clickable reaction on the area and call setStoryReaction when the are is clicked.
         */
        public StoryAreaTypeSuggestedReaction() {
        }

        /**
         * An area pointing to a suggested reaction. App needs to show a clickable reaction on the area and call setStoryReaction when the are is clicked.
         *
         * @param reactionType Type of the reaction.
         * @param totalCount Number of times the reaction was added.
         * @param isDark True, if reaction has a dark background.
         * @param isFlipped True, if reaction corner is flipped.
         */
        public StoryAreaTypeSuggestedReaction(ReactionType reactionType, int totalCount, boolean isDark, boolean isFlipped) {
            this.reactionType = reactionType;
            this.totalCount = totalCount;
            this.isDark = isDark;
            this.isFlipped = isFlipped;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -111177092;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An area pointing to a message.
     */
    public static class StoryAreaTypeMessage extends StoryAreaType {
        /**
         * Identifier of the chat with the message.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;

        /**
         * An area pointing to a message.
         */
        public StoryAreaTypeMessage() {
        }

        /**
         * An area pointing to a message.
         *
         * @param chatId Identifier of the chat with the message.
         * @param messageId Identifier of the message.
         */
        public StoryAreaTypeMessage(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1074825548;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An area pointing to a HTTP or tg:// link.
     */
    public static class StoryAreaTypeLink extends StoryAreaType {
        /**
         * HTTP or tg:// URL to be opened when the area is clicked.
         */
        public String url;

        /**
         * An area pointing to a HTTP or tg:// link.
         */
        public StoryAreaTypeLink() {
        }

        /**
         * An area pointing to a HTTP or tg:// link.
         *
         * @param url HTTP or tg:// URL to be opened when the area is clicked.
         */
        public StoryAreaTypeLink(String url) {
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -127770235;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An area with information about weather.
     */
    public static class StoryAreaTypeWeather extends StoryAreaType {
        /**
         * Temperature, in degree Celsius.
         */
        public double temperature;
        /**
         * Emoji representing the weather.
         */
        public String emoji;
        /**
         * A color of the area background in the ARGB format.
         */
        public int backgroundColor;

        /**
         * An area with information about weather.
         */
        public StoryAreaTypeWeather() {
        }

        /**
         * An area with information about weather.
         *
         * @param temperature Temperature, in degree Celsius.
         * @param emoji Emoji representing the weather.
         * @param backgroundColor A color of the area background in the ARGB format.
         */
        public StoryAreaTypeWeather(double temperature, String emoji, int backgroundColor) {
            this.temperature = temperature;
            this.emoji = emoji;
            this.backgroundColor = backgroundColor;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1504150082;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An area with an upgraded gift.
     */
    public static class StoryAreaTypeUpgradedGift extends StoryAreaType {
        /**
         * Unique name of the upgraded gift.
         */
        public String giftName;

        /**
         * An area with an upgraded gift.
         */
        public StoryAreaTypeUpgradedGift() {
        }

        /**
         * An area with an upgraded gift.
         *
         * @param giftName Unique name of the upgraded gift.
         */
        public StoryAreaTypeUpgradedGift(String giftName) {
            this.giftName = giftName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 760281479;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains the content of a story.
     */
    public abstract static class StoryContent extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            StoryContentPhoto.CONSTRUCTOR,
            StoryContentVideo.CONSTRUCTOR,
            StoryContentLive.CONSTRUCTOR,
            StoryContentUnsupported.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public StoryContent() {
        }
    }

    /**
     * A photo story.
     */
    public static class StoryContentPhoto extends StoryContent {
        /**
         * The photo.
         */
        public Photo photo;

        /**
         * A photo story.
         */
        public StoryContentPhoto() {
        }

        /**
         * A photo story.
         *
         * @param photo The photo.
         */
        public StoryContentPhoto(Photo photo) {
            this.photo = photo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -731971504;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A video story.
     */
    public static class StoryContentVideo extends StoryContent {
        /**
         * The video in MPEG4 format.
         */
        public StoryVideo video;
        /**
         * Alternative version of the video in MPEG4 format, encoded with H.264 codec; may be null.
         */
        @Nullable public StoryVideo alternativeVideo;

        /**
         * A video story.
         */
        public StoryContentVideo() {
        }

        /**
         * A video story.
         *
         * @param video The video in MPEG4 format.
         * @param alternativeVideo Alternative version of the video in MPEG4 format, encoded with H.264 codec; may be null.
         */
        public StoryContentVideo(StoryVideo video, StoryVideo alternativeVideo) {
            this.video = video;
            this.alternativeVideo = alternativeVideo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1291754842;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A live story.
     */
    public static class StoryContentLive extends StoryContent {
        /**
         * Identifier of the corresponding group call. The group call can be received through the method getGroupCall.
         */
        public int groupCallId;
        /**
         * True, if the call is an RTMP stream instead of an ordinary group call.
         */
        public boolean isRtmpStream;

        /**
         * A live story.
         */
        public StoryContentLive() {
        }

        /**
         * A live story.
         *
         * @param groupCallId Identifier of the corresponding group call. The group call can be received through the method getGroupCall.
         * @param isRtmpStream True, if the call is an RTMP stream instead of an ordinary group call.
         */
        public StoryContentLive(int groupCallId, boolean isRtmpStream) {
            this.groupCallId = groupCallId;
            this.isRtmpStream = isRtmpStream;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1192628634;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A story content that is not supported in the current TDLib version.
     */
    public static class StoryContentUnsupported extends StoryContent {

        /**
         * A story content that is not supported in the current TDLib version.
         */
        public StoryContentUnsupported() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2033715858;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains the type of the content of a story.
     */
    public abstract static class StoryContentType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            StoryContentTypePhoto.CONSTRUCTOR,
            StoryContentTypeVideo.CONSTRUCTOR,
            StoryContentTypeLive.CONSTRUCTOR,
            StoryContentTypeUnsupported.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public StoryContentType() {
        }
    }

    /**
     * A photo story.
     */
    public static class StoryContentTypePhoto extends StoryContentType {

        /**
         * A photo story.
         */
        public StoryContentTypePhoto() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1568510965;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A video story.
     */
    public static class StoryContentTypeVideo extends StoryContentType {

        /**
         * A video story.
         */
        public StoryContentTypeVideo() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -573976899;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A live story.
     */
    public static class StoryContentTypeLive extends StoryContentType {

        /**
         * A live story.
         */
        public StoryContentTypeLive() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -659651117;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A story of unknown content type.
     */
    public static class StoryContentTypeUnsupported extends StoryContentType {

        /**
         * A story of unknown content type.
         */
        public StoryContentTypeUnsupported() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 642311105;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains identifier of a story along with identifier of the chat that posted it.
     */
    public static class StoryFullId extends Object {
        /**
         * Identifier of the chat that posted the story.
         */
        public long posterChatId;
        /**
         * Unique story identifier among stories of the chat.
         */
        public int storyId;

        /**
         * Contains identifier of a story along with identifier of the chat that posted it.
         */
        public StoryFullId() {
        }

        /**
         * Contains identifier of a story along with identifier of the chat that posted it.
         *
         * @param posterChatId Identifier of the chat that posted the story.
         * @param storyId Unique story identifier among stories of the chat.
         */
        public StoryFullId(long posterChatId, int storyId) {
            this.posterChatId = posterChatId;
            this.storyId = storyId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 765952419;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains basic information about a story.
     */
    public static class StoryInfo extends Object {
        /**
         * Unique story identifier among stories of the chat.
         */
        public int storyId;
        /**
         * Point in time (Unix timestamp) when the story was published.
         */
        public int date;
        /**
         * True, if the story is available only to close friends.
         */
        public boolean isForCloseFriends;
        /**
         * True, if the story is a live story.
         */
        public boolean isLive;

        /**
         * Contains basic information about a story.
         */
        public StoryInfo() {
        }

        /**
         * Contains basic information about a story.
         *
         * @param storyId Unique story identifier among stories of the chat.
         * @param date Point in time (Unix timestamp) when the story was published.
         * @param isForCloseFriends True, if the story is available only to close friends.
         * @param isLive True, if the story is a live story.
         */
        public StoryInfo(int storyId, int date, boolean isForCloseFriends, boolean isLive) {
            this.storyId = storyId;
            this.date = date;
            this.isForCloseFriends = isForCloseFriends;
            this.isLive = isLive;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 182159362;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents interaction with a story.
     */
    public static class StoryInteraction extends Object {
        /**
         * Identifier of the user or chat that made the interaction.
         */
        public MessageSender actorId;
        /**
         * Approximate point in time (Unix timestamp) when the interaction happened.
         */
        public int interactionDate;
        /**
         * Block list to which the actor is added; may be null if none or for chat stories.
         */
        @Nullable public BlockList blockList;
        /**
         * Type of the interaction.
         */
        public StoryInteractionType type;

        /**
         * Represents interaction with a story.
         */
        public StoryInteraction() {
        }

        /**
         * Represents interaction with a story.
         *
         * @param actorId Identifier of the user or chat that made the interaction.
         * @param interactionDate Approximate point in time (Unix timestamp) when the interaction happened.
         * @param blockList Block list to which the actor is added; may be null if none or for chat stories.
         * @param type Type of the interaction.
         */
        public StoryInteraction(MessageSender actorId, int interactionDate, BlockList blockList, StoryInteractionType type) {
            this.actorId = actorId;
            this.interactionDate = interactionDate;
            this.blockList = blockList;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -702229982;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about interactions with a story.
     */
    public static class StoryInteractionInfo extends Object {
        /**
         * Number of times the story was viewed.
         */
        public int viewCount;
        /**
         * Number of times the story was forwarded; 0 if none or unknown.
         */
        public int forwardCount;
        /**
         * Number of reactions added to the story; 0 if none or unknown.
         */
        public int reactionCount;
        /**
         * Identifiers of at most 3 recent viewers of the story.
         */
        public long[] recentViewerUserIds;

        /**
         * Contains information about interactions with a story.
         */
        public StoryInteractionInfo() {
        }

        /**
         * Contains information about interactions with a story.
         *
         * @param viewCount Number of times the story was viewed.
         * @param forwardCount Number of times the story was forwarded; 0 if none or unknown.
         * @param reactionCount Number of reactions added to the story; 0 if none or unknown.
         * @param recentViewerUserIds Identifiers of at most 3 recent viewers of the story.
         */
        public StoryInteractionInfo(int viewCount, int forwardCount, int reactionCount, long[] recentViewerUserIds) {
            this.viewCount = viewCount;
            this.forwardCount = forwardCount;
            this.reactionCount = reactionCount;
            this.recentViewerUserIds = recentViewerUserIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -846542065;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes type of interaction with a story.
     */
    public abstract static class StoryInteractionType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            StoryInteractionTypeView.CONSTRUCTOR,
            StoryInteractionTypeForward.CONSTRUCTOR,
            StoryInteractionTypeRepost.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public StoryInteractionType() {
        }
    }

    /**
     * A view of the story.
     */
    public static class StoryInteractionTypeView extends StoryInteractionType {
        /**
         * Type of the reaction that was chosen by the viewer; may be null if none.
         */
        @Nullable public ReactionType chosenReactionType;

        /**
         * A view of the story.
         */
        public StoryInteractionTypeView() {
        }

        /**
         * A view of the story.
         *
         * @param chosenReactionType Type of the reaction that was chosen by the viewer; may be null if none.
         */
        public StoryInteractionTypeView(ReactionType chosenReactionType) {
            this.chosenReactionType = chosenReactionType;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1407399888;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A forward of the story as a message.
     */
    public static class StoryInteractionTypeForward extends StoryInteractionType {
        /**
         * The message with story forward.
         */
        public Message message;

        /**
         * A forward of the story as a message.
         */
        public StoryInteractionTypeForward() {
        }

        /**
         * A forward of the story as a message.
         *
         * @param message The message with story forward.
         */
        public StoryInteractionTypeForward(Message message) {
            this.message = message;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 668089599;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A repost of the story as a story.
     */
    public static class StoryInteractionTypeRepost extends StoryInteractionType {
        /**
         * The reposted story.
         */
        public Story story;

        /**
         * A repost of the story as a story.
         */
        public StoryInteractionTypeRepost() {
        }

        /**
         * A repost of the story as a story.
         *
         * @param story The reposted story.
         */
        public StoryInteractionTypeRepost(Story story) {
            this.story = story;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1021150780;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of interactions with a story.
     */
    public static class StoryInteractions extends Object {
        /**
         * Approximate total number of interactions found.
         */
        public int totalCount;
        /**
         * Approximate total number of found forwards and reposts; always 0 for chat stories.
         */
        public int totalForwardCount;
        /**
         * Approximate total number of found reactions; always 0 for chat stories.
         */
        public int totalReactionCount;
        /**
         * List of story interactions.
         */
        public StoryInteraction[] interactions;
        /**
         * The offset for the next request. If empty, then there are no more results.
         */
        public String nextOffset;

        /**
         * Represents a list of interactions with a story.
         */
        public StoryInteractions() {
        }

        /**
         * Represents a list of interactions with a story.
         *
         * @param totalCount Approximate total number of interactions found.
         * @param totalForwardCount Approximate total number of found forwards and reposts; always 0 for chat stories.
         * @param totalReactionCount Approximate total number of found reactions; always 0 for chat stories.
         * @param interactions List of story interactions.
         * @param nextOffset The offset for the next request. If empty, then there are no more results.
         */
        public StoryInteractions(int totalCount, int totalForwardCount, int totalReactionCount, StoryInteraction[] interactions, String nextOffset) {
            this.totalCount = totalCount;
            this.totalForwardCount = totalForwardCount;
            this.totalReactionCount = totalReactionCount;
            this.interactions = interactions;
            this.nextOffset = nextOffset;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1537062962;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a list of stories.
     */
    public abstract static class StoryList extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            StoryListMain.CONSTRUCTOR,
            StoryListArchive.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public StoryList() {
        }
    }

    /**
     * The list of stories, shown in the main chat list and folder chat lists.
     */
    public static class StoryListMain extends StoryList {

        /**
         * The list of stories, shown in the main chat list and folder chat lists.
         */
        public StoryListMain() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -672222209;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of stories, shown in the Arvhive chat list.
     */
    public static class StoryListArchive extends StoryList {

        /**
         * The list of stories, shown in the Arvhive chat list.
         */
        public StoryListArchive() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -41900223;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains information about the origin of a story that was reposted.
     */
    public abstract static class StoryOrigin extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            StoryOriginPublicStory.CONSTRUCTOR,
            StoryOriginHiddenUser.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public StoryOrigin() {
        }
    }

    /**
     * The original story was a public story that was posted by a known chat.
     */
    public static class StoryOriginPublicStory extends StoryOrigin {
        /**
         * Identifier of the chat that posted original story.
         */
        public long chatId;
        /**
         * Story identifier of the original story.
         */
        public int storyId;

        /**
         * The original story was a public story that was posted by a known chat.
         */
        public StoryOriginPublicStory() {
        }

        /**
         * The original story was a public story that was posted by a known chat.
         *
         * @param chatId Identifier of the chat that posted original story.
         * @param storyId Story identifier of the original story.
         */
        public StoryOriginPublicStory(long chatId, int storyId) {
            this.chatId = chatId;
            this.storyId = storyId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 741842878;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The original story was posted by an unknown user.
     */
    public static class StoryOriginHiddenUser extends StoryOrigin {
        /**
         * Name of the user or the chat that posted the story.
         */
        public String posterName;

        /**
         * The original story was posted by an unknown user.
         */
        public StoryOriginHiddenUser() {
        }

        /**
         * The original story was posted by an unknown user.
         *
         * @param posterName Name of the user or the chat that posted the story.
         */
        public StoryOriginHiddenUser(String posterName) {
            this.posterName = posterName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -96348585;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes privacy settings of a story.
     */
    public abstract static class StoryPrivacySettings extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            StoryPrivacySettingsEveryone.CONSTRUCTOR,
            StoryPrivacySettingsContacts.CONSTRUCTOR,
            StoryPrivacySettingsCloseFriends.CONSTRUCTOR,
            StoryPrivacySettingsSelectedUsers.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public StoryPrivacySettings() {
        }
    }

    /**
     * The story can be viewed by everyone.
     */
    public static class StoryPrivacySettingsEveryone extends StoryPrivacySettings {
        /**
         * Identifiers of the users that can't see the story; always unknown and empty for non-owned stories.
         */
        public long[] exceptUserIds;

        /**
         * The story can be viewed by everyone.
         */
        public StoryPrivacySettingsEveryone() {
        }

        /**
         * The story can be viewed by everyone.
         *
         * @param exceptUserIds Identifiers of the users that can't see the story; always unknown and empty for non-owned stories.
         */
        public StoryPrivacySettingsEveryone(long[] exceptUserIds) {
            this.exceptUserIds = exceptUserIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 890847843;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The story can be viewed by all contacts except chosen users.
     */
    public static class StoryPrivacySettingsContacts extends StoryPrivacySettings {
        /**
         * User identifiers of the contacts that can't see the story; always unknown and empty for non-owned stories.
         */
        public long[] exceptUserIds;

        /**
         * The story can be viewed by all contacts except chosen users.
         */
        public StoryPrivacySettingsContacts() {
        }

        /**
         * The story can be viewed by all contacts except chosen users.
         *
         * @param exceptUserIds User identifiers of the contacts that can't see the story; always unknown and empty for non-owned stories.
         */
        public StoryPrivacySettingsContacts(long[] exceptUserIds) {
            this.exceptUserIds = exceptUserIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 50285309;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The story can be viewed by all close friends.
     */
    public static class StoryPrivacySettingsCloseFriends extends StoryPrivacySettings {

        /**
         * The story can be viewed by all close friends.
         */
        public StoryPrivacySettingsCloseFriends() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2097122144;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The story can be viewed by certain specified users.
     */
    public static class StoryPrivacySettingsSelectedUsers extends StoryPrivacySettings {
        /**
         * Identifiers of the users; always unknown and empty for non-owned stories.
         */
        public long[] userIds;

        /**
         * The story can be viewed by certain specified users.
         */
        public StoryPrivacySettingsSelectedUsers() {
        }

        /**
         * The story can be viewed by certain specified users.
         *
         * @param userIds Identifiers of the users; always unknown and empty for non-owned stories.
         */
        public StoryPrivacySettingsSelectedUsers(long[] userIds) {
            this.userIds = userIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1885772602;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about original story that was reposted.
     */
    public static class StoryRepostInfo extends Object {
        /**
         * Origin of the story that was reposted.
         */
        public StoryOrigin origin;
        /**
         * True, if story content was modified during reposting; otherwise, story wasn't modified.
         */
        public boolean isContentModified;

        /**
         * Contains information about original story that was reposted.
         */
        public StoryRepostInfo() {
        }

        /**
         * Contains information about original story that was reposted.
         *
         * @param origin Origin of the story that was reposted.
         * @param isContentModified True, if story content was modified during reposting; otherwise, story wasn't modified.
         */
        public StoryRepostInfo(StoryOrigin origin, boolean isContentModified) {
            this.origin = origin;
            this.isContentModified = isContentModified;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -8412096;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A detailed statistics about a story.
     */
    public static class StoryStatistics extends Object {
        /**
         * A graph containing number of story views and shares.
         */
        public StatisticalGraph storyInteractionGraph;
        /**
         * A graph containing number of story reactions.
         */
        public StatisticalGraph storyReactionGraph;

        /**
         * A detailed statistics about a story.
         */
        public StoryStatistics() {
        }

        /**
         * A detailed statistics about a story.
         *
         * @param storyInteractionGraph A graph containing number of story views and shares.
         * @param storyReactionGraph A graph containing number of story reactions.
         */
        public StoryStatistics(StatisticalGraph storyInteractionGraph, StatisticalGraph storyReactionGraph) {
            this.storyInteractionGraph = storyInteractionGraph;
            this.storyReactionGraph = storyReactionGraph;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1178897259;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a video file posted as a story.
     */
    public static class StoryVideo extends Object {
        /**
         * Duration of the video, in seconds.
         */
        public double duration;
        /**
         * Video width.
         */
        public int width;
        /**
         * Video height.
         */
        public int height;
        /**
         * True, if stickers were added to the video. The list of corresponding sticker sets can be received using getAttachedStickerSets.
         */
        public boolean hasStickers;
        /**
         * True, if the video has no sound.
         */
        public boolean isAnimation;
        /**
         * Video minithumbnail; may be null.
         */
        @Nullable public Minithumbnail minithumbnail;
        /**
         * Video thumbnail in JPEG or MPEG4 format; may be null.
         */
        @Nullable public Thumbnail thumbnail;
        /**
         * Size of file prefix, which is expected to be preloaded, in bytes.
         */
        public int preloadPrefixSize;
        /**
         * Timestamp of the frame used as video thumbnail.
         */
        public double coverFrameTimestamp;
        /**
         * File containing the video.
         */
        public File video;

        /**
         * Describes a video file posted as a story.
         */
        public StoryVideo() {
        }

        /**
         * Describes a video file posted as a story.
         *
         * @param duration Duration of the video, in seconds.
         * @param width Video width.
         * @param height Video height.
         * @param hasStickers True, if stickers were added to the video. The list of corresponding sticker sets can be received using getAttachedStickerSets.
         * @param isAnimation True, if the video has no sound.
         * @param minithumbnail Video minithumbnail; may be null.
         * @param thumbnail Video thumbnail in JPEG or MPEG4 format; may be null.
         * @param preloadPrefixSize Size of file prefix, which is expected to be preloaded, in bytes.
         * @param coverFrameTimestamp Timestamp of the frame used as video thumbnail.
         * @param video File containing the video.
         */
        public StoryVideo(double duration, int width, int height, boolean hasStickers, boolean isAnimation, Minithumbnail minithumbnail, Thumbnail thumbnail, int preloadPrefixSize, double coverFrameTimestamp, File video) {
            this.duration = duration;
            this.width = width;
            this.height = height;
            this.hasStickers = hasStickers;
            this.isAnimation = isAnimation;
            this.minithumbnail = minithumbnail;
            this.thumbnail = thumbnail;
            this.preloadPrefixSize = preloadPrefixSize;
            this.coverFrameTimestamp = coverFrameTimestamp;
            this.video = video;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1445661253;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes an action suggested to the current user.
     */
    public abstract static class SuggestedAction extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            SuggestedActionEnableArchiveAndMuteNewChats.CONSTRUCTOR,
            SuggestedActionCheckPassword.CONSTRUCTOR,
            SuggestedActionCheckPhoneNumber.CONSTRUCTOR,
            SuggestedActionViewChecksHint.CONSTRUCTOR,
            SuggestedActionConvertToBroadcastGroup.CONSTRUCTOR,
            SuggestedActionSetPassword.CONSTRUCTOR,
            SuggestedActionUpgradePremium.CONSTRUCTOR,
            SuggestedActionRestorePremium.CONSTRUCTOR,
            SuggestedActionSubscribeToAnnualPremium.CONSTRUCTOR,
            SuggestedActionGiftPremiumForChristmas.CONSTRUCTOR,
            SuggestedActionSetBirthdate.CONSTRUCTOR,
            SuggestedActionSetProfilePhoto.CONSTRUCTOR,
            SuggestedActionExtendPremium.CONSTRUCTOR,
            SuggestedActionExtendStarSubscriptions.CONSTRUCTOR,
            SuggestedActionCustom.CONSTRUCTOR,
            SuggestedActionSetLoginEmailAddress.CONSTRUCTOR,
            SuggestedActionAddLoginPasskey.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public SuggestedAction() {
        }
    }

    /**
     * Suggests the user to enable archiveAndMuteNewChatsFromUnknownUsers setting in archiveChatListSettings.
     */
    public static class SuggestedActionEnableArchiveAndMuteNewChats extends SuggestedAction {

        /**
         * Suggests the user to enable archiveAndMuteNewChatsFromUnknownUsers setting in archiveChatListSettings.
         */
        public SuggestedActionEnableArchiveAndMuteNewChats() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2017586255;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Suggests the user to check whether they still remember their 2-step verification password.
     */
    public static class SuggestedActionCheckPassword extends SuggestedAction {

        /**
         * Suggests the user to check whether they still remember their 2-step verification password.
         */
        public SuggestedActionCheckPassword() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1910534839;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Suggests the user to check whether authorization phone number is correct and change the phone number if it is inaccessible.
     */
    public static class SuggestedActionCheckPhoneNumber extends SuggestedAction {

        /**
         * Suggests the user to check whether authorization phone number is correct and change the phone number if it is inaccessible.
         */
        public SuggestedActionCheckPhoneNumber() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 648771563;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Suggests the user to view a hint about the meaning of one and two check marks on sent messages.
     */
    public static class SuggestedActionViewChecksHint extends SuggestedAction {

        /**
         * Suggests the user to view a hint about the meaning of one and two check marks on sent messages.
         */
        public SuggestedActionViewChecksHint() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 891303239;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Suggests the user to convert specified supergroup to a broadcast group.
     */
    public static class SuggestedActionConvertToBroadcastGroup extends SuggestedAction {
        /**
         * Supergroup identifier.
         */
        public long supergroupId;

        /**
         * Suggests the user to convert specified supergroup to a broadcast group.
         */
        public SuggestedActionConvertToBroadcastGroup() {
        }

        /**
         * Suggests the user to convert specified supergroup to a broadcast group.
         *
         * @param supergroupId Supergroup identifier.
         */
        public SuggestedActionConvertToBroadcastGroup(long supergroupId) {
            this.supergroupId = supergroupId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -965071304;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Suggests the user to set a 2-step verification password to be able to log in again.
     */
    public static class SuggestedActionSetPassword extends SuggestedAction {
        /**
         * The number of days to pass between consecutive authorizations if the user declines to set password; if 0, then the user is advised to set the password for security reasons.
         */
        public int authorizationDelay;

        /**
         * Suggests the user to set a 2-step verification password to be able to log in again.
         */
        public SuggestedActionSetPassword() {
        }

        /**
         * Suggests the user to set a 2-step verification password to be able to log in again.
         *
         * @param authorizationDelay The number of days to pass between consecutive authorizations if the user declines to set password; if 0, then the user is advised to set the password for security reasons.
         */
        public SuggestedActionSetPassword(int authorizationDelay) {
            this.authorizationDelay = authorizationDelay;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1863613848;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Suggests the user to upgrade the Premium subscription from monthly payments to annual payments.
     */
    public static class SuggestedActionUpgradePremium extends SuggestedAction {

        /**
         * Suggests the user to upgrade the Premium subscription from monthly payments to annual payments.
         */
        public SuggestedActionUpgradePremium() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1890220539;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Suggests the user to restore a recently expired Premium subscription.
     */
    public static class SuggestedActionRestorePremium extends SuggestedAction {

        /**
         * Suggests the user to restore a recently expired Premium subscription.
         */
        public SuggestedActionRestorePremium() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -385229468;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Suggests the user to subscribe to the Premium subscription with annual payments.
     */
    public static class SuggestedActionSubscribeToAnnualPremium extends SuggestedAction {

        /**
         * Suggests the user to subscribe to the Premium subscription with annual payments.
         */
        public SuggestedActionSubscribeToAnnualPremium() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 373913787;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Suggests the user to gift Telegram Premium to friends for Christmas.
     */
    public static class SuggestedActionGiftPremiumForChristmas extends SuggestedAction {

        /**
         * Suggests the user to gift Telegram Premium to friends for Christmas.
         */
        public SuggestedActionGiftPremiumForChristmas() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1816924561;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Suggests the user to set birthdate.
     */
    public static class SuggestedActionSetBirthdate extends SuggestedAction {

        /**
         * Suggests the user to set birthdate.
         */
        public SuggestedActionSetBirthdate() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -356672766;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Suggests the user to set profile photo.
     */
    public static class SuggestedActionSetProfilePhoto extends SuggestedAction {

        /**
         * Suggests the user to set profile photo.
         */
        public SuggestedActionSetProfilePhoto() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1612563093;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Suggests the user to extend their expiring Telegram Premium subscription.
     */
    public static class SuggestedActionExtendPremium extends SuggestedAction {
        /**
         * A URL for managing Telegram Premium subscription.
         */
        public String managePremiumSubscriptionUrl;

        /**
         * Suggests the user to extend their expiring Telegram Premium subscription.
         */
        public SuggestedActionExtendPremium() {
        }

        /**
         * Suggests the user to extend their expiring Telegram Premium subscription.
         *
         * @param managePremiumSubscriptionUrl A URL for managing Telegram Premium subscription.
         */
        public SuggestedActionExtendPremium(String managePremiumSubscriptionUrl) {
            this.managePremiumSubscriptionUrl = managePremiumSubscriptionUrl;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -566207286;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Suggests the user to extend their expiring Telegram Star subscriptions. Call getStarSubscriptions with onlyExpiring == true to get the number of expiring subscriptions and the number of required to buy Telegram Stars.
     */
    public static class SuggestedActionExtendStarSubscriptions extends SuggestedAction {

        /**
         * Suggests the user to extend their expiring Telegram Star subscriptions. Call getStarSubscriptions with onlyExpiring == true to get the number of expiring subscriptions and the number of required to buy Telegram Stars.
         */
        public SuggestedActionExtendStarSubscriptions() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -47000234;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A custom suggestion to be shown at the top of the chat list.
     */
    public static class SuggestedActionCustom extends SuggestedAction {
        /**
         * Unique name of the suggestion.
         */
        public String name;
        /**
         * Title of the suggestion.
         */
        public FormattedText title;
        /**
         * Description of the suggestion.
         */
        public FormattedText description;
        /**
         * The link to open when the suggestion is clicked.
         */
        public String url;

        /**
         * A custom suggestion to be shown at the top of the chat list.
         */
        public SuggestedActionCustom() {
        }

        /**
         * A custom suggestion to be shown at the top of the chat list.
         *
         * @param name Unique name of the suggestion.
         * @param title Title of the suggestion.
         * @param description Description of the suggestion.
         * @param url The link to open when the suggestion is clicked.
         */
        public SuggestedActionCustom(String name, FormattedText title, FormattedText description, String url) {
            this.name = name;
            this.title = title;
            this.description = description;
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2092876611;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Suggests the user to add login email address. Call isLoginEmailAddressRequired, and then setLoginEmailAddress or checkLoginEmailAddressCode to change the login email address.
     */
    public static class SuggestedActionSetLoginEmailAddress extends SuggestedAction {
        /**
         * True, if the suggested action can be hidden using hideSuggestedAction. Otherwise, the user must not be able to use the application without setting up the email address.
         */
        public boolean canBeHidden;

        /**
         * Suggests the user to add login email address. Call isLoginEmailAddressRequired, and then setLoginEmailAddress or checkLoginEmailAddressCode to change the login email address.
         */
        public SuggestedActionSetLoginEmailAddress() {
        }

        /**
         * Suggests the user to add login email address. Call isLoginEmailAddressRequired, and then setLoginEmailAddress or checkLoginEmailAddressCode to change the login email address.
         *
         * @param canBeHidden True, if the suggested action can be hidden using hideSuggestedAction. Otherwise, the user must not be able to use the application without setting up the email address.
         */
        public SuggestedActionSetLoginEmailAddress(boolean canBeHidden) {
            this.canBeHidden = canBeHidden;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1557625160;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Suggests the user to add a passkey for login using addLoginPasskey.
     */
    public static class SuggestedActionAddLoginPasskey extends SuggestedAction {

        /**
         * Suggests the user to add a passkey for login using addLoginPasskey.
         */
        public SuggestedActionAddLoginPasskey() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1186248690;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a suggested post. If the post can be approved or declined, then changes to the post can be also suggested. Use sendMessage with reply to the message and suggested post information to suggest message changes. Use addOffer to suggest price or time changes.
     */
    public static class SuggestedPostInfo extends Object {
        /**
         * Price of the suggested post; may be null if the post is non-paid.
         */
        @Nullable public SuggestedPostPrice price;
        /**
         * Point in time (Unix timestamp) when the post is expected to be published; 0 if the specific date isn't set yet.
         */
        public int sendDate;
        /**
         * State of the post.
         */
        public SuggestedPostState state;
        /**
         * True, if the suggested post can be approved by the current user using approveSuggestedPost; updates aren't sent when value of this field changes.
         */
        public boolean canBeApproved;
        /**
         * True, if the suggested post can be declined by the current user using declineSuggestedPost; updates aren't sent when value of this field changes.
         */
        public boolean canBeDeclined;

        /**
         * Contains information about a suggested post. If the post can be approved or declined, then changes to the post can be also suggested. Use sendMessage with reply to the message and suggested post information to suggest message changes. Use addOffer to suggest price or time changes.
         */
        public SuggestedPostInfo() {
        }

        /**
         * Contains information about a suggested post. If the post can be approved or declined, then changes to the post can be also suggested. Use sendMessage with reply to the message and suggested post information to suggest message changes. Use addOffer to suggest price or time changes.
         *
         * @param price Price of the suggested post; may be null if the post is non-paid.
         * @param sendDate Point in time (Unix timestamp) when the post is expected to be published; 0 if the specific date isn't set yet.
         * @param state State of the post.
         * @param canBeApproved True, if the suggested post can be approved by the current user using approveSuggestedPost; updates aren't sent when value of this field changes.
         * @param canBeDeclined True, if the suggested post can be declined by the current user using declineSuggestedPost; updates aren't sent when value of this field changes.
         */
        public SuggestedPostInfo(SuggestedPostPrice price, int sendDate, SuggestedPostState state, boolean canBeApproved, boolean canBeDeclined) {
            this.price = price;
            this.sendDate = sendDate;
            this.state = state;
            this.canBeApproved = canBeApproved;
            this.canBeDeclined = canBeDeclined;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1088331710;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes price of a suggested post.
     */
    public abstract static class SuggestedPostPrice extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            SuggestedPostPriceStar.CONSTRUCTOR,
            SuggestedPostPriceTon.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public SuggestedPostPrice() {
        }
    }

    /**
     * Describes price of a suggested post in Telegram Stars.
     */
    public static class SuggestedPostPriceStar extends SuggestedPostPrice {
        /**
         * The Telegram Star amount expected to be paid for the post; getOption(&quot;suggested_post_star_count_min&quot;)-getOption(&quot;suggested_post_star_count_max&quot;).
         */
        public long starCount;

        /**
         * Describes price of a suggested post in Telegram Stars.
         */
        public SuggestedPostPriceStar() {
        }

        /**
         * Describes price of a suggested post in Telegram Stars.
         *
         * @param starCount The Telegram Star amount expected to be paid for the post; getOption(&quot;suggested_post_star_count_min&quot;)-getOption(&quot;suggested_post_star_count_max&quot;).
         */
        public SuggestedPostPriceStar(long starCount) {
            this.starCount = starCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 216488903;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes price of a suggested post in Toncoins.
     */
    public static class SuggestedPostPriceTon extends SuggestedPostPrice {
        /**
         * The amount of 1/100 of Toncoin expected to be paid for the post; getOption(&quot;suggested_post_toncoin_cent_count_min&quot;)-getOption(&quot;suggested_post_toncoin_cent_count_max&quot;).
         */
        public long toncoinCentCount;

        /**
         * Describes price of a suggested post in Toncoins.
         */
        public SuggestedPostPriceTon() {
        }

        /**
         * Describes price of a suggested post in Toncoins.
         *
         * @param toncoinCentCount The amount of 1/100 of Toncoin expected to be paid for the post; getOption(&quot;suggested_post_toncoin_cent_count_min&quot;)-getOption(&quot;suggested_post_toncoin_cent_count_max&quot;).
         */
        public SuggestedPostPriceTon(long toncoinCentCount) {
            this.toncoinCentCount = toncoinCentCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1095222334;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes reason for refund of the payment for a suggested post.
     */
    public abstract static class SuggestedPostRefundReason extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            SuggestedPostRefundReasonPostDeleted.CONSTRUCTOR,
            SuggestedPostRefundReasonPaymentRefunded.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public SuggestedPostRefundReason() {
        }
    }

    /**
     * The post was refunded, because it was deleted by channel administrators in less than getOption(&quot;suggested_post_lifetime_min&quot;) seconds.
     */
    public static class SuggestedPostRefundReasonPostDeleted extends SuggestedPostRefundReason {

        /**
         * The post was refunded, because it was deleted by channel administrators in less than getOption(&quot;suggested_post_lifetime_min&quot;) seconds.
         */
        public SuggestedPostRefundReasonPostDeleted() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1657796126;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The post was refunded, because the payment for the post was refunded.
     */
    public static class SuggestedPostRefundReasonPaymentRefunded extends SuggestedPostRefundReason {

        /**
         * The post was refunded, because the payment for the post was refunded.
         */
        public SuggestedPostRefundReasonPaymentRefunded() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 755739598;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes state of a suggested post.
     */
    public abstract static class SuggestedPostState extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            SuggestedPostStatePending.CONSTRUCTOR,
            SuggestedPostStateApproved.CONSTRUCTOR,
            SuggestedPostStateDeclined.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public SuggestedPostState() {
        }
    }

    /**
     * The post must be approved or declined.
     */
    public static class SuggestedPostStatePending extends SuggestedPostState {

        /**
         * The post must be approved or declined.
         */
        public SuggestedPostStatePending() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 232632669;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The post was approved.
     */
    public static class SuggestedPostStateApproved extends SuggestedPostState {

        /**
         * The post was approved.
         */
        public SuggestedPostStateApproved() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -782541552;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The post was declined.
     */
    public static class SuggestedPostStateDeclined extends SuggestedPostState {

        /**
         * The post was declined.
         */
        public SuggestedPostStateDeclined() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 318192794;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a supergroup or channel with zero or more members (subscribers in the case of channels). From the point of view of the system, a channel is a special kind of a supergroup: only administrators can post and see the list of members, and posts from all administrators use the name and photo of the channel instead of individual names and profile photos. Unlike supergroups, channels can have an unlimited number of subscribers.
     */
    public static class Supergroup extends Object {
        /**
         * Supergroup or channel identifier.
         */
        public long id;
        /**
         * Usernames of the supergroup or channel; may be null.
         */
        @Nullable public Usernames usernames;
        /**
         * Point in time (Unix timestamp) when the current user joined, or the point in time when the supergroup or channel was created, in case the user is not a member.
         */
        public int date;
        /**
         * Status of the current user in the supergroup or channel.
         */
        public ChatMemberStatus status;
        /**
         * Number of members in the supergroup or channel; 0 if unknown. Currently, it is guaranteed to be known only if the supergroup or channel was received through getChatSimilarChats, getChatsToPostStories, getCreatedPublicChats, getGroupsInCommon, getInactiveSupergroupChats, getRecommendedChats, getSuitableDiscussionChats, getUserPrivacySettingRules, getVideoChatAvailableParticipants, searchPublicChats, or in chatFolderInviteLinkInfo.missingChatIds, or in userFullInfo.personalChatId, or for chats with messages or stories from publicForwards and foundStories.
         */
        public int memberCount;
        /**
         * Approximate boost level for the chat.
         */
        public int boostLevel;
        /**
         * True, if automatic translation of messages is enabled in the channel.
         */
        public boolean hasAutomaticTranslation;
        /**
         * True, if the channel has a discussion group, or the supergroup is the designated discussion group for a channel.
         */
        public boolean hasLinkedChat;
        /**
         * True, if the supergroup is connected to a location, i.e. the supergroup is a location-based supergroup.
         */
        public boolean hasLocation;
        /**
         * True, if messages sent to the channel contains name of the sender. This field is only applicable to channels.
         */
        public boolean signMessages;
        /**
         * True, if messages sent to the channel have information about the sender user. This field is only applicable to channels.
         */
        public boolean showMessageSender;
        /**
         * True, if users need to join the supergroup before they can send messages. May be false only for discussion supergroups and channel direct messages groups.
         */
        public boolean joinToSendMessages;
        /**
         * True, if all users directly joining the supergroup need to be approved by supergroup administrators. May be true only for non-broadcast supergroups with username, location, or a linked chat.
         */
        public boolean joinByRequest;
        /**
         * True, if the slow mode is enabled in the supergroup.
         */
        public boolean isSlowModeEnabled;
        /**
         * True, if the supergroup is a channel.
         */
        public boolean isChannel;
        /**
         * True, if the supergroup is a broadcast group, i.e. only administrators can send messages and there is no limit on the number of members.
         */
        public boolean isBroadcastGroup;
        /**
         * True, if the supergroup is a forum with topics.
         */
        public boolean isForum;
        /**
         * True, if the supergroup is a direct message group for a channel chat.
         */
        public boolean isDirectMessagesGroup;
        /**
         * True, if the supergroup is a direct messages group for a channel chat that is administered by the current user.
         */
        public boolean isAdministeredDirectMessagesGroup;
        /**
         * Information about verification status of the supergroup or channel; may be null if none.
         */
        @Nullable public VerificationStatus verificationStatus;
        /**
         * True, if the channel has direct messages group.
         */
        public boolean hasDirectMessagesGroup;
        /**
         * True, if the supergroup is a forum, which topics are shown in the same way as in channel direct messages groups.
         */
        public boolean hasForumTabs;
        /**
         * Information about the restrictions that must be applied to the corresponding supergroup or channel chat; may be null if none.
         */
        @Nullable public RestrictionInfo restrictionInfo;
        /**
         * Number of Telegram Stars that must be paid by non-administrator users of the supergroup chat for each sent message.
         */
        public long paidMessageStarCount;
        /**
         * State of active stories of the supergroup or channel; may be null if there are no active stories.
         */
        @Nullable public ActiveStoryState activeStoryState;

        /**
         * Represents a supergroup or channel with zero or more members (subscribers in the case of channels). From the point of view of the system, a channel is a special kind of a supergroup: only administrators can post and see the list of members, and posts from all administrators use the name and photo of the channel instead of individual names and profile photos. Unlike supergroups, channels can have an unlimited number of subscribers.
         */
        public Supergroup() {
        }

        /**
         * Represents a supergroup or channel with zero or more members (subscribers in the case of channels). From the point of view of the system, a channel is a special kind of a supergroup: only administrators can post and see the list of members, and posts from all administrators use the name and photo of the channel instead of individual names and profile photos. Unlike supergroups, channels can have an unlimited number of subscribers.
         *
         * @param id Supergroup or channel identifier.
         * @param usernames Usernames of the supergroup or channel; may be null.
         * @param date Point in time (Unix timestamp) when the current user joined, or the point in time when the supergroup or channel was created, in case the user is not a member.
         * @param status Status of the current user in the supergroup or channel.
         * @param memberCount Number of members in the supergroup or channel; 0 if unknown. Currently, it is guaranteed to be known only if the supergroup or channel was received through getChatSimilarChats, getChatsToPostStories, getCreatedPublicChats, getGroupsInCommon, getInactiveSupergroupChats, getRecommendedChats, getSuitableDiscussionChats, getUserPrivacySettingRules, getVideoChatAvailableParticipants, searchPublicChats, or in chatFolderInviteLinkInfo.missingChatIds, or in userFullInfo.personalChatId, or for chats with messages or stories from publicForwards and foundStories.
         * @param boostLevel Approximate boost level for the chat.
         * @param hasAutomaticTranslation True, if automatic translation of messages is enabled in the channel.
         * @param hasLinkedChat True, if the channel has a discussion group, or the supergroup is the designated discussion group for a channel.
         * @param hasLocation True, if the supergroup is connected to a location, i.e. the supergroup is a location-based supergroup.
         * @param signMessages True, if messages sent to the channel contains name of the sender. This field is only applicable to channels.
         * @param showMessageSender True, if messages sent to the channel have information about the sender user. This field is only applicable to channels.
         * @param joinToSendMessages True, if users need to join the supergroup before they can send messages. May be false only for discussion supergroups and channel direct messages groups.
         * @param joinByRequest True, if all users directly joining the supergroup need to be approved by supergroup administrators. May be true only for non-broadcast supergroups with username, location, or a linked chat.
         * @param isSlowModeEnabled True, if the slow mode is enabled in the supergroup.
         * @param isChannel True, if the supergroup is a channel.
         * @param isBroadcastGroup True, if the supergroup is a broadcast group, i.e. only administrators can send messages and there is no limit on the number of members.
         * @param isForum True, if the supergroup is a forum with topics.
         * @param isDirectMessagesGroup True, if the supergroup is a direct message group for a channel chat.
         * @param isAdministeredDirectMessagesGroup True, if the supergroup is a direct messages group for a channel chat that is administered by the current user.
         * @param verificationStatus Information about verification status of the supergroup or channel; may be null if none.
         * @param hasDirectMessagesGroup True, if the channel has direct messages group.
         * @param hasForumTabs True, if the supergroup is a forum, which topics are shown in the same way as in channel direct messages groups.
         * @param restrictionInfo Information about the restrictions that must be applied to the corresponding supergroup or channel chat; may be null if none.
         * @param paidMessageStarCount Number of Telegram Stars that must be paid by non-administrator users of the supergroup chat for each sent message.
         * @param activeStoryState State of active stories of the supergroup or channel; may be null if there are no active stories.
         */
        public Supergroup(long id, Usernames usernames, int date, ChatMemberStatus status, int memberCount, int boostLevel, boolean hasAutomaticTranslation, boolean hasLinkedChat, boolean hasLocation, boolean signMessages, boolean showMessageSender, boolean joinToSendMessages, boolean joinByRequest, boolean isSlowModeEnabled, boolean isChannel, boolean isBroadcastGroup, boolean isForum, boolean isDirectMessagesGroup, boolean isAdministeredDirectMessagesGroup, VerificationStatus verificationStatus, boolean hasDirectMessagesGroup, boolean hasForumTabs, RestrictionInfo restrictionInfo, long paidMessageStarCount, ActiveStoryState activeStoryState) {
            this.id = id;
            this.usernames = usernames;
            this.date = date;
            this.status = status;
            this.memberCount = memberCount;
            this.boostLevel = boostLevel;
            this.hasAutomaticTranslation = hasAutomaticTranslation;
            this.hasLinkedChat = hasLinkedChat;
            this.hasLocation = hasLocation;
            this.signMessages = signMessages;
            this.showMessageSender = showMessageSender;
            this.joinToSendMessages = joinToSendMessages;
            this.joinByRequest = joinByRequest;
            this.isSlowModeEnabled = isSlowModeEnabled;
            this.isChannel = isChannel;
            this.isBroadcastGroup = isBroadcastGroup;
            this.isForum = isForum;
            this.isDirectMessagesGroup = isDirectMessagesGroup;
            this.isAdministeredDirectMessagesGroup = isAdministeredDirectMessagesGroup;
            this.verificationStatus = verificationStatus;
            this.hasDirectMessagesGroup = hasDirectMessagesGroup;
            this.hasForumTabs = hasForumTabs;
            this.restrictionInfo = restrictionInfo;
            this.paidMessageStarCount = paidMessageStarCount;
            this.activeStoryState = activeStoryState;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1134998957;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains full information about a supergroup or channel.
     */
    public static class SupergroupFullInfo extends Object {
        /**
         * Chat photo; may be null if empty or unknown. If non-null, then it is the same photo as in chat.photo.
         */
        @Nullable public ChatPhoto photo;
        /**
         * Supergroup or channel description.
         */
        public String description;
        /**
         * Number of members in the supergroup or channel; 0 if unknown.
         */
        public int memberCount;
        /**
         * Number of privileged users in the supergroup or channel; 0 if unknown.
         */
        public int administratorCount;
        /**
         * Number of restricted users in the supergroup; 0 if unknown.
         */
        public int restrictedCount;
        /**
         * Number of users banned from chat; 0 if unknown.
         */
        public int bannedCount;
        /**
         * Chat identifier of a discussion group for the channel, or a channel, for which the supergroup is the designated discussion group; 0 if none or unknown.
         */
        public long linkedChatId;
        /**
         * Chat identifier of a direct messages group for the channel, or a channel, for which the supergroup is the designated direct messages group; 0 if none.
         */
        public long directMessagesChatId;
        /**
         * Delay between consecutive sent messages for non-administrator supergroup members, in seconds.
         */
        public int slowModeDelay;
        /**
         * Time left before next message can be sent in the supergroup, in seconds. An updateSupergroupFullInfo update is not triggered when value of this field changes, but both new and old values are non-zero.
         */
        public double slowModeDelayExpiresIn;
        /**
         * True, if paid messages can be enabled in the supergroup chat; for supergroup only.
         */
        public boolean canEnablePaidMessages;
        /**
         * True, if paid reaction can be enabled in the channel chat; for channels only.
         */
        public boolean canEnablePaidReaction;
        /**
         * True, if members of the chat can be retrieved via getSupergroupMembers or searchChatMembers.
         */
        public boolean canGetMembers;
        /**
         * True, if non-administrators can receive only administrators and bots using getSupergroupMembers or searchChatMembers.
         */
        public boolean hasHiddenMembers;
        /**
         * True, if non-administrators and non-bots can be hidden in responses to getSupergroupMembers and searchChatMembers for non-administrators.
         */
        public boolean canHideMembers;
        /**
         * True, if the supergroup sticker set can be changed.
         */
        public boolean canSetStickerSet;
        /**
         * True, if the supergroup location can be changed.
         */
        public boolean canSetLocation;
        /**
         * True, if the supergroup or channel statistics are available.
         */
        public boolean canGetStatistics;
        /**
         * True, if the supergroup or channel revenue statistics are available.
         */
        public boolean canGetRevenueStatistics;
        /**
         * True, if the supergroup or channel Telegram Star revenue statistics are available.
         */
        public boolean canGetStarRevenueStatistics;
        /**
         * True, if the user can send a gift to the supergroup or channel using sendGift or transferGift.
         */
        public boolean canSendGift;
        /**
         * True, if aggressive anti-spam checks can be enabled or disabled in the supergroup.
         */
        public boolean canToggleAggressiveAntiSpam;
        /**
         * True, if new chat members will have access to old messages. In public, discussion, of forum groups and all channels, old messages are always available, so this option affects only private non-forum supergroups without a linked chat. The value of this field is only available to chat administrators.
         */
        public boolean isAllHistoryAvailable;
        /**
         * True, if the chat can have sponsored messages. The value of this field is only available to the owner of the chat.
         */
        public boolean canHaveSponsoredMessages;
        /**
         * True, if aggressive anti-spam checks are enabled in the supergroup. The value of this field is only available to chat administrators.
         */
        public boolean hasAggressiveAntiSpamEnabled;
        /**
         * True, if paid media can be sent and forwarded to the channel chat; for channels only.
         */
        public boolean hasPaidMediaAllowed;
        /**
         * True, if the supergroup or channel has pinned stories.
         */
        public boolean hasPinnedStories;
        /**
         * Number of saved to profile gifts for channels without canPostMessages administrator right, otherwise, the total number of received gifts.
         */
        public int giftCount;
        /**
         * Number of times the current user boosted the supergroup or channel.
         */
        public int myBoostCount;
        /**
         * Number of times the supergroup must be boosted by a user to ignore slow mode and chat permission restrictions; 0 if unspecified.
         */
        public int unrestrictBoostCount;
        /**
         * Number of Telegram Stars that must be paid by the current user for each sent message to the supergroup.
         */
        public long outgoingPaidMessageStarCount;
        /**
         * Identifier of the supergroup sticker set that must be shown before user sticker sets; 0 if none.
         */
        public long stickerSetId;
        /**
         * Identifier of the custom emoji sticker set that can be used in the supergroup without Telegram Premium subscription; 0 if none.
         */
        public long customEmojiStickerSetId;
        /**
         * Location to which the supergroup is connected; may be null if none.
         */
        @Nullable public ChatLocation location;
        /**
         * Primary invite link for the chat; may be null. For chat administrators with canInviteUsers right only.
         */
        @Nullable public ChatInviteLink inviteLink;
        /**
         * List of commands of bots in the group.
         */
        public BotCommands[] botCommands;
        /**
         * Information about verification status of the supergroup or the channel provided by a bot; may be null if none or unknown.
         */
        @Nullable public BotVerification botVerification;
        /**
         * The main tab chosen by the administrators of the channel; may be null if not chosen manually.
         */
        @Nullable public ProfileTab mainProfileTab;
        /**
         * Identifier of the basic group from which supergroup was upgraded; 0 if none.
         */
        public long upgradedFromBasicGroupId;
        /**
         * Identifier of the last message in the basic group from which supergroup was upgraded; 0 if none.
         */
        public long upgradedFromMaxMessageId;

        /**
         * Contains full information about a supergroup or channel.
         */
        public SupergroupFullInfo() {
        }

        /**
         * Contains full information about a supergroup or channel.
         *
         * @param photo Chat photo; may be null if empty or unknown. If non-null, then it is the same photo as in chat.photo.
         * @param description Supergroup or channel description.
         * @param memberCount Number of members in the supergroup or channel; 0 if unknown.
         * @param administratorCount Number of privileged users in the supergroup or channel; 0 if unknown.
         * @param restrictedCount Number of restricted users in the supergroup; 0 if unknown.
         * @param bannedCount Number of users banned from chat; 0 if unknown.
         * @param linkedChatId Chat identifier of a discussion group for the channel, or a channel, for which the supergroup is the designated discussion group; 0 if none or unknown.
         * @param directMessagesChatId Chat identifier of a direct messages group for the channel, or a channel, for which the supergroup is the designated direct messages group; 0 if none.
         * @param slowModeDelay Delay between consecutive sent messages for non-administrator supergroup members, in seconds.
         * @param slowModeDelayExpiresIn Time left before next message can be sent in the supergroup, in seconds. An updateSupergroupFullInfo update is not triggered when value of this field changes, but both new and old values are non-zero.
         * @param canEnablePaidMessages True, if paid messages can be enabled in the supergroup chat; for supergroup only.
         * @param canEnablePaidReaction True, if paid reaction can be enabled in the channel chat; for channels only.
         * @param canGetMembers True, if members of the chat can be retrieved via getSupergroupMembers or searchChatMembers.
         * @param hasHiddenMembers True, if non-administrators can receive only administrators and bots using getSupergroupMembers or searchChatMembers.
         * @param canHideMembers True, if non-administrators and non-bots can be hidden in responses to getSupergroupMembers and searchChatMembers for non-administrators.
         * @param canSetStickerSet True, if the supergroup sticker set can be changed.
         * @param canSetLocation True, if the supergroup location can be changed.
         * @param canGetStatistics True, if the supergroup or channel statistics are available.
         * @param canGetRevenueStatistics True, if the supergroup or channel revenue statistics are available.
         * @param canGetStarRevenueStatistics True, if the supergroup or channel Telegram Star revenue statistics are available.
         * @param canSendGift True, if the user can send a gift to the supergroup or channel using sendGift or transferGift.
         * @param canToggleAggressiveAntiSpam True, if aggressive anti-spam checks can be enabled or disabled in the supergroup.
         * @param isAllHistoryAvailable True, if new chat members will have access to old messages. In public, discussion, of forum groups and all channels, old messages are always available, so this option affects only private non-forum supergroups without a linked chat. The value of this field is only available to chat administrators.
         * @param canHaveSponsoredMessages True, if the chat can have sponsored messages. The value of this field is only available to the owner of the chat.
         * @param hasAggressiveAntiSpamEnabled True, if aggressive anti-spam checks are enabled in the supergroup. The value of this field is only available to chat administrators.
         * @param hasPaidMediaAllowed True, if paid media can be sent and forwarded to the channel chat; for channels only.
         * @param hasPinnedStories True, if the supergroup or channel has pinned stories.
         * @param giftCount Number of saved to profile gifts for channels without canPostMessages administrator right, otherwise, the total number of received gifts.
         * @param myBoostCount Number of times the current user boosted the supergroup or channel.
         * @param unrestrictBoostCount Number of times the supergroup must be boosted by a user to ignore slow mode and chat permission restrictions; 0 if unspecified.
         * @param outgoingPaidMessageStarCount Number of Telegram Stars that must be paid by the current user for each sent message to the supergroup.
         * @param stickerSetId Identifier of the supergroup sticker set that must be shown before user sticker sets; 0 if none.
         * @param customEmojiStickerSetId Identifier of the custom emoji sticker set that can be used in the supergroup without Telegram Premium subscription; 0 if none.
         * @param location Location to which the supergroup is connected; may be null if none.
         * @param inviteLink Primary invite link for the chat; may be null. For chat administrators with canInviteUsers right only.
         * @param botCommands List of commands of bots in the group.
         * @param botVerification Information about verification status of the supergroup or the channel provided by a bot; may be null if none or unknown.
         * @param mainProfileTab The main tab chosen by the administrators of the channel; may be null if not chosen manually.
         * @param upgradedFromBasicGroupId Identifier of the basic group from which supergroup was upgraded; 0 if none.
         * @param upgradedFromMaxMessageId Identifier of the last message in the basic group from which supergroup was upgraded; 0 if none.
         */
        public SupergroupFullInfo(ChatPhoto photo, String description, int memberCount, int administratorCount, int restrictedCount, int bannedCount, long linkedChatId, long directMessagesChatId, int slowModeDelay, double slowModeDelayExpiresIn, boolean canEnablePaidMessages, boolean canEnablePaidReaction, boolean canGetMembers, boolean hasHiddenMembers, boolean canHideMembers, boolean canSetStickerSet, boolean canSetLocation, boolean canGetStatistics, boolean canGetRevenueStatistics, boolean canGetStarRevenueStatistics, boolean canSendGift, boolean canToggleAggressiveAntiSpam, boolean isAllHistoryAvailable, boolean canHaveSponsoredMessages, boolean hasAggressiveAntiSpamEnabled, boolean hasPaidMediaAllowed, boolean hasPinnedStories, int giftCount, int myBoostCount, int unrestrictBoostCount, long outgoingPaidMessageStarCount, long stickerSetId, long customEmojiStickerSetId, ChatLocation location, ChatInviteLink inviteLink, BotCommands[] botCommands, BotVerification botVerification, ProfileTab mainProfileTab, long upgradedFromBasicGroupId, long upgradedFromMaxMessageId) {
            this.photo = photo;
            this.description = description;
            this.memberCount = memberCount;
            this.administratorCount = administratorCount;
            this.restrictedCount = restrictedCount;
            this.bannedCount = bannedCount;
            this.linkedChatId = linkedChatId;
            this.directMessagesChatId = directMessagesChatId;
            this.slowModeDelay = slowModeDelay;
            this.slowModeDelayExpiresIn = slowModeDelayExpiresIn;
            this.canEnablePaidMessages = canEnablePaidMessages;
            this.canEnablePaidReaction = canEnablePaidReaction;
            this.canGetMembers = canGetMembers;
            this.hasHiddenMembers = hasHiddenMembers;
            this.canHideMembers = canHideMembers;
            this.canSetStickerSet = canSetStickerSet;
            this.canSetLocation = canSetLocation;
            this.canGetStatistics = canGetStatistics;
            this.canGetRevenueStatistics = canGetRevenueStatistics;
            this.canGetStarRevenueStatistics = canGetStarRevenueStatistics;
            this.canSendGift = canSendGift;
            this.canToggleAggressiveAntiSpam = canToggleAggressiveAntiSpam;
            this.isAllHistoryAvailable = isAllHistoryAvailable;
            this.canHaveSponsoredMessages = canHaveSponsoredMessages;
            this.hasAggressiveAntiSpamEnabled = hasAggressiveAntiSpamEnabled;
            this.hasPaidMediaAllowed = hasPaidMediaAllowed;
            this.hasPinnedStories = hasPinnedStories;
            this.giftCount = giftCount;
            this.myBoostCount = myBoostCount;
            this.unrestrictBoostCount = unrestrictBoostCount;
            this.outgoingPaidMessageStarCount = outgoingPaidMessageStarCount;
            this.stickerSetId = stickerSetId;
            this.customEmojiStickerSetId = customEmojiStickerSetId;
            this.location = location;
            this.inviteLink = inviteLink;
            this.botCommands = botCommands;
            this.botVerification = botVerification;
            this.mainProfileTab = mainProfileTab;
            this.upgradedFromBasicGroupId = upgradedFromBasicGroupId;
            this.upgradedFromMaxMessageId = upgradedFromMaxMessageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -497664769;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Specifies the kind of chat members to return in getSupergroupMembers.
     */
    public abstract static class SupergroupMembersFilter extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            SupergroupMembersFilterRecent.CONSTRUCTOR,
            SupergroupMembersFilterContacts.CONSTRUCTOR,
            SupergroupMembersFilterAdministrators.CONSTRUCTOR,
            SupergroupMembersFilterSearch.CONSTRUCTOR,
            SupergroupMembersFilterRestricted.CONSTRUCTOR,
            SupergroupMembersFilterBanned.CONSTRUCTOR,
            SupergroupMembersFilterMention.CONSTRUCTOR,
            SupergroupMembersFilterBots.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public SupergroupMembersFilter() {
        }
    }

    /**
     * Returns recently active users in reverse chronological order.
     */
    public static class SupergroupMembersFilterRecent extends SupergroupMembersFilter {

        /**
         * Returns recently active users in reverse chronological order.
         */
        public SupergroupMembersFilterRecent() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1178199509;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns contacts of the user, which are members of the supergroup or channel.
     */
    public static class SupergroupMembersFilterContacts extends SupergroupMembersFilter {
        /**
         * Query to search for.
         */
        public String query;

        /**
         * Returns contacts of the user, which are members of the supergroup or channel.
         */
        public SupergroupMembersFilterContacts() {
        }

        /**
         * Returns contacts of the user, which are members of the supergroup or channel.
         *
         * @param query Query to search for.
         */
        public SupergroupMembersFilterContacts(String query) {
            this.query = query;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1282910856;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the owner and administrators.
     */
    public static class SupergroupMembersFilterAdministrators extends SupergroupMembersFilter {

        /**
         * Returns the owner and administrators.
         */
        public SupergroupMembersFilterAdministrators() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2097380265;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Used to search for supergroup or channel members via a (string) query.
     */
    public static class SupergroupMembersFilterSearch extends SupergroupMembersFilter {
        /**
         * Query to search for.
         */
        public String query;

        /**
         * Used to search for supergroup or channel members via a (string) query.
         */
        public SupergroupMembersFilterSearch() {
        }

        /**
         * Used to search for supergroup or channel members via a (string) query.
         *
         * @param query Query to search for.
         */
        public SupergroupMembersFilterSearch(String query) {
            this.query = query;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1696358469;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns restricted supergroup members; can be used only by administrators.
     */
    public static class SupergroupMembersFilterRestricted extends SupergroupMembersFilter {
        /**
         * Query to search for.
         */
        public String query;

        /**
         * Returns restricted supergroup members; can be used only by administrators.
         */
        public SupergroupMembersFilterRestricted() {
        }

        /**
         * Returns restricted supergroup members; can be used only by administrators.
         *
         * @param query Query to search for.
         */
        public SupergroupMembersFilterRestricted(String query) {
            this.query = query;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1107800034;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns users banned from the supergroup or channel; can be used only by administrators.
     */
    public static class SupergroupMembersFilterBanned extends SupergroupMembersFilter {
        /**
         * Query to search for.
         */
        public String query;

        /**
         * Returns users banned from the supergroup or channel; can be used only by administrators.
         */
        public SupergroupMembersFilterBanned() {
        }

        /**
         * Returns users banned from the supergroup or channel; can be used only by administrators.
         *
         * @param query Query to search for.
         */
        public SupergroupMembersFilterBanned(String query) {
            this.query = query;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1210621683;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns users which can be mentioned in the supergroup.
     */
    public static class SupergroupMembersFilterMention extends SupergroupMembersFilter {
        /**
         * Query to search for.
         */
        public String query;
        /**
         * Identifier of the topic in which the users will be mentioned; pass null if none.
         */
        public MessageTopic topicId;

        /**
         * Returns users which can be mentioned in the supergroup.
         */
        public SupergroupMembersFilterMention() {
        }

        /**
         * Returns users which can be mentioned in the supergroup.
         *
         * @param query Query to search for.
         * @param topicId Identifier of the topic in which the users will be mentioned; pass null if none.
         */
        public SupergroupMembersFilterMention(String query, MessageTopic topicId) {
            this.query = query;
            this.topicId = topicId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1151301973;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns bot members of the supergroup or channel.
     */
    public static class SupergroupMembersFilterBots extends SupergroupMembersFilter {

        /**
         * Returns bot members of the supergroup or channel.
         */
        public SupergroupMembersFilterBots() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 492138918;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a URL linking to an internal Telegram entity.
     */
    public static class TMeUrl extends Object {
        /**
         * URL.
         */
        public String url;
        /**
         * Type of the URL.
         */
        public TMeUrlType type;

        /**
         * Represents a URL linking to an internal Telegram entity.
         */
        public TMeUrl() {
        }

        /**
         * Represents a URL linking to an internal Telegram entity.
         *
         * @param url URL.
         * @param type Type of the URL.
         */
        public TMeUrl(String url, TMeUrlType type) {
            this.url = url;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1140786622;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the type of URL linking to an internal Telegram entity.
     */
    public abstract static class TMeUrlType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            TMeUrlTypeUser.CONSTRUCTOR,
            TMeUrlTypeSupergroup.CONSTRUCTOR,
            TMeUrlTypeChatInvite.CONSTRUCTOR,
            TMeUrlTypeStickerSet.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public TMeUrlType() {
        }
    }

    /**
     * A URL linking to a user.
     */
    public static class TMeUrlTypeUser extends TMeUrlType {
        /**
         * Identifier of the user.
         */
        public long userId;

        /**
         * A URL linking to a user.
         */
        public TMeUrlTypeUser() {
        }

        /**
         * A URL linking to a user.
         *
         * @param userId Identifier of the user.
         */
        public TMeUrlTypeUser(long userId) {
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 125336602;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A URL linking to a public supergroup or channel.
     */
    public static class TMeUrlTypeSupergroup extends TMeUrlType {
        /**
         * Identifier of the supergroup or channel.
         */
        public long supergroupId;

        /**
         * A URL linking to a public supergroup or channel.
         */
        public TMeUrlTypeSupergroup() {
        }

        /**
         * A URL linking to a public supergroup or channel.
         *
         * @param supergroupId Identifier of the supergroup or channel.
         */
        public TMeUrlTypeSupergroup(long supergroupId) {
            this.supergroupId = supergroupId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1353369944;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat invite link.
     */
    public static class TMeUrlTypeChatInvite extends TMeUrlType {
        /**
         * Information about the chat invite link.
         */
        public ChatInviteLinkInfo info;

        /**
         * A chat invite link.
         */
        public TMeUrlTypeChatInvite() {
        }

        /**
         * A chat invite link.
         *
         * @param info Information about the chat invite link.
         */
        public TMeUrlTypeChatInvite(ChatInviteLinkInfo info) {
            this.info = info;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 313907785;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A URL linking to a sticker set.
     */
    public static class TMeUrlTypeStickerSet extends TMeUrlType {
        /**
         * Identifier of the sticker set.
         */
        public long stickerSetId;

        /**
         * A URL linking to a sticker set.
         */
        public TMeUrlTypeStickerSet() {
        }

        /**
         * A URL linking to a sticker set.
         *
         * @param stickerSetId Identifier of the sticker set.
         */
        public TMeUrlTypeStickerSet(long stickerSetId) {
            this.stickerSetId = stickerSetId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1602473196;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of t.me URLs.
     */
    public static class TMeUrls extends Object {
        /**
         * List of URLs.
         */
        public TMeUrl[] urls;

        /**
         * Contains a list of t.me URLs.
         */
        public TMeUrls() {
        }

        /**
         * Contains a list of t.me URLs.
         *
         * @param urls List of URLs.
         */
        public TMeUrls(TMeUrl[] urls) {
            this.urls = urls;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1130595098;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the target chat to be opened.
     */
    public abstract static class TargetChat extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            TargetChatCurrent.CONSTRUCTOR,
            TargetChatChosen.CONSTRUCTOR,
            TargetChatInternalLink.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public TargetChat() {
        }
    }

    /**
     * The currently opened chat and forum topic must be kept.
     */
    public static class TargetChatCurrent extends TargetChat {

        /**
         * The currently opened chat and forum topic must be kept.
         */
        public TargetChatCurrent() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -416689904;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat needs to be chosen by the user among chats of the specified types.
     */
    public static class TargetChatChosen extends TargetChat {
        /**
         * Allowed types for the chat.
         */
        public TargetChatTypes types;

        /**
         * The chat needs to be chosen by the user among chats of the specified types.
         */
        public TargetChatChosen() {
        }

        /**
         * The chat needs to be chosen by the user among chats of the specified types.
         *
         * @param types Allowed types for the chat.
         */
        public TargetChatChosen(TargetChatTypes types) {
            this.types = types;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1392978522;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat needs to be open with the provided internal link.
     */
    public static class TargetChatInternalLink extends TargetChat {
        /**
         * An internal link pointing to the chat.
         */
        public InternalLinkType link;

        /**
         * The chat needs to be open with the provided internal link.
         */
        public TargetChatInternalLink() {
        }

        /**
         * The chat needs to be open with the provided internal link.
         *
         * @param link An internal link pointing to the chat.
         */
        public TargetChatInternalLink(InternalLinkType link) {
            this.link = link;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -579301408;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes allowed types for the target chat.
     */
    public static class TargetChatTypes extends Object {
        /**
         * True, if private chats with ordinary users are allowed.
         */
        public boolean allowUserChats;
        /**
         * True, if private chats with other bots are allowed.
         */
        public boolean allowBotChats;
        /**
         * True, if basic group and supergroup chats are allowed.
         */
        public boolean allowGroupChats;
        /**
         * True, if channel chats are allowed.
         */
        public boolean allowChannelChats;

        /**
         * Describes allowed types for the target chat.
         */
        public TargetChatTypes() {
        }

        /**
         * Describes allowed types for the target chat.
         *
         * @param allowUserChats True, if private chats with ordinary users are allowed.
         * @param allowBotChats True, if private chats with other bots are allowed.
         * @param allowGroupChats True, if basic group and supergroup chats are allowed.
         * @param allowChannelChats True, if channel chats are allowed.
         */
        public TargetChatTypes(boolean allowUserChats, boolean allowBotChats, boolean allowGroupChats, boolean allowChannelChats) {
            this.allowUserChats = allowUserChats;
            this.allowBotChats = allowBotChats;
            this.allowGroupChats = allowGroupChats;
            this.allowChannelChats = allowChannelChats;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1513098833;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes a purpose of a payment toward Telegram.
     */
    public abstract static class TelegramPaymentPurpose extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            TelegramPaymentPurposePremiumGift.CONSTRUCTOR,
            TelegramPaymentPurposePremiumGiftCodes.CONSTRUCTOR,
            TelegramPaymentPurposePremiumGiveaway.CONSTRUCTOR,
            TelegramPaymentPurposeStars.CONSTRUCTOR,
            TelegramPaymentPurposeGiftedStars.CONSTRUCTOR,
            TelegramPaymentPurposeStarGiveaway.CONSTRUCTOR,
            TelegramPaymentPurposeJoinChat.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public TelegramPaymentPurpose() {
        }
    }

    /**
     * The user gifting Telegram Premium to another user.
     */
    public static class TelegramPaymentPurposePremiumGift extends TelegramPaymentPurpose {
        /**
         * ISO 4217 currency code of the payment currency, or &quot;XTR&quot; for payments in Telegram Stars.
         */
        public String currency;
        /**
         * Paid amount, in the smallest units of the currency.
         */
        public long amount;
        /**
         * Identifier of the user which will receive Telegram Premium.
         */
        public long userId;
        /**
         * Number of months the Telegram Premium subscription will be active for the user.
         */
        public int monthCount;
        /**
         * Text to show to the user receiving Telegram Premium; 0-getOption(&quot;gift_text_length_max&quot;) characters. Only Bold, Italic, Underline, Strikethrough, Spoiler, CustomEmoji, and DateTime entities are allowed.
         */
        public FormattedText text;

        /**
         * The user gifting Telegram Premium to another user.
         */
        public TelegramPaymentPurposePremiumGift() {
        }

        /**
         * The user gifting Telegram Premium to another user.
         *
         * @param currency ISO 4217 currency code of the payment currency, or &quot;XTR&quot; for payments in Telegram Stars.
         * @param amount Paid amount, in the smallest units of the currency.
         * @param userId Identifier of the user which will receive Telegram Premium.
         * @param monthCount Number of months the Telegram Premium subscription will be active for the user.
         * @param text Text to show to the user receiving Telegram Premium; 0-getOption(&quot;gift_text_length_max&quot;) characters. Only Bold, Italic, Underline, Strikethrough, Spoiler, CustomEmoji, and DateTime entities are allowed.
         */
        public TelegramPaymentPurposePremiumGift(String currency, long amount, long userId, int monthCount, FormattedText text) {
            this.currency = currency;
            this.amount = amount;
            this.userId = userId;
            this.monthCount = monthCount;
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1600286150;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user boosting a chat by creating Telegram Premium gift codes for other users.
     */
    public static class TelegramPaymentPurposePremiumGiftCodes extends TelegramPaymentPurpose {
        /**
         * Identifier of the supergroup or channel chat, which will be automatically boosted by the users for duration of the Premium subscription and which is administered by the user.
         */
        public long boostedChatId;
        /**
         * ISO 4217 currency code of the payment currency.
         */
        public String currency;
        /**
         * Paid amount, in the smallest units of the currency.
         */
        public long amount;
        /**
         * Identifiers of the users which can activate the gift codes.
         */
        public long[] userIds;
        /**
         * Number of months the Telegram Premium subscription will be active for the users.
         */
        public int monthCount;
        /**
         * Text to show along with the gift codes; 0-getOption(&quot;gift_text_length_max&quot;) characters. Only Bold, Italic, Underline, Strikethrough, Spoiler, CustomEmoji, and DateTime entities are allowed.
         */
        public FormattedText text;

        /**
         * The user boosting a chat by creating Telegram Premium gift codes for other users.
         */
        public TelegramPaymentPurposePremiumGiftCodes() {
        }

        /**
         * The user boosting a chat by creating Telegram Premium gift codes for other users.
         *
         * @param boostedChatId Identifier of the supergroup or channel chat, which will be automatically boosted by the users for duration of the Premium subscription and which is administered by the user.
         * @param currency ISO 4217 currency code of the payment currency.
         * @param amount Paid amount, in the smallest units of the currency.
         * @param userIds Identifiers of the users which can activate the gift codes.
         * @param monthCount Number of months the Telegram Premium subscription will be active for the users.
         * @param text Text to show along with the gift codes; 0-getOption(&quot;gift_text_length_max&quot;) characters. Only Bold, Italic, Underline, Strikethrough, Spoiler, CustomEmoji, and DateTime entities are allowed.
         */
        public TelegramPaymentPurposePremiumGiftCodes(long boostedChatId, String currency, long amount, long[] userIds, int monthCount, FormattedText text) {
            this.boostedChatId = boostedChatId;
            this.currency = currency;
            this.amount = amount;
            this.userIds = userIds;
            this.monthCount = monthCount;
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1863495348;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user creating a Telegram Premium giveaway.
     */
    public static class TelegramPaymentPurposePremiumGiveaway extends TelegramPaymentPurpose {
        /**
         * Giveaway parameters.
         */
        public GiveawayParameters parameters;
        /**
         * ISO 4217 currency code of the payment currency.
         */
        public String currency;
        /**
         * Paid amount, in the smallest units of the currency.
         */
        public long amount;
        /**
         * Number of users which will be able to activate the gift codes.
         */
        public int winnerCount;
        /**
         * Number of months the Telegram Premium subscription will be active for the users.
         */
        public int monthCount;

        /**
         * The user creating a Telegram Premium giveaway.
         */
        public TelegramPaymentPurposePremiumGiveaway() {
        }

        /**
         * The user creating a Telegram Premium giveaway.
         *
         * @param parameters Giveaway parameters.
         * @param currency ISO 4217 currency code of the payment currency.
         * @param amount Paid amount, in the smallest units of the currency.
         * @param winnerCount Number of users which will be able to activate the gift codes.
         * @param monthCount Number of months the Telegram Premium subscription will be active for the users.
         */
        public TelegramPaymentPurposePremiumGiveaway(GiveawayParameters parameters, String currency, long amount, int winnerCount, int monthCount) {
            this.parameters = parameters;
            this.currency = currency;
            this.amount = amount;
            this.winnerCount = winnerCount;
            this.monthCount = monthCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -760757441;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user buying Telegram Stars.
     */
    public static class TelegramPaymentPurposeStars extends TelegramPaymentPurpose {
        /**
         * ISO 4217 currency code of the payment currency.
         */
        public String currency;
        /**
         * Paid amount, in the smallest units of the currency.
         */
        public long amount;
        /**
         * Number of bought Telegram Stars.
         */
        public long starCount;
        /**
         * Identifier of the chat that is supposed to receive the Telegram Stars; pass 0 if none.
         */
        public long chatId;

        /**
         * The user buying Telegram Stars.
         */
        public TelegramPaymentPurposeStars() {
        }

        /**
         * The user buying Telegram Stars.
         *
         * @param currency ISO 4217 currency code of the payment currency.
         * @param amount Paid amount, in the smallest units of the currency.
         * @param starCount Number of bought Telegram Stars.
         * @param chatId Identifier of the chat that is supposed to receive the Telegram Stars; pass 0 if none.
         */
        public TelegramPaymentPurposeStars(String currency, long amount, long starCount, long chatId) {
            this.currency = currency;
            this.amount = amount;
            this.starCount = starCount;
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1204968037;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user buying Telegram Stars for other users.
     */
    public static class TelegramPaymentPurposeGiftedStars extends TelegramPaymentPurpose {
        /**
         * Identifier of the user to which Telegram Stars are gifted.
         */
        public long userId;
        /**
         * ISO 4217 currency code of the payment currency.
         */
        public String currency;
        /**
         * Paid amount, in the smallest units of the currency.
         */
        public long amount;
        /**
         * Number of bought Telegram Stars.
         */
        public long starCount;

        /**
         * The user buying Telegram Stars for other users.
         */
        public TelegramPaymentPurposeGiftedStars() {
        }

        /**
         * The user buying Telegram Stars for other users.
         *
         * @param userId Identifier of the user to which Telegram Stars are gifted.
         * @param currency ISO 4217 currency code of the payment currency.
         * @param amount Paid amount, in the smallest units of the currency.
         * @param starCount Number of bought Telegram Stars.
         */
        public TelegramPaymentPurposeGiftedStars(long userId, String currency, long amount, long starCount) {
            this.userId = userId;
            this.currency = currency;
            this.amount = amount;
            this.starCount = starCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1850308042;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user creating a Telegram Star giveaway.
     */
    public static class TelegramPaymentPurposeStarGiveaway extends TelegramPaymentPurpose {
        /**
         * Giveaway parameters.
         */
        public GiveawayParameters parameters;
        /**
         * ISO 4217 currency code of the payment currency.
         */
        public String currency;
        /**
         * Paid amount, in the smallest units of the currency.
         */
        public long amount;
        /**
         * The number of users to receive Telegram Stars.
         */
        public int winnerCount;
        /**
         * The number of Telegram Stars to be distributed through the giveaway.
         */
        public long starCount;

        /**
         * The user creating a Telegram Star giveaway.
         */
        public TelegramPaymentPurposeStarGiveaway() {
        }

        /**
         * The user creating a Telegram Star giveaway.
         *
         * @param parameters Giveaway parameters.
         * @param currency ISO 4217 currency code of the payment currency.
         * @param amount Paid amount, in the smallest units of the currency.
         * @param winnerCount The number of users to receive Telegram Stars.
         * @param starCount The number of Telegram Stars to be distributed through the giveaway.
         */
        public TelegramPaymentPurposeStarGiveaway(GiveawayParameters parameters, String currency, long amount, int winnerCount, long starCount) {
            this.parameters = parameters;
            this.currency = currency;
            this.amount = amount;
            this.winnerCount = winnerCount;
            this.starCount = starCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1014604689;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user joins a chat and subscribes to regular payments in Telegram Stars.
     */
    public static class TelegramPaymentPurposeJoinChat extends TelegramPaymentPurpose {
        /**
         * Invite link to use.
         */
        public String inviteLink;

        /**
         * The user joins a chat and subscribes to regular payments in Telegram Stars.
         */
        public TelegramPaymentPurposeJoinChat() {
        }

        /**
         * The user joins a chat and subscribes to regular payments in Telegram Stars.
         *
         * @param inviteLink Invite link to use.
         */
        public TelegramPaymentPurposeJoinChat(String inviteLink) {
            this.inviteLink = inviteLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1914869880;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about the availability of a temporary password, which can be used for payments.
     */
    public static class TemporaryPasswordState extends Object {
        /**
         * True, if a temporary password is available.
         */
        public boolean hasPassword;
        /**
         * Time left before the temporary password expires, in seconds.
         */
        public int validFor;

        /**
         * Returns information about the availability of a temporary password, which can be used for payments.
         */
        public TemporaryPasswordState() {
        }

        /**
         * Returns information about the availability of a temporary password, which can be used for payments.
         *
         * @param hasPassword True, if a temporary password is available.
         * @param validFor Time left before the temporary password expires, in seconds.
         */
        public TemporaryPasswordState(boolean hasPassword, int validFor) {
            this.hasPassword = hasPassword;
            this.validFor = validFor;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 939837410;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains Telegram terms of service.
     */
    public static class TermsOfService extends Object {
        /**
         * Text of the terms of service.
         */
        public FormattedText text;
        /**
         * The minimum age of a user to be able to accept the terms; 0 if age isn't restricted.
         */
        public int minUserAge;
        /**
         * True, if a blocking popup with terms of service must be shown to the user.
         */
        public boolean showPopup;

        /**
         * Contains Telegram terms of service.
         */
        public TermsOfService() {
        }

        /**
         * Contains Telegram terms of service.
         *
         * @param text Text of the terms of service.
         * @param minUserAge The minimum age of a user to be able to accept the terms; 0 if age isn't restricted.
         * @param showPopup True, if a blocking popup with terms of service must be shown to the user.
         */
        public TermsOfService(FormattedText text, int minUserAge, boolean showPopup) {
            this.text = text;
            this.minUserAge = minUserAge;
            this.showPopup = showPopup;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 739422597;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A simple object containing a sequence of bytes; for testing only.
     */
    public static class TestBytes extends Object {
        /**
         * Bytes.
         */
        public byte[] value;

        /**
         * A simple object containing a sequence of bytes; for testing only.
         */
        public TestBytes() {
        }

        /**
         * A simple object containing a sequence of bytes; for testing only.
         *
         * @param value Bytes.
         */
        public TestBytes(byte[] value) {
            this.value = value;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1541225250;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A simple object containing a number; for testing only.
     */
    public static class TestInt extends Object {
        /**
         * Number.
         */
        public int value;

        /**
         * A simple object containing a number; for testing only.
         */
        public TestInt() {
        }

        /**
         * A simple object containing a number; for testing only.
         *
         * @param value Number.
         */
        public TestInt(int value) {
            this.value = value;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -574804983;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A simple object containing a string; for testing only.
     */
    public static class TestString extends Object {
        /**
         * String.
         */
        public String value;

        /**
         * A simple object containing a string; for testing only.
         */
        public TestString() {
        }

        /**
         * A simple object containing a string; for testing only.
         *
         * @param value String.
         */
        public TestString(String value) {
            this.value = value;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -27891572;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A simple object containing a vector of numbers; for testing only.
     */
    public static class TestVectorInt extends Object {
        /**
         * Vector of numbers.
         */
        public int[] value;

        /**
         * A simple object containing a vector of numbers; for testing only.
         */
        public TestVectorInt() {
        }

        /**
         * A simple object containing a vector of numbers; for testing only.
         *
         * @param value Vector of numbers.
         */
        public TestVectorInt(int[] value) {
            this.value = value;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 593682027;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A simple object containing a vector of objects that hold a number; for testing only.
     */
    public static class TestVectorIntObject extends Object {
        /**
         * Vector of objects.
         */
        public TestInt[] value;

        /**
         * A simple object containing a vector of objects that hold a number; for testing only.
         */
        public TestVectorIntObject() {
        }

        /**
         * A simple object containing a vector of objects that hold a number; for testing only.
         *
         * @param value Vector of objects.
         */
        public TestVectorIntObject(TestInt[] value) {
            this.value = value;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 125891546;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A simple object containing a vector of strings; for testing only.
     */
    public static class TestVectorString extends Object {
        /**
         * Vector of strings.
         */
        public String[] value;

        /**
         * A simple object containing a vector of strings; for testing only.
         */
        public TestVectorString() {
        }

        /**
         * A simple object containing a vector of strings; for testing only.
         *
         * @param value Vector of strings.
         */
        public TestVectorString(String[] value) {
            this.value = value;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 79339995;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A simple object containing a vector of objects that hold a string; for testing only.
     */
    public static class TestVectorStringObject extends Object {
        /**
         * Vector of objects.
         */
        public TestString[] value;

        /**
         * A simple object containing a vector of objects that hold a string; for testing only.
         */
        public TestVectorStringObject() {
        }

        /**
         * A simple object containing a vector of objects that hold a string; for testing only.
         *
         * @param value Vector of objects.
         */
        public TestVectorStringObject(TestString[] value) {
            this.value = value;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 80780537;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains some text.
     */
    public static class Text extends Object {
        /**
         * Text.
         */
        public String text;

        /**
         * Contains some text.
         */
        public Text() {
        }

        /**
         * Contains some text.
         *
         * @param text Text.
         */
        public Text(String text) {
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 578181272;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a style that can be used to compose a text.
     */
    public static class TextCompositionStyle extends Object {
        /**
         * Name of the style.
         */
        public String name;
        /**
         * Identifier of the custom emoji corresponding to the style; 0 if none.
         */
        public long customEmojiId;
        /**
         * Title of the style in the user application's language.
         */
        public String title;
        /**
         * True, if the style is created by a user.
         */
        public boolean isCustom;
        /**
         * True, if the user is creator of the style.
         */
        public boolean isCreator;
        /**
         * Number of users that installed the style; for created custom styles only; 0 if unknown.
         */
        public int installCount;
        /**
         * Prompt of the style; for created custom styles only.
         */
        public String prompt;
        /**
         * User identifier of the creator of the style; 0 if none of unknown.
         */
        public long creatorUserId;
        /**
         * Example of the style usage in English; may be null if unknown.
         */
        @Nullable public TextCompositionStyleExample englishExample;

        /**
         * Describes a style that can be used to compose a text.
         */
        public TextCompositionStyle() {
        }

        /**
         * Describes a style that can be used to compose a text.
         *
         * @param name Name of the style.
         * @param customEmojiId Identifier of the custom emoji corresponding to the style; 0 if none.
         * @param title Title of the style in the user application's language.
         * @param isCustom True, if the style is created by a user.
         * @param isCreator True, if the user is creator of the style.
         * @param installCount Number of users that installed the style; for created custom styles only; 0 if unknown.
         * @param prompt Prompt of the style; for created custom styles only.
         * @param creatorUserId User identifier of the creator of the style; 0 if none of unknown.
         * @param englishExample Example of the style usage in English; may be null if unknown.
         */
        public TextCompositionStyle(String name, long customEmojiId, String title, boolean isCustom, boolean isCreator, int installCount, String prompt, long creatorUserId, TextCompositionStyleExample englishExample) {
            this.name = name;
            this.customEmojiId = customEmojiId;
            this.title = title;
            this.isCustom = isCustom;
            this.isCreator = isCreator;
            this.installCount = installCount;
            this.prompt = prompt;
            this.creatorUserId = creatorUserId;
            this.englishExample = englishExample;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -171516397;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains an example of text composition style usage.
     */
    public static class TextCompositionStyleExample extends Object {
        /**
         * Source text.
         */
        public FormattedText sourceText;
        /**
         * The text after the style was applied to the source text.
         */
        public FormattedText resultText;

        /**
         * Contains an example of text composition style usage.
         */
        public TextCompositionStyleExample() {
        }

        /**
         * Contains an example of text composition style usage.
         *
         * @param sourceText Source text.
         * @param resultText The text after the style was applied to the source text.
         */
        public TextCompositionStyleExample(FormattedText sourceText, FormattedText resultText) {
            this.sourceText = sourceText;
            this.resultText = resultText;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -43329922;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of text entities.
     */
    public static class TextEntities extends Object {
        /**
         * List of text entities.
         */
        public TextEntity[] entities;

        /**
         * Contains a list of text entities.
         */
        public TextEntities() {
        }

        /**
         * Contains a list of text entities.
         *
         * @param entities List of text entities.
         */
        public TextEntities(TextEntity[] entities) {
            this.entities = entities;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -933199172;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a part of the text that needs to be formatted in some unusual way.
     */
    public static class TextEntity extends Object {
        /**
         * Offset of the entity, in UTF-16 code units.
         */
        public int offset;
        /**
         * Length of the entity, in UTF-16 code units.
         */
        public int length;
        /**
         * Type of the entity.
         */
        public TextEntityType type;

        /**
         * Represents a part of the text that needs to be formatted in some unusual way.
         */
        public TextEntity() {
        }

        /**
         * Represents a part of the text that needs to be formatted in some unusual way.
         *
         * @param offset Offset of the entity, in UTF-16 code units.
         * @param length Length of the entity, in UTF-16 code units.
         * @param type Type of the entity.
         */
        public TextEntity(int offset, int length, TextEntityType type) {
            this.offset = offset;
            this.length = length;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1951688280;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents a part of the text which must be formatted differently.
     */
    public abstract static class TextEntityType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            TextEntityTypeMention.CONSTRUCTOR,
            TextEntityTypeHashtag.CONSTRUCTOR,
            TextEntityTypeCashtag.CONSTRUCTOR,
            TextEntityTypeBotCommand.CONSTRUCTOR,
            TextEntityTypeUrl.CONSTRUCTOR,
            TextEntityTypeEmailAddress.CONSTRUCTOR,
            TextEntityTypePhoneNumber.CONSTRUCTOR,
            TextEntityTypeBankCardNumber.CONSTRUCTOR,
            TextEntityTypeBold.CONSTRUCTOR,
            TextEntityTypeItalic.CONSTRUCTOR,
            TextEntityTypeUnderline.CONSTRUCTOR,
            TextEntityTypeStrikethrough.CONSTRUCTOR,
            TextEntityTypeSpoiler.CONSTRUCTOR,
            TextEntityTypeCode.CONSTRUCTOR,
            TextEntityTypePre.CONSTRUCTOR,
            TextEntityTypePreCode.CONSTRUCTOR,
            TextEntityTypeBlockQuote.CONSTRUCTOR,
            TextEntityTypeExpandableBlockQuote.CONSTRUCTOR,
            TextEntityTypeTextUrl.CONSTRUCTOR,
            TextEntityTypeMentionName.CONSTRUCTOR,
            TextEntityTypeCustomEmoji.CONSTRUCTOR,
            TextEntityTypeMediaTimestamp.CONSTRUCTOR,
            TextEntityTypeDateTime.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public TextEntityType() {
        }
    }

    /**
     * A mention of a user, a supergroup, or a channel by their username.
     */
    public static class TextEntityTypeMention extends TextEntityType {

        /**
         * A mention of a user, a supergroup, or a channel by their username.
         */
        public TextEntityTypeMention() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 934535013;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A hashtag text, beginning with &quot;#&quot; and optionally containing a chat username at the end.
     */
    public static class TextEntityTypeHashtag extends TextEntityType {

        /**
         * A hashtag text, beginning with &quot;#&quot; and optionally containing a chat username at the end.
         */
        public TextEntityTypeHashtag() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1023958307;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A cashtag text, beginning with &quot;$&quot;, consisting of capital English letters (e.g., &quot;$USD&quot;), and optionally containing a chat username at the end.
     */
    public static class TextEntityTypeCashtag extends TextEntityType {

        /**
         * A cashtag text, beginning with &quot;$&quot;, consisting of capital English letters (e.g., &quot;$USD&quot;), and optionally containing a chat username at the end.
         */
        public TextEntityTypeCashtag() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1222915915;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A bot command, beginning with &quot;/&quot;.
     */
    public static class TextEntityTypeBotCommand extends TextEntityType {

        /**
         * A bot command, beginning with &quot;/&quot;.
         */
        public TextEntityTypeBotCommand() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1150997581;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An HTTP URL.
     */
    public static class TextEntityTypeUrl extends TextEntityType {

        /**
         * An HTTP URL.
         */
        public TextEntityTypeUrl() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1312762756;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An email address.
     */
    public static class TextEntityTypeEmailAddress extends TextEntityType {

        /**
         * An email address.
         */
        public TextEntityTypeEmailAddress() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1425545249;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A phone number.
     */
    public static class TextEntityTypePhoneNumber extends TextEntityType {

        /**
         * A phone number.
         */
        public TextEntityTypePhoneNumber() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1160140246;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A bank card number. The getBankCardInfo method can be used to get information about the bank card.
     */
    public static class TextEntityTypeBankCardNumber extends TextEntityType {

        /**
         * A bank card number. The getBankCardInfo method can be used to get information about the bank card.
         */
        public TextEntityTypeBankCardNumber() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 105986320;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A bold text.
     */
    public static class TextEntityTypeBold extends TextEntityType {

        /**
         * A bold text.
         */
        public TextEntityTypeBold() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1128210000;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An italic text.
     */
    public static class TextEntityTypeItalic extends TextEntityType {

        /**
         * An italic text.
         */
        public TextEntityTypeItalic() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -118253987;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An underlined text.
     */
    public static class TextEntityTypeUnderline extends TextEntityType {

        /**
         * An underlined text.
         */
        public TextEntityTypeUnderline() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 792317842;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A strikethrough text.
     */
    public static class TextEntityTypeStrikethrough extends TextEntityType {

        /**
         * A strikethrough text.
         */
        public TextEntityTypeStrikethrough() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 961529082;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A spoiler text.
     */
    public static class TextEntityTypeSpoiler extends TextEntityType {

        /**
         * A spoiler text.
         */
        public TextEntityTypeSpoiler() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 544019899;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Text that must be formatted as if inside a code HTML tag.
     */
    public static class TextEntityTypeCode extends TextEntityType {

        /**
         * Text that must be formatted as if inside a code HTML tag.
         */
        public TextEntityTypeCode() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -974534326;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Text that must be formatted as if inside a pre HTML tag.
     */
    public static class TextEntityTypePre extends TextEntityType {

        /**
         * Text that must be formatted as if inside a pre HTML tag.
         */
        public TextEntityTypePre() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1648958606;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Text that must be formatted as if inside pre, and code HTML tags.
     */
    public static class TextEntityTypePreCode extends TextEntityType {
        /**
         * Programming language of the code; as defined by the sender.
         */
        public String language;

        /**
         * Text that must be formatted as if inside pre, and code HTML tags.
         */
        public TextEntityTypePreCode() {
        }

        /**
         * Text that must be formatted as if inside pre, and code HTML tags.
         *
         * @param language Programming language of the code; as defined by the sender.
         */
        public TextEntityTypePreCode(String language) {
            this.language = language;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -945325397;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Text that must be formatted as if inside a blockquote HTML tag; not supported in secret chats.
     */
    public static class TextEntityTypeBlockQuote extends TextEntityType {

        /**
         * Text that must be formatted as if inside a blockquote HTML tag; not supported in secret chats.
         */
        public TextEntityTypeBlockQuote() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1003999032;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Text that must be formatted as if inside a blockquote HTML tag and collapsed by default to 3 lines with the ability to show full text; not supported in secret chats.
     */
    public static class TextEntityTypeExpandableBlockQuote extends TextEntityType {

        /**
         * Text that must be formatted as if inside a blockquote HTML tag and collapsed by default to 3 lines with the ability to show full text; not supported in secret chats.
         */
        public TextEntityTypeExpandableBlockQuote() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 36572261;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A text description shown instead of a raw URL.
     */
    public static class TextEntityTypeTextUrl extends TextEntityType {
        /**
         * HTTP or tg:// URL to be opened when the link is clicked.
         */
        public String url;

        /**
         * A text description shown instead of a raw URL.
         */
        public TextEntityTypeTextUrl() {
        }

        /**
         * A text description shown instead of a raw URL.
         *
         * @param url HTTP or tg:// URL to be opened when the link is clicked.
         */
        public TextEntityTypeTextUrl(String url) {
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 445719651;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A text shows instead of a raw mention of the user (e.g., when the user has no username).
     */
    public static class TextEntityTypeMentionName extends TextEntityType {
        /**
         * Identifier of the mentioned user.
         */
        public long userId;

        /**
         * A text shows instead of a raw mention of the user (e.g., when the user has no username).
         */
        public TextEntityTypeMentionName() {
        }

        /**
         * A text shows instead of a raw mention of the user (e.g., when the user has no username).
         *
         * @param userId Identifier of the mentioned user.
         */
        public TextEntityTypeMentionName(long userId) {
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1570974289;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A custom emoji. The text behind a custom emoji must be an emoji. Only premium users can use premium custom emoji.
     */
    public static class TextEntityTypeCustomEmoji extends TextEntityType {
        /**
         * Unique identifier of the custom emoji.
         */
        public long customEmojiId;

        /**
         * A custom emoji. The text behind a custom emoji must be an emoji. Only premium users can use premium custom emoji.
         */
        public TextEntityTypeCustomEmoji() {
        }

        /**
         * A custom emoji. The text behind a custom emoji must be an emoji. Only premium users can use premium custom emoji.
         *
         * @param customEmojiId Unique identifier of the custom emoji.
         */
        public TextEntityTypeCustomEmoji(long customEmojiId) {
            this.customEmojiId = customEmojiId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1724820677;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A media timestamp.
     */
    public static class TextEntityTypeMediaTimestamp extends TextEntityType {
        /**
         * Timestamp from which a video/audio/video note/voice note/story playing must start, in seconds. The media can be in the content or the link preview of the current message, or in the same places in the replied message.
         */
        public int mediaTimestamp;

        /**
         * A media timestamp.
         */
        public TextEntityTypeMediaTimestamp() {
        }

        /**
         * A media timestamp.
         *
         * @param mediaTimestamp Timestamp from which a video/audio/video note/voice note/story playing must start, in seconds. The media can be in the content or the link preview of the current message, or in the same places in the replied message.
         */
        public TextEntityTypeMediaTimestamp(int mediaTimestamp) {
            this.mediaTimestamp = mediaTimestamp;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1841898992;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A date and time.
     */
    public static class TextEntityTypeDateTime extends TextEntityType {
        /**
         * Point in time (Unix timestamp) representing the date and time.
         */
        public int unixTime;
        /**
         * Date and time formatting type; may be null if none and the original text must not be changed.
         */
        @Nullable public DateTimeFormattingType formattingType;

        /**
         * A date and time.
         */
        public TextEntityTypeDateTime() {
        }

        /**
         * A date and time.
         *
         * @param unixTime Point in time (Unix timestamp) representing the date and time.
         * @param formattingType Date and time formatting type; may be null if none and the original text must not be changed.
         */
        public TextEntityTypeDateTime(int unixTime, DateTimeFormattingType formattingType) {
            this.unixTime = unixTime;
            this.formattingType = formattingType;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1544268588;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the way the text needs to be parsed for text entities.
     */
    public abstract static class TextParseMode extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            TextParseModeMarkdown.CONSTRUCTOR,
            TextParseModeHTML.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public TextParseMode() {
        }
    }

    /**
     * The text uses Markdown-style formatting.
     */
    public static class TextParseModeMarkdown extends TextParseMode {
        /**
         * Version of the parser: 0 or 1 - Telegram Bot API &quot;Markdown&quot; parse mode, 2 - Telegram Bot API &quot;MarkdownV2&quot; parse mode.
         */
        public int version;

        /**
         * The text uses Markdown-style formatting.
         */
        public TextParseModeMarkdown() {
        }

        /**
         * The text uses Markdown-style formatting.
         *
         * @param version Version of the parser: 0 or 1 - Telegram Bot API &quot;Markdown&quot; parse mode, 2 - Telegram Bot API &quot;MarkdownV2&quot; parse mode.
         */
        public TextParseModeMarkdown(int version) {
            this.version = version;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 360073407;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The text uses HTML-style formatting. The same as Telegram Bot API &quot;HTML&quot; parse mode.
     */
    public static class TextParseModeHTML extends TextParseMode {

        /**
         * The text uses HTML-style formatting. The same as Telegram Bot API &quot;HTML&quot; parse mode.
         */
        public TextParseModeHTML() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1660208627;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes manually or automatically chosen quote from another message.
     */
    public static class TextQuote extends Object {
        /**
         * Text of the quote. Only Bold, Italic, Underline, Strikethrough, Spoiler, CustomEmoji, and DateTime entities can be present in the text.
         */
        public FormattedText text;
        /**
         * Approximate quote position in the original message in UTF-16 code units as specified by the message sender.
         */
        public int position;
        /**
         * True, if the quote was manually chosen by the message sender.
         */
        public boolean isManual;

        /**
         * Describes manually or automatically chosen quote from another message.
         */
        public TextQuote() {
        }

        /**
         * Describes manually or automatically chosen quote from another message.
         *
         * @param text Text of the quote. Only Bold, Italic, Underline, Strikethrough, Spoiler, CustomEmoji, and DateTime entities can be present in the text.
         * @param position Approximate quote position in the original message in UTF-16 code units as specified by the message sender.
         * @param isManual True, if the quote was manually chosen by the message sender.
         */
        public TextQuote(FormattedText text, int position, boolean isManual) {
            this.text = text;
            this.position = position;
            this.isManual = isManual;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2039105358;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains parameters of the application theme.
     */
    public static class ThemeParameters extends Object {
        /**
         * A color of the background in the RGB format.
         */
        public int backgroundColor;
        /**
         * A secondary color for the background in the RGB format.
         */
        public int secondaryBackgroundColor;
        /**
         * A color of the header background in the RGB format.
         */
        public int headerBackgroundColor;
        /**
         * A color of the bottom bar background in the RGB format.
         */
        public int bottomBarBackgroundColor;
        /**
         * A color of the section background in the RGB format.
         */
        public int sectionBackgroundColor;
        /**
         * A color of the section separator in the RGB format.
         */
        public int sectionSeparatorColor;
        /**
         * A color of text in the RGB format.
         */
        public int textColor;
        /**
         * An accent color of the text in the RGB format.
         */
        public int accentTextColor;
        /**
         * A color of text on the section headers in the RGB format.
         */
        public int sectionHeaderTextColor;
        /**
         * A color of the subtitle text in the RGB format.
         */
        public int subtitleTextColor;
        /**
         * A color of the text for destructive actions in the RGB format.
         */
        public int destructiveTextColor;
        /**
         * A color of hints in the RGB format.
         */
        public int hintColor;
        /**
         * A color of links in the RGB format.
         */
        public int linkColor;
        /**
         * A color of the buttons in the RGB format.
         */
        public int buttonColor;
        /**
         * A color of text on the buttons in the RGB format.
         */
        public int buttonTextColor;

        /**
         * Contains parameters of the application theme.
         */
        public ThemeParameters() {
        }

        /**
         * Contains parameters of the application theme.
         *
         * @param backgroundColor A color of the background in the RGB format.
         * @param secondaryBackgroundColor A secondary color for the background in the RGB format.
         * @param headerBackgroundColor A color of the header background in the RGB format.
         * @param bottomBarBackgroundColor A color of the bottom bar background in the RGB format.
         * @param sectionBackgroundColor A color of the section background in the RGB format.
         * @param sectionSeparatorColor A color of the section separator in the RGB format.
         * @param textColor A color of text in the RGB format.
         * @param accentTextColor An accent color of the text in the RGB format.
         * @param sectionHeaderTextColor A color of text on the section headers in the RGB format.
         * @param subtitleTextColor A color of the subtitle text in the RGB format.
         * @param destructiveTextColor A color of the text for destructive actions in the RGB format.
         * @param hintColor A color of hints in the RGB format.
         * @param linkColor A color of links in the RGB format.
         * @param buttonColor A color of the buttons in the RGB format.
         * @param buttonTextColor A color of text on the buttons in the RGB format.
         */
        public ThemeParameters(int backgroundColor, int secondaryBackgroundColor, int headerBackgroundColor, int bottomBarBackgroundColor, int sectionBackgroundColor, int sectionSeparatorColor, int textColor, int accentTextColor, int sectionHeaderTextColor, int subtitleTextColor, int destructiveTextColor, int hintColor, int linkColor, int buttonColor, int buttonTextColor) {
            this.backgroundColor = backgroundColor;
            this.secondaryBackgroundColor = secondaryBackgroundColor;
            this.headerBackgroundColor = headerBackgroundColor;
            this.bottomBarBackgroundColor = bottomBarBackgroundColor;
            this.sectionBackgroundColor = sectionBackgroundColor;
            this.sectionSeparatorColor = sectionSeparatorColor;
            this.textColor = textColor;
            this.accentTextColor = accentTextColor;
            this.sectionHeaderTextColor = sectionHeaderTextColor;
            this.subtitleTextColor = subtitleTextColor;
            this.destructiveTextColor = destructiveTextColor;
            this.hintColor = hintColor;
            this.linkColor = linkColor;
            this.buttonColor = buttonColor;
            this.buttonTextColor = buttonTextColor;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -276589137;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes theme settings.
     */
    public static class ThemeSettings extends Object {
        /**
         * Base theme for this theme.
         */
        public BuiltInTheme baseTheme;
        /**
         * Theme accent color in ARGB format.
         */
        public int accentColor;
        /**
         * The background to be used in chats; may be null.
         */
        @Nullable public Background background;
        /**
         * The fill to be used as a background for outgoing messages; may be null if the fill from the base theme must be used instead.
         */
        @Nullable public BackgroundFill outgoingMessageFill;
        /**
         * If true, the freeform gradient fill needs to be animated on every sent message.
         */
        public boolean animateOutgoingMessageFill;
        /**
         * Accent color of outgoing messages in ARGB format.
         */
        public int outgoingMessageAccentColor;

        /**
         * Describes theme settings.
         */
        public ThemeSettings() {
        }

        /**
         * Describes theme settings.
         *
         * @param baseTheme Base theme for this theme.
         * @param accentColor Theme accent color in ARGB format.
         * @param background The background to be used in chats; may be null.
         * @param outgoingMessageFill The fill to be used as a background for outgoing messages; may be null if the fill from the base theme must be used instead.
         * @param animateOutgoingMessageFill If true, the freeform gradient fill needs to be animated on every sent message.
         * @param outgoingMessageAccentColor Accent color of outgoing messages in ARGB format.
         */
        public ThemeSettings(BuiltInTheme baseTheme, int accentColor, Background background, BackgroundFill outgoingMessageFill, boolean animateOutgoingMessageFill, int outgoingMessageAccentColor) {
            this.baseTheme = baseTheme;
            this.accentColor = accentColor;
            this.background = background;
            this.outgoingMessageFill = outgoingMessageFill;
            this.animateOutgoingMessageFill = animateOutgoingMessageFill;
            this.outgoingMessageAccentColor = outgoingMessageAccentColor;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1935106938;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a thumbnail.
     */
    public static class Thumbnail extends Object {
        /**
         * Thumbnail format.
         */
        public ThumbnailFormat format;
        /**
         * Thumbnail width.
         */
        public int width;
        /**
         * Thumbnail height.
         */
        public int height;
        /**
         * The thumbnail.
         */
        public File file;

        /**
         * Represents a thumbnail.
         */
        public Thumbnail() {
        }

        /**
         * Represents a thumbnail.
         *
         * @param format Thumbnail format.
         * @param width Thumbnail width.
         * @param height Thumbnail height.
         * @param file The thumbnail.
         */
        public Thumbnail(ThumbnailFormat format, int width, int height, File file) {
            this.format = format;
            this.width = width;
            this.height = height;
            this.file = file;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1243275371;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes format of a thumbnail.
     */
    public abstract static class ThumbnailFormat extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            ThumbnailFormatJpeg.CONSTRUCTOR,
            ThumbnailFormatGif.CONSTRUCTOR,
            ThumbnailFormatMpeg4.CONSTRUCTOR,
            ThumbnailFormatPng.CONSTRUCTOR,
            ThumbnailFormatTgs.CONSTRUCTOR,
            ThumbnailFormatWebm.CONSTRUCTOR,
            ThumbnailFormatWebp.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public ThumbnailFormat() {
        }
    }

    /**
     * The thumbnail is in JPEG format.
     */
    public static class ThumbnailFormatJpeg extends ThumbnailFormat {

        /**
         * The thumbnail is in JPEG format.
         */
        public ThumbnailFormatJpeg() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -653503352;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The thumbnail is in static GIF format. It will be used only for some bot inline query results.
     */
    public static class ThumbnailFormatGif extends ThumbnailFormat {

        /**
         * The thumbnail is in static GIF format. It will be used only for some bot inline query results.
         */
        public ThumbnailFormatGif() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1252205962;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The thumbnail is in MPEG4 format. It will be used only for some animations and videos.
     */
    public static class ThumbnailFormatMpeg4 extends ThumbnailFormat {

        /**
         * The thumbnail is in MPEG4 format. It will be used only for some animations and videos.
         */
        public ThumbnailFormatMpeg4() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 278616062;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The thumbnail is in PNG format. It will be used only for background patterns.
     */
    public static class ThumbnailFormatPng extends ThumbnailFormat {

        /**
         * The thumbnail is in PNG format. It will be used only for background patterns.
         */
        public ThumbnailFormatPng() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1577490421;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The thumbnail is in TGS format. It will be used only for sticker sets.
     */
    public static class ThumbnailFormatTgs extends ThumbnailFormat {

        /**
         * The thumbnail is in TGS format. It will be used only for sticker sets.
         */
        public ThumbnailFormatTgs() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1315522642;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The thumbnail is in WEBM format. It will be used only for sticker sets.
     */
    public static class ThumbnailFormatWebm extends ThumbnailFormat {

        /**
         * The thumbnail is in WEBM format. It will be used only for sticker sets.
         */
        public ThumbnailFormatWebm() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -660084953;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The thumbnail is in WEBP format. It will be used only for some stickers and sticker sets.
     */
    public static class ThumbnailFormatWebp extends ThumbnailFormat {

        /**
         * The thumbnail is in WEBP format. It will be used only for some stickers and sticker sets.
         */
        public ThumbnailFormatWebp() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -53588974;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a time zone.
     */
    public static class TimeZone extends Object {
        /**
         * Unique time zone identifier.
         */
        public String id;
        /**
         * Time zone name.
         */
        public String name;
        /**
         * Current UTC time offset for the time zone.
         */
        public int utcTimeOffset;

        /**
         * Describes a time zone.
         */
        public TimeZone() {
        }

        /**
         * Describes a time zone.
         *
         * @param id Unique time zone identifier.
         * @param name Time zone name.
         * @param utcTimeOffset Current UTC time offset for the time zone.
         */
        public TimeZone(String id, String name, int utcTimeOffset) {
            this.id = id;
            this.name = name;
            this.utcTimeOffset = utcTimeOffset;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1189481763;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of time zones.
     */
    public static class TimeZones extends Object {
        /**
         * A list of time zones.
         */
        public TimeZone[] timeZones;

        /**
         * Contains a list of time zones.
         */
        public TimeZones() {
        }

        /**
         * Contains a list of time zones.
         *
         * @param timeZones A list of time zones.
         */
        public TimeZones(TimeZone[] timeZones) {
            this.timeZones = timeZones;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -334655570;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A detailed statistics about Toncoins earned by the current user.
     */
    public static class TonRevenueStatistics extends Object {
        /**
         * A graph containing amount of revenue in a given day.
         */
        public StatisticalGraph revenueByDayGraph;
        /**
         * Amount of earned revenue.
         */
        public TonRevenueStatus status;
        /**
         * Current conversion rate of nanotoncoin to USD cents.
         */
        public double usdRate;

        /**
         * A detailed statistics about Toncoins earned by the current user.
         */
        public TonRevenueStatistics() {
        }

        /**
         * A detailed statistics about Toncoins earned by the current user.
         *
         * @param revenueByDayGraph A graph containing amount of revenue in a given day.
         * @param status Amount of earned revenue.
         * @param usdRate Current conversion rate of nanotoncoin to USD cents.
         */
        public TonRevenueStatistics(StatisticalGraph revenueByDayGraph, TonRevenueStatus status, double usdRate) {
            this.revenueByDayGraph = revenueByDayGraph;
            this.status = status;
            this.usdRate = usdRate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 565933594;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about Toncoins earned by the current user.
     */
    public static class TonRevenueStatus extends Object {
        /**
         * Total Toncoin amount earned; in the smallest units of the cryptocurrency.
         */
        public long totalAmount;
        /**
         * The Toncoin amount that isn't withdrawn yet; in the smallest units of the cryptocurrency.
         */
        public long balanceAmount;
        /**
         * The Toncoin amount that is available for withdrawal; in the smallest units of the cryptocurrency.
         */
        public long availableAmount;
        /**
         * True, if Toncoins can be withdrawn.
         */
        public boolean withdrawalEnabled;

        /**
         * Contains information about Toncoins earned by the current user.
         */
        public TonRevenueStatus() {
        }

        /**
         * Contains information about Toncoins earned by the current user.
         *
         * @param totalAmount Total Toncoin amount earned; in the smallest units of the cryptocurrency.
         * @param balanceAmount The Toncoin amount that isn't withdrawn yet; in the smallest units of the cryptocurrency.
         * @param availableAmount The Toncoin amount that is available for withdrawal; in the smallest units of the cryptocurrency.
         * @param withdrawalEnabled True, if Toncoins can be withdrawn.
         */
        public TonRevenueStatus(long totalAmount, long balanceAmount, long availableAmount, boolean withdrawalEnabled) {
            this.totalAmount = totalAmount;
            this.balanceAmount = balanceAmount;
            this.availableAmount = availableAmount;
            this.withdrawalEnabled = withdrawalEnabled;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1437514030;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a transaction changing the amount of owned Toncoins.
     */
    public static class TonTransaction extends Object {
        /**
         * Unique identifier of the transaction.
         */
        public String id;
        /**
         * The amount of added owned Toncoins; negative for outgoing transactions.
         */
        public long tonAmount;
        /**
         * True, if the transaction is a refund of a previous transaction.
         */
        public boolean isRefund;
        /**
         * Point in time (Unix timestamp) when the transaction was completed.
         */
        public int date;
        /**
         * Type of the transaction.
         */
        public TonTransactionType type;

        /**
         * Represents a transaction changing the amount of owned Toncoins.
         */
        public TonTransaction() {
        }

        /**
         * Represents a transaction changing the amount of owned Toncoins.
         *
         * @param id Unique identifier of the transaction.
         * @param tonAmount The amount of added owned Toncoins; negative for outgoing transactions.
         * @param isRefund True, if the transaction is a refund of a previous transaction.
         * @param date Point in time (Unix timestamp) when the transaction was completed.
         * @param type Type of the transaction.
         */
        public TonTransaction(String id, long tonAmount, boolean isRefund, int date, TonTransactionType type) {
            this.id = id;
            this.tonAmount = tonAmount;
            this.isRefund = isRefund;
            this.date = date;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1562036527;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes type of transaction with Toncoins.
     */
    public abstract static class TonTransactionType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            TonTransactionTypeFragmentDeposit.CONSTRUCTOR,
            TonTransactionTypeFragmentWithdrawal.CONSTRUCTOR,
            TonTransactionTypeSuggestedPostPayment.CONSTRUCTOR,
            TonTransactionTypeGiftPurchaseOffer.CONSTRUCTOR,
            TonTransactionTypeUpgradedGiftPurchase.CONSTRUCTOR,
            TonTransactionTypeUpgradedGiftSale.CONSTRUCTOR,
            TonTransactionTypeStakeDiceStake.CONSTRUCTOR,
            TonTransactionTypeStakeDicePayout.CONSTRUCTOR,
            TonTransactionTypeUnsupported.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public TonTransactionType() {
        }
    }

    /**
     * The transaction is a deposit of Toncoins from Fragment.
     */
    public static class TonTransactionTypeFragmentDeposit extends TonTransactionType {
        /**
         * True, if the transaction is a gift from another user.
         */
        public boolean isGift;
        /**
         * The sticker to be shown in the transaction information; may be null if unknown.
         */
        @Nullable public Sticker sticker;

        /**
         * The transaction is a deposit of Toncoins from Fragment.
         */
        public TonTransactionTypeFragmentDeposit() {
        }

        /**
         * The transaction is a deposit of Toncoins from Fragment.
         *
         * @param isGift True, if the transaction is a gift from another user.
         * @param sticker The sticker to be shown in the transaction information; may be null if unknown.
         */
        public TonTransactionTypeFragmentDeposit(boolean isGift, Sticker sticker) {
            this.isGift = isGift;
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1395530668;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a withdrawal of earned Toncoins to Fragment.
     */
    public static class TonTransactionTypeFragmentWithdrawal extends TonTransactionType {
        /**
         * State of the withdrawal; may be null for refunds from Fragment.
         */
        @Nullable public RevenueWithdrawalState withdrawalState;

        /**
         * The transaction is a withdrawal of earned Toncoins to Fragment.
         */
        public TonTransactionTypeFragmentWithdrawal() {
        }

        /**
         * The transaction is a withdrawal of earned Toncoins to Fragment.
         *
         * @param withdrawalState State of the withdrawal; may be null for refunds from Fragment.
         */
        public TonTransactionTypeFragmentWithdrawal(RevenueWithdrawalState withdrawalState) {
            this.withdrawalState = withdrawalState;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1410960428;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a payment for a suggested post.
     */
    public static class TonTransactionTypeSuggestedPostPayment extends TonTransactionType {
        /**
         * Identifier of the channel chat that posted the post.
         */
        public long chatId;

        /**
         * The transaction is a payment for a suggested post.
         */
        public TonTransactionTypeSuggestedPostPayment() {
        }

        /**
         * The transaction is a payment for a suggested post.
         *
         * @param chatId Identifier of the channel chat that posted the post.
         */
        public TonTransactionTypeSuggestedPostPayment(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -396472561;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is an offer of gift purchase.
     */
    public static class TonTransactionTypeGiftPurchaseOffer extends TonTransactionType {
        /**
         * The gift.
         */
        public UpgradedGift gift;

        /**
         * The transaction is an offer of gift purchase.
         */
        public TonTransactionTypeGiftPurchaseOffer() {
        }

        /**
         * The transaction is an offer of gift purchase.
         *
         * @param gift The gift.
         */
        public TonTransactionTypeGiftPurchaseOffer(UpgradedGift gift) {
            this.gift = gift;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1754409273;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a purchase of an upgraded gift for some user or channel.
     */
    public static class TonTransactionTypeUpgradedGiftPurchase extends TonTransactionType {
        /**
         * Identifier of the user who sold the gift.
         */
        public long userId;
        /**
         * The gift.
         */
        public UpgradedGift gift;

        /**
         * The transaction is a purchase of an upgraded gift for some user or channel.
         */
        public TonTransactionTypeUpgradedGiftPurchase() {
        }

        /**
         * The transaction is a purchase of an upgraded gift for some user or channel.
         *
         * @param userId Identifier of the user who sold the gift.
         * @param gift The gift.
         */
        public TonTransactionTypeUpgradedGiftPurchase(long userId, UpgradedGift gift) {
            this.userId = userId;
            this.gift = gift;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2007364707;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a sale of an upgraded gift.
     */
    public static class TonTransactionTypeUpgradedGiftSale extends TonTransactionType {
        /**
         * Identifier of the user who bought the gift.
         */
        public long userId;
        /**
         * The gift.
         */
        public UpgradedGift gift;
        /**
         * The number of Toncoins received by the Telegram for each 1000 Toncoins received by the seller of the gift.
         */
        public int commissionPerMille;
        /**
         * The Toncoin amount that was received by the Telegram; in the smallest units of the currency.
         */
        public long commissionToncoinAmount;
        /**
         * True, if the gift was sold through a purchase offer.
         */
        public boolean viaOffer;

        /**
         * The transaction is a sale of an upgraded gift.
         */
        public TonTransactionTypeUpgradedGiftSale() {
        }

        /**
         * The transaction is a sale of an upgraded gift.
         *
         * @param userId Identifier of the user who bought the gift.
         * @param gift The gift.
         * @param commissionPerMille The number of Toncoins received by the Telegram for each 1000 Toncoins received by the seller of the gift.
         * @param commissionToncoinAmount The Toncoin amount that was received by the Telegram; in the smallest units of the currency.
         * @param viaOffer True, if the gift was sold through a purchase offer.
         */
        public TonTransactionTypeUpgradedGiftSale(long userId, UpgradedGift gift, int commissionPerMille, long commissionToncoinAmount, boolean viaOffer) {
            this.userId = userId;
            this.gift = gift;
            this.commissionPerMille = commissionPerMille;
            this.commissionToncoinAmount = commissionToncoinAmount;
            this.viaOffer = viaOffer;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1162099275;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a payment for stake dice throw.
     */
    public static class TonTransactionTypeStakeDiceStake extends TonTransactionType {

        /**
         * The transaction is a payment for stake dice throw.
         */
        public TonTransactionTypeStakeDiceStake() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1789542822;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a payment for successful stake dice throw.
     */
    public static class TonTransactionTypeStakeDicePayout extends TonTransactionType {

        /**
         * The transaction is a payment for successful stake dice throw.
         */
        public TonTransactionTypeStakeDicePayout() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -25462760;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is a transaction of an unsupported type.
     */
    public static class TonTransactionTypeUnsupported extends TonTransactionType {

        /**
         * The transaction is a transaction of an unsupported type.
         */
        public TonTransactionTypeUnsupported() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1747387269;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of Toncoin transactions.
     */
    public static class TonTransactions extends Object {
        /**
         * The total amount of owned Toncoins.
         */
        public long tonAmount;
        /**
         * List of Toncoin transactions.
         */
        public TonTransaction[] transactions;
        /**
         * The offset for the next request. If empty, then there are no more results.
         */
        public String nextOffset;

        /**
         * Represents a list of Toncoin transactions.
         */
        public TonTransactions() {
        }

        /**
         * Represents a list of Toncoin transactions.
         *
         * @param tonAmount The total amount of owned Toncoins.
         * @param transactions List of Toncoin transactions.
         * @param nextOffset The offset for the next request. If empty, then there are no more results.
         */
        public TonTransactions(long tonAmount, TonTransaction[] transactions, String nextOffset) {
            this.tonAmount = tonAmount;
            this.transactions = transactions;
            this.nextOffset = nextOffset;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1317235021;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents the categories of chats for which a list of frequently used chats can be retrieved.
     */
    public abstract static class TopChatCategory extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            TopChatCategoryUsers.CONSTRUCTOR,
            TopChatCategoryBots.CONSTRUCTOR,
            TopChatCategoryGroups.CONSTRUCTOR,
            TopChatCategoryChannels.CONSTRUCTOR,
            TopChatCategoryInlineBots.CONSTRUCTOR,
            TopChatCategoryGuestBots.CONSTRUCTOR,
            TopChatCategoryWebAppBots.CONSTRUCTOR,
            TopChatCategoryCalls.CONSTRUCTOR,
            TopChatCategoryForwardChats.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public TopChatCategory() {
        }
    }

    /**
     * A category containing frequently used private chats with non-bot users.
     */
    public static class TopChatCategoryUsers extends TopChatCategory {

        /**
         * A category containing frequently used private chats with non-bot users.
         */
        public TopChatCategoryUsers() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1026706816;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A category containing frequently used private chats with bot users.
     */
    public static class TopChatCategoryBots extends TopChatCategory {

        /**
         * A category containing frequently used private chats with bot users.
         */
        public TopChatCategoryBots() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1577129195;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A category containing frequently used basic groups and supergroups.
     */
    public static class TopChatCategoryGroups extends TopChatCategory {

        /**
         * A category containing frequently used basic groups and supergroups.
         */
        public TopChatCategoryGroups() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1530056846;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A category containing frequently used channels.
     */
    public static class TopChatCategoryChannels extends TopChatCategory {

        /**
         * A category containing frequently used channels.
         */
        public TopChatCategoryChannels() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -500825885;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A category containing frequently used chats with inline bots sorted by their usage in inline mode.
     */
    public static class TopChatCategoryInlineBots extends TopChatCategory {

        /**
         * A category containing frequently used chats with inline bots sorted by their usage in inline mode.
         */
        public TopChatCategoryInlineBots() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 377023356;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A category containing frequently used chats with bots, which were used as guest bots.
     */
    public static class TopChatCategoryGuestBots extends TopChatCategory {

        /**
         * A category containing frequently used chats with bots, which were used as guest bots.
         */
        public TopChatCategoryGuestBots() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1792882579;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A category containing frequently used chats with bots, which Web Apps were opened.
     */
    public static class TopChatCategoryWebAppBots extends TopChatCategory {

        /**
         * A category containing frequently used chats with bots, which Web Apps were opened.
         */
        public TopChatCategoryWebAppBots() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 100062973;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A category containing frequently used chats used for calls.
     */
    public static class TopChatCategoryCalls extends TopChatCategory {

        /**
         * A category containing frequently used chats used for calls.
         */
        public TopChatCategoryCalls() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 356208861;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A category containing frequently used chats used to forward messages.
     */
    public static class TopChatCategoryForwardChats extends TopChatCategory {

        /**
         * A category containing frequently used chats used to forward messages.
         */
        public TopChatCategoryForwardChats() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1695922133;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes direction of transactions in a transaction list.
     */
    public abstract static class TransactionDirection extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            TransactionDirectionIncoming.CONSTRUCTOR,
            TransactionDirectionOutgoing.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public TransactionDirection() {
        }
    }

    /**
     * The transaction is incoming and increases the amount of owned currency.
     */
    public static class TransactionDirectionIncoming extends TransactionDirection {

        /**
         * The transaction is incoming and increases the amount of owned currency.
         */
        public TransactionDirectionIncoming() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -271074103;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The transaction is outgoing and decreases the amount of owned currency.
     */
    public static class TransactionDirectionOutgoing extends TransactionDirection {

        /**
         * The transaction is outgoing and decreases the amount of owned currency.
         */
        public TransactionDirectionOutgoing() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1638241254;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of trending sticker sets.
     */
    public static class TrendingStickerSets extends Object {
        /**
         * Approximate total number of trending sticker sets.
         */
        public int totalCount;
        /**
         * List of trending sticker sets.
         */
        public StickerSetInfo[] sets;
        /**
         * True, if the list contains sticker sets with premium stickers.
         */
        public boolean isPremium;

        /**
         * Represents a list of trending sticker sets.
         */
        public TrendingStickerSets() {
        }

        /**
         * Represents a list of trending sticker sets.
         *
         * @param totalCount Approximate total number of trending sticker sets.
         * @param sets List of trending sticker sets.
         * @param isPremium True, if the list contains sticker sets with premium stickers.
         */
        public TrendingStickerSets(int totalCount, StickerSetInfo[] sets, boolean isPremium) {
            this.totalCount = totalCount;
            this.sets = sets;
            this.isPremium = isPremium;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 41028940;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about an unconfirmed session.
     */
    public static class UnconfirmedSession extends Object {
        /**
         * Session identifier.
         */
        public long id;
        /**
         * Point in time (Unix timestamp) when the user has logged in.
         */
        public int logInDate;
        /**
         * Model of the device that was used for the session creation, as provided by the application.
         */
        public String deviceModel;
        /**
         * A human-readable description of the location from which the session was created, based on the IP address.
         */
        public String location;

        /**
         * Contains information about an unconfirmed session.
         */
        public UnconfirmedSession() {
        }

        /**
         * Contains information about an unconfirmed session.
         *
         * @param id Session identifier.
         * @param logInDate Point in time (Unix timestamp) when the user has logged in.
         * @param deviceModel Model of the device that was used for the session creation, as provided by the application.
         * @param location A human-readable description of the location from which the session was created, based on the IP address.
         */
        public UnconfirmedSession(long id, int logInDate, String deviceModel, String location) {
            this.id = id;
            this.logInDate = logInDate;
            this.deviceModel = deviceModel;
            this.location = location;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2062726663;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about an unread reaction to a message.
     */
    public static class UnreadReaction extends Object {
        /**
         * Type of the reaction.
         */
        public ReactionType type;
        /**
         * Identifier of the sender, added the reaction.
         */
        public MessageSender senderId;
        /**
         * True, if the reaction was added with a big animation.
         */
        public boolean isBig;

        /**
         * Contains information about an unread reaction to a message.
         */
        public UnreadReaction() {
        }

        /**
         * Contains information about an unread reaction to a message.
         *
         * @param type Type of the reaction.
         * @param senderId Identifier of the sender, added the reaction.
         * @param isBig True, if the reaction was added with a big animation.
         */
        public UnreadReaction(ReactionType type, MessageSender senderId, boolean isBig) {
            this.type = type;
            this.senderId = senderId;
            this.isBig = isBig;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1940178046;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains notifications about data changes.
     */
    public abstract static class Update extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            UpdateAuthorizationState.CONSTRUCTOR,
            UpdateNewMessage.CONSTRUCTOR,
            UpdateMessageSendAcknowledged.CONSTRUCTOR,
            UpdateMessageSendSucceeded.CONSTRUCTOR,
            UpdateMessageSendFailed.CONSTRUCTOR,
            UpdateMessageContent.CONSTRUCTOR,
            UpdateMessageEdited.CONSTRUCTOR,
            UpdateMessageIsPinned.CONSTRUCTOR,
            UpdateMessageInteractionInfo.CONSTRUCTOR,
            UpdateMessageContentOpened.CONSTRUCTOR,
            UpdateMessageMentionRead.CONSTRUCTOR,
            UpdateMessageUnreadReactions.CONSTRUCTOR,
            UpdateMessageContainsUnreadPollVotes.CONSTRUCTOR,
            UpdateMessageFactCheck.CONSTRUCTOR,
            UpdateMessageSuggestedPostInfo.CONSTRUCTOR,
            UpdateMessageLiveLocationViewed.CONSTRUCTOR,
            UpdateVideoPublished.CONSTRUCTOR,
            UpdateNewChat.CONSTRUCTOR,
            UpdateChatTitle.CONSTRUCTOR,
            UpdateChatPhoto.CONSTRUCTOR,
            UpdateChatAccentColors.CONSTRUCTOR,
            UpdateChatPermissions.CONSTRUCTOR,
            UpdateChatLastMessage.CONSTRUCTOR,
            UpdateChatPosition.CONSTRUCTOR,
            UpdateChatAddedToList.CONSTRUCTOR,
            UpdateChatRemovedFromList.CONSTRUCTOR,
            UpdateChatReadInbox.CONSTRUCTOR,
            UpdateChatReadOutbox.CONSTRUCTOR,
            UpdateChatActionBar.CONSTRUCTOR,
            UpdateChatBusinessBotManageBar.CONSTRUCTOR,
            UpdateChatAvailableReactions.CONSTRUCTOR,
            UpdateChatDraftMessage.CONSTRUCTOR,
            UpdateChatEmojiStatus.CONSTRUCTOR,
            UpdateChatMessageSender.CONSTRUCTOR,
            UpdateChatMessageAutoDeleteTime.CONSTRUCTOR,
            UpdateChatNotificationSettings.CONSTRUCTOR,
            UpdateChatPendingJoinRequests.CONSTRUCTOR,
            UpdateChatReplyMarkup.CONSTRUCTOR,
            UpdateChatBackground.CONSTRUCTOR,
            UpdateChatTheme.CONSTRUCTOR,
            UpdateChatUnreadMentionCount.CONSTRUCTOR,
            UpdateChatUnreadReactionCount.CONSTRUCTOR,
            UpdateChatUnreadPollVoteCount.CONSTRUCTOR,
            UpdateChatVideoChat.CONSTRUCTOR,
            UpdateChatDefaultDisableNotification.CONSTRUCTOR,
            UpdateChatHasProtectedContent.CONSTRUCTOR,
            UpdateChatIsTranslatable.CONSTRUCTOR,
            UpdateChatIsMarkedAsUnread.CONSTRUCTOR,
            UpdateChatViewAsTopics.CONSTRUCTOR,
            UpdateChatBlockList.CONSTRUCTOR,
            UpdateChatHasScheduledMessages.CONSTRUCTOR,
            UpdateChatFolders.CONSTRUCTOR,
            UpdateChatOnlineMemberCount.CONSTRUCTOR,
            UpdateSavedMessagesTopic.CONSTRUCTOR,
            UpdateSavedMessagesTopicCount.CONSTRUCTOR,
            UpdateDirectMessagesChatTopic.CONSTRUCTOR,
            UpdateTopicMessageCount.CONSTRUCTOR,
            UpdateQuickReplyShortcut.CONSTRUCTOR,
            UpdateQuickReplyShortcutDeleted.CONSTRUCTOR,
            UpdateQuickReplyShortcuts.CONSTRUCTOR,
            UpdateQuickReplyShortcutMessages.CONSTRUCTOR,
            UpdateForumTopicInfo.CONSTRUCTOR,
            UpdateForumTopic.CONSTRUCTOR,
            UpdateScopeNotificationSettings.CONSTRUCTOR,
            UpdateReactionNotificationSettings.CONSTRUCTOR,
            UpdateNotification.CONSTRUCTOR,
            UpdateNotificationGroup.CONSTRUCTOR,
            UpdateActiveNotifications.CONSTRUCTOR,
            UpdateHavePendingNotifications.CONSTRUCTOR,
            UpdateDeleteMessages.CONSTRUCTOR,
            UpdateChatAction.CONSTRUCTOR,
            UpdatePendingTextMessage.CONSTRUCTOR,
            UpdateUserStatus.CONSTRUCTOR,
            UpdateUser.CONSTRUCTOR,
            UpdateBasicGroup.CONSTRUCTOR,
            UpdateSupergroup.CONSTRUCTOR,
            UpdateSecretChat.CONSTRUCTOR,
            UpdateUserFullInfo.CONSTRUCTOR,
            UpdateBasicGroupFullInfo.CONSTRUCTOR,
            UpdateSupergroupFullInfo.CONSTRUCTOR,
            UpdateServiceNotification.CONSTRUCTOR,
            UpdateNewOauthRequest.CONSTRUCTOR,
            UpdateFile.CONSTRUCTOR,
            UpdateFileGenerationStart.CONSTRUCTOR,
            UpdateFileGenerationStop.CONSTRUCTOR,
            UpdateFileDownloads.CONSTRUCTOR,
            UpdateFileAddedToDownloads.CONSTRUCTOR,
            UpdateFileDownload.CONSTRUCTOR,
            UpdateFileRemovedFromDownloads.CONSTRUCTOR,
            UpdateApplicationVerificationRequired.CONSTRUCTOR,
            UpdateApplicationRecaptchaVerificationRequired.CONSTRUCTOR,
            UpdateCall.CONSTRUCTOR,
            UpdateGroupCall.CONSTRUCTOR,
            UpdateGroupCallParticipant.CONSTRUCTOR,
            UpdateGroupCallParticipants.CONSTRUCTOR,
            UpdateGroupCallVerificationState.CONSTRUCTOR,
            UpdateNewGroupCallMessage.CONSTRUCTOR,
            UpdateNewGroupCallPaidReaction.CONSTRUCTOR,
            UpdateGroupCallMessageSendFailed.CONSTRUCTOR,
            UpdateGroupCallMessagesDeleted.CONSTRUCTOR,
            UpdateLiveStoryTopDonors.CONSTRUCTOR,
            UpdateNewCallSignalingData.CONSTRUCTOR,
            UpdateGiftAuctionState.CONSTRUCTOR,
            UpdateActiveGiftAuctions.CONSTRUCTOR,
            UpdateUserPrivacySettingRules.CONSTRUCTOR,
            UpdateUnreadMessageCount.CONSTRUCTOR,
            UpdateUnreadChatCount.CONSTRUCTOR,
            UpdateStory.CONSTRUCTOR,
            UpdateStoryDeleted.CONSTRUCTOR,
            UpdateStoryPostSucceeded.CONSTRUCTOR,
            UpdateStoryPostFailed.CONSTRUCTOR,
            UpdateChatActiveStories.CONSTRUCTOR,
            UpdateStoryListChatCount.CONSTRUCTOR,
            UpdateStoryStealthMode.CONSTRUCTOR,
            UpdateTrustedMiniAppBots.CONSTRUCTOR,
            UpdateOption.CONSTRUCTOR,
            UpdateStickerSet.CONSTRUCTOR,
            UpdateInstalledStickerSets.CONSTRUCTOR,
            UpdateTrendingStickerSets.CONSTRUCTOR,
            UpdateRecentStickers.CONSTRUCTOR,
            UpdateFavoriteStickers.CONSTRUCTOR,
            UpdateSavedAnimations.CONSTRUCTOR,
            UpdateSavedNotificationSounds.CONSTRUCTOR,
            UpdateDefaultBackground.CONSTRUCTOR,
            UpdateEmojiChatThemes.CONSTRUCTOR,
            UpdateAccentColors.CONSTRUCTOR,
            UpdateProfileAccentColors.CONSTRUCTOR,
            UpdateLanguagePackStrings.CONSTRUCTOR,
            UpdateConnectionState.CONSTRUCTOR,
            UpdateFreezeState.CONSTRUCTOR,
            UpdateAgeVerificationParameters.CONSTRUCTOR,
            UpdateTermsOfService.CONSTRUCTOR,
            UpdateUnconfirmedSession.CONSTRUCTOR,
            UpdateAttachmentMenuBots.CONSTRUCTOR,
            UpdateWebAppMessageSent.CONSTRUCTOR,
            UpdateActiveEmojiReactions.CONSTRUCTOR,
            UpdateAvailableMessageEffects.CONSTRUCTOR,
            UpdateDefaultReactionType.CONSTRUCTOR,
            UpdateDefaultPaidReactionType.CONSTRUCTOR,
            UpdateSavedMessagesTags.CONSTRUCTOR,
            UpdateActiveLiveLocationMessages.CONSTRUCTOR,
            UpdateOwnedStarCount.CONSTRUCTOR,
            UpdateOwnedTonCount.CONSTRUCTOR,
            UpdateChatRevenueAmount.CONSTRUCTOR,
            UpdateStarRevenueStatus.CONSTRUCTOR,
            UpdateTonRevenueStatus.CONSTRUCTOR,
            UpdateSpeechRecognitionTrial.CONSTRUCTOR,
            UpdateGroupCallMessageLevels.CONSTRUCTOR,
            UpdateDiceEmojis.CONSTRUCTOR,
            UpdateStakeDiceState.CONSTRUCTOR,
            UpdateAnimatedEmojiMessageClicked.CONSTRUCTOR,
            UpdateAnimationSearchParameters.CONSTRUCTOR,
            UpdateTextCompositionStyles.CONSTRUCTOR,
            UpdateSuggestedActions.CONSTRUCTOR,
            UpdateSpeedLimitNotification.CONSTRUCTOR,
            UpdateContactCloseBirthdays.CONSTRUCTOR,
            UpdateAutosaveSettings.CONSTRUCTOR,
            UpdateBusinessConnection.CONSTRUCTOR,
            UpdateNewBusinessMessage.CONSTRUCTOR,
            UpdateBusinessMessageEdited.CONSTRUCTOR,
            UpdateBusinessMessagesDeleted.CONSTRUCTOR,
            UpdateNewInlineQuery.CONSTRUCTOR,
            UpdateNewChosenInlineResult.CONSTRUCTOR,
            UpdateNewGuestQuery.CONSTRUCTOR,
            UpdateNewCallbackQuery.CONSTRUCTOR,
            UpdateNewInlineCallbackQuery.CONSTRUCTOR,
            UpdateNewBusinessCallbackQuery.CONSTRUCTOR,
            UpdateNewShippingQuery.CONSTRUCTOR,
            UpdateNewPreCheckoutQuery.CONSTRUCTOR,
            UpdateNewCustomEvent.CONSTRUCTOR,
            UpdateNewCustomQuery.CONSTRUCTOR,
            UpdatePoll.CONSTRUCTOR,
            UpdatePollAnswer.CONSTRUCTOR,
            UpdateManagedBot.CONSTRUCTOR,
            UpdateChatMember.CONSTRUCTOR,
            UpdateNewChatJoinRequest.CONSTRUCTOR,
            UpdateChatBoost.CONSTRUCTOR,
            UpdateMessageReaction.CONSTRUCTOR,
            UpdateMessageReactions.CONSTRUCTOR,
            UpdatePaidMediaPurchased.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public Update() {
        }
    }

    /**
     * The user authorization state has changed.
     */
    public static class UpdateAuthorizationState extends Update {
        /**
         * New authorization state.
         */
        public AuthorizationState authorizationState;

        /**
         * The user authorization state has changed.
         */
        public UpdateAuthorizationState() {
        }

        /**
         * The user authorization state has changed.
         *
         * @param authorizationState New authorization state.
         */
        public UpdateAuthorizationState(AuthorizationState authorizationState) {
            this.authorizationState = authorizationState;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1622347490;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new message was received; can also be an outgoing message.
     */
    public static class UpdateNewMessage extends Update {
        /**
         * The new message.
         */
        public Message message;

        /**
         * A new message was received; can also be an outgoing message.
         */
        public UpdateNewMessage() {
        }

        /**
         * A new message was received; can also be an outgoing message.
         *
         * @param message The new message.
         */
        public UpdateNewMessage(Message message) {
            this.message = message;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -563105266;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A request to send a message has reached the Telegram server. This doesn't mean that the message will be sent successfully. This update is sent only if the option &quot;use_quick_ack&quot; is set to true. This update may be sent multiple times for the same message.
     */
    public static class UpdateMessageSendAcknowledged extends Update {
        /**
         * The chat identifier of the sent message.
         */
        public long chatId;
        /**
         * A temporary message identifier.
         */
        public long messageId;

        /**
         * A request to send a message has reached the Telegram server. This doesn't mean that the message will be sent successfully. This update is sent only if the option &quot;use_quick_ack&quot; is set to true. This update may be sent multiple times for the same message.
         */
        public UpdateMessageSendAcknowledged() {
        }

        /**
         * A request to send a message has reached the Telegram server. This doesn't mean that the message will be sent successfully. This update is sent only if the option &quot;use_quick_ack&quot; is set to true. This update may be sent multiple times for the same message.
         *
         * @param chatId The chat identifier of the sent message.
         * @param messageId A temporary message identifier.
         */
        public UpdateMessageSendAcknowledged(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1302843961;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message has been successfully sent.
     */
    public static class UpdateMessageSendSucceeded extends Update {
        /**
         * The sent message. Almost any field of the new message can be different from the corresponding field of the original message. For example, the field schedulingState may change, making the message scheduled, or non-scheduled.
         */
        public Message message;
        /**
         * The previous temporary message identifier.
         */
        public long oldMessageId;

        /**
         * A message has been successfully sent.
         */
        public UpdateMessageSendSucceeded() {
        }

        /**
         * A message has been successfully sent.
         *
         * @param message The sent message. Almost any field of the new message can be different from the corresponding field of the original message. For example, the field schedulingState may change, making the message scheduled, or non-scheduled.
         * @param oldMessageId The previous temporary message identifier.
         */
        public UpdateMessageSendSucceeded(Message message, long oldMessageId) {
            this.message = message;
            this.oldMessageId = oldMessageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1815715197;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message failed to send. Be aware that some messages being sent can be irrecoverably deleted, in which case updateDeleteMessages will be received instead of this update.
     */
    public static class UpdateMessageSendFailed extends Update {
        /**
         * The failed to send message.
         */
        public Message message;
        /**
         * The previous temporary message identifier.
         */
        public long oldMessageId;
        /**
         * The cause of the message sending failure.
         */
        public Error error;

        /**
         * A message failed to send. Be aware that some messages being sent can be irrecoverably deleted, in which case updateDeleteMessages will be received instead of this update.
         */
        public UpdateMessageSendFailed() {
        }

        /**
         * A message failed to send. Be aware that some messages being sent can be irrecoverably deleted, in which case updateDeleteMessages will be received instead of this update.
         *
         * @param message The failed to send message.
         * @param oldMessageId The previous temporary message identifier.
         * @param error The cause of the message sending failure.
         */
        public UpdateMessageSendFailed(Message message, long oldMessageId, Error error) {
            this.message = message;
            this.oldMessageId = oldMessageId;
            this.error = error;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -635701017;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message content has changed.
     */
    public static class UpdateMessageContent extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Message identifier.
         */
        public long messageId;
        /**
         * New message content.
         */
        public MessageContent newContent;

        /**
         * The message content has changed.
         */
        public UpdateMessageContent() {
        }

        /**
         * The message content has changed.
         *
         * @param chatId Chat identifier.
         * @param messageId Message identifier.
         * @param newContent New message content.
         */
        public UpdateMessageContent(long chatId, long messageId, MessageContent newContent) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.newContent = newContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 506903332;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message was edited. Changes in the message content will come in a separate updateMessageContent.
     */
    public static class UpdateMessageEdited extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Message identifier.
         */
        public long messageId;
        /**
         * Point in time (Unix timestamp) when the message was edited.
         */
        public int editDate;
        /**
         * New message reply markup; may be null.
         */
        @Nullable public ReplyMarkup replyMarkup;

        /**
         * A message was edited. Changes in the message content will come in a separate updateMessageContent.
         */
        public UpdateMessageEdited() {
        }

        /**
         * A message was edited. Changes in the message content will come in a separate updateMessageContent.
         *
         * @param chatId Chat identifier.
         * @param messageId Message identifier.
         * @param editDate Point in time (Unix timestamp) when the message was edited.
         * @param replyMarkup New message reply markup; may be null.
         */
        public UpdateMessageEdited(long chatId, long messageId, int editDate, ReplyMarkup replyMarkup) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.editDate = editDate;
            this.replyMarkup = replyMarkup;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -559545626;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message pinned state was changed.
     */
    public static class UpdateMessageIsPinned extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The message identifier.
         */
        public long messageId;
        /**
         * True, if the message is pinned.
         */
        public boolean isPinned;

        /**
         * The message pinned state was changed.
         */
        public UpdateMessageIsPinned() {
        }

        /**
         * The message pinned state was changed.
         *
         * @param chatId Chat identifier.
         * @param messageId The message identifier.
         * @param isPinned True, if the message is pinned.
         */
        public UpdateMessageIsPinned(long chatId, long messageId, boolean isPinned) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1102848829;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The information about interactions with a message has changed.
     */
    public static class UpdateMessageInteractionInfo extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Message identifier.
         */
        public long messageId;
        /**
         * New information about interactions with the message; may be null.
         */
        @Nullable public MessageInteractionInfo interactionInfo;

        /**
         * The information about interactions with a message has changed.
         */
        public UpdateMessageInteractionInfo() {
        }

        /**
         * The information about interactions with a message has changed.
         *
         * @param chatId Chat identifier.
         * @param messageId Message identifier.
         * @param interactionInfo New information about interactions with the message; may be null.
         */
        public UpdateMessageInteractionInfo(long chatId, long messageId, MessageInteractionInfo interactionInfo) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.interactionInfo = interactionInfo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1417659394;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message content was opened. Updates voice note messages to &quot;listened&quot;, video note messages to &quot;viewed&quot; and starts the self-destruct timer.
     */
    public static class UpdateMessageContentOpened extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Message identifier.
         */
        public long messageId;

        /**
         * The message content was opened. Updates voice note messages to &quot;listened&quot;, video note messages to &quot;viewed&quot; and starts the self-destruct timer.
         */
        public UpdateMessageContentOpened() {
        }

        /**
         * The message content was opened. Updates voice note messages to &quot;listened&quot;, video note messages to &quot;viewed&quot; and starts the self-destruct timer.
         *
         * @param chatId Chat identifier.
         * @param messageId Message identifier.
         */
        public UpdateMessageContentOpened(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1520523131;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with an unread mention was read.
     */
    public static class UpdateMessageMentionRead extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Message identifier.
         */
        public long messageId;
        /**
         * The new number of unread mention messages left in the chat.
         */
        public int unreadMentionCount;

        /**
         * A message with an unread mention was read.
         */
        public UpdateMessageMentionRead() {
        }

        /**
         * A message with an unread mention was read.
         *
         * @param chatId Chat identifier.
         * @param messageId Message identifier.
         * @param unreadMentionCount The new number of unread mention messages left in the chat.
         */
        public UpdateMessageMentionRead(long chatId, long messageId, int unreadMentionCount) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.unreadMentionCount = unreadMentionCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -252228282;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of unread reactions added to a message was changed.
     */
    public static class UpdateMessageUnreadReactions extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Message identifier.
         */
        public long messageId;
        /**
         * The new list of unread reactions.
         */
        public UnreadReaction[] unreadReactions;
        /**
         * The new number of messages with unread reactions in the chat.
         */
        public int unreadReactionCount;

        /**
         * The list of unread reactions added to a message was changed.
         */
        public UpdateMessageUnreadReactions() {
        }

        /**
         * The list of unread reactions added to a message was changed.
         *
         * @param chatId Chat identifier.
         * @param messageId Message identifier.
         * @param unreadReactions The new list of unread reactions.
         * @param unreadReactionCount The new number of messages with unread reactions in the chat.
         */
        public UpdateMessageUnreadReactions(long chatId, long messageId, UnreadReaction[] unreadReactions, int unreadReactionCount) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.unreadReactions = unreadReactions;
            this.unreadReactionCount = unreadReactionCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 942840008;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Unread votes were added or removed from a poll message.
     */
    public static class UpdateMessageContainsUnreadPollVotes extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Message identifier.
         */
        public long messageId;
        /**
         * True, if the message is a poll message with unread votes.
         */
        public boolean containsUnreadPollVotes;
        /**
         * The new number of messages with unread poll votes in the chat.
         */
        public int unreadPollVoteCount;

        /**
         * Unread votes were added or removed from a poll message.
         */
        public UpdateMessageContainsUnreadPollVotes() {
        }

        /**
         * Unread votes were added or removed from a poll message.
         *
         * @param chatId Chat identifier.
         * @param messageId Message identifier.
         * @param containsUnreadPollVotes True, if the message is a poll message with unread votes.
         * @param unreadPollVoteCount The new number of messages with unread poll votes in the chat.
         */
        public UpdateMessageContainsUnreadPollVotes(long chatId, long messageId, boolean containsUnreadPollVotes, int unreadPollVoteCount) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.containsUnreadPollVotes = containsUnreadPollVotes;
            this.unreadPollVoteCount = unreadPollVoteCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1708270285;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A fact-check added to a message was changed.
     */
    public static class UpdateMessageFactCheck extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Message identifier.
         */
        public long messageId;
        /**
         * The new fact-check.
         */
        public FactCheck factCheck;

        /**
         * A fact-check added to a message was changed.
         */
        public UpdateMessageFactCheck() {
        }

        /**
         * A fact-check added to a message was changed.
         *
         * @param chatId Chat identifier.
         * @param messageId Message identifier.
         * @param factCheck The new fact-check.
         */
        public UpdateMessageFactCheck(long chatId, long messageId, FactCheck factCheck) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.factCheck = factCheck;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1014561538;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Information about suggested post of a message was changed.
     */
    public static class UpdateMessageSuggestedPostInfo extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Message identifier.
         */
        public long messageId;
        /**
         * The new information about the suggested post.
         */
        public SuggestedPostInfo suggestedPostInfo;

        /**
         * Information about suggested post of a message was changed.
         */
        public UpdateMessageSuggestedPostInfo() {
        }

        /**
         * Information about suggested post of a message was changed.
         *
         * @param chatId Chat identifier.
         * @param messageId Message identifier.
         * @param suggestedPostInfo The new information about the suggested post.
         */
        public UpdateMessageSuggestedPostInfo(long chatId, long messageId, SuggestedPostInfo suggestedPostInfo) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.suggestedPostInfo = suggestedPostInfo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 194418186;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message with a live location was viewed. When the update is received, the application is expected to update the live location.
     */
    public static class UpdateMessageLiveLocationViewed extends Update {
        /**
         * Identifier of the chat with the live location message.
         */
        public long chatId;
        /**
         * Identifier of the message with live location.
         */
        public long messageId;

        /**
         * A message with a live location was viewed. When the update is received, the application is expected to update the live location.
         */
        public UpdateMessageLiveLocationViewed() {
        }

        /**
         * A message with a live location was viewed. When the update is received, the application is expected to update the live location.
         *
         * @param chatId Identifier of the chat with the live location message.
         * @param messageId Identifier of the message with live location.
         */
        public UpdateMessageLiveLocationViewed(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1308260971;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An automatically scheduled message with video has been successfully sent after conversion.
     */
    public static class UpdateVideoPublished extends Update {
        /**
         * Identifier of the chat with the message.
         */
        public long chatId;
        /**
         * Identifier of the sent message.
         */
        public long messageId;

        /**
         * An automatically scheduled message with video has been successfully sent after conversion.
         */
        public UpdateVideoPublished() {
        }

        /**
         * An automatically scheduled message with video has been successfully sent after conversion.
         *
         * @param chatId Identifier of the chat with the message.
         * @param messageId Identifier of the sent message.
         */
        public UpdateVideoPublished(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -352575406;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new chat has been loaded/created. This update is guaranteed to come before the chat identifier is returned to the application. The chat field changes will be reported through separate updates.
     */
    public static class UpdateNewChat extends Update {
        /**
         * The chat.
         */
        public Chat chat;

        /**
         * A new chat has been loaded/created. This update is guaranteed to come before the chat identifier is returned to the application. The chat field changes will be reported through separate updates.
         */
        public UpdateNewChat() {
        }

        /**
         * A new chat has been loaded/created. This update is guaranteed to come before the chat identifier is returned to the application. The chat field changes will be reported through separate updates.
         *
         * @param chat The chat.
         */
        public UpdateNewChat(Chat chat) {
            this.chat = chat;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2075757773;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The title of a chat was changed.
     */
    public static class UpdateChatTitle extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The new chat title.
         */
        public String title;

        /**
         * The title of a chat was changed.
         */
        public UpdateChatTitle() {
        }

        /**
         * The title of a chat was changed.
         *
         * @param chatId Chat identifier.
         * @param title The new chat title.
         */
        public UpdateChatTitle(long chatId, String title) {
            this.chatId = chatId;
            this.title = title;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -175405660;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat photo was changed.
     */
    public static class UpdateChatPhoto extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The new chat photo; may be null.
         */
        @Nullable public ChatPhotoInfo photo;

        /**
         * A chat photo was changed.
         */
        public UpdateChatPhoto() {
        }

        /**
         * A chat photo was changed.
         *
         * @param chatId Chat identifier.
         * @param photo The new chat photo; may be null.
         */
        public UpdateChatPhoto(long chatId, ChatPhotoInfo photo) {
            this.chatId = chatId;
            this.photo = photo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -324713921;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Chat accent colors have changed.
     */
    public static class UpdateChatAccentColors extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The new chat accent color identifier.
         */
        public int accentColorId;
        /**
         * The new identifier of a custom emoji to be shown on the reply header and link preview background; 0 if none.
         */
        public long backgroundCustomEmojiId;
        /**
         * Color scheme based on an upgraded gift to be used for the chat instead of accentColorId and backgroundCustomEmojiId; may be null if none.
         */
        @Nullable public UpgradedGiftColors upgradedGiftColors;
        /**
         * The new chat profile accent color identifier; -1 if none.
         */
        public int profileAccentColorId;
        /**
         * The new identifier of a custom emoji to be shown on the profile background; 0 if none.
         */
        public long profileBackgroundCustomEmojiId;

        /**
         * Chat accent colors have changed.
         */
        public UpdateChatAccentColors() {
        }

        /**
         * Chat accent colors have changed.
         *
         * @param chatId Chat identifier.
         * @param accentColorId The new chat accent color identifier.
         * @param backgroundCustomEmojiId The new identifier of a custom emoji to be shown on the reply header and link preview background; 0 if none.
         * @param upgradedGiftColors Color scheme based on an upgraded gift to be used for the chat instead of accentColorId and backgroundCustomEmojiId; may be null if none.
         * @param profileAccentColorId The new chat profile accent color identifier; -1 if none.
         * @param profileBackgroundCustomEmojiId The new identifier of a custom emoji to be shown on the profile background; 0 if none.
         */
        public UpdateChatAccentColors(long chatId, int accentColorId, long backgroundCustomEmojiId, UpgradedGiftColors upgradedGiftColors, int profileAccentColorId, long profileBackgroundCustomEmojiId) {
            this.chatId = chatId;
            this.accentColorId = accentColorId;
            this.backgroundCustomEmojiId = backgroundCustomEmojiId;
            this.upgradedGiftColors = upgradedGiftColors;
            this.profileAccentColorId = profileAccentColorId;
            this.profileBackgroundCustomEmojiId = profileBackgroundCustomEmojiId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 874004198;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Chat permissions were changed.
     */
    public static class UpdateChatPermissions extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The new chat permissions.
         */
        public ChatPermissions permissions;

        /**
         * Chat permissions were changed.
         */
        public UpdateChatPermissions() {
        }

        /**
         * Chat permissions were changed.
         *
         * @param chatId Chat identifier.
         * @param permissions The new chat permissions.
         */
        public UpdateChatPermissions(long chatId, ChatPermissions permissions) {
            this.chatId = chatId;
            this.permissions = permissions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1622010003;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The last message of a chat was changed.
     */
    public static class UpdateChatLastMessage extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The new last message in the chat; may be null if the last message became unknown. While the last message is unknown, new messages can be added to the chat without corresponding updateNewMessage update.
         */
        @Nullable public Message lastMessage;
        /**
         * The new chat positions in the chat lists.
         */
        public ChatPosition[] positions;

        /**
         * The last message of a chat was changed.
         */
        public UpdateChatLastMessage() {
        }

        /**
         * The last message of a chat was changed.
         *
         * @param chatId Chat identifier.
         * @param lastMessage The new last message in the chat; may be null if the last message became unknown. While the last message is unknown, new messages can be added to the chat without corresponding updateNewMessage update.
         * @param positions The new chat positions in the chat lists.
         */
        public UpdateChatLastMessage(long chatId, Message lastMessage, ChatPosition[] positions) {
            this.chatId = chatId;
            this.lastMessage = lastMessage;
            this.positions = positions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -923244537;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The position of a chat in a chat list has changed. An updateChatLastMessage or updateChatDraftMessage update might be sent instead of the update.
     */
    public static class UpdateChatPosition extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New chat position. If new order is 0, then the chat needs to be removed from the list.
         */
        public ChatPosition position;

        /**
         * The position of a chat in a chat list has changed. An updateChatLastMessage or updateChatDraftMessage update might be sent instead of the update.
         */
        public UpdateChatPosition() {
        }

        /**
         * The position of a chat in a chat list has changed. An updateChatLastMessage or updateChatDraftMessage update might be sent instead of the update.
         *
         * @param chatId Chat identifier.
         * @param position New chat position. If new order is 0, then the chat needs to be removed from the list.
         */
        public UpdateChatPosition(long chatId, ChatPosition position) {
            this.chatId = chatId;
            this.position = position;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -8979849;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat was added to a chat list.
     */
    public static class UpdateChatAddedToList extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The chat list to which the chat was added.
         */
        public ChatList chatList;

        /**
         * A chat was added to a chat list.
         */
        public UpdateChatAddedToList() {
        }

        /**
         * A chat was added to a chat list.
         *
         * @param chatId Chat identifier.
         * @param chatList The chat list to which the chat was added.
         */
        public UpdateChatAddedToList(long chatId, ChatList chatList) {
            this.chatId = chatId;
            this.chatList = chatList;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1418722068;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat was removed from a chat list.
     */
    public static class UpdateChatRemovedFromList extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The chat list from which the chat was removed.
         */
        public ChatList chatList;

        /**
         * A chat was removed from a chat list.
         */
        public UpdateChatRemovedFromList() {
        }

        /**
         * A chat was removed from a chat list.
         *
         * @param chatId Chat identifier.
         * @param chatList The chat list from which the chat was removed.
         */
        public UpdateChatRemovedFromList(long chatId, ChatList chatList) {
            this.chatId = chatId;
            this.chatList = chatList;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1294647836;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Incoming messages were read or the number of unread messages has been changed.
     */
    public static class UpdateChatReadInbox extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifier of the last read incoming message.
         */
        public long lastReadInboxMessageId;
        /**
         * The number of unread messages left in the chat.
         */
        public int unreadCount;

        /**
         * Incoming messages were read or the number of unread messages has been changed.
         */
        public UpdateChatReadInbox() {
        }

        /**
         * Incoming messages were read or the number of unread messages has been changed.
         *
         * @param chatId Chat identifier.
         * @param lastReadInboxMessageId Identifier of the last read incoming message.
         * @param unreadCount The number of unread messages left in the chat.
         */
        public UpdateChatReadInbox(long chatId, long lastReadInboxMessageId, int unreadCount) {
            this.chatId = chatId;
            this.lastReadInboxMessageId = lastReadInboxMessageId;
            this.unreadCount = unreadCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -797952281;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Outgoing messages were read.
     */
    public static class UpdateChatReadOutbox extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifier of last read outgoing message.
         */
        public long lastReadOutboxMessageId;

        /**
         * Outgoing messages were read.
         */
        public UpdateChatReadOutbox() {
        }

        /**
         * Outgoing messages were read.
         *
         * @param chatId Chat identifier.
         * @param lastReadOutboxMessageId Identifier of last read outgoing message.
         */
        public UpdateChatReadOutbox(long chatId, long lastReadOutboxMessageId) {
            this.chatId = chatId;
            this.lastReadOutboxMessageId = lastReadOutboxMessageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 708334213;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat action bar was changed.
     */
    public static class UpdateChatActionBar extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The new value of the action bar; may be null.
         */
        @Nullable public ChatActionBar actionBar;

        /**
         * The chat action bar was changed.
         */
        public UpdateChatActionBar() {
        }

        /**
         * The chat action bar was changed.
         *
         * @param chatId Chat identifier.
         * @param actionBar The new value of the action bar; may be null.
         */
        public UpdateChatActionBar(long chatId, ChatActionBar actionBar) {
            this.chatId = chatId;
            this.actionBar = actionBar;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -643671870;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The bar for managing business bot was changed in a chat.
     */
    public static class UpdateChatBusinessBotManageBar extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The new value of the business bot manage bar; may be null.
         */
        @Nullable public BusinessBotManageBar businessBotManageBar;

        /**
         * The bar for managing business bot was changed in a chat.
         */
        public UpdateChatBusinessBotManageBar() {
        }

        /**
         * The bar for managing business bot was changed in a chat.
         *
         * @param chatId Chat identifier.
         * @param businessBotManageBar The new value of the business bot manage bar; may be null.
         */
        public UpdateChatBusinessBotManageBar(long chatId, BusinessBotManageBar businessBotManageBar) {
            this.chatId = chatId;
            this.businessBotManageBar = businessBotManageBar;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1104091145;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat available reactions were changed.
     */
    public static class UpdateChatAvailableReactions extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The new reactions, available in the chat.
         */
        public ChatAvailableReactions availableReactions;

        /**
         * The chat available reactions were changed.
         */
        public UpdateChatAvailableReactions() {
        }

        /**
         * The chat available reactions were changed.
         *
         * @param chatId Chat identifier.
         * @param availableReactions The new reactions, available in the chat.
         */
        public UpdateChatAvailableReactions(long chatId, ChatAvailableReactions availableReactions) {
            this.chatId = chatId;
            this.availableReactions = availableReactions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1967909895;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat draft has changed. Be aware that the update may come in the currently opened chat but with old content of the draft. If the user has changed the content of the draft, this update mustn't be applied.
     */
    public static class UpdateChatDraftMessage extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The new draft message; may be null if none.
         */
        @Nullable public DraftMessage draftMessage;
        /**
         * The new chat positions in the chat lists.
         */
        public ChatPosition[] positions;

        /**
         * A chat draft has changed. Be aware that the update may come in the currently opened chat but with old content of the draft. If the user has changed the content of the draft, this update mustn't be applied.
         */
        public UpdateChatDraftMessage() {
        }

        /**
         * A chat draft has changed. Be aware that the update may come in the currently opened chat but with old content of the draft. If the user has changed the content of the draft, this update mustn't be applied.
         *
         * @param chatId Chat identifier.
         * @param draftMessage The new draft message; may be null if none.
         * @param positions The new chat positions in the chat lists.
         */
        public UpdateChatDraftMessage(long chatId, DraftMessage draftMessage, ChatPosition[] positions) {
            this.chatId = chatId;
            this.draftMessage = draftMessage;
            this.positions = positions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1455190380;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Chat emoji status has changed.
     */
    public static class UpdateChatEmojiStatus extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The new chat emoji status; may be null.
         */
        @Nullable public EmojiStatus emojiStatus;

        /**
         * Chat emoji status has changed.
         */
        public UpdateChatEmojiStatus() {
        }

        /**
         * Chat emoji status has changed.
         *
         * @param chatId Chat identifier.
         * @param emojiStatus The new chat emoji status; may be null.
         */
        public UpdateChatEmojiStatus(long chatId, EmojiStatus emojiStatus) {
            this.chatId = chatId;
            this.emojiStatus = emojiStatus;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2004444432;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message sender that is selected to send messages in a chat has changed.
     */
    public static class UpdateChatMessageSender extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New value of messageSenderId; may be null if the user can't change message sender.
         */
        @Nullable public MessageSender messageSenderId;

        /**
         * The message sender that is selected to send messages in a chat has changed.
         */
        public UpdateChatMessageSender() {
        }

        /**
         * The message sender that is selected to send messages in a chat has changed.
         *
         * @param chatId Chat identifier.
         * @param messageSenderId New value of messageSenderId; may be null if the user can't change message sender.
         */
        public UpdateChatMessageSender(long chatId, MessageSender messageSenderId) {
            this.chatId = chatId;
            this.messageSenderId = messageSenderId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2003849793;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The message auto-delete or self-destruct timer setting for a chat was changed.
     */
    public static class UpdateChatMessageAutoDeleteTime extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New value of messageAutoDeleteTime.
         */
        public int messageAutoDeleteTime;

        /**
         * The message auto-delete or self-destruct timer setting for a chat was changed.
         */
        public UpdateChatMessageAutoDeleteTime() {
        }

        /**
         * The message auto-delete or self-destruct timer setting for a chat was changed.
         *
         * @param chatId Chat identifier.
         * @param messageAutoDeleteTime New value of messageAutoDeleteTime.
         */
        public UpdateChatMessageAutoDeleteTime(long chatId, int messageAutoDeleteTime) {
            this.chatId = chatId;
            this.messageAutoDeleteTime = messageAutoDeleteTime;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1900174821;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Notification settings for a chat were changed.
     */
    public static class UpdateChatNotificationSettings extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The new notification settings.
         */
        public ChatNotificationSettings notificationSettings;

        /**
         * Notification settings for a chat were changed.
         */
        public UpdateChatNotificationSettings() {
        }

        /**
         * Notification settings for a chat were changed.
         *
         * @param chatId Chat identifier.
         * @param notificationSettings The new notification settings.
         */
        public UpdateChatNotificationSettings(long chatId, ChatNotificationSettings notificationSettings) {
            this.chatId = chatId;
            this.notificationSettings = notificationSettings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -803163050;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat pending join requests were changed.
     */
    public static class UpdateChatPendingJoinRequests extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The new data about pending join requests; may be null.
         */
        @Nullable public ChatJoinRequestsInfo pendingJoinRequests;

        /**
         * The chat pending join requests were changed.
         */
        public UpdateChatPendingJoinRequests() {
        }

        /**
         * The chat pending join requests were changed.
         *
         * @param chatId Chat identifier.
         * @param pendingJoinRequests The new data about pending join requests; may be null.
         */
        public UpdateChatPendingJoinRequests(long chatId, ChatJoinRequestsInfo pendingJoinRequests) {
            this.chatId = chatId;
            this.pendingJoinRequests = pendingJoinRequests;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 348578785;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat reply markup was changed.
     */
    public static class UpdateChatReplyMarkup extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The message from which the reply markup must be used; may be null if there is no default reply markup in the chat.
         */
        @Nullable public Message replyMarkupMessage;

        /**
         * The chat reply markup was changed.
         */
        public UpdateChatReplyMarkup() {
        }

        /**
         * The chat reply markup was changed.
         *
         * @param chatId Chat identifier.
         * @param replyMarkupMessage The message from which the reply markup must be used; may be null if there is no default reply markup in the chat.
         */
        public UpdateChatReplyMarkup(long chatId, Message replyMarkupMessage) {
            this.chatId = chatId;
            this.replyMarkupMessage = replyMarkupMessage;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -714111887;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat background was changed.
     */
    public static class UpdateChatBackground extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The new chat background; may be null if background was reset to default.
         */
        @Nullable public ChatBackground background;

        /**
         * The chat background was changed.
         */
        public UpdateChatBackground() {
        }

        /**
         * The chat background was changed.
         *
         * @param chatId Chat identifier.
         * @param background The new chat background; may be null if background was reset to default.
         */
        public UpdateChatBackground(long chatId, ChatBackground background) {
            this.chatId = chatId;
            this.background = background;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -6473549;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat theme was changed.
     */
    public static class UpdateChatTheme extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The new theme of the chat; may be null if theme was reset to default.
         */
        @Nullable public ChatTheme theme;

        /**
         * The chat theme was changed.
         */
        public UpdateChatTheme() {
        }

        /**
         * The chat theme was changed.
         *
         * @param chatId Chat identifier.
         * @param theme The new theme of the chat; may be null if theme was reset to default.
         */
        public UpdateChatTheme(long chatId, ChatTheme theme) {
            this.chatId = chatId;
            this.theme = theme;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1625214435;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat unreadMentionCount has changed.
     */
    public static class UpdateChatUnreadMentionCount extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The number of unread mention messages left in the chat.
         */
        public int unreadMentionCount;

        /**
         * The chat unreadMentionCount has changed.
         */
        public UpdateChatUnreadMentionCount() {
        }

        /**
         * The chat unreadMentionCount has changed.
         *
         * @param chatId Chat identifier.
         * @param unreadMentionCount The number of unread mention messages left in the chat.
         */
        public UpdateChatUnreadMentionCount(long chatId, int unreadMentionCount) {
            this.chatId = chatId;
            this.unreadMentionCount = unreadMentionCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2131461348;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat unreadReactionCount has changed.
     */
    public static class UpdateChatUnreadReactionCount extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The number of messages with unread reactions left in the chat.
         */
        public int unreadReactionCount;

        /**
         * The chat unreadReactionCount has changed.
         */
        public UpdateChatUnreadReactionCount() {
        }

        /**
         * The chat unreadReactionCount has changed.
         *
         * @param chatId Chat identifier.
         * @param unreadReactionCount The number of messages with unread reactions left in the chat.
         */
        public UpdateChatUnreadReactionCount(long chatId, int unreadReactionCount) {
            this.chatId = chatId;
            this.unreadReactionCount = unreadReactionCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2124399395;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The chat unreadPollVoteCount has changed.
     */
    public static class UpdateChatUnreadPollVoteCount extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The number of messages with unread poll votes left in the chat.
         */
        public int unreadPollVoteCount;

        /**
         * The chat unreadPollVoteCount has changed.
         */
        public UpdateChatUnreadPollVoteCount() {
        }

        /**
         * The chat unreadPollVoteCount has changed.
         *
         * @param chatId Chat identifier.
         * @param unreadPollVoteCount The number of messages with unread poll votes left in the chat.
         */
        public UpdateChatUnreadPollVoteCount(long chatId, int unreadPollVoteCount) {
            this.chatId = chatId;
            this.unreadPollVoteCount = unreadPollVoteCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1720127450;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat video chat state has changed.
     */
    public static class UpdateChatVideoChat extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New value of videoChat.
         */
        public VideoChat videoChat;

        /**
         * A chat video chat state has changed.
         */
        public UpdateChatVideoChat() {
        }

        /**
         * A chat video chat state has changed.
         *
         * @param chatId Chat identifier.
         * @param videoChat New value of videoChat.
         */
        public UpdateChatVideoChat(long chatId, VideoChat videoChat) {
            this.chatId = chatId;
            this.videoChat = videoChat;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 637226150;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The value of the default disableNotification parameter, used when a message is sent to the chat, was changed.
     */
    public static class UpdateChatDefaultDisableNotification extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The new defaultDisableNotification value.
         */
        public boolean defaultDisableNotification;

        /**
         * The value of the default disableNotification parameter, used when a message is sent to the chat, was changed.
         */
        public UpdateChatDefaultDisableNotification() {
        }

        /**
         * The value of the default disableNotification parameter, used when a message is sent to the chat, was changed.
         *
         * @param chatId Chat identifier.
         * @param defaultDisableNotification The new defaultDisableNotification value.
         */
        public UpdateChatDefaultDisableNotification(long chatId, boolean defaultDisableNotification) {
            this.chatId = chatId;
            this.defaultDisableNotification = defaultDisableNotification;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 464087707;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat content was allowed or restricted for saving.
     */
    public static class UpdateChatHasProtectedContent extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New value of hasProtectedContent.
         */
        public boolean hasProtectedContent;

        /**
         * A chat content was allowed or restricted for saving.
         */
        public UpdateChatHasProtectedContent() {
        }

        /**
         * A chat content was allowed or restricted for saving.
         *
         * @param chatId Chat identifier.
         * @param hasProtectedContent New value of hasProtectedContent.
         */
        public UpdateChatHasProtectedContent(long chatId, boolean hasProtectedContent) {
            this.chatId = chatId;
            this.hasProtectedContent = hasProtectedContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1800406811;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Translation of chat messages was enabled or disabled.
     */
    public static class UpdateChatIsTranslatable extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New value of isTranslatable.
         */
        public boolean isTranslatable;

        /**
         * Translation of chat messages was enabled or disabled.
         */
        public UpdateChatIsTranslatable() {
        }

        /**
         * Translation of chat messages was enabled or disabled.
         *
         * @param chatId Chat identifier.
         * @param isTranslatable New value of isTranslatable.
         */
        public UpdateChatIsTranslatable(long chatId, boolean isTranslatable) {
            this.chatId = chatId;
            this.isTranslatable = isTranslatable;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2063799831;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat was marked as unread or was read.
     */
    public static class UpdateChatIsMarkedAsUnread extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New value of isMarkedAsUnread.
         */
        public boolean isMarkedAsUnread;

        /**
         * A chat was marked as unread or was read.
         */
        public UpdateChatIsMarkedAsUnread() {
        }

        /**
         * A chat was marked as unread or was read.
         *
         * @param chatId Chat identifier.
         * @param isMarkedAsUnread New value of isMarkedAsUnread.
         */
        public UpdateChatIsMarkedAsUnread(long chatId, boolean isMarkedAsUnread) {
            this.chatId = chatId;
            this.isMarkedAsUnread = isMarkedAsUnread;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1468347188;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat default appearance has changed.
     */
    public static class UpdateChatViewAsTopics extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New value of viewAsTopics.
         */
        public boolean viewAsTopics;

        /**
         * A chat default appearance has changed.
         */
        public UpdateChatViewAsTopics() {
        }

        /**
         * A chat default appearance has changed.
         *
         * @param chatId Chat identifier.
         * @param viewAsTopics New value of viewAsTopics.
         */
        public UpdateChatViewAsTopics(long chatId, boolean viewAsTopics) {
            this.chatId = chatId;
            this.viewAsTopics = viewAsTopics;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1543444029;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat was blocked or unblocked.
     */
    public static class UpdateChatBlockList extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Block list to which the chat is added; may be null if none.
         */
        @Nullable public BlockList blockList;

        /**
         * A chat was blocked or unblocked.
         */
        public UpdateChatBlockList() {
        }

        /**
         * A chat was blocked or unblocked.
         *
         * @param chatId Chat identifier.
         * @param blockList Block list to which the chat is added; may be null if none.
         */
        public UpdateChatBlockList(long chatId, BlockList blockList) {
            this.chatId = chatId;
            this.blockList = blockList;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2027228018;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat's hasScheduledMessages field has changed.
     */
    public static class UpdateChatHasScheduledMessages extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New value of hasScheduledMessages.
         */
        public boolean hasScheduledMessages;

        /**
         * A chat's hasScheduledMessages field has changed.
         */
        public UpdateChatHasScheduledMessages() {
        }

        /**
         * A chat's hasScheduledMessages field has changed.
         *
         * @param chatId Chat identifier.
         * @param hasScheduledMessages New value of hasScheduledMessages.
         */
        public UpdateChatHasScheduledMessages(long chatId, boolean hasScheduledMessages) {
            this.chatId = chatId;
            this.hasScheduledMessages = hasScheduledMessages;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2064958167;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of chat folders or a chat folder has changed.
     */
    public static class UpdateChatFolders extends Update {
        /**
         * The new list of chat folders.
         */
        public ChatFolderInfo[] chatFolders;
        /**
         * Position of the main chat list among chat folders, 0-based.
         */
        public int mainChatListPosition;
        /**
         * True, if folder tags are enabled.
         */
        public boolean areTagsEnabled;

        /**
         * The list of chat folders or a chat folder has changed.
         */
        public UpdateChatFolders() {
        }

        /**
         * The list of chat folders or a chat folder has changed.
         *
         * @param chatFolders The new list of chat folders.
         * @param mainChatListPosition Position of the main chat list among chat folders, 0-based.
         * @param areTagsEnabled True, if folder tags are enabled.
         */
        public UpdateChatFolders(ChatFolderInfo[] chatFolders, int mainChatListPosition, boolean areTagsEnabled) {
            this.chatFolders = chatFolders;
            this.mainChatListPosition = mainChatListPosition;
            this.areTagsEnabled = areTagsEnabled;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1998101395;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The number of online group members has changed. This update with non-zero number of online group members is sent only for currently opened chats. There is no guarantee that it is sent just after the number of online users has changed.
     */
    public static class UpdateChatOnlineMemberCount extends Update {
        /**
         * Identifier of the chat.
         */
        public long chatId;
        /**
         * New number of online members in the chat, or 0 if unknown.
         */
        public int onlineMemberCount;

        /**
         * The number of online group members has changed. This update with non-zero number of online group members is sent only for currently opened chats. There is no guarantee that it is sent just after the number of online users has changed.
         */
        public UpdateChatOnlineMemberCount() {
        }

        /**
         * The number of online group members has changed. This update with non-zero number of online group members is sent only for currently opened chats. There is no guarantee that it is sent just after the number of online users has changed.
         *
         * @param chatId Identifier of the chat.
         * @param onlineMemberCount New number of online members in the chat, or 0 if unknown.
         */
        public UpdateChatOnlineMemberCount(long chatId, int onlineMemberCount) {
            this.chatId = chatId;
            this.onlineMemberCount = onlineMemberCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 487369373;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Basic information about a Saved Messages topic has changed. This update is guaranteed to come before the topic identifier is returned to the application.
     */
    public static class UpdateSavedMessagesTopic extends Update {
        /**
         * New data about the topic.
         */
        public SavedMessagesTopic topic;

        /**
         * Basic information about a Saved Messages topic has changed. This update is guaranteed to come before the topic identifier is returned to the application.
         */
        public UpdateSavedMessagesTopic() {
        }

        /**
         * Basic information about a Saved Messages topic has changed. This update is guaranteed to come before the topic identifier is returned to the application.
         *
         * @param topic New data about the topic.
         */
        public UpdateSavedMessagesTopic(SavedMessagesTopic topic) {
            this.topic = topic;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1618855120;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Number of Saved Messages topics has changed.
     */
    public static class UpdateSavedMessagesTopicCount extends Update {
        /**
         * Approximate total number of Saved Messages topics.
         */
        public int topicCount;

        /**
         * Number of Saved Messages topics has changed.
         */
        public UpdateSavedMessagesTopicCount() {
        }

        /**
         * Number of Saved Messages topics has changed.
         *
         * @param topicCount Approximate total number of Saved Messages topics.
         */
        public UpdateSavedMessagesTopicCount(int topicCount) {
            this.topicCount = topicCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -70092335;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Basic information about a topic in a channel direct messages chat administered by the current user has changed. This update is guaranteed to come before the topic identifier is returned to the application.
     */
    public static class UpdateDirectMessagesChatTopic extends Update {
        /**
         * New data about the topic.
         */
        public DirectMessagesChatTopic topic;

        /**
         * Basic information about a topic in a channel direct messages chat administered by the current user has changed. This update is guaranteed to come before the topic identifier is returned to the application.
         */
        public UpdateDirectMessagesChatTopic() {
        }

        /**
         * Basic information about a topic in a channel direct messages chat administered by the current user has changed. This update is guaranteed to come before the topic identifier is returned to the application.
         *
         * @param topic New data about the topic.
         */
        public UpdateDirectMessagesChatTopic(DirectMessagesChatTopic topic) {
            this.topic = topic;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -683346963;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Number of messages in a topic has changed; for Saved Messages and channel direct messages chat topics only.
     */
    public static class UpdateTopicMessageCount extends Update {
        /**
         * Identifier of the chat in topic of which the number of messages has changed.
         */
        public long chatId;
        /**
         * Identifier of the topic.
         */
        public MessageTopic topicId;
        /**
         * Approximate number of messages in the topic.
         */
        public int messageCount;

        /**
         * Number of messages in a topic has changed; for Saved Messages and channel direct messages chat topics only.
         */
        public UpdateTopicMessageCount() {
        }

        /**
         * Number of messages in a topic has changed; for Saved Messages and channel direct messages chat topics only.
         *
         * @param chatId Identifier of the chat in topic of which the number of messages has changed.
         * @param topicId Identifier of the topic.
         * @param messageCount Approximate number of messages in the topic.
         */
        public UpdateTopicMessageCount(long chatId, MessageTopic topicId, int messageCount) {
            this.chatId = chatId;
            this.topicId = topicId;
            this.messageCount = messageCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1591525479;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Basic information about a quick reply shortcut has changed. This update is guaranteed to come before the quick shortcut name is returned to the application.
     */
    public static class UpdateQuickReplyShortcut extends Update {
        /**
         * New data about the shortcut.
         */
        public QuickReplyShortcut shortcut;

        /**
         * Basic information about a quick reply shortcut has changed. This update is guaranteed to come before the quick shortcut name is returned to the application.
         */
        public UpdateQuickReplyShortcut() {
        }

        /**
         * Basic information about a quick reply shortcut has changed. This update is guaranteed to come before the quick shortcut name is returned to the application.
         *
         * @param shortcut New data about the shortcut.
         */
        public UpdateQuickReplyShortcut(QuickReplyShortcut shortcut) {
            this.shortcut = shortcut;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -963430193;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A quick reply shortcut and all its messages were deleted.
     */
    public static class UpdateQuickReplyShortcutDeleted extends Update {
        /**
         * The identifier of the deleted shortcut.
         */
        public int shortcutId;

        /**
         * A quick reply shortcut and all its messages were deleted.
         */
        public UpdateQuickReplyShortcutDeleted() {
        }

        /**
         * A quick reply shortcut and all its messages were deleted.
         *
         * @param shortcutId The identifier of the deleted shortcut.
         */
        public UpdateQuickReplyShortcutDeleted(int shortcutId) {
            this.shortcutId = shortcutId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -390480838;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of quick reply shortcuts has changed.
     */
    public static class UpdateQuickReplyShortcuts extends Update {
        /**
         * The new list of identifiers of quick reply shortcuts.
         */
        public int[] shortcutIds;

        /**
         * The list of quick reply shortcuts has changed.
         */
        public UpdateQuickReplyShortcuts() {
        }

        /**
         * The list of quick reply shortcuts has changed.
         *
         * @param shortcutIds The new list of identifiers of quick reply shortcuts.
         */
        public UpdateQuickReplyShortcuts(int[] shortcutIds) {
            this.shortcutIds = shortcutIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1994849731;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of quick reply shortcut messages has changed.
     */
    public static class UpdateQuickReplyShortcutMessages extends Update {
        /**
         * The identifier of the shortcut.
         */
        public int shortcutId;
        /**
         * The new list of quick reply messages for the shortcut in order from the first to the last sent.
         */
        public QuickReplyMessage[] messages;

        /**
         * The list of quick reply shortcut messages has changed.
         */
        public UpdateQuickReplyShortcutMessages() {
        }

        /**
         * The list of quick reply shortcut messages has changed.
         *
         * @param shortcutId The identifier of the shortcut.
         * @param messages The new list of quick reply messages for the shortcut in order from the first to the last sent.
         */
        public UpdateQuickReplyShortcutMessages(int shortcutId, QuickReplyMessage[] messages) {
            this.shortcutId = shortcutId;
            this.messages = messages;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1396685225;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Basic information about a topic in a forum chat was changed.
     */
    public static class UpdateForumTopicInfo extends Update {
        /**
         * New information about the topic.
         */
        public ForumTopicInfo info;

        /**
         * Basic information about a topic in a forum chat was changed.
         */
        public UpdateForumTopicInfo() {
        }

        /**
         * Basic information about a topic in a forum chat was changed.
         *
         * @param info New information about the topic.
         */
        public UpdateForumTopicInfo(ForumTopicInfo info) {
            this.info = info;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1420762696;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Information about a topic in a forum chat was changed.
     */
    public static class UpdateForumTopic extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Forum topic identifier of the topic.
         */
        public int forumTopicId;
        /**
         * True, if the topic is pinned in the topic list.
         */
        public boolean isPinned;
        /**
         * Identifier of the last read incoming message.
         */
        public long lastReadInboxMessageId;
        /**
         * Identifier of the last read outgoing message.
         */
        public long lastReadOutboxMessageId;
        /**
         * Number of unread messages with a mention/reply in the topic.
         */
        public int unreadMentionCount;
        /**
         * Number of messages with unread reactions in the topic.
         */
        public int unreadReactionCount;
        /**
         * Number of messages with unread poll votes in the topic.
         */
        public int unreadPollVoteCount;
        /**
         * Notification settings for the topic.
         */
        public ChatNotificationSettings notificationSettings;
        /**
         * A draft of a message in the topic; may be null if none.
         */
        @Nullable public DraftMessage draftMessage;

        /**
         * Information about a topic in a forum chat was changed.
         */
        public UpdateForumTopic() {
        }

        /**
         * Information about a topic in a forum chat was changed.
         *
         * @param chatId Chat identifier.
         * @param forumTopicId Forum topic identifier of the topic.
         * @param isPinned True, if the topic is pinned in the topic list.
         * @param lastReadInboxMessageId Identifier of the last read incoming message.
         * @param lastReadOutboxMessageId Identifier of the last read outgoing message.
         * @param unreadMentionCount Number of unread messages with a mention/reply in the topic.
         * @param unreadReactionCount Number of messages with unread reactions in the topic.
         * @param unreadPollVoteCount Number of messages with unread poll votes in the topic.
         * @param notificationSettings Notification settings for the topic.
         * @param draftMessage A draft of a message in the topic; may be null if none.
         */
        public UpdateForumTopic(long chatId, int forumTopicId, boolean isPinned, long lastReadInboxMessageId, long lastReadOutboxMessageId, int unreadMentionCount, int unreadReactionCount, int unreadPollVoteCount, ChatNotificationSettings notificationSettings, DraftMessage draftMessage) {
            this.chatId = chatId;
            this.forumTopicId = forumTopicId;
            this.isPinned = isPinned;
            this.lastReadInboxMessageId = lastReadInboxMessageId;
            this.lastReadOutboxMessageId = lastReadOutboxMessageId;
            this.unreadMentionCount = unreadMentionCount;
            this.unreadReactionCount = unreadReactionCount;
            this.unreadPollVoteCount = unreadPollVoteCount;
            this.notificationSettings = notificationSettings;
            this.draftMessage = draftMessage;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1851967925;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Notification settings for some type of chats were updated.
     */
    public static class UpdateScopeNotificationSettings extends Update {
        /**
         * Types of chats for which notification settings were updated.
         */
        public NotificationSettingsScope scope;
        /**
         * The new notification settings.
         */
        public ScopeNotificationSettings notificationSettings;

        /**
         * Notification settings for some type of chats were updated.
         */
        public UpdateScopeNotificationSettings() {
        }

        /**
         * Notification settings for some type of chats were updated.
         *
         * @param scope Types of chats for which notification settings were updated.
         * @param notificationSettings The new notification settings.
         */
        public UpdateScopeNotificationSettings(NotificationSettingsScope scope, ScopeNotificationSettings notificationSettings) {
            this.scope = scope;
            this.notificationSettings = notificationSettings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1203975309;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Notification settings for reactions were updated.
     */
    public static class UpdateReactionNotificationSettings extends Update {
        /**
         * The new notification settings.
         */
        public ReactionNotificationSettings notificationSettings;

        /**
         * Notification settings for reactions were updated.
         */
        public UpdateReactionNotificationSettings() {
        }

        /**
         * Notification settings for reactions were updated.
         *
         * @param notificationSettings The new notification settings.
         */
        public UpdateReactionNotificationSettings(ReactionNotificationSettings notificationSettings) {
            this.notificationSettings = notificationSettings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -447932436;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A notification was changed.
     */
    public static class UpdateNotification extends Update {
        /**
         * Unique notification group identifier.
         */
        public int notificationGroupId;
        /**
         * Changed notification.
         */
        public Notification notification;

        /**
         * A notification was changed.
         */
        public UpdateNotification() {
        }

        /**
         * A notification was changed.
         *
         * @param notificationGroupId Unique notification group identifier.
         * @param notification Changed notification.
         */
        public UpdateNotification(int notificationGroupId, Notification notification) {
            this.notificationGroupId = notificationGroupId;
            this.notification = notification;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1897496876;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A list of active notifications in a notification group has changed.
     */
    public static class UpdateNotificationGroup extends Update {
        /**
         * Unique notification group identifier.
         */
        public int notificationGroupId;
        /**
         * New type of the notification group.
         */
        public NotificationGroupType type;
        /**
         * Identifier of a chat to which all notifications in the group belong.
         */
        public long chatId;
        /**
         * Chat identifier, which notification settings must be applied to the added notifications.
         */
        public long notificationSettingsChatId;
        /**
         * Identifier of the notification sound to be played; 0 if sound is disabled.
         */
        public long notificationSoundId;
        /**
         * Total number of unread notifications in the group, can be bigger than number of active notifications.
         */
        public int totalCount;
        /**
         * List of added group notifications, sorted by notification identifier.
         */
        public Notification[] addedNotifications;
        /**
         * Identifiers of removed group notifications, sorted by notification identifier.
         */
        public int[] removedNotificationIds;

        /**
         * A list of active notifications in a notification group has changed.
         */
        public UpdateNotificationGroup() {
        }

        /**
         * A list of active notifications in a notification group has changed.
         *
         * @param notificationGroupId Unique notification group identifier.
         * @param type New type of the notification group.
         * @param chatId Identifier of a chat to which all notifications in the group belong.
         * @param notificationSettingsChatId Chat identifier, which notification settings must be applied to the added notifications.
         * @param notificationSoundId Identifier of the notification sound to be played; 0 if sound is disabled.
         * @param totalCount Total number of unread notifications in the group, can be bigger than number of active notifications.
         * @param addedNotifications List of added group notifications, sorted by notification identifier.
         * @param removedNotificationIds Identifiers of removed group notifications, sorted by notification identifier.
         */
        public UpdateNotificationGroup(int notificationGroupId, NotificationGroupType type, long chatId, long notificationSettingsChatId, long notificationSoundId, int totalCount, Notification[] addedNotifications, int[] removedNotificationIds) {
            this.notificationGroupId = notificationGroupId;
            this.type = type;
            this.chatId = chatId;
            this.notificationSettingsChatId = notificationSettingsChatId;
            this.notificationSoundId = notificationSoundId;
            this.totalCount = totalCount;
            this.addedNotifications = addedNotifications;
            this.removedNotificationIds = removedNotificationIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1381081378;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains active notifications that were shown on previous application launches. This update is sent only if the message database is used. In that case it comes once before any updateNotification and updateNotificationGroup update.
     */
    public static class UpdateActiveNotifications extends Update {
        /**
         * Lists of active notification groups.
         */
        public NotificationGroup[] groups;

        /**
         * Contains active notifications that were shown on previous application launches. This update is sent only if the message database is used. In that case it comes once before any updateNotification and updateNotificationGroup update.
         */
        public UpdateActiveNotifications() {
        }

        /**
         * Contains active notifications that were shown on previous application launches. This update is sent only if the message database is used. In that case it comes once before any updateNotification and updateNotificationGroup update.
         *
         * @param groups Lists of active notification groups.
         */
        public UpdateActiveNotifications(NotificationGroup[] groups) {
            this.groups = groups;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1306672221;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes whether there are some pending notification updates. Can be used to prevent application from killing, while there are some pending notifications.
     */
    public static class UpdateHavePendingNotifications extends Update {
        /**
         * True, if there are some delayed notification updates, which will be sent soon.
         */
        public boolean haveDelayedNotifications;
        /**
         * True, if there can be some yet unreceived notifications, which are being fetched from the server.
         */
        public boolean haveUnreceivedNotifications;

        /**
         * Describes whether there are some pending notification updates. Can be used to prevent application from killing, while there are some pending notifications.
         */
        public UpdateHavePendingNotifications() {
        }

        /**
         * Describes whether there are some pending notification updates. Can be used to prevent application from killing, while there are some pending notifications.
         *
         * @param haveDelayedNotifications True, if there are some delayed notification updates, which will be sent soon.
         * @param haveUnreceivedNotifications True, if there can be some yet unreceived notifications, which are being fetched from the server.
         */
        public UpdateHavePendingNotifications(boolean haveDelayedNotifications, boolean haveUnreceivedNotifications) {
            this.haveDelayedNotifications = haveDelayedNotifications;
            this.haveUnreceivedNotifications = haveUnreceivedNotifications;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 179233243;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Some messages were deleted.
     */
    public static class UpdateDeleteMessages extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifiers of the deleted messages.
         */
        public long[] messageIds;
        /**
         * True, if the messages are permanently deleted by a user (as opposed to just becoming inaccessible).
         */
        public boolean isPermanent;
        /**
         * True, if the messages are deleted only from the cache and can possibly be retrieved again in the future.
         */
        public boolean fromCache;

        /**
         * Some messages were deleted.
         */
        public UpdateDeleteMessages() {
        }

        /**
         * Some messages were deleted.
         *
         * @param chatId Chat identifier.
         * @param messageIds Identifiers of the deleted messages.
         * @param isPermanent True, if the messages are permanently deleted by a user (as opposed to just becoming inaccessible).
         * @param fromCache True, if the messages are deleted only from the cache and can possibly be retrieved again in the future.
         */
        public UpdateDeleteMessages(long chatId, long[] messageIds, boolean isPermanent, boolean fromCache) {
            this.chatId = chatId;
            this.messageIds = messageIds;
            this.isPermanent = isPermanent;
            this.fromCache = fromCache;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1669252686;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message sender activity in the chat has changed.
     */
    public static class UpdateChatAction extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifier of the specific topic in which the action was performed; may be null if none.
         */
        @Nullable public MessageTopic topicId;
        /**
         * Identifier of a message sender performing the action.
         */
        public MessageSender senderId;
        /**
         * The action.
         */
        public ChatAction action;

        /**
         * A message sender activity in the chat has changed.
         */
        public UpdateChatAction() {
        }

        /**
         * A message sender activity in the chat has changed.
         *
         * @param chatId Chat identifier.
         * @param topicId Identifier of the specific topic in which the action was performed; may be null if none.
         * @param senderId Identifier of a message sender performing the action.
         * @param action The action.
         */
        public UpdateChatAction(long chatId, MessageTopic topicId, MessageSender senderId, ChatAction action) {
            this.chatId = chatId;
            this.topicId = topicId;
            this.senderId = senderId;
            this.action = action;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1140846612;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new pending text message was received in a chat with a bot. The message must be shown in the chat for at most getOption(&quot;pending_text_message_period&quot;) seconds, replace any other pending message with the same draftId, and be deleted whenever any incoming message from the bot in the message thread is received.
     */
    public static class UpdatePendingTextMessage extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The forum topic identifier in which the message will be sent; 0 if none.
         */
        public int forumTopicId;
        /**
         * Unique identifier of the message draft within the message thread.
         */
        public long draftId;
        /**
         * Text of the pending message.
         */
        public FormattedText text;

        /**
         * A new pending text message was received in a chat with a bot. The message must be shown in the chat for at most getOption(&quot;pending_text_message_period&quot;) seconds, replace any other pending message with the same draftId, and be deleted whenever any incoming message from the bot in the message thread is received.
         */
        public UpdatePendingTextMessage() {
        }

        /**
         * A new pending text message was received in a chat with a bot. The message must be shown in the chat for at most getOption(&quot;pending_text_message_period&quot;) seconds, replace any other pending message with the same draftId, and be deleted whenever any incoming message from the bot in the message thread is received.
         *
         * @param chatId Chat identifier.
         * @param forumTopicId The forum topic identifier in which the message will be sent; 0 if none.
         * @param draftId Unique identifier of the message draft within the message thread.
         * @param text Text of the pending message.
         */
        public UpdatePendingTextMessage(long chatId, int forumTopicId, long draftId, FormattedText text) {
            this.chatId = chatId;
            this.forumTopicId = forumTopicId;
            this.draftId = draftId;
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1076298155;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user went online or offline.
     */
    public static class UpdateUserStatus extends Update {
        /**
         * User identifier.
         */
        public long userId;
        /**
         * New status of the user.
         */
        public UserStatus status;

        /**
         * The user went online or offline.
         */
        public UpdateUserStatus() {
        }

        /**
         * The user went online or offline.
         *
         * @param userId User identifier.
         * @param status New status of the user.
         */
        public UpdateUserStatus(long userId, UserStatus status) {
            this.userId = userId;
            this.status = status;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 958468625;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Some data of a user has changed. This update is guaranteed to come before the user identifier is returned to the application.
     */
    public static class UpdateUser extends Update {
        /**
         * New data about the user.
         */
        public User user;

        /**
         * Some data of a user has changed. This update is guaranteed to come before the user identifier is returned to the application.
         */
        public UpdateUser() {
        }

        /**
         * Some data of a user has changed. This update is guaranteed to come before the user identifier is returned to the application.
         *
         * @param user New data about the user.
         */
        public UpdateUser(User user) {
            this.user = user;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1183394041;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Some data of a basic group has changed. This update is guaranteed to come before the basic group identifier is returned to the application.
     */
    public static class UpdateBasicGroup extends Update {
        /**
         * New data about the group.
         */
        public BasicGroup basicGroup;

        /**
         * Some data of a basic group has changed. This update is guaranteed to come before the basic group identifier is returned to the application.
         */
        public UpdateBasicGroup() {
        }

        /**
         * Some data of a basic group has changed. This update is guaranteed to come before the basic group identifier is returned to the application.
         *
         * @param basicGroup New data about the group.
         */
        public UpdateBasicGroup(BasicGroup basicGroup) {
            this.basicGroup = basicGroup;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1003239581;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Some data of a supergroup or a channel has changed. This update is guaranteed to come before the supergroup identifier is returned to the application.
     */
    public static class UpdateSupergroup extends Update {
        /**
         * New data about the supergroup.
         */
        public Supergroup supergroup;

        /**
         * Some data of a supergroup or a channel has changed. This update is guaranteed to come before the supergroup identifier is returned to the application.
         */
        public UpdateSupergroup() {
        }

        /**
         * Some data of a supergroup or a channel has changed. This update is guaranteed to come before the supergroup identifier is returned to the application.
         *
         * @param supergroup New data about the supergroup.
         */
        public UpdateSupergroup(Supergroup supergroup) {
            this.supergroup = supergroup;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -76782300;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Some data of a secret chat has changed. This update is guaranteed to come before the secret chat identifier is returned to the application.
     */
    public static class UpdateSecretChat extends Update {
        /**
         * New data about the secret chat.
         */
        public SecretChat secretChat;

        /**
         * Some data of a secret chat has changed. This update is guaranteed to come before the secret chat identifier is returned to the application.
         */
        public UpdateSecretChat() {
        }

        /**
         * Some data of a secret chat has changed. This update is guaranteed to come before the secret chat identifier is returned to the application.
         *
         * @param secretChat New data about the secret chat.
         */
        public UpdateSecretChat(SecretChat secretChat) {
            this.secretChat = secretChat;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1666903253;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Some data in userFullInfo has been changed.
     */
    public static class UpdateUserFullInfo extends Update {
        /**
         * User identifier.
         */
        public long userId;
        /**
         * New full information about the user.
         */
        public UserFullInfo userFullInfo;

        /**
         * Some data in userFullInfo has been changed.
         */
        public UpdateUserFullInfo() {
        }

        /**
         * Some data in userFullInfo has been changed.
         *
         * @param userId User identifier.
         * @param userFullInfo New full information about the user.
         */
        public UpdateUserFullInfo(long userId, UserFullInfo userFullInfo) {
            this.userId = userId;
            this.userFullInfo = userFullInfo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -51197161;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Some data in basicGroupFullInfo has been changed.
     */
    public static class UpdateBasicGroupFullInfo extends Update {
        /**
         * Identifier of a basic group.
         */
        public long basicGroupId;
        /**
         * New full information about the group.
         */
        public BasicGroupFullInfo basicGroupFullInfo;

        /**
         * Some data in basicGroupFullInfo has been changed.
         */
        public UpdateBasicGroupFullInfo() {
        }

        /**
         * Some data in basicGroupFullInfo has been changed.
         *
         * @param basicGroupId Identifier of a basic group.
         * @param basicGroupFullInfo New full information about the group.
         */
        public UpdateBasicGroupFullInfo(long basicGroupId, BasicGroupFullInfo basicGroupFullInfo) {
            this.basicGroupId = basicGroupId;
            this.basicGroupFullInfo = basicGroupFullInfo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1391881151;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Some data in supergroupFullInfo has been changed.
     */
    public static class UpdateSupergroupFullInfo extends Update {
        /**
         * Identifier of the supergroup or channel.
         */
        public long supergroupId;
        /**
         * New full information about the supergroup.
         */
        public SupergroupFullInfo supergroupFullInfo;

        /**
         * Some data in supergroupFullInfo has been changed.
         */
        public UpdateSupergroupFullInfo() {
        }

        /**
         * Some data in supergroupFullInfo has been changed.
         *
         * @param supergroupId Identifier of the supergroup or channel.
         * @param supergroupFullInfo New full information about the supergroup.
         */
        public UpdateSupergroupFullInfo(long supergroupId, SupergroupFullInfo supergroupFullInfo) {
            this.supergroupId = supergroupId;
            this.supergroupFullInfo = supergroupFullInfo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 435539214;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A service notification from the server was received. Upon receiving this the application must show a popup with the content of the notification.
     */
    public static class UpdateServiceNotification extends Update {
        /**
         * Notification type. If type begins with &quot;AUTH_KEY_DROP_&quot;, then two buttons &quot;Cancel&quot; and &quot;Log out&quot; must be shown under notification; if user presses the second, all local data must be destroyed using Destroy method.
         */
        public String type;
        /**
         * Notification content.
         */
        public MessageContent content;

        /**
         * A service notification from the server was received. Upon receiving this the application must show a popup with the content of the notification.
         */
        public UpdateServiceNotification() {
        }

        /**
         * A service notification from the server was received. Upon receiving this the application must show a popup with the content of the notification.
         *
         * @param type Notification type. If type begins with &quot;AUTH_KEY_DROP_&quot;, then two buttons &quot;Cancel&quot; and &quot;Log out&quot; must be shown under notification; if user presses the second, all local data must be destroyed using Destroy method.
         * @param content Notification content.
         */
        public UpdateServiceNotification(String type, MessageContent content) {
            this.type = type;
            this.content = content;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1318622637;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An OAuth authorization request was received.
     */
    public static class UpdateNewOauthRequest extends Update {
        /**
         * A domain of the URL where the user authorizes.
         */
        public String domain;
        /**
         * Human-readable description of a country and a region from which the authorization is performed, based on the IP address.
         */
        public String location;
        /**
         * The URL to pass to getOauthLinkInfo; the link is valid for 60 seconds.
         */
        public String url;

        /**
         * An OAuth authorization request was received.
         */
        public UpdateNewOauthRequest() {
        }

        /**
         * An OAuth authorization request was received.
         *
         * @param domain A domain of the URL where the user authorizes.
         * @param location Human-readable description of a country and a region from which the authorization is performed, based on the IP address.
         * @param url The URL to pass to getOauthLinkInfo; the link is valid for 60 seconds.
         */
        public UpdateNewOauthRequest(String domain, String location, String url) {
            this.domain = domain;
            this.location = location;
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 248383005;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Information about a file was updated.
     */
    public static class UpdateFile extends Update {
        /**
         * New data about the file.
         */
        public File file;

        /**
         * Information about a file was updated.
         */
        public UpdateFile() {
        }

        /**
         * Information about a file was updated.
         *
         * @param file New data about the file.
         */
        public UpdateFile(File file) {
            this.file = file;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 114132831;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The file generation process needs to be started by the application. Use setFileGenerationProgress and finishFileGeneration to generate the file.
     */
    public static class UpdateFileGenerationStart extends Update {
        /**
         * Unique identifier for the generation process.
         */
        public long generationId;
        /**
         * The original path specified by the application in inputFileGenerated.
         */
        public String originalPath;
        /**
         * The path to a file that must be created and where the new file must be generated by the application. If the application has no access to the path, it can use writeGeneratedFilePart to generate the file.
         */
        public String destinationPath;
        /**
         * If the conversion is &quot;#url#&quot; than originalPath contains an HTTP/HTTPS URL of a file that must be downloaded by the application. Otherwise, this is the conversion specified by the application in inputFileGenerated.
         */
        public String conversion;

        /**
         * The file generation process needs to be started by the application. Use setFileGenerationProgress and finishFileGeneration to generate the file.
         */
        public UpdateFileGenerationStart() {
        }

        /**
         * The file generation process needs to be started by the application. Use setFileGenerationProgress and finishFileGeneration to generate the file.
         *
         * @param generationId Unique identifier for the generation process.
         * @param originalPath The original path specified by the application in inputFileGenerated.
         * @param destinationPath The path to a file that must be created and where the new file must be generated by the application. If the application has no access to the path, it can use writeGeneratedFilePart to generate the file.
         * @param conversion If the conversion is &quot;#url#&quot; than originalPath contains an HTTP/HTTPS URL of a file that must be downloaded by the application. Otherwise, this is the conversion specified by the application in inputFileGenerated.
         */
        public UpdateFileGenerationStart(long generationId, String originalPath, String destinationPath, String conversion) {
            this.generationId = generationId;
            this.originalPath = originalPath;
            this.destinationPath = destinationPath;
            this.conversion = conversion;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 216817388;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * File generation is no longer needed.
     */
    public static class UpdateFileGenerationStop extends Update {
        /**
         * Unique identifier for the generation process.
         */
        public long generationId;

        /**
         * File generation is no longer needed.
         */
        public UpdateFileGenerationStop() {
        }

        /**
         * File generation is no longer needed.
         *
         * @param generationId Unique identifier for the generation process.
         */
        public UpdateFileGenerationStop(long generationId) {
            this.generationId = generationId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1894449685;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The state of the file download list has changed.
     */
    public static class UpdateFileDownloads extends Update {
        /**
         * Total size of files in the file download list, in bytes.
         */
        public long totalSize;
        /**
         * Total number of files in the file download list.
         */
        public int totalCount;
        /**
         * Total downloaded size of files in the file download list, in bytes.
         */
        public long downloadedSize;

        /**
         * The state of the file download list has changed.
         */
        public UpdateFileDownloads() {
        }

        /**
         * The state of the file download list has changed.
         *
         * @param totalSize Total size of files in the file download list, in bytes.
         * @param totalCount Total number of files in the file download list.
         * @param downloadedSize Total downloaded size of files in the file download list, in bytes.
         */
        public UpdateFileDownloads(long totalSize, int totalCount, long downloadedSize) {
            this.totalSize = totalSize;
            this.totalCount = totalCount;
            this.downloadedSize = downloadedSize;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -389213497;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A file was added to the file download list. This update is sent only after file download list is loaded for the first time.
     */
    public static class UpdateFileAddedToDownloads extends Update {
        /**
         * The added file download.
         */
        public FileDownload fileDownload;
        /**
         * New number of being downloaded and recently downloaded files found.
         */
        public DownloadedFileCounts counts;

        /**
         * A file was added to the file download list. This update is sent only after file download list is loaded for the first time.
         */
        public UpdateFileAddedToDownloads() {
        }

        /**
         * A file was added to the file download list. This update is sent only after file download list is loaded for the first time.
         *
         * @param fileDownload The added file download.
         * @param counts New number of being downloaded and recently downloaded files found.
         */
        public UpdateFileAddedToDownloads(FileDownload fileDownload, DownloadedFileCounts counts) {
            this.fileDownload = fileDownload;
            this.counts = counts;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1609929242;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A file download was changed. This update is sent only after file download list is loaded for the first time.
     */
    public static class UpdateFileDownload extends Update {
        /**
         * File identifier.
         */
        public int fileId;
        /**
         * Point in time (Unix timestamp) when the file downloading was completed; 0 if the file downloading isn't completed.
         */
        public int completeDate;
        /**
         * True, if downloading of the file is paused.
         */
        public boolean isPaused;
        /**
         * New number of being downloaded and recently downloaded files found.
         */
        public DownloadedFileCounts counts;

        /**
         * A file download was changed. This update is sent only after file download list is loaded for the first time.
         */
        public UpdateFileDownload() {
        }

        /**
         * A file download was changed. This update is sent only after file download list is loaded for the first time.
         *
         * @param fileId File identifier.
         * @param completeDate Point in time (Unix timestamp) when the file downloading was completed; 0 if the file downloading isn't completed.
         * @param isPaused True, if downloading of the file is paused.
         * @param counts New number of being downloaded and recently downloaded files found.
         */
        public UpdateFileDownload(int fileId, int completeDate, boolean isPaused, DownloadedFileCounts counts) {
            this.fileId = fileId;
            this.completeDate = completeDate;
            this.isPaused = isPaused;
            this.counts = counts;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 875529162;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A file was removed from the file download list. This update is sent only after file download list is loaded for the first time.
     */
    public static class UpdateFileRemovedFromDownloads extends Update {
        /**
         * File identifier.
         */
        public int fileId;
        /**
         * New number of being downloaded and recently downloaded files found.
         */
        public DownloadedFileCounts counts;

        /**
         * A file was removed from the file download list. This update is sent only after file download list is loaded for the first time.
         */
        public UpdateFileRemovedFromDownloads() {
        }

        /**
         * A file was removed from the file download list. This update is sent only after file download list is loaded for the first time.
         *
         * @param fileId File identifier.
         * @param counts New number of being downloaded and recently downloaded files found.
         */
        public UpdateFileRemovedFromDownloads(int fileId, DownloadedFileCounts counts) {
            this.fileId = fileId;
            this.counts = counts;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1853625576;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A request can't be completed unless application verification is performed; for official mobile applications only. The method setApplicationVerificationToken must be called once the verification is completed or failed.
     */
    public static class UpdateApplicationVerificationRequired extends Update {
        /**
         * Unique identifier for the verification process.
         */
        public long verificationId;
        /**
         * Unique base64url-encoded nonce for the classic Play Integrity verification (https://developer.android.com/google/play/integrity/classic) for Android, or a unique string to compare with verifyNonce field from a push notification for iOS.
         */
        public String nonce;
        /**
         * Cloud project number to pass to the Play Integrity API on Android.
         */
        public long cloudProjectNumber;

        /**
         * A request can't be completed unless application verification is performed; for official mobile applications only. The method setApplicationVerificationToken must be called once the verification is completed or failed.
         */
        public UpdateApplicationVerificationRequired() {
        }

        /**
         * A request can't be completed unless application verification is performed; for official mobile applications only. The method setApplicationVerificationToken must be called once the verification is completed or failed.
         *
         * @param verificationId Unique identifier for the verification process.
         * @param nonce Unique base64url-encoded nonce for the classic Play Integrity verification (https://developer.android.com/google/play/integrity/classic) for Android, or a unique string to compare with verifyNonce field from a push notification for iOS.
         * @param cloudProjectNumber Cloud project number to pass to the Play Integrity API on Android.
         */
        public UpdateApplicationVerificationRequired(long verificationId, String nonce, long cloudProjectNumber) {
            this.verificationId = verificationId;
            this.nonce = nonce;
            this.cloudProjectNumber = cloudProjectNumber;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -979607081;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A request can't be completed unless reCAPTCHA verification is performed; for official mobile applications only. The method setApplicationVerificationToken must be called once the verification is completed or failed.
     */
    public static class UpdateApplicationRecaptchaVerificationRequired extends Update {
        /**
         * Unique identifier for the verification process.
         */
        public long verificationId;
        /**
         * The action for the check.
         */
        public String action;
        /**
         * Identifier of the reCAPTCHA key.
         */
        public String recaptchaKeyId;

        /**
         * A request can't be completed unless reCAPTCHA verification is performed; for official mobile applications only. The method setApplicationVerificationToken must be called once the verification is completed or failed.
         */
        public UpdateApplicationRecaptchaVerificationRequired() {
        }

        /**
         * A request can't be completed unless reCAPTCHA verification is performed; for official mobile applications only. The method setApplicationVerificationToken must be called once the verification is completed or failed.
         *
         * @param verificationId Unique identifier for the verification process.
         * @param action The action for the check.
         * @param recaptchaKeyId Identifier of the reCAPTCHA key.
         */
        public UpdateApplicationRecaptchaVerificationRequired(long verificationId, String action, String recaptchaKeyId) {
            this.verificationId = verificationId;
            this.action = action;
            this.recaptchaKeyId = recaptchaKeyId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1796351554;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * New call was created or information about a call was updated.
     */
    public static class UpdateCall extends Update {
        /**
         * New data about a call.
         */
        public Call call;

        /**
         * New call was created or information about a call was updated.
         */
        public UpdateCall() {
        }

        /**
         * New call was created or information about a call was updated.
         *
         * @param call New data about a call.
         */
        public UpdateCall(Call call) {
            this.call = call;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1337184477;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Information about a group call was updated.
     */
    public static class UpdateGroupCall extends Update {
        /**
         * New data about the group call.
         */
        public GroupCall groupCall;

        /**
         * Information about a group call was updated.
         */
        public UpdateGroupCall() {
        }

        /**
         * Information about a group call was updated.
         *
         * @param groupCall New data about the group call.
         */
        public UpdateGroupCall(GroupCall groupCall) {
            this.groupCall = groupCall;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 808603136;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Information about a group call participant was changed. The updates are sent only after the group call is received through getGroupCall and only if the call is joined or being joined.
     */
    public static class UpdateGroupCallParticipant extends Update {
        /**
         * Identifier of the group call.
         */
        public int groupCallId;
        /**
         * New data about the participant.
         */
        public GroupCallParticipant participant;

        /**
         * Information about a group call participant was changed. The updates are sent only after the group call is received through getGroupCall and only if the call is joined or being joined.
         */
        public UpdateGroupCallParticipant() {
        }

        /**
         * Information about a group call participant was changed. The updates are sent only after the group call is received through getGroupCall and only if the call is joined or being joined.
         *
         * @param groupCallId Identifier of the group call.
         * @param participant New data about the participant.
         */
        public UpdateGroupCallParticipant(int groupCallId, GroupCallParticipant participant) {
            this.groupCallId = groupCallId;
            this.participant = participant;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -803128071;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of group call participants that can send and receive encrypted call data has changed; for group calls not bound to a chat only.
     */
    public static class UpdateGroupCallParticipants extends Update {
        /**
         * Identifier of the group call.
         */
        public int groupCallId;
        /**
         * New list of group call participant user identifiers. The identifiers may be invalid or the corresponding users may be unknown. The participants must be shown in the list of group call participants even if there is no information about them.
         */
        public long[] participantUserIds;

        /**
         * The list of group call participants that can send and receive encrypted call data has changed; for group calls not bound to a chat only.
         */
        public UpdateGroupCallParticipants() {
        }

        /**
         * The list of group call participants that can send and receive encrypted call data has changed; for group calls not bound to a chat only.
         *
         * @param groupCallId Identifier of the group call.
         * @param participantUserIds New list of group call participant user identifiers. The identifiers may be invalid or the corresponding users may be unknown. The participants must be shown in the list of group call participants even if there is no information about them.
         */
        public UpdateGroupCallParticipants(int groupCallId, long[] participantUserIds) {
            this.groupCallId = groupCallId;
            this.participantUserIds = participantUserIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1874006374;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The verification state of an encrypted group call has changed; for group calls not bound to a chat only.
     */
    public static class UpdateGroupCallVerificationState extends Update {
        /**
         * Identifier of the group call.
         */
        public int groupCallId;
        /**
         * The call state generation to which the emoji corresponds. If generation is different for two users, then their emoji may be also different.
         */
        public int generation;
        /**
         * Group call state fingerprint represented as 4 emoji; may be empty if the state isn't verified yet.
         */
        public String[] emojis;

        /**
         * The verification state of an encrypted group call has changed; for group calls not bound to a chat only.
         */
        public UpdateGroupCallVerificationState() {
        }

        /**
         * The verification state of an encrypted group call has changed; for group calls not bound to a chat only.
         *
         * @param groupCallId Identifier of the group call.
         * @param generation The call state generation to which the emoji corresponds. If generation is different for two users, then their emoji may be also different.
         * @param emojis Group call state fingerprint represented as 4 emoji; may be empty if the state isn't verified yet.
         */
        public UpdateGroupCallVerificationState(int groupCallId, int generation, String[] emojis) {
            this.groupCallId = groupCallId;
            this.generation = generation;
            this.emojis = emojis;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 682965060;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new message was received in a group call.
     */
    public static class UpdateNewGroupCallMessage extends Update {
        /**
         * Identifier of the group call.
         */
        public int groupCallId;
        /**
         * The message.
         */
        public GroupCallMessage message;

        /**
         * A new message was received in a group call.
         */
        public UpdateNewGroupCallMessage() {
        }

        /**
         * A new message was received in a group call.
         *
         * @param groupCallId Identifier of the group call.
         * @param message The message.
         */
        public UpdateNewGroupCallMessage(int groupCallId, GroupCallMessage message) {
            this.groupCallId = groupCallId;
            this.message = message;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2072291743;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new paid reaction was received in a live story group call.
     */
    public static class UpdateNewGroupCallPaidReaction extends Update {
        /**
         * Identifier of the group call.
         */
        public int groupCallId;
        /**
         * Identifier of the sender of the reaction.
         */
        public MessageSender senderId;
        /**
         * The number of Telegram Stars that were paid to send the reaction.
         */
        public long starCount;

        /**
         * A new paid reaction was received in a live story group call.
         */
        public UpdateNewGroupCallPaidReaction() {
        }

        /**
         * A new paid reaction was received in a live story group call.
         *
         * @param groupCallId Identifier of the group call.
         * @param senderId Identifier of the sender of the reaction.
         * @param starCount The number of Telegram Stars that were paid to send the reaction.
         */
        public UpdateNewGroupCallPaidReaction(int groupCallId, MessageSender senderId, long starCount) {
            this.groupCallId = groupCallId;
            this.senderId = senderId;
            this.starCount = starCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -189233012;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A group call message failed to send.
     */
    public static class UpdateGroupCallMessageSendFailed extends Update {
        /**
         * Identifier of the group call.
         */
        public int groupCallId;
        /**
         * Message identifier.
         */
        public int messageId;
        /**
         * The cause of the message sending failure.
         */
        public Error error;

        /**
         * A group call message failed to send.
         */
        public UpdateGroupCallMessageSendFailed() {
        }

        /**
         * A group call message failed to send.
         *
         * @param groupCallId Identifier of the group call.
         * @param messageId Message identifier.
         * @param error The cause of the message sending failure.
         */
        public UpdateGroupCallMessageSendFailed(int groupCallId, int messageId, Error error) {
            this.groupCallId = groupCallId;
            this.messageId = messageId;
            this.error = error;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 472432559;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Some group call messages were deleted.
     */
    public static class UpdateGroupCallMessagesDeleted extends Update {
        /**
         * Identifier of the group call.
         */
        public int groupCallId;
        /**
         * Identifiers of the deleted messages.
         */
        public int[] messageIds;

        /**
         * Some group call messages were deleted.
         */
        public UpdateGroupCallMessagesDeleted() {
        }

        /**
         * Some group call messages were deleted.
         *
         * @param groupCallId Identifier of the group call.
         * @param messageIds Identifiers of the deleted messages.
         */
        public UpdateGroupCallMessagesDeleted(int groupCallId, int[] messageIds) {
            this.groupCallId = groupCallId;
            this.messageIds = messageIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1275517315;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of top donors in live story group call has changed.
     */
    public static class UpdateLiveStoryTopDonors extends Update {
        /**
         * Identifier of the group call.
         */
        public int groupCallId;
        /**
         * New list of live story donors.
         */
        public LiveStoryDonors donors;

        /**
         * The list of top donors in live story group call has changed.
         */
        public UpdateLiveStoryTopDonors() {
        }

        /**
         * The list of top donors in live story group call has changed.
         *
         * @param groupCallId Identifier of the group call.
         * @param donors New list of live story donors.
         */
        public UpdateLiveStoryTopDonors(int groupCallId, LiveStoryDonors donors) {
            this.groupCallId = groupCallId;
            this.donors = donors;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -715693884;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * New call signaling data arrived.
     */
    public static class UpdateNewCallSignalingData extends Update {
        /**
         * The call identifier.
         */
        public int callId;
        /**
         * The data.
         */
        public byte[] data;

        /**
         * New call signaling data arrived.
         */
        public UpdateNewCallSignalingData() {
        }

        /**
         * New call signaling data arrived.
         *
         * @param callId The call identifier.
         * @param data The data.
         */
        public UpdateNewCallSignalingData(int callId, byte[] data) {
            this.callId = callId;
            this.data = data;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 583634317;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * State of a gift auction was updated.
     */
    public static class UpdateGiftAuctionState extends Update {
        /**
         * New state of the auction.
         */
        public GiftAuctionState state;

        /**
         * State of a gift auction was updated.
         */
        public UpdateGiftAuctionState() {
        }

        /**
         * State of a gift auction was updated.
         *
         * @param state New state of the auction.
         */
        public UpdateGiftAuctionState(GiftAuctionState state) {
            this.state = state;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1864542270;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of auctions in which participate the current user has changed.
     */
    public static class UpdateActiveGiftAuctions extends Update {
        /**
         * New states of the auctions.
         */
        public GiftAuctionState[] states;

        /**
         * The list of auctions in which participate the current user has changed.
         */
        public UpdateActiveGiftAuctions() {
        }

        /**
         * The list of auctions in which participate the current user has changed.
         *
         * @param states New states of the auctions.
         */
        public UpdateActiveGiftAuctions(GiftAuctionState[] states) {
            this.states = states;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -521505204;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Some privacy setting rules have been changed.
     */
    public static class UpdateUserPrivacySettingRules extends Update {
        /**
         * The privacy setting.
         */
        public UserPrivacySetting setting;
        /**
         * New privacy rules.
         */
        public UserPrivacySettingRules rules;

        /**
         * Some privacy setting rules have been changed.
         */
        public UpdateUserPrivacySettingRules() {
        }

        /**
         * Some privacy setting rules have been changed.
         *
         * @param setting The privacy setting.
         * @param rules New privacy rules.
         */
        public UpdateUserPrivacySettingRules(UserPrivacySetting setting, UserPrivacySettingRules rules) {
            this.setting = setting;
            this.rules = rules;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -912960778;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Number of unread messages in a chat list has changed. This update is sent only if the message database is used.
     */
    public static class UpdateUnreadMessageCount extends Update {
        /**
         * The chat list with changed number of unread messages.
         */
        public ChatList chatList;
        /**
         * Total number of unread messages.
         */
        public int unreadCount;
        /**
         * Total number of unread messages in unmuted chats.
         */
        public int unreadUnmutedCount;

        /**
         * Number of unread messages in a chat list has changed. This update is sent only if the message database is used.
         */
        public UpdateUnreadMessageCount() {
        }

        /**
         * Number of unread messages in a chat list has changed. This update is sent only if the message database is used.
         *
         * @param chatList The chat list with changed number of unread messages.
         * @param unreadCount Total number of unread messages.
         * @param unreadUnmutedCount Total number of unread messages in unmuted chats.
         */
        public UpdateUnreadMessageCount(ChatList chatList, int unreadCount, int unreadUnmutedCount) {
            this.chatList = chatList;
            this.unreadCount = unreadCount;
            this.unreadUnmutedCount = unreadUnmutedCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 78987721;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Number of unread chats, i.e. with unread messages or marked as unread, has changed. This update is sent only if the message database is used.
     */
    public static class UpdateUnreadChatCount extends Update {
        /**
         * The chat list with changed number of unread messages.
         */
        public ChatList chatList;
        /**
         * Approximate total number of chats in the chat list.
         */
        public int totalCount;
        /**
         * Total number of unread chats.
         */
        public int unreadCount;
        /**
         * Total number of unread unmuted chats.
         */
        public int unreadUnmutedCount;
        /**
         * Total number of chats marked as unread.
         */
        public int markedAsUnreadCount;
        /**
         * Total number of unmuted chats marked as unread.
         */
        public int markedAsUnreadUnmutedCount;

        /**
         * Number of unread chats, i.e. with unread messages or marked as unread, has changed. This update is sent only if the message database is used.
         */
        public UpdateUnreadChatCount() {
        }

        /**
         * Number of unread chats, i.e. with unread messages or marked as unread, has changed. This update is sent only if the message database is used.
         *
         * @param chatList The chat list with changed number of unread messages.
         * @param totalCount Approximate total number of chats in the chat list.
         * @param unreadCount Total number of unread chats.
         * @param unreadUnmutedCount Total number of unread unmuted chats.
         * @param markedAsUnreadCount Total number of chats marked as unread.
         * @param markedAsUnreadUnmutedCount Total number of unmuted chats marked as unread.
         */
        public UpdateUnreadChatCount(ChatList chatList, int totalCount, int unreadCount, int unreadUnmutedCount, int markedAsUnreadCount, int markedAsUnreadUnmutedCount) {
            this.chatList = chatList;
            this.totalCount = totalCount;
            this.unreadCount = unreadCount;
            this.unreadUnmutedCount = unreadUnmutedCount;
            this.markedAsUnreadCount = markedAsUnreadCount;
            this.markedAsUnreadUnmutedCount = markedAsUnreadUnmutedCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1994494530;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A story was changed.
     */
    public static class UpdateStory extends Update {
        /**
         * The new information about the story.
         */
        public Story story;

        /**
         * A story was changed.
         */
        public UpdateStory() {
        }

        /**
         * A story was changed.
         *
         * @param story The new information about the story.
         */
        public UpdateStory(Story story) {
            this.story = story;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 419845935;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A story became inaccessible.
     */
    public static class UpdateStoryDeleted extends Update {
        /**
         * Identifier of the chat that posted the story.
         */
        public long storyPosterChatId;
        /**
         * Story identifier.
         */
        public int storyId;

        /**
         * A story became inaccessible.
         */
        public UpdateStoryDeleted() {
        }

        /**
         * A story became inaccessible.
         *
         * @param storyPosterChatId Identifier of the chat that posted the story.
         * @param storyId Story identifier.
         */
        public UpdateStoryDeleted(long storyPosterChatId, int storyId) {
            this.storyPosterChatId = storyPosterChatId;
            this.storyId = storyId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -582743166;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A story has been successfully posted.
     */
    public static class UpdateStoryPostSucceeded extends Update {
        /**
         * The posted story.
         */
        public Story story;
        /**
         * The previous temporary story identifier.
         */
        public int oldStoryId;

        /**
         * A story has been successfully posted.
         */
        public UpdateStoryPostSucceeded() {
        }

        /**
         * A story has been successfully posted.
         *
         * @param story The posted story.
         * @param oldStoryId The previous temporary story identifier.
         */
        public UpdateStoryPostSucceeded(Story story, int oldStoryId) {
            this.story = story;
            this.oldStoryId = oldStoryId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1712432318;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A story failed to post. If the story posting is canceled, then updateStoryDeleted will be received instead of this update.
     */
    public static class UpdateStoryPostFailed extends Update {
        /**
         * The failed to post story.
         */
        public Story story;
        /**
         * The cause of the story posting failure.
         */
        public Error error;
        /**
         * Type of the error; may be null if unknown.
         */
        @Nullable public CanPostStoryResult errorType;

        /**
         * A story failed to post. If the story posting is canceled, then updateStoryDeleted will be received instead of this update.
         */
        public UpdateStoryPostFailed() {
        }

        /**
         * A story failed to post. If the story posting is canceled, then updateStoryDeleted will be received instead of this update.
         *
         * @param story The failed to post story.
         * @param error The cause of the story posting failure.
         * @param errorType Type of the error; may be null if unknown.
         */
        public UpdateStoryPostFailed(Story story, Error error, CanPostStoryResult errorType) {
            this.story = story;
            this.error = error;
            this.errorType = errorType;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1248168444;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of active stories posted by a specific chat has changed.
     */
    public static class UpdateChatActiveStories extends Update {
        /**
         * The new list of active stories.
         */
        public ChatActiveStories activeStories;

        /**
         * The list of active stories posted by a specific chat has changed.
         */
        public UpdateChatActiveStories() {
        }

        /**
         * The list of active stories posted by a specific chat has changed.
         *
         * @param activeStories The new list of active stories.
         */
        public UpdateChatActiveStories(ChatActiveStories activeStories) {
            this.activeStories = activeStories;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2037935148;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Number of chats in a story list has changed.
     */
    public static class UpdateStoryListChatCount extends Update {
        /**
         * The story list.
         */
        public StoryList storyList;
        /**
         * Approximate total number of chats with active stories in the list.
         */
        public int chatCount;

        /**
         * Number of chats in a story list has changed.
         */
        public UpdateStoryListChatCount() {
        }

        /**
         * Number of chats in a story list has changed.
         *
         * @param storyList The story list.
         * @param chatCount Approximate total number of chats with active stories in the list.
         */
        public UpdateStoryListChatCount(StoryList storyList, int chatCount) {
            this.storyList = storyList;
            this.chatCount = chatCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2009871041;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Story stealth mode settings have changed.
     */
    public static class UpdateStoryStealthMode extends Update {
        /**
         * Point in time (Unix timestamp) until stealth mode is active; 0 if it is disabled.
         */
        public int activeUntilDate;
        /**
         * Point in time (Unix timestamp) when stealth mode can be enabled again; 0 if there is no active cooldown.
         */
        public int cooldownUntilDate;

        /**
         * Story stealth mode settings have changed.
         */
        public UpdateStoryStealthMode() {
        }

        /**
         * Story stealth mode settings have changed.
         *
         * @param activeUntilDate Point in time (Unix timestamp) until stealth mode is active; 0 if it is disabled.
         * @param cooldownUntilDate Point in time (Unix timestamp) when stealth mode can be enabled again; 0 if there is no active cooldown.
         */
        public UpdateStoryStealthMode(int activeUntilDate, int cooldownUntilDate) {
            this.activeUntilDate = activeUntilDate;
            this.cooldownUntilDate = cooldownUntilDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1878506778;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Lists of bots which Mini Apps must be allowed to read text from clipboard and must be opened without a warning.
     */
    public static class UpdateTrustedMiniAppBots extends Update {
        /**
         * List of user identifiers of the bots; the corresponding users may not be sent using updateUser updates and may not be accessible.
         */
        public long[] botUserIds;

        /**
         * Lists of bots which Mini Apps must be allowed to read text from clipboard and must be opened without a warning.
         */
        public UpdateTrustedMiniAppBots() {
        }

        /**
         * Lists of bots which Mini Apps must be allowed to read text from clipboard and must be opened without a warning.
         *
         * @param botUserIds List of user identifiers of the bots; the corresponding users may not be sent using updateUser updates and may not be accessible.
         */
        public UpdateTrustedMiniAppBots(long[] botUserIds) {
            this.botUserIds = botUserIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1733723438;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * An option changed its value.
     */
    public static class UpdateOption extends Update {
        /**
         * The option name.
         */
        public String name;
        /**
         * The new option value.
         */
        public OptionValue value;

        /**
         * An option changed its value.
         */
        public UpdateOption() {
        }

        /**
         * An option changed its value.
         *
         * @param name The option name.
         * @param value The new option value.
         */
        public UpdateOption(String name, OptionValue value) {
            this.name = name;
            this.value = value;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 900822020;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A sticker set has changed.
     */
    public static class UpdateStickerSet extends Update {
        /**
         * The sticker set.
         */
        public StickerSet stickerSet;

        /**
         * A sticker set has changed.
         */
        public UpdateStickerSet() {
        }

        /**
         * A sticker set has changed.
         *
         * @param stickerSet The sticker set.
         */
        public UpdateStickerSet(StickerSet stickerSet) {
            this.stickerSet = stickerSet;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1879268812;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of installed sticker sets was updated.
     */
    public static class UpdateInstalledStickerSets extends Update {
        /**
         * Type of the affected stickers.
         */
        public StickerType stickerType;
        /**
         * The new list of installed ordinary sticker sets.
         */
        public long[] stickerSetIds;

        /**
         * The list of installed sticker sets was updated.
         */
        public UpdateInstalledStickerSets() {
        }

        /**
         * The list of installed sticker sets was updated.
         *
         * @param stickerType Type of the affected stickers.
         * @param stickerSetIds The new list of installed ordinary sticker sets.
         */
        public UpdateInstalledStickerSets(StickerType stickerType, long[] stickerSetIds) {
            this.stickerType = stickerType;
            this.stickerSetIds = stickerSetIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1735084182;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of trending sticker sets was updated or some of them were viewed.
     */
    public static class UpdateTrendingStickerSets extends Update {
        /**
         * Type of the affected stickers.
         */
        public StickerType stickerType;
        /**
         * The prefix of the list of trending sticker sets with the newest trending sticker sets.
         */
        public TrendingStickerSets stickerSets;

        /**
         * The list of trending sticker sets was updated or some of them were viewed.
         */
        public UpdateTrendingStickerSets() {
        }

        /**
         * The list of trending sticker sets was updated or some of them were viewed.
         *
         * @param stickerType Type of the affected stickers.
         * @param stickerSets The prefix of the list of trending sticker sets with the newest trending sticker sets.
         */
        public UpdateTrendingStickerSets(StickerType stickerType, TrendingStickerSets stickerSets) {
            this.stickerType = stickerType;
            this.stickerSets = stickerSets;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1266307239;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of recently used stickers was updated.
     */
    public static class UpdateRecentStickers extends Update {
        /**
         * True, if the list of stickers attached to photo or video files was updated; otherwise, the list of sent stickers is updated.
         */
        public boolean isAttached;
        /**
         * The new list of file identifiers of recently used stickers.
         */
        public int[] stickerIds;

        /**
         * The list of recently used stickers was updated.
         */
        public UpdateRecentStickers() {
        }

        /**
         * The list of recently used stickers was updated.
         *
         * @param isAttached True, if the list of stickers attached to photo or video files was updated; otherwise, the list of sent stickers is updated.
         * @param stickerIds The new list of file identifiers of recently used stickers.
         */
        public UpdateRecentStickers(boolean isAttached, int[] stickerIds) {
            this.isAttached = isAttached;
            this.stickerIds = stickerIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1906403540;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of favorite stickers was updated.
     */
    public static class UpdateFavoriteStickers extends Update {
        /**
         * The new list of file identifiers of favorite stickers.
         */
        public int[] stickerIds;

        /**
         * The list of favorite stickers was updated.
         */
        public UpdateFavoriteStickers() {
        }

        /**
         * The list of favorite stickers was updated.
         *
         * @param stickerIds The new list of file identifiers of favorite stickers.
         */
        public UpdateFavoriteStickers(int[] stickerIds) {
            this.stickerIds = stickerIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1662240999;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of saved animations was updated.
     */
    public static class UpdateSavedAnimations extends Update {
        /**
         * The new list of file identifiers of saved animations.
         */
        public int[] animationIds;

        /**
         * The list of saved animations was updated.
         */
        public UpdateSavedAnimations() {
        }

        /**
         * The list of saved animations was updated.
         *
         * @param animationIds The new list of file identifiers of saved animations.
         */
        public UpdateSavedAnimations(int[] animationIds) {
            this.animationIds = animationIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 65563814;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of saved notification sounds was updated. This update may not be sent until information about a notification sound was requested for the first time.
     */
    public static class UpdateSavedNotificationSounds extends Update {
        /**
         * The new list of identifiers of saved notification sounds.
         */
        public long[] notificationSoundIds;

        /**
         * The list of saved notification sounds was updated. This update may not be sent until information about a notification sound was requested for the first time.
         */
        public UpdateSavedNotificationSounds() {
        }

        /**
         * The list of saved notification sounds was updated. This update may not be sent until information about a notification sound was requested for the first time.
         *
         * @param notificationSoundIds The new list of identifiers of saved notification sounds.
         */
        public UpdateSavedNotificationSounds(long[] notificationSoundIds) {
            this.notificationSoundIds = notificationSoundIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1052725698;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The default background has changed.
     */
    public static class UpdateDefaultBackground extends Update {
        /**
         * True, if default background for dark theme has changed.
         */
        public boolean forDarkTheme;
        /**
         * The new default background; may be null.
         */
        @Nullable public Background background;

        /**
         * The default background has changed.
         */
        public UpdateDefaultBackground() {
        }

        /**
         * The default background has changed.
         *
         * @param forDarkTheme True, if default background for dark theme has changed.
         * @param background The new default background; may be null.
         */
        public UpdateDefaultBackground(boolean forDarkTheme, Background background) {
            this.forDarkTheme = forDarkTheme;
            this.background = background;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -716139217;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of available emoji chat themes has changed.
     */
    public static class UpdateEmojiChatThemes extends Update {
        /**
         * The new list of emoji chat themes.
         */
        public EmojiChatTheme[] chatThemes;

        /**
         * The list of available emoji chat themes has changed.
         */
        public UpdateEmojiChatThemes() {
        }

        /**
         * The list of available emoji chat themes has changed.
         *
         * @param chatThemes The new list of emoji chat themes.
         */
        public UpdateEmojiChatThemes(EmojiChatTheme[] chatThemes) {
            this.chatThemes = chatThemes;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1021628745;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of supported accent colors has changed.
     */
    public static class UpdateAccentColors extends Update {
        /**
         * Information about supported colors; colors with identifiers 0 (red), 1 (orange), 2 (purple/violet), 3 (green), 4 (cyan), 5 (blue), 6 (pink) must always be supported and aren't included in the list. The exact colors for the accent colors with identifiers 0-6 must be taken from the application theme.
         */
        public AccentColor[] colors;
        /**
         * The list of accent color identifiers, which can be set through setAccentColor and setChatAccentColor. The colors must be shown in the specified order.
         */
        public int[] availableAccentColorIds;

        /**
         * The list of supported accent colors has changed.
         */
        public UpdateAccentColors() {
        }

        /**
         * The list of supported accent colors has changed.
         *
         * @param colors Information about supported colors; colors with identifiers 0 (red), 1 (orange), 2 (purple/violet), 3 (green), 4 (cyan), 5 (blue), 6 (pink) must always be supported and aren't included in the list. The exact colors for the accent colors with identifiers 0-6 must be taken from the application theme.
         * @param availableAccentColorIds The list of accent color identifiers, which can be set through setAccentColor and setChatAccentColor. The colors must be shown in the specified order.
         */
        public UpdateAccentColors(AccentColor[] colors, int[] availableAccentColorIds) {
            this.colors = colors;
            this.availableAccentColorIds = availableAccentColorIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1197047738;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of supported accent colors for user profiles has changed.
     */
    public static class UpdateProfileAccentColors extends Update {
        /**
         * Information about supported colors.
         */
        public ProfileAccentColor[] colors;
        /**
         * The list of accent color identifiers, which can be set through setProfileAccentColor and setChatProfileAccentColor. The colors must be shown in the specified order.
         */
        public int[] availableAccentColorIds;

        /**
         * The list of supported accent colors for user profiles has changed.
         */
        public UpdateProfileAccentColors() {
        }

        /**
         * The list of supported accent colors for user profiles has changed.
         *
         * @param colors Information about supported colors.
         * @param availableAccentColorIds The list of accent color identifiers, which can be set through setProfileAccentColor and setChatProfileAccentColor. The colors must be shown in the specified order.
         */
        public UpdateProfileAccentColors(ProfileAccentColor[] colors, int[] availableAccentColorIds) {
            this.colors = colors;
            this.availableAccentColorIds = availableAccentColorIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 605202104;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Some language pack strings have been updated.
     */
    public static class UpdateLanguagePackStrings extends Update {
        /**
         * Localization target to which the language pack belongs.
         */
        public String localizationTarget;
        /**
         * Identifier of the updated language pack.
         */
        public String languagePackId;
        /**
         * List of changed language pack strings; empty if all strings have changed.
         */
        public LanguagePackString[] strings;

        /**
         * Some language pack strings have been updated.
         */
        public UpdateLanguagePackStrings() {
        }

        /**
         * Some language pack strings have been updated.
         *
         * @param localizationTarget Localization target to which the language pack belongs.
         * @param languagePackId Identifier of the updated language pack.
         * @param strings List of changed language pack strings; empty if all strings have changed.
         */
        public UpdateLanguagePackStrings(String localizationTarget, String languagePackId, LanguagePackString[] strings) {
            this.localizationTarget = localizationTarget;
            this.languagePackId = languagePackId;
            this.strings = strings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1056319886;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The connection state has changed. This update must be used only to show a human-readable description of the connection state.
     */
    public static class UpdateConnectionState extends Update {
        /**
         * The new connection state.
         */
        public ConnectionState state;

        /**
         * The connection state has changed. This update must be used only to show a human-readable description of the connection state.
         */
        public UpdateConnectionState() {
        }

        /**
         * The connection state has changed. This update must be used only to show a human-readable description of the connection state.
         *
         * @param state The new connection state.
         */
        public UpdateConnectionState(ConnectionState state) {
            this.state = state;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1469292078;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The freeze state of the current user's account has changed.
     */
    public static class UpdateFreezeState extends Update {
        /**
         * True, if the account is frozen.
         */
        public boolean isFrozen;
        /**
         * Point in time (Unix timestamp) when the account was frozen; 0 if the account isn't frozen.
         */
        public int freezingDate;
        /**
         * Point in time (Unix timestamp) when the account will be deleted and can't be unfrozen; 0 if the account isn't frozen.
         */
        public int deletionDate;
        /**
         * The link to open to send an appeal to unfreeze the account.
         */
        public String appealLink;

        /**
         * The freeze state of the current user's account has changed.
         */
        public UpdateFreezeState() {
        }

        /**
         * The freeze state of the current user's account has changed.
         *
         * @param isFrozen True, if the account is frozen.
         * @param freezingDate Point in time (Unix timestamp) when the account was frozen; 0 if the account isn't frozen.
         * @param deletionDate Point in time (Unix timestamp) when the account will be deleted and can't be unfrozen; 0 if the account isn't frozen.
         * @param appealLink The link to open to send an appeal to unfreeze the account.
         */
        public UpdateFreezeState(boolean isFrozen, int freezingDate, int deletionDate, String appealLink) {
            this.isFrozen = isFrozen;
            this.freezingDate = freezingDate;
            this.deletionDate = deletionDate;
            this.appealLink = appealLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1692410540;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The parameters for age verification of the current user's account has changed.
     */
    public static class UpdateAgeVerificationParameters extends Update {
        /**
         * Parameters for the age verification; may be null if age verification isn't needed.
         */
        @Nullable public AgeVerificationParameters parameters;

        /**
         * The parameters for age verification of the current user's account has changed.
         */
        public UpdateAgeVerificationParameters() {
        }

        /**
         * The parameters for age verification of the current user's account has changed.
         *
         * @param parameters Parameters for the age verification; may be null if age verification isn't needed.
         */
        public UpdateAgeVerificationParameters(AgeVerificationParameters parameters) {
            this.parameters = parameters;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -49283131;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * New terms of service must be accepted by the user. If the terms of service are declined, then the deleteAccount method must be called with the reason &quot;Decline ToS update&quot;.
     */
    public static class UpdateTermsOfService extends Update {
        /**
         * Identifier of the terms of service.
         */
        public String termsOfServiceId;
        /**
         * The new terms of service.
         */
        public TermsOfService termsOfService;

        /**
         * New terms of service must be accepted by the user. If the terms of service are declined, then the deleteAccount method must be called with the reason &quot;Decline ToS update&quot;.
         */
        public UpdateTermsOfService() {
        }

        /**
         * New terms of service must be accepted by the user. If the terms of service are declined, then the deleteAccount method must be called with the reason &quot;Decline ToS update&quot;.
         *
         * @param termsOfServiceId Identifier of the terms of service.
         * @param termsOfService The new terms of service.
         */
        public UpdateTermsOfService(String termsOfServiceId, TermsOfService termsOfService) {
            this.termsOfServiceId = termsOfServiceId;
            this.termsOfService = termsOfService;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1304640162;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The first unconfirmed session has changed.
     */
    public static class UpdateUnconfirmedSession extends Update {
        /**
         * The unconfirmed session; may be null if none.
         */
        @Nullable public UnconfirmedSession session;

        /**
         * The first unconfirmed session has changed.
         */
        public UpdateUnconfirmedSession() {
        }

        /**
         * The first unconfirmed session has changed.
         *
         * @param session The unconfirmed session; may be null if none.
         */
        public UpdateUnconfirmedSession(UnconfirmedSession session) {
            this.session = session;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -22673268;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of bots added to attachment or side menu has changed.
     */
    public static class UpdateAttachmentMenuBots extends Update {
        /**
         * The new list of bots. The bots must not be shown on scheduled messages screen.
         */
        public AttachmentMenuBot[] bots;

        /**
         * The list of bots added to attachment or side menu has changed.
         */
        public UpdateAttachmentMenuBots() {
        }

        /**
         * The list of bots added to attachment or side menu has changed.
         *
         * @param bots The new list of bots. The bots must not be shown on scheduled messages screen.
         */
        public UpdateAttachmentMenuBots(AttachmentMenuBot[] bots) {
            this.bots = bots;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 291369922;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message was sent by an opened Web App, so the Web App needs to be closed.
     */
    public static class UpdateWebAppMessageSent extends Update {
        /**
         * Identifier of Web App launch.
         */
        public long webAppLaunchId;

        /**
         * A message was sent by an opened Web App, so the Web App needs to be closed.
         */
        public UpdateWebAppMessageSent() {
        }

        /**
         * A message was sent by an opened Web App, so the Web App needs to be closed.
         *
         * @param webAppLaunchId Identifier of Web App launch.
         */
        public UpdateWebAppMessageSent(long webAppLaunchId) {
            this.webAppLaunchId = webAppLaunchId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1480790569;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of active emoji reactions has changed.
     */
    public static class UpdateActiveEmojiReactions extends Update {
        /**
         * The new list of active emoji reactions.
         */
        public String[] emojis;

        /**
         * The list of active emoji reactions has changed.
         */
        public UpdateActiveEmojiReactions() {
        }

        /**
         * The list of active emoji reactions has changed.
         *
         * @param emojis The new list of active emoji reactions.
         */
        public UpdateActiveEmojiReactions(String[] emojis) {
            this.emojis = emojis;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 77556818;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of available message effects has changed.
     */
    public static class UpdateAvailableMessageEffects extends Update {
        /**
         * The new list of available message effects from emoji reactions.
         */
        public long[] reactionEffectIds;
        /**
         * The new list of available message effects from Premium stickers.
         */
        public long[] stickerEffectIds;

        /**
         * The list of available message effects has changed.
         */
        public UpdateAvailableMessageEffects() {
        }

        /**
         * The list of available message effects has changed.
         *
         * @param reactionEffectIds The new list of available message effects from emoji reactions.
         * @param stickerEffectIds The new list of available message effects from Premium stickers.
         */
        public UpdateAvailableMessageEffects(long[] reactionEffectIds, long[] stickerEffectIds) {
            this.reactionEffectIds = reactionEffectIds;
            this.stickerEffectIds = stickerEffectIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1964701061;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The type of default reaction has changed.
     */
    public static class UpdateDefaultReactionType extends Update {
        /**
         * The new type of the default reaction.
         */
        public ReactionType reactionType;

        /**
         * The type of default reaction has changed.
         */
        public UpdateDefaultReactionType() {
        }

        /**
         * The type of default reaction has changed.
         *
         * @param reactionType The new type of the default reaction.
         */
        public UpdateDefaultReactionType(ReactionType reactionType) {
            this.reactionType = reactionType;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1264668933;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The type of default paid reaction has changed.
     */
    public static class UpdateDefaultPaidReactionType extends Update {
        /**
         * The new type of the default paid reaction.
         */
        public PaidReactionType type;

        /**
         * The type of default paid reaction has changed.
         */
        public UpdateDefaultPaidReactionType() {
        }

        /**
         * The type of default paid reaction has changed.
         *
         * @param type The new type of the default paid reaction.
         */
        public UpdateDefaultPaidReactionType(PaidReactionType type) {
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 38198599;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Tags used in Saved Messages or a Saved Messages topic have changed.
     */
    public static class UpdateSavedMessagesTags extends Update {
        /**
         * Identifier of Saved Messages topic which tags were changed; 0 if tags for the whole chat has changed.
         */
        public long savedMessagesTopicId;
        /**
         * The new tags.
         */
        public SavedMessagesTags tags;

        /**
         * Tags used in Saved Messages or a Saved Messages topic have changed.
         */
        public UpdateSavedMessagesTags() {
        }

        /**
         * Tags used in Saved Messages or a Saved Messages topic have changed.
         *
         * @param savedMessagesTopicId Identifier of Saved Messages topic which tags were changed; 0 if tags for the whole chat has changed.
         * @param tags The new tags.
         */
        public UpdateSavedMessagesTags(long savedMessagesTopicId, SavedMessagesTags tags) {
            this.savedMessagesTopicId = savedMessagesTopicId;
            this.tags = tags;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1938178634;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of messages with active live location that need to be updated by the application has changed. The list is persistent across application restarts only if the message database is used.
     */
    public static class UpdateActiveLiveLocationMessages extends Update {
        /**
         * The list of messages with active live locations.
         */
        public Message[] messages;

        /**
         * The list of messages with active live location that need to be updated by the application has changed. The list is persistent across application restarts only if the message database is used.
         */
        public UpdateActiveLiveLocationMessages() {
        }

        /**
         * The list of messages with active live location that need to be updated by the application has changed. The list is persistent across application restarts only if the message database is used.
         *
         * @param messages The list of messages with active live locations.
         */
        public UpdateActiveLiveLocationMessages(Message[] messages) {
            this.messages = messages;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1308142440;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The number of Telegram Stars owned by the current user has changed.
     */
    public static class UpdateOwnedStarCount extends Update {
        /**
         * The new amount of owned Telegram Stars.
         */
        public StarAmount starAmount;

        /**
         * The number of Telegram Stars owned by the current user has changed.
         */
        public UpdateOwnedStarCount() {
        }

        /**
         * The number of Telegram Stars owned by the current user has changed.
         *
         * @param starAmount The new amount of owned Telegram Stars.
         */
        public UpdateOwnedStarCount(StarAmount starAmount) {
            this.starAmount = starAmount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1350647928;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The number of Toncoins owned by the current user has changed.
     */
    public static class UpdateOwnedTonCount extends Update {
        /**
         * The new amount of owned Toncoins; in the smallest units of the cryptocurrency.
         */
        public long tonAmount;

        /**
         * The number of Toncoins owned by the current user has changed.
         */
        public UpdateOwnedTonCount() {
        }

        /**
         * The number of Toncoins owned by the current user has changed.
         *
         * @param tonAmount The new amount of owned Toncoins; in the smallest units of the cryptocurrency.
         */
        public UpdateOwnedTonCount(long tonAmount) {
            this.tonAmount = tonAmount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1102136345;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The revenue earned from sponsored messages in a chat has changed. If chat revenue screen is opened, then getChatRevenueTransactions may be called to fetch new transactions.
     */
    public static class UpdateChatRevenueAmount extends Update {
        /**
         * Identifier of the chat.
         */
        public long chatId;
        /**
         * New amount of earned revenue.
         */
        public ChatRevenueAmount revenueAmount;

        /**
         * The revenue earned from sponsored messages in a chat has changed. If chat revenue screen is opened, then getChatRevenueTransactions may be called to fetch new transactions.
         */
        public UpdateChatRevenueAmount() {
        }

        /**
         * The revenue earned from sponsored messages in a chat has changed. If chat revenue screen is opened, then getChatRevenueTransactions may be called to fetch new transactions.
         *
         * @param chatId Identifier of the chat.
         * @param revenueAmount New amount of earned revenue.
         */
        public UpdateChatRevenueAmount(long chatId, ChatRevenueAmount revenueAmount) {
            this.chatId = chatId;
            this.revenueAmount = revenueAmount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -959857468;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The Telegram Star revenue earned by a user or a chat has changed. If Telegram Star transaction screen of the chat is opened, then getStarTransactions may be called to fetch new transactions.
     */
    public static class UpdateStarRevenueStatus extends Update {
        /**
         * Identifier of the owner of the Telegram Stars.
         */
        public MessageSender ownerId;
        /**
         * New Telegram Star revenue status.
         */
        public StarRevenueStatus status;

        /**
         * The Telegram Star revenue earned by a user or a chat has changed. If Telegram Star transaction screen of the chat is opened, then getStarTransactions may be called to fetch new transactions.
         */
        public UpdateStarRevenueStatus() {
        }

        /**
         * The Telegram Star revenue earned by a user or a chat has changed. If Telegram Star transaction screen of the chat is opened, then getStarTransactions may be called to fetch new transactions.
         *
         * @param ownerId Identifier of the owner of the Telegram Stars.
         * @param status New Telegram Star revenue status.
         */
        public UpdateStarRevenueStatus(MessageSender ownerId, StarRevenueStatus status) {
            this.ownerId = ownerId;
            this.status = status;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -280232757;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The Toncoin revenue earned by the current user has changed. If Toncoin transaction screen of the chat is opened, then getTonTransactions may be called to fetch new transactions.
     */
    public static class UpdateTonRevenueStatus extends Update {
        /**
         * New Toncoin revenue status.
         */
        public TonRevenueStatus status;

        /**
         * The Toncoin revenue earned by the current user has changed. If Toncoin transaction screen of the chat is opened, then getTonTransactions may be called to fetch new transactions.
         */
        public UpdateTonRevenueStatus() {
        }

        /**
         * The Toncoin revenue earned by the current user has changed. If Toncoin transaction screen of the chat is opened, then getTonTransactions may be called to fetch new transactions.
         *
         * @param status New Toncoin revenue status.
         */
        public UpdateTonRevenueStatus(TonRevenueStatus status) {
            this.status = status;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1832579994;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The parameters of speech recognition without Telegram Premium subscription has changed.
     */
    public static class UpdateSpeechRecognitionTrial extends Update {
        /**
         * The maximum allowed duration of media for speech recognition without Telegram Premium subscription, in seconds.
         */
        public int maxMediaDuration;
        /**
         * The total number of allowed speech recognitions per week; 0 if none.
         */
        public int weeklyCount;
        /**
         * Number of left speech recognition attempts this week.
         */
        public int leftCount;
        /**
         * Point in time (Unix timestamp) when the weekly number of tries will reset; 0 if unknown.
         */
        public int nextResetDate;

        /**
         * The parameters of speech recognition without Telegram Premium subscription has changed.
         */
        public UpdateSpeechRecognitionTrial() {
        }

        /**
         * The parameters of speech recognition without Telegram Premium subscription has changed.
         *
         * @param maxMediaDuration The maximum allowed duration of media for speech recognition without Telegram Premium subscription, in seconds.
         * @param weeklyCount The total number of allowed speech recognitions per week; 0 if none.
         * @param leftCount Number of left speech recognition attempts this week.
         * @param nextResetDate Point in time (Unix timestamp) when the weekly number of tries will reset; 0 if unknown.
         */
        public UpdateSpeechRecognitionTrial(int maxMediaDuration, int weeklyCount, int leftCount, int nextResetDate) {
            this.maxMediaDuration = maxMediaDuration;
            this.weeklyCount = weeklyCount;
            this.leftCount = leftCount;
            this.nextResetDate = nextResetDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -11600703;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The levels of live story group call messages have changed.
     */
    public static class UpdateGroupCallMessageLevels extends Update {
        /**
         * New description of the levels in decreasing order of groupCallMessageLevel.minStarCount.
         */
        public GroupCallMessageLevel[] levels;

        /**
         * The levels of live story group call messages have changed.
         */
        public UpdateGroupCallMessageLevels() {
        }

        /**
         * The levels of live story group call messages have changed.
         *
         * @param levels New description of the levels in decreasing order of groupCallMessageLevel.minStarCount.
         */
        public UpdateGroupCallMessageLevels(GroupCallMessageLevel[] levels) {
            this.levels = levels;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -882998951;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of supported dice emojis has changed.
     */
    public static class UpdateDiceEmojis extends Update {
        /**
         * The new list of supported dice emojis.
         */
        public String[] emojis;

        /**
         * The list of supported dice emojis has changed.
         */
        public UpdateDiceEmojis() {
        }

        /**
         * The list of supported dice emojis has changed.
         *
         * @param emojis The new list of supported dice emojis.
         */
        public UpdateDiceEmojis(String[] emojis) {
            this.emojis = emojis;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1069066940;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The stake dice state has changed.
     */
    public static class UpdateStakeDiceState extends Update {
        /**
         * The new state. The state can be used only if it was received recently enough. Otherwise, a new state must be requested using getStakeDiceState.
         */
        public StakeDiceState state;

        /**
         * The stake dice state has changed.
         */
        public UpdateStakeDiceState() {
        }

        /**
         * The stake dice state has changed.
         *
         * @param state The new state. The state can be used only if it was received recently enough. Otherwise, a new state must be requested using getStakeDiceState.
         */
        public UpdateStakeDiceState(StakeDiceState state) {
            this.state = state;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -739631973;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Some animated emoji message was clicked and a big animated sticker must be played if the message is visible on the screen. chatActionWatchingAnimations with the text of the message needs to be sent if the sticker is played.
     */
    public static class UpdateAnimatedEmojiMessageClicked extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Message identifier.
         */
        public long messageId;
        /**
         * The animated sticker to be played.
         */
        public Sticker sticker;

        /**
         * Some animated emoji message was clicked and a big animated sticker must be played if the message is visible on the screen. chatActionWatchingAnimations with the text of the message needs to be sent if the sticker is played.
         */
        public UpdateAnimatedEmojiMessageClicked() {
        }

        /**
         * Some animated emoji message was clicked and a big animated sticker must be played if the message is visible on the screen. chatActionWatchingAnimations with the text of the message needs to be sent if the sticker is played.
         *
         * @param chatId Chat identifier.
         * @param messageId Message identifier.
         * @param sticker The animated sticker to be played.
         */
        public UpdateAnimatedEmojiMessageClicked(long chatId, long messageId, Sticker sticker) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1558809595;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The parameters of animation search through getOption(&quot;animation_search_bot_username&quot;) bot has changed.
     */
    public static class UpdateAnimationSearchParameters extends Update {
        /**
         * Name of the animation search provider.
         */
        public String provider;
        /**
         * The new list of emojis suggested for searching.
         */
        public String[] emojis;

        /**
         * The parameters of animation search through getOption(&quot;animation_search_bot_username&quot;) bot has changed.
         */
        public UpdateAnimationSearchParameters() {
        }

        /**
         * The parameters of animation search through getOption(&quot;animation_search_bot_username&quot;) bot has changed.
         *
         * @param provider Name of the animation search provider.
         * @param emojis The new list of emojis suggested for searching.
         */
        public UpdateAnimationSearchParameters(String provider, String[] emojis) {
            this.provider = provider;
            this.emojis = emojis;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1144983202;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The styles supported for text composition have changed.
     */
    public static class UpdateTextCompositionStyles extends Update {
        /**
         * The new list of supported styles.
         */
        public TextCompositionStyle[] styles;

        /**
         * The styles supported for text composition have changed.
         */
        public UpdateTextCompositionStyles() {
        }

        /**
         * The styles supported for text composition have changed.
         *
         * @param styles The new list of supported styles.
         */
        public UpdateTextCompositionStyles(TextCompositionStyle[] styles) {
            this.styles = styles;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -481267771;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of suggested to the user actions has changed.
     */
    public static class UpdateSuggestedActions extends Update {
        /**
         * Added suggested actions.
         */
        public SuggestedAction[] addedActions;
        /**
         * Removed suggested actions.
         */
        public SuggestedAction[] removedActions;

        /**
         * The list of suggested to the user actions has changed.
         */
        public UpdateSuggestedActions() {
        }

        /**
         * The list of suggested to the user actions has changed.
         *
         * @param addedActions Added suggested actions.
         * @param removedActions Removed suggested actions.
         */
        public UpdateSuggestedActions(SuggestedAction[] addedActions, SuggestedAction[] removedActions) {
            this.addedActions = addedActions;
            this.removedActions = removedActions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1459452346;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Download or upload file speed for the user was limited, but it can be restored by subscription to Telegram Premium. The notification can be postponed until a being downloaded or uploaded file is visible to the user. Use getOption(&quot;premium_download_speedup&quot;) or getOption(&quot;premium_upload_speedup&quot;) to get expected speedup after subscription to Telegram Premium.
     */
    public static class UpdateSpeedLimitNotification extends Update {
        /**
         * True, if upload speed was limited; false, if download speed was limited.
         */
        public boolean isUpload;

        /**
         * Download or upload file speed for the user was limited, but it can be restored by subscription to Telegram Premium. The notification can be postponed until a being downloaded or uploaded file is visible to the user. Use getOption(&quot;premium_download_speedup&quot;) or getOption(&quot;premium_upload_speedup&quot;) to get expected speedup after subscription to Telegram Premium.
         */
        public UpdateSpeedLimitNotification() {
        }

        /**
         * Download or upload file speed for the user was limited, but it can be restored by subscription to Telegram Premium. The notification can be postponed until a being downloaded or uploaded file is visible to the user. Use getOption(&quot;premium_download_speedup&quot;) or getOption(&quot;premium_upload_speedup&quot;) to get expected speedup after subscription to Telegram Premium.
         *
         * @param isUpload True, if upload speed was limited; false, if download speed was limited.
         */
        public UpdateSpeedLimitNotification(boolean isUpload) {
            this.isUpload = isUpload;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -964437912;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The list of contacts that had birthdays recently or will have birthday soon has changed.
     */
    public static class UpdateContactCloseBirthdays extends Update {
        /**
         * List of contact users with close birthday.
         */
        public CloseBirthdayUser[] closeBirthdayUsers;

        /**
         * The list of contacts that had birthdays recently or will have birthday soon has changed.
         */
        public UpdateContactCloseBirthdays() {
        }

        /**
         * The list of contacts that had birthdays recently or will have birthday soon has changed.
         *
         * @param closeBirthdayUsers List of contact users with close birthday.
         */
        public UpdateContactCloseBirthdays(CloseBirthdayUser[] closeBirthdayUsers) {
            this.closeBirthdayUsers = closeBirthdayUsers;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -36007873;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Autosave settings for some type of chats were updated.
     */
    public static class UpdateAutosaveSettings extends Update {
        /**
         * Type of chats for which autosave settings were updated.
         */
        public AutosaveSettingsScope scope;
        /**
         * The new autosave settings; may be null if the settings are reset to default.
         */
        @Nullable public ScopeAutosaveSettings settings;

        /**
         * Autosave settings for some type of chats were updated.
         */
        public UpdateAutosaveSettings() {
        }

        /**
         * Autosave settings for some type of chats were updated.
         *
         * @param scope Type of chats for which autosave settings were updated.
         * @param settings The new autosave settings; may be null if the settings are reset to default.
         */
        public UpdateAutosaveSettings(AutosaveSettingsScope scope, ScopeAutosaveSettings settings) {
            this.scope = scope;
            this.settings = settings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -634958069;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A business connection has changed; for bots only.
     */
    public static class UpdateBusinessConnection extends Update {
        /**
         * New data about the connection.
         */
        public BusinessConnection connection;

        /**
         * A business connection has changed; for bots only.
         */
        public UpdateBusinessConnection() {
        }

        /**
         * A business connection has changed; for bots only.
         *
         * @param connection New data about the connection.
         */
        public UpdateBusinessConnection(BusinessConnection connection) {
            this.connection = connection;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2043480970;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new message was added to a business account; for bots only.
     */
    public static class UpdateNewBusinessMessage extends Update {
        /**
         * Unique identifier of the business connection.
         */
        public String connectionId;
        /**
         * The new message.
         */
        public BusinessMessage message;

        /**
         * A new message was added to a business account; for bots only.
         */
        public UpdateNewBusinessMessage() {
        }

        /**
         * A new message was added to a business account; for bots only.
         *
         * @param connectionId Unique identifier of the business connection.
         * @param message The new message.
         */
        public UpdateNewBusinessMessage(String connectionId, BusinessMessage message) {
            this.connectionId = connectionId;
            this.message = message;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2034350524;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A message in a business account was edited; for bots only.
     */
    public static class UpdateBusinessMessageEdited extends Update {
        /**
         * Unique identifier of the business connection.
         */
        public String connectionId;
        /**
         * The edited message.
         */
        public BusinessMessage message;

        /**
         * A message in a business account was edited; for bots only.
         */
        public UpdateBusinessMessageEdited() {
        }

        /**
         * A message in a business account was edited; for bots only.
         *
         * @param connectionId Unique identifier of the business connection.
         * @param message The edited message.
         */
        public UpdateBusinessMessageEdited(String connectionId, BusinessMessage message) {
            this.connectionId = connectionId;
            this.message = message;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2119799415;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Messages in a business account were deleted; for bots only.
     */
    public static class UpdateBusinessMessagesDeleted extends Update {
        /**
         * Unique identifier of the business connection.
         */
        public String connectionId;
        /**
         * Identifier of a chat in the business account in which messages were deleted.
         */
        public long chatId;
        /**
         * Unique message identifiers of the deleted messages.
         */
        public long[] messageIds;

        /**
         * Messages in a business account were deleted; for bots only.
         */
        public UpdateBusinessMessagesDeleted() {
        }

        /**
         * Messages in a business account were deleted; for bots only.
         *
         * @param connectionId Unique identifier of the business connection.
         * @param chatId Identifier of a chat in the business account in which messages were deleted.
         * @param messageIds Unique message identifiers of the deleted messages.
         */
        public UpdateBusinessMessagesDeleted(String connectionId, long chatId, long[] messageIds) {
            this.connectionId = connectionId;
            this.chatId = chatId;
            this.messageIds = messageIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1106703050;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new incoming inline query; for bots only.
     */
    public static class UpdateNewInlineQuery extends Update {
        /**
         * Unique query identifier.
         */
        public long id;
        /**
         * Identifier of the user who sent the query.
         */
        public long senderUserId;
        /**
         * User location; may be null.
         */
        @Nullable public Location userLocation;
        /**
         * The type of the chat from which the query originated; may be null if unknown.
         */
        @Nullable public ChatType chatType;
        /**
         * Text of the query.
         */
        public String query;
        /**
         * Offset of the first entry to return.
         */
        public String offset;

        /**
         * A new incoming inline query; for bots only.
         */
        public UpdateNewInlineQuery() {
        }

        /**
         * A new incoming inline query; for bots only.
         *
         * @param id Unique query identifier.
         * @param senderUserId Identifier of the user who sent the query.
         * @param userLocation User location; may be null.
         * @param chatType The type of the chat from which the query originated; may be null if unknown.
         * @param query Text of the query.
         * @param offset Offset of the first entry to return.
         */
        public UpdateNewInlineQuery(long id, long senderUserId, Location userLocation, ChatType chatType, String query, String offset) {
            this.id = id;
            this.senderUserId = senderUserId;
            this.userLocation = userLocation;
            this.chatType = chatType;
            this.query = query;
            this.offset = offset;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1903279924;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user has chosen a result of an inline query; for bots only.
     */
    public static class UpdateNewChosenInlineResult extends Update {
        /**
         * Identifier of the user who sent the query.
         */
        public long senderUserId;
        /**
         * User location; may be null.
         */
        @Nullable public Location userLocation;
        /**
         * Text of the query.
         */
        public String query;
        /**
         * Identifier of the chosen result.
         */
        public String resultId;
        /**
         * Identifier of the sent inline message, if known.
         */
        public String inlineMessageId;

        /**
         * The user has chosen a result of an inline query; for bots only.
         */
        public UpdateNewChosenInlineResult() {
        }

        /**
         * The user has chosen a result of an inline query; for bots only.
         *
         * @param senderUserId Identifier of the user who sent the query.
         * @param userLocation User location; may be null.
         * @param query Text of the query.
         * @param resultId Identifier of the chosen result.
         * @param inlineMessageId Identifier of the sent inline message, if known.
         */
        public UpdateNewChosenInlineResult(long senderUserId, Location userLocation, String query, String resultId, String inlineMessageId) {
            this.senderUserId = senderUserId;
            this.userLocation = userLocation;
            this.query = query;
            this.resultId = resultId;
            this.inlineMessageId = inlineMessageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -884191395;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new incoming guest query; for bots only.
     */
    public static class UpdateNewGuestQuery extends Update {
        /**
         * Unique query identifier.
         */
        public long id;
        /**
         * The message with the query.
         */
        public Message message;
        /**
         * The list of reference messages.
         */
        public Message[] referenceMessages;

        /**
         * A new incoming guest query; for bots only.
         */
        public UpdateNewGuestQuery() {
        }

        /**
         * A new incoming guest query; for bots only.
         *
         * @param id Unique query identifier.
         * @param message The message with the query.
         * @param referenceMessages The list of reference messages.
         */
        public UpdateNewGuestQuery(long id, Message message, Message[] referenceMessages) {
            this.id = id;
            this.message = message;
            this.referenceMessages = referenceMessages;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1489540905;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new incoming callback query; for bots only.
     */
    public static class UpdateNewCallbackQuery extends Update {
        /**
         * Unique query identifier.
         */
        public long id;
        /**
         * Identifier of the user who sent the query.
         */
        public long senderUserId;
        /**
         * Identifier of the chat where the query was sent.
         */
        public long chatId;
        /**
         * Identifier of the message from which the query originated.
         */
        public long messageId;
        /**
         * Identifier that uniquely corresponds to the chat to which the message was sent.
         */
        public long chatInstance;
        /**
         * Query payload.
         */
        public CallbackQueryPayload payload;

        /**
         * A new incoming callback query; for bots only.
         */
        public UpdateNewCallbackQuery() {
        }

        /**
         * A new incoming callback query; for bots only.
         *
         * @param id Unique query identifier.
         * @param senderUserId Identifier of the user who sent the query.
         * @param chatId Identifier of the chat where the query was sent.
         * @param messageId Identifier of the message from which the query originated.
         * @param chatInstance Identifier that uniquely corresponds to the chat to which the message was sent.
         * @param payload Query payload.
         */
        public UpdateNewCallbackQuery(long id, long senderUserId, long chatId, long messageId, long chatInstance, CallbackQueryPayload payload) {
            this.id = id;
            this.senderUserId = senderUserId;
            this.chatId = chatId;
            this.messageId = messageId;
            this.chatInstance = chatInstance;
            this.payload = payload;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1989881762;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new incoming callback query from a message sent via a bot; for bots only.
     */
    public static class UpdateNewInlineCallbackQuery extends Update {
        /**
         * Unique query identifier.
         */
        public long id;
        /**
         * Identifier of the user who sent the query.
         */
        public long senderUserId;
        /**
         * Identifier of the inline message from which the query originated.
         */
        public String inlineMessageId;
        /**
         * An identifier uniquely corresponding to the chat a message was sent to.
         */
        public long chatInstance;
        /**
         * Query payload.
         */
        public CallbackQueryPayload payload;

        /**
         * A new incoming callback query from a message sent via a bot; for bots only.
         */
        public UpdateNewInlineCallbackQuery() {
        }

        /**
         * A new incoming callback query from a message sent via a bot; for bots only.
         *
         * @param id Unique query identifier.
         * @param senderUserId Identifier of the user who sent the query.
         * @param inlineMessageId Identifier of the inline message from which the query originated.
         * @param chatInstance An identifier uniquely corresponding to the chat a message was sent to.
         * @param payload Query payload.
         */
        public UpdateNewInlineCallbackQuery(long id, long senderUserId, String inlineMessageId, long chatInstance, CallbackQueryPayload payload) {
            this.id = id;
            this.senderUserId = senderUserId;
            this.inlineMessageId = inlineMessageId;
            this.chatInstance = chatInstance;
            this.payload = payload;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -319212358;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new incoming callback query from a business message; for bots only.
     */
    public static class UpdateNewBusinessCallbackQuery extends Update {
        /**
         * Unique query identifier.
         */
        public long id;
        /**
         * Identifier of the user who sent the query.
         */
        public long senderUserId;
        /**
         * Unique identifier of the business connection.
         */
        public String connectionId;
        /**
         * The message from the business account from which the query originated.
         */
        public BusinessMessage message;
        /**
         * An identifier uniquely corresponding to the chat a message was sent to.
         */
        public long chatInstance;
        /**
         * Query payload.
         */
        public CallbackQueryPayload payload;

        /**
         * A new incoming callback query from a business message; for bots only.
         */
        public UpdateNewBusinessCallbackQuery() {
        }

        /**
         * A new incoming callback query from a business message; for bots only.
         *
         * @param id Unique query identifier.
         * @param senderUserId Identifier of the user who sent the query.
         * @param connectionId Unique identifier of the business connection.
         * @param message The message from the business account from which the query originated.
         * @param chatInstance An identifier uniquely corresponding to the chat a message was sent to.
         * @param payload Query payload.
         */
        public UpdateNewBusinessCallbackQuery(long id, long senderUserId, String connectionId, BusinessMessage message, long chatInstance, CallbackQueryPayload payload) {
            this.id = id;
            this.senderUserId = senderUserId;
            this.connectionId = connectionId;
            this.message = message;
            this.chatInstance = chatInstance;
            this.payload = payload;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 336745316;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new incoming shipping query; for bots only. Only for invoices with flexible price.
     */
    public static class UpdateNewShippingQuery extends Update {
        /**
         * Unique query identifier.
         */
        public long id;
        /**
         * Identifier of the user who sent the query.
         */
        public long senderUserId;
        /**
         * Invoice payload.
         */
        public String invoicePayload;
        /**
         * User shipping address.
         */
        public Address shippingAddress;

        /**
         * A new incoming shipping query; for bots only. Only for invoices with flexible price.
         */
        public UpdateNewShippingQuery() {
        }

        /**
         * A new incoming shipping query; for bots only. Only for invoices with flexible price.
         *
         * @param id Unique query identifier.
         * @param senderUserId Identifier of the user who sent the query.
         * @param invoicePayload Invoice payload.
         * @param shippingAddress User shipping address.
         */
        public UpdateNewShippingQuery(long id, long senderUserId, String invoicePayload, Address shippingAddress) {
            this.id = id;
            this.senderUserId = senderUserId;
            this.invoicePayload = invoicePayload;
            this.shippingAddress = shippingAddress;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 693651058;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new incoming pre-checkout query; for bots only. Contains full information about a checkout.
     */
    public static class UpdateNewPreCheckoutQuery extends Update {
        /**
         * Unique query identifier.
         */
        public long id;
        /**
         * Identifier of the user who sent the query.
         */
        public long senderUserId;
        /**
         * Currency for the product price.
         */
        public String currency;
        /**
         * Total price for the product, in the smallest units of the currency.
         */
        public long totalAmount;
        /**
         * Invoice payload.
         */
        public byte[] invoicePayload;
        /**
         * Identifier of a shipping option chosen by the user; may be empty if not applicable.
         */
        public String shippingOptionId;
        /**
         * Information about the order; may be null.
         */
        @Nullable public OrderInfo orderInfo;

        /**
         * A new incoming pre-checkout query; for bots only. Contains full information about a checkout.
         */
        public UpdateNewPreCheckoutQuery() {
        }

        /**
         * A new incoming pre-checkout query; for bots only. Contains full information about a checkout.
         *
         * @param id Unique query identifier.
         * @param senderUserId Identifier of the user who sent the query.
         * @param currency Currency for the product price.
         * @param totalAmount Total price for the product, in the smallest units of the currency.
         * @param invoicePayload Invoice payload.
         * @param shippingOptionId Identifier of a shipping option chosen by the user; may be empty if not applicable.
         * @param orderInfo Information about the order; may be null.
         */
        public UpdateNewPreCheckoutQuery(long id, long senderUserId, String currency, long totalAmount, byte[] invoicePayload, String shippingOptionId, OrderInfo orderInfo) {
            this.id = id;
            this.senderUserId = senderUserId;
            this.currency = currency;
            this.totalAmount = totalAmount;
            this.invoicePayload = invoicePayload;
            this.shippingOptionId = shippingOptionId;
            this.orderInfo = orderInfo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 708342217;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new incoming event; for bots only.
     */
    public static class UpdateNewCustomEvent extends Update {
        /**
         * A JSON-serialized event.
         */
        public String event;

        /**
         * A new incoming event; for bots only.
         */
        public UpdateNewCustomEvent() {
        }

        /**
         * A new incoming event; for bots only.
         *
         * @param event A JSON-serialized event.
         */
        public UpdateNewCustomEvent(String event) {
            this.event = event;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1994222092;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A new incoming query; for bots only.
     */
    public static class UpdateNewCustomQuery extends Update {
        /**
         * The query identifier.
         */
        public long id;
        /**
         * JSON-serialized query data.
         */
        public String data;
        /**
         * Query timeout.
         */
        public int timeout;

        /**
         * A new incoming query; for bots only.
         */
        public UpdateNewCustomQuery() {
        }

        /**
         * A new incoming query; for bots only.
         *
         * @param id The query identifier.
         * @param data JSON-serialized query data.
         * @param timeout Query timeout.
         */
        public UpdateNewCustomQuery(long id, String data, int timeout) {
            this.id = id;
            this.data = data;
            this.timeout = timeout;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -687670874;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A poll was updated; for bots only.
     */
    public static class UpdatePoll extends Update {
        /**
         * New data about the poll.
         */
        public Poll poll;

        /**
         * A poll was updated; for bots only.
         */
        public UpdatePoll() {
        }

        /**
         * A poll was updated; for bots only.
         *
         * @param poll New data about the poll.
         */
        public UpdatePoll(Poll poll) {
            this.poll = poll;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1771342902;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A user changed the answer to a poll; for bots only.
     */
    public static class UpdatePollAnswer extends Update {
        /**
         * Unique poll identifier.
         */
        public long pollId;
        /**
         * Identifier of the message sender that changed the answer to the poll.
         */
        public MessageSender voterId;
        /**
         * Unique identifiers of answer options, that were chosen by the user.
         */
        public String[] optionIds;
        /**
         * 0-based identifiers of answer options, that were chosen by the user.
         */
        public int[] optionPositions;

        /**
         * A user changed the answer to a poll; for bots only.
         */
        public UpdatePollAnswer() {
        }

        /**
         * A user changed the answer to a poll; for bots only.
         *
         * @param pollId Unique poll identifier.
         * @param voterId Identifier of the message sender that changed the answer to the poll.
         * @param optionIds Unique identifiers of answer options, that were chosen by the user.
         * @param optionPositions 0-based identifiers of answer options, that were chosen by the user.
         */
        public UpdatePollAnswer(long pollId, MessageSender voterId, String[] optionIds, int[] optionPositions) {
            this.pollId = pollId;
            this.voterId = voterId;
            this.optionIds = optionIds;
            this.optionPositions = optionPositions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1334893971;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A bot that can be managed by the current bot was created or updated; for bots only.
     */
    public static class UpdateManagedBot extends Update {
        /**
         * Identifier of the user who created the bot.
         */
        public long userId;
        /**
         * Identifier of the created managed bot.
         */
        public long botUserId;

        /**
         * A bot that can be managed by the current bot was created or updated; for bots only.
         */
        public UpdateManagedBot() {
        }

        /**
         * A bot that can be managed by the current bot was created or updated; for bots only.
         *
         * @param userId Identifier of the user who created the bot.
         * @param botUserId Identifier of the created managed bot.
         */
        public UpdateManagedBot(long userId, long botUserId) {
            this.userId = userId;
            this.botUserId = botUserId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1388678066;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * User rights changed in a chat; for bots only.
     */
    public static class UpdateChatMember extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifier of the user, changing the rights.
         */
        public long actorUserId;
        /**
         * Point in time (Unix timestamp) when the user rights were changed.
         */
        public int date;
        /**
         * If user has joined the chat using an invite link, the invite link; may be null.
         */
        @Nullable public ChatInviteLink inviteLink;
        /**
         * True, if the user has joined the chat after sending a join request and being approved by an administrator.
         */
        public boolean viaJoinRequest;
        /**
         * True, if the user has joined the chat using an invite link for a chat folder.
         */
        public boolean viaChatFolderInviteLink;
        /**
         * Previous chat member.
         */
        public ChatMember oldChatMember;
        /**
         * New chat member.
         */
        public ChatMember newChatMember;

        /**
         * User rights changed in a chat; for bots only.
         */
        public UpdateChatMember() {
        }

        /**
         * User rights changed in a chat; for bots only.
         *
         * @param chatId Chat identifier.
         * @param actorUserId Identifier of the user, changing the rights.
         * @param date Point in time (Unix timestamp) when the user rights were changed.
         * @param inviteLink If user has joined the chat using an invite link, the invite link; may be null.
         * @param viaJoinRequest True, if the user has joined the chat after sending a join request and being approved by an administrator.
         * @param viaChatFolderInviteLink True, if the user has joined the chat using an invite link for a chat folder.
         * @param oldChatMember Previous chat member.
         * @param newChatMember New chat member.
         */
        public UpdateChatMember(long chatId, long actorUserId, int date, ChatInviteLink inviteLink, boolean viaJoinRequest, boolean viaChatFolderInviteLink, ChatMember oldChatMember, ChatMember newChatMember) {
            this.chatId = chatId;
            this.actorUserId = actorUserId;
            this.date = date;
            this.inviteLink = inviteLink;
            this.viaJoinRequest = viaJoinRequest;
            this.viaChatFolderInviteLink = viaChatFolderInviteLink;
            this.oldChatMember = oldChatMember;
            this.newChatMember = newChatMember;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1736025145;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A user sent a join request to a chat; for bots only.
     */
    public static class UpdateNewChatJoinRequest extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Join request.
         */
        public ChatJoinRequest request;
        /**
         * Chat identifier of the private chat with the user.
         */
        public long userChatId;
        /**
         * The invite link, which was used to send join request; may be null.
         */
        @Nullable public ChatInviteLink inviteLink;

        /**
         * A user sent a join request to a chat; for bots only.
         */
        public UpdateNewChatJoinRequest() {
        }

        /**
         * A user sent a join request to a chat; for bots only.
         *
         * @param chatId Chat identifier.
         * @param request Join request.
         * @param userChatId Chat identifier of the private chat with the user.
         * @param inviteLink The invite link, which was used to send join request; may be null.
         */
        public UpdateNewChatJoinRequest(long chatId, ChatJoinRequest request, long userChatId, ChatInviteLink inviteLink) {
            this.chatId = chatId;
            this.request = request;
            this.userChatId = userChatId;
            this.inviteLink = inviteLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2118694979;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A chat boost has changed; for bots only.
     */
    public static class UpdateChatBoost extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New information about the boost.
         */
        public ChatBoost boost;

        /**
         * A chat boost has changed; for bots only.
         */
        public UpdateChatBoost() {
        }

        /**
         * A chat boost has changed; for bots only.
         *
         * @param chatId Chat identifier.
         * @param boost New information about the boost.
         */
        public UpdateChatBoost(long chatId, ChatBoost boost) {
            this.chatId = chatId;
            this.boost = boost;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1349680676;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * User changed its reactions on a message with public reactions; for bots only.
     */
    public static class UpdateMessageReaction extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Message identifier.
         */
        public long messageId;
        /**
         * Identifier of the user or chat that changed reactions.
         */
        public MessageSender actorId;
        /**
         * Point in time (Unix timestamp) when the reactions were changed.
         */
        public int date;
        /**
         * Old list of chosen reactions.
         */
        public ReactionType[] oldReactionTypes;
        /**
         * New list of chosen reactions.
         */
        public ReactionType[] newReactionTypes;

        /**
         * User changed its reactions on a message with public reactions; for bots only.
         */
        public UpdateMessageReaction() {
        }

        /**
         * User changed its reactions on a message with public reactions; for bots only.
         *
         * @param chatId Chat identifier.
         * @param messageId Message identifier.
         * @param actorId Identifier of the user or chat that changed reactions.
         * @param date Point in time (Unix timestamp) when the reactions were changed.
         * @param oldReactionTypes Old list of chosen reactions.
         * @param newReactionTypes New list of chosen reactions.
         */
        public UpdateMessageReaction(long chatId, long messageId, MessageSender actorId, int date, ReactionType[] oldReactionTypes, ReactionType[] newReactionTypes) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.actorId = actorId;
            this.date = date;
            this.oldReactionTypes = oldReactionTypes;
            this.newReactionTypes = newReactionTypes;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1084895706;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Reactions added to a message with anonymous reactions have changed; for bots only.
     */
    public static class UpdateMessageReactions extends Update {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Message identifier.
         */
        public long messageId;
        /**
         * Point in time (Unix timestamp) when the reactions were changed.
         */
        public int date;
        /**
         * The list of reactions added to the message.
         */
        public MessageReaction[] reactions;

        /**
         * Reactions added to a message with anonymous reactions have changed; for bots only.
         */
        public UpdateMessageReactions() {
        }

        /**
         * Reactions added to a message with anonymous reactions have changed; for bots only.
         *
         * @param chatId Chat identifier.
         * @param messageId Message identifier.
         * @param date Point in time (Unix timestamp) when the reactions were changed.
         * @param reactions The list of reactions added to the message.
         */
        public UpdateMessageReactions(long chatId, long messageId, int date, MessageReaction[] reactions) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.date = date;
            this.reactions = reactions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 955237189;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Paid media were purchased by a user; for bots only.
     */
    public static class UpdatePaidMediaPurchased extends Update {
        /**
         * User identifier.
         */
        public long userId;
        /**
         * Bot-specified payload for the paid media.
         */
        public String payload;

        /**
         * Paid media were purchased by a user; for bots only.
         */
        public UpdatePaidMediaPurchased() {
        }

        /**
         * Paid media were purchased by a user; for bots only.
         *
         * @param userId User identifier.
         * @param payload Bot-specified payload for the paid media.
         */
        public UpdatePaidMediaPurchased(long userId, String payload) {
            this.userId = userId;
            this.payload = payload;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1542396325;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of updates.
     */
    public static class Updates extends Object {
        /**
         * List of updates.
         */
        public Update[] updates;

        /**
         * Contains a list of updates.
         */
        public Updates() {
        }

        /**
         * Contains a list of updates.
         *
         * @param updates List of updates.
         */
        public Updates(Update[] updates) {
            this.updates = updates;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 475842347;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains result of gift upgrading.
     */
    public static class UpgradeGiftResult extends Object {
        /**
         * The upgraded gift.
         */
        public UpgradedGift gift;
        /**
         * Unique identifier of the received gift for the current user.
         */
        public String receivedGiftId;
        /**
         * True, if the gift is displayed on the user's or the channel's profile page.
         */
        public boolean isSaved;
        /**
         * True, if the gift can be transferred to another owner.
         */
        public boolean canBeTransferred;
        /**
         * Number of Telegram Stars that must be paid to transfer the upgraded gift.
         */
        public long transferStarCount;
        /**
         * Number of Telegram Stars that must be paid to drop original details of the upgraded gift; 0 if not available.
         */
        public long dropOriginalDetailsStarCount;
        /**
         * Point in time (Unix timestamp) when the gift can be transferred to another owner; can be in the past; 0 if the gift can be transferred immediately or transfer isn't possible.
         */
        public int nextTransferDate;
        /**
         * Point in time (Unix timestamp) when the gift can be resold to another user; can be in the past; 0 if the gift can't be resold; only for the receiver of the gift.
         */
        public int nextResaleDate;
        /**
         * Point in time (Unix timestamp) when the gift can be transferred to the TON blockchain as an NFT; can be in the past.
         */
        public int exportDate;

        /**
         * Contains result of gift upgrading.
         */
        public UpgradeGiftResult() {
        }

        /**
         * Contains result of gift upgrading.
         *
         * @param gift The upgraded gift.
         * @param receivedGiftId Unique identifier of the received gift for the current user.
         * @param isSaved True, if the gift is displayed on the user's or the channel's profile page.
         * @param canBeTransferred True, if the gift can be transferred to another owner.
         * @param transferStarCount Number of Telegram Stars that must be paid to transfer the upgraded gift.
         * @param dropOriginalDetailsStarCount Number of Telegram Stars that must be paid to drop original details of the upgraded gift; 0 if not available.
         * @param nextTransferDate Point in time (Unix timestamp) when the gift can be transferred to another owner; can be in the past; 0 if the gift can be transferred immediately or transfer isn't possible.
         * @param nextResaleDate Point in time (Unix timestamp) when the gift can be resold to another user; can be in the past; 0 if the gift can't be resold; only for the receiver of the gift.
         * @param exportDate Point in time (Unix timestamp) when the gift can be transferred to the TON blockchain as an NFT; can be in the past.
         */
        public UpgradeGiftResult(UpgradedGift gift, String receivedGiftId, boolean isSaved, boolean canBeTransferred, long transferStarCount, long dropOriginalDetailsStarCount, int nextTransferDate, int nextResaleDate, int exportDate) {
            this.gift = gift;
            this.receivedGiftId = receivedGiftId;
            this.isSaved = isSaved;
            this.canBeTransferred = canBeTransferred;
            this.transferStarCount = transferStarCount;
            this.dropOriginalDetailsStarCount = dropOriginalDetailsStarCount;
            this.nextTransferDate = nextTransferDate;
            this.nextResaleDate = nextResaleDate;
            this.exportDate = exportDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 965145418;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an upgraded gift that can be transferred to another owner or transferred to the TON blockchain as an NFT.
     */
    public static class UpgradedGift extends Object {
        /**
         * Unique identifier of the gift.
         */
        public long id;
        /**
         * Unique identifier of the regular gift from which the gift was upgraded; may be 0 for short period of time for old gifts from database.
         */
        public long regularGiftId;
        /**
         * Identifier of the chat that published the gift; 0 if none.
         */
        public long publisherChatId;
        /**
         * The title of the upgraded gift.
         */
        public String title;
        /**
         * Unique name of the upgraded gift that can be used with internalLinkTypeUpgradedGift or sendResoldGift.
         */
        public String name;
        /**
         * Unique number of the upgraded gift among gifts upgraded from the same gift.
         */
        public int number;
        /**
         * Total number of gifts that were upgraded from the same gift.
         */
        public int totalUpgradedCount;
        /**
         * The maximum number of gifts that can be upgraded from the same gift.
         */
        public int maxUpgradedCount;
        /**
         * True, if the gift was used to craft another gift.
         */
        public boolean isBurned;
        /**
         * True, if the gift was craft from another gifts.
         */
        public boolean isCrafted;
        /**
         * True, if the original gift could have been bought only by Telegram Premium subscribers.
         */
        public boolean isPremium;
        /**
         * True, if the gift can be used to set a theme in a chat.
         */
        public boolean isThemeAvailable;
        /**
         * Identifier of the chat for which the gift is used to set a theme; 0 if none or the gift isn't owned by the current user.
         */
        public long usedThemeChatId;
        /**
         * Identifier of the user or the chat to which the upgraded gift was assigned from blockchain; may be null if none or unknown.
         */
        @Nullable public MessageSender hostId;
        /**
         * Identifier of the user or the chat that owns the upgraded gift; may be null if none or unknown.
         */
        @Nullable public MessageSender ownerId;
        /**
         * Address of the gift NFT owner in TON blockchain; may be empty if none. Append the address to getOption(&quot;ton_blockchain_explorer_url&quot;) to get a link with information about the address.
         */
        public String ownerAddress;
        /**
         * Name of the owner for the case when owner identifier and address aren't known.
         */
        public String ownerName;
        /**
         * Address of the gift NFT in TON blockchain; may be empty if none. Append the address to getOption(&quot;ton_blockchain_explorer_url&quot;) to get a link with information about the address.
         */
        public String giftAddress;
        /**
         * Model of the upgraded gift.
         */
        public UpgradedGiftModel model;
        /**
         * Symbol of the upgraded gift.
         */
        public UpgradedGiftSymbol symbol;
        /**
         * Backdrop of the upgraded gift.
         */
        public UpgradedGiftBackdrop backdrop;
        /**
         * Information about the originally sent gift; may be null if unknown.
         */
        @Nullable public UpgradedGiftOriginalDetails originalDetails;
        /**
         * Colors that can be set for user's name, background of empty chat photo, replies to messages and link previews; may be null if none or unknown.
         */
        @Nullable public UpgradedGiftColors colors;
        /**
         * Resale parameters of the gift; may be null if resale isn't possible.
         */
        @Nullable public GiftResaleParameters resaleParameters;
        /**
         * True, if an offer to purchase the gift can be sent using sendGiftPurchaseOffer.
         */
        public boolean canSendPurchaseOffer;
        /**
         * Probability that the gift adds to the chance of successful crafting of a new gift; 0 if the gift can't be used for crafting.
         */
        public int craftProbabilityPerMille;
        /**
         * ISO 4217 currency code of the currency in which value of the gift is represented; may be empty if unavailable.
         */
        public String valueCurrency;
        /**
         * Estimated value of the gift; in the smallest units of the currency; 0 if unavailable.
         */
        public long valueAmount;
        /**
         * Estimated value of the gift in USD; in USD cents; 0 if unavailable.
         */
        public long valueUsdAmount;

        /**
         * Describes an upgraded gift that can be transferred to another owner or transferred to the TON blockchain as an NFT.
         */
        public UpgradedGift() {
        }

        /**
         * Describes an upgraded gift that can be transferred to another owner or transferred to the TON blockchain as an NFT.
         *
         * @param id Unique identifier of the gift.
         * @param regularGiftId Unique identifier of the regular gift from which the gift was upgraded; may be 0 for short period of time for old gifts from database.
         * @param publisherChatId Identifier of the chat that published the gift; 0 if none.
         * @param title The title of the upgraded gift.
         * @param name Unique name of the upgraded gift that can be used with internalLinkTypeUpgradedGift or sendResoldGift.
         * @param number Unique number of the upgraded gift among gifts upgraded from the same gift.
         * @param totalUpgradedCount Total number of gifts that were upgraded from the same gift.
         * @param maxUpgradedCount The maximum number of gifts that can be upgraded from the same gift.
         * @param isBurned True, if the gift was used to craft another gift.
         * @param isCrafted True, if the gift was craft from another gifts.
         * @param isPremium True, if the original gift could have been bought only by Telegram Premium subscribers.
         * @param isThemeAvailable True, if the gift can be used to set a theme in a chat.
         * @param usedThemeChatId Identifier of the chat for which the gift is used to set a theme; 0 if none or the gift isn't owned by the current user.
         * @param hostId Identifier of the user or the chat to which the upgraded gift was assigned from blockchain; may be null if none or unknown.
         * @param ownerId Identifier of the user or the chat that owns the upgraded gift; may be null if none or unknown.
         * @param ownerAddress Address of the gift NFT owner in TON blockchain; may be empty if none. Append the address to getOption(&quot;ton_blockchain_explorer_url&quot;) to get a link with information about the address.
         * @param ownerName Name of the owner for the case when owner identifier and address aren't known.
         * @param giftAddress Address of the gift NFT in TON blockchain; may be empty if none. Append the address to getOption(&quot;ton_blockchain_explorer_url&quot;) to get a link with information about the address.
         * @param model Model of the upgraded gift.
         * @param symbol Symbol of the upgraded gift.
         * @param backdrop Backdrop of the upgraded gift.
         * @param originalDetails Information about the originally sent gift; may be null if unknown.
         * @param colors Colors that can be set for user's name, background of empty chat photo, replies to messages and link previews; may be null if none or unknown.
         * @param resaleParameters Resale parameters of the gift; may be null if resale isn't possible.
         * @param canSendPurchaseOffer True, if an offer to purchase the gift can be sent using sendGiftPurchaseOffer.
         * @param craftProbabilityPerMille Probability that the gift adds to the chance of successful crafting of a new gift; 0 if the gift can't be used for crafting.
         * @param valueCurrency ISO 4217 currency code of the currency in which value of the gift is represented; may be empty if unavailable.
         * @param valueAmount Estimated value of the gift; in the smallest units of the currency; 0 if unavailable.
         * @param valueUsdAmount Estimated value of the gift in USD; in USD cents; 0 if unavailable.
         */
        public UpgradedGift(long id, long regularGiftId, long publisherChatId, String title, String name, int number, int totalUpgradedCount, int maxUpgradedCount, boolean isBurned, boolean isCrafted, boolean isPremium, boolean isThemeAvailable, long usedThemeChatId, MessageSender hostId, MessageSender ownerId, String ownerAddress, String ownerName, String giftAddress, UpgradedGiftModel model, UpgradedGiftSymbol symbol, UpgradedGiftBackdrop backdrop, UpgradedGiftOriginalDetails originalDetails, UpgradedGiftColors colors, GiftResaleParameters resaleParameters, boolean canSendPurchaseOffer, int craftProbabilityPerMille, String valueCurrency, long valueAmount, long valueUsdAmount) {
            this.id = id;
            this.regularGiftId = regularGiftId;
            this.publisherChatId = publisherChatId;
            this.title = title;
            this.name = name;
            this.number = number;
            this.totalUpgradedCount = totalUpgradedCount;
            this.maxUpgradedCount = maxUpgradedCount;
            this.isBurned = isBurned;
            this.isCrafted = isCrafted;
            this.isPremium = isPremium;
            this.isThemeAvailable = isThemeAvailable;
            this.usedThemeChatId = usedThemeChatId;
            this.hostId = hostId;
            this.ownerId = ownerId;
            this.ownerAddress = ownerAddress;
            this.ownerName = ownerName;
            this.giftAddress = giftAddress;
            this.model = model;
            this.symbol = symbol;
            this.backdrop = backdrop;
            this.originalDetails = originalDetails;
            this.colors = colors;
            this.resaleParameters = resaleParameters;
            this.canSendPurchaseOffer = canSendPurchaseOffer;
            this.craftProbabilityPerMille = craftProbabilityPerMille;
            this.valueCurrency = valueCurrency;
            this.valueAmount = valueAmount;
            this.valueUsdAmount = valueUsdAmount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 239775652;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Contains identifier of an upgraded gift attribute to search for.
     */
    public abstract static class UpgradedGiftAttributeId extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            UpgradedGiftAttributeIdModel.CONSTRUCTOR,
            UpgradedGiftAttributeIdSymbol.CONSTRUCTOR,
            UpgradedGiftAttributeIdBackdrop.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public UpgradedGiftAttributeId() {
        }
    }

    /**
     * Identifier of a gift model.
     */
    public static class UpgradedGiftAttributeIdModel extends UpgradedGiftAttributeId {
        /**
         * Identifier of the sticker representing the model.
         */
        public long stickerId;

        /**
         * Identifier of a gift model.
         */
        public UpgradedGiftAttributeIdModel() {
        }

        /**
         * Identifier of a gift model.
         *
         * @param stickerId Identifier of the sticker representing the model.
         */
        public UpgradedGiftAttributeIdModel(long stickerId) {
            this.stickerId = stickerId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1053287307;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Identifier of a gift symbol.
     */
    public static class UpgradedGiftAttributeIdSymbol extends UpgradedGiftAttributeId {
        /**
         * Identifier of the sticker representing the symbol.
         */
        public long stickerId;

        /**
         * Identifier of a gift symbol.
         */
        public UpgradedGiftAttributeIdSymbol() {
        }

        /**
         * Identifier of a gift symbol.
         *
         * @param stickerId Identifier of the sticker representing the symbol.
         */
        public UpgradedGiftAttributeIdSymbol(long stickerId) {
            this.stickerId = stickerId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1188205608;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Identifier of a gift backdrop.
     */
    public static class UpgradedGiftAttributeIdBackdrop extends UpgradedGiftAttributeId {
        /**
         * Identifier of the backdrop.
         */
        public int backdropId;

        /**
         * Identifier of a gift backdrop.
         */
        public UpgradedGiftAttributeIdBackdrop() {
        }

        /**
         * Identifier of a gift backdrop.
         *
         * @param backdropId Identifier of the backdrop.
         */
        public UpgradedGiftAttributeIdBackdrop(int backdropId) {
            this.backdropId = backdropId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1461997935;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes rarity of an upgraded gift attribute.
     */
    public abstract static class UpgradedGiftAttributeRarity extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            UpgradedGiftAttributeRarityPerMille.CONSTRUCTOR,
            UpgradedGiftAttributeRarityUncommon.CONSTRUCTOR,
            UpgradedGiftAttributeRarityRare.CONSTRUCTOR,
            UpgradedGiftAttributeRarityEpic.CONSTRUCTOR,
            UpgradedGiftAttributeRarityLegendary.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public UpgradedGiftAttributeRarity() {
        }
    }

    /**
     * The rarity is represented as the numeric frequency of the model.
     */
    public static class UpgradedGiftAttributeRarityPerMille extends UpgradedGiftAttributeRarity {
        /**
         * The number of upgraded gifts that receive this attribute for each 1000 gifts upgraded; if 0, then it can be shown as &quot;&lt;0.1%&quot;.
         */
        public int perMille;

        /**
         * The rarity is represented as the numeric frequency of the model.
         */
        public UpgradedGiftAttributeRarityPerMille() {
        }

        /**
         * The rarity is represented as the numeric frequency of the model.
         *
         * @param perMille The number of upgraded gifts that receive this attribute for each 1000 gifts upgraded; if 0, then it can be shown as &quot;&lt;0.1%&quot;.
         */
        public UpgradedGiftAttributeRarityPerMille(int perMille) {
            this.perMille = perMille;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1306052575;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The attribute is uncommon.
     */
    public static class UpgradedGiftAttributeRarityUncommon extends UpgradedGiftAttributeRarity {

        /**
         * The attribute is uncommon.
         */
        public UpgradedGiftAttributeRarityUncommon() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -203711025;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The attribute is rare.
     */
    public static class UpgradedGiftAttributeRarityRare extends UpgradedGiftAttributeRarity {

        /**
         * The attribute is rare.
         */
        public UpgradedGiftAttributeRarityRare() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1676142893;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The attribute is epic.
     */
    public static class UpgradedGiftAttributeRarityEpic extends UpgradedGiftAttributeRarity {

        /**
         * The attribute is epic.
         */
        public UpgradedGiftAttributeRarityEpic() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1206252713;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The attribute is legendary.
     */
    public static class UpgradedGiftAttributeRarityLegendary extends UpgradedGiftAttributeRarity {

        /**
         * The attribute is legendary.
         */
        public UpgradedGiftAttributeRarityLegendary() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 85089455;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a backdrop of an upgraded gift.
     */
    public static class UpgradedGiftBackdrop extends Object {
        /**
         * Unique identifier of the backdrop.
         */
        public int id;
        /**
         * Name of the backdrop.
         */
        public String name;
        /**
         * Colors of the backdrop.
         */
        public UpgradedGiftBackdropColors colors;
        /**
         * The rarity of the backdrop.
         */
        public UpgradedGiftAttributeRarity rarity;

        /**
         * Describes a backdrop of an upgraded gift.
         */
        public UpgradedGiftBackdrop() {
        }

        /**
         * Describes a backdrop of an upgraded gift.
         *
         * @param id Unique identifier of the backdrop.
         * @param name Name of the backdrop.
         * @param colors Colors of the backdrop.
         * @param rarity The rarity of the backdrop.
         */
        public UpgradedGiftBackdrop(int id, String name, UpgradedGiftBackdropColors colors, UpgradedGiftAttributeRarity rarity) {
            this.id = id;
            this.name = name;
            this.colors = colors;
            this.rarity = rarity;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -775752215;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes colors of a backdrop of an upgraded gift.
     */
    public static class UpgradedGiftBackdropColors extends Object {
        /**
         * A color in the center of the backdrop in the RGB format.
         */
        public int centerColor;
        /**
         * A color on the edges of the backdrop in the RGB format.
         */
        public int edgeColor;
        /**
         * A color to be applied for the symbol in the RGB format.
         */
        public int symbolColor;
        /**
         * A color for the text on the backdrop in the RGB format.
         */
        public int textColor;

        /**
         * Describes colors of a backdrop of an upgraded gift.
         */
        public UpgradedGiftBackdropColors() {
        }

        /**
         * Describes colors of a backdrop of an upgraded gift.
         *
         * @param centerColor A color in the center of the backdrop in the RGB format.
         * @param edgeColor A color on the edges of the backdrop in the RGB format.
         * @param symbolColor A color to be applied for the symbol in the RGB format.
         * @param textColor A color for the text on the backdrop in the RGB format.
         */
        public UpgradedGiftBackdropColors(int centerColor, int edgeColor, int symbolColor, int textColor) {
            this.centerColor = centerColor;
            this.edgeColor = edgeColor;
            this.symbolColor = symbolColor;
            this.textColor = textColor;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 4227529;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a backdrop of an upgraded gift.
     */
    public static class UpgradedGiftBackdropCount extends Object {
        /**
         * The backdrop.
         */
        public UpgradedGiftBackdrop backdrop;
        /**
         * Total number of gifts with the symbol.
         */
        public int totalCount;

        /**
         * Describes a backdrop of an upgraded gift.
         */
        public UpgradedGiftBackdropCount() {
        }

        /**
         * Describes a backdrop of an upgraded gift.
         *
         * @param backdrop The backdrop.
         * @param totalCount Total number of gifts with the symbol.
         */
        public UpgradedGiftBackdropCount(UpgradedGiftBackdrop backdrop, int totalCount) {
            this.backdrop = backdrop;
            this.totalCount = totalCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -562274120;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about color scheme for user's name, background of empty chat photo, replies to messages and link previews.
     */
    public static class UpgradedGiftColors extends Object {
        /**
         * Unique identifier of the upgraded gift colors.
         */
        public long id;
        /**
         * Custom emoji identifier of the model of the upgraded gift.
         */
        public long modelCustomEmojiId;
        /**
         * Custom emoji identifier of the symbol of the upgraded gift.
         */
        public long symbolCustomEmojiId;
        /**
         * Accent color to use in light themes in RGB format.
         */
        public int lightThemeAccentColor;
        /**
         * The list of 1-3 colors in RGB format, describing the accent color, as expected to be shown in light themes.
         */
        public int[] lightThemeColors;
        /**
         * Accent color to use in dark themes in RGB format.
         */
        public int darkThemeAccentColor;
        /**
         * The list of 1-3 colors in RGB format, describing the accent color, as expected to be shown in dark themes.
         */
        public int[] darkThemeColors;

        /**
         * Contains information about color scheme for user's name, background of empty chat photo, replies to messages and link previews.
         */
        public UpgradedGiftColors() {
        }

        /**
         * Contains information about color scheme for user's name, background of empty chat photo, replies to messages and link previews.
         *
         * @param id Unique identifier of the upgraded gift colors.
         * @param modelCustomEmojiId Custom emoji identifier of the model of the upgraded gift.
         * @param symbolCustomEmojiId Custom emoji identifier of the symbol of the upgraded gift.
         * @param lightThemeAccentColor Accent color to use in light themes in RGB format.
         * @param lightThemeColors The list of 1-3 colors in RGB format, describing the accent color, as expected to be shown in light themes.
         * @param darkThemeAccentColor Accent color to use in dark themes in RGB format.
         * @param darkThemeColors The list of 1-3 colors in RGB format, describing the accent color, as expected to be shown in dark themes.
         */
        public UpgradedGiftColors(long id, long modelCustomEmojiId, long symbolCustomEmojiId, int lightThemeAccentColor, int[] lightThemeColors, int darkThemeAccentColor, int[] darkThemeColors) {
            this.id = id;
            this.modelCustomEmojiId = modelCustomEmojiId;
            this.symbolCustomEmojiId = symbolCustomEmojiId;
            this.lightThemeAccentColor = lightThemeAccentColor;
            this.lightThemeColors = lightThemeColors;
            this.darkThemeAccentColor = darkThemeAccentColor;
            this.darkThemeColors = darkThemeColors;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 743567702;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a model of an upgraded gift.
     */
    public static class UpgradedGiftModel extends Object {
        /**
         * Name of the model.
         */
        public String name;
        /**
         * The sticker representing the upgraded gift.
         */
        public Sticker sticker;
        /**
         * The rarity of the model.
         */
        public UpgradedGiftAttributeRarity rarity;
        /**
         * True, if the model can be obtained only through gift crafting.
         */
        public boolean isCrafted;

        /**
         * Describes a model of an upgraded gift.
         */
        public UpgradedGiftModel() {
        }

        /**
         * Describes a model of an upgraded gift.
         *
         * @param name Name of the model.
         * @param sticker The sticker representing the upgraded gift.
         * @param rarity The rarity of the model.
         * @param isCrafted True, if the model can be obtained only through gift crafting.
         */
        public UpgradedGiftModel(String name, Sticker sticker, UpgradedGiftAttributeRarity rarity, boolean isCrafted) {
            this.name = name;
            this.sticker = sticker;
            this.rarity = rarity;
            this.isCrafted = isCrafted;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1451554959;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a model of an upgraded gift with the number of gifts found.
     */
    public static class UpgradedGiftModelCount extends Object {
        /**
         * The model.
         */
        public UpgradedGiftModel model;
        /**
         * Total number of gifts with the model.
         */
        public int totalCount;

        /**
         * Describes a model of an upgraded gift with the number of gifts found.
         */
        public UpgradedGiftModelCount() {
        }

        /**
         * Describes a model of an upgraded gift with the number of gifts found.
         *
         * @param model The model.
         * @param totalCount Total number of gifts with the model.
         */
        public UpgradedGiftModelCount(UpgradedGiftModel model, int totalCount) {
            this.model = model;
            this.totalCount = totalCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1127238023;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes origin from which the upgraded gift was obtained.
     */
    public abstract static class UpgradedGiftOrigin extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            UpgradedGiftOriginUpgrade.CONSTRUCTOR,
            UpgradedGiftOriginTransfer.CONSTRUCTOR,
            UpgradedGiftOriginResale.CONSTRUCTOR,
            UpgradedGiftOriginBlockchain.CONSTRUCTOR,
            UpgradedGiftOriginPrepaidUpgrade.CONSTRUCTOR,
            UpgradedGiftOriginOffer.CONSTRUCTOR,
            UpgradedGiftOriginCraft.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public UpgradedGiftOrigin() {
        }
    }

    /**
     * The gift was obtained by upgrading of a previously received gift.
     */
    public static class UpgradedGiftOriginUpgrade extends UpgradedGiftOrigin {
        /**
         * Identifier of the message with the regular gift that was upgraded; may be 0 or an identifier of a deleted message.
         */
        public long giftMessageId;

        /**
         * The gift was obtained by upgrading of a previously received gift.
         */
        public UpgradedGiftOriginUpgrade() {
        }

        /**
         * The gift was obtained by upgrading of a previously received gift.
         *
         * @param giftMessageId Identifier of the message with the regular gift that was upgraded; may be 0 or an identifier of a deleted message.
         */
        public UpgradedGiftOriginUpgrade(long giftMessageId) {
            this.giftMessageId = giftMessageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 530003363;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The gift was transferred from another owner.
     */
    public static class UpgradedGiftOriginTransfer extends UpgradedGiftOrigin {

        /**
         * The gift was transferred from another owner.
         */
        public UpgradedGiftOriginTransfer() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 331458658;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The gift was bought from another user.
     */
    public static class UpgradedGiftOriginResale extends UpgradedGiftOrigin {
        /**
         * Price paid for the gift.
         */
        public GiftResalePrice price;

        /**
         * The gift was bought from another user.
         */
        public UpgradedGiftOriginResale() {
        }

        /**
         * The gift was bought from another user.
         *
         * @param price Price paid for the gift.
         */
        public UpgradedGiftOriginResale(GiftResalePrice price) {
            this.price = price;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -989020635;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The gift was assigned from blockchain and isn't owned by the current user. The gift can't be transferred, resold or withdrawn to blockchain.
     */
    public static class UpgradedGiftOriginBlockchain extends UpgradedGiftOrigin {

        /**
         * The gift was assigned from blockchain and isn't owned by the current user. The gift can't be transferred, resold or withdrawn to blockchain.
         */
        public UpgradedGiftOriginBlockchain() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2133095888;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The sender or receiver of the message has paid for upgraid of the gift, which has been completed.
     */
    public static class UpgradedGiftOriginPrepaidUpgrade extends UpgradedGiftOrigin {

        /**
         * The sender or receiver of the message has paid for upgraid of the gift, which has been completed.
         */
        public UpgradedGiftOriginPrepaidUpgrade() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 619653731;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The gift was bought through an offer.
     */
    public static class UpgradedGiftOriginOffer extends UpgradedGiftOrigin {
        /**
         * Price paid for the gift.
         */
        public GiftResalePrice price;

        /**
         * The gift was bought through an offer.
         */
        public UpgradedGiftOriginOffer() {
        }

        /**
         * The gift was bought through an offer.
         *
         * @param price Price paid for the gift.
         */
        public UpgradedGiftOriginOffer(GiftResalePrice price) {
            this.price = price;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -182289662;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The gift was crafted from other gifts.
     */
    public static class UpgradedGiftOriginCraft extends UpgradedGiftOrigin {

        /**
         * The gift was crafted from other gifts.
         */
        public UpgradedGiftOriginCraft() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1827738024;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes the original details about the gift.
     */
    public static class UpgradedGiftOriginalDetails extends Object {
        /**
         * Identifier of the user or the chat that sent the gift; may be null if the gift was private.
         */
        @Nullable public MessageSender senderId;
        /**
         * Identifier of the user or the chat that received the gift.
         */
        public MessageSender receiverId;
        /**
         * Message added to the gift.
         */
        public FormattedText text;
        /**
         * Point in time (Unix timestamp) when the gift was sent.
         */
        public int date;

        /**
         * Describes the original details about the gift.
         */
        public UpgradedGiftOriginalDetails() {
        }

        /**
         * Describes the original details about the gift.
         *
         * @param senderId Identifier of the user or the chat that sent the gift; may be null if the gift was private.
         * @param receiverId Identifier of the user or the chat that received the gift.
         * @param text Message added to the gift.
         * @param date Point in time (Unix timestamp) when the gift was sent.
         */
        public UpgradedGiftOriginalDetails(MessageSender senderId, MessageSender receiverId, FormattedText text, int date) {
            this.senderId = senderId;
            this.receiverId = receiverId;
            this.text = text;
            this.date = date;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 55247728;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a symbol shown on the pattern of an upgraded gift.
     */
    public static class UpgradedGiftSymbol extends Object {
        /**
         * Name of the symbol.
         */
        public String name;
        /**
         * The sticker representing the symbol.
         */
        public Sticker sticker;
        /**
         * The rarity of the symbol.
         */
        public UpgradedGiftAttributeRarity rarity;

        /**
         * Describes a symbol shown on the pattern of an upgraded gift.
         */
        public UpgradedGiftSymbol() {
        }

        /**
         * Describes a symbol shown on the pattern of an upgraded gift.
         *
         * @param name Name of the symbol.
         * @param sticker The sticker representing the symbol.
         * @param rarity The rarity of the symbol.
         */
        public UpgradedGiftSymbol(String name, Sticker sticker, UpgradedGiftAttributeRarity rarity) {
            this.name = name;
            this.sticker = sticker;
            this.rarity = rarity;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 744249151;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a symbol shown on the pattern of an upgraded gift.
     */
    public static class UpgradedGiftSymbolCount extends Object {
        /**
         * The symbol.
         */
        public UpgradedGiftSymbol symbol;
        /**
         * Total number of gifts with the symbol.
         */
        public int totalCount;

        /**
         * Describes a symbol shown on the pattern of an upgraded gift.
         */
        public UpgradedGiftSymbolCount() {
        }

        /**
         * Describes a symbol shown on the pattern of an upgraded gift.
         *
         * @param symbol The symbol.
         * @param totalCount Total number of gifts with the symbol.
         */
        public UpgradedGiftSymbolCount(UpgradedGiftSymbol symbol, int totalCount) {
            this.symbol = symbol;
            this.totalCount = totalCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -773579874;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about value of an upgraded gift.
     */
    public static class UpgradedGiftValueInfo extends Object {
        /**
         * ISO 4217 currency code of the currency in which the prices are represented.
         */
        public String currency;
        /**
         * Estimated value of the gift; in the smallest units of the currency.
         */
        public long value;
        /**
         * True, if the value is calculated as average value of similar sold gifts. Otherwise, it is based on the sale price of the gift.
         */
        public boolean isValueAverage;
        /**
         * Point in time (Unix timestamp) when the corresponding regular gift was originally purchased.
         */
        public int initialSaleDate;
        /**
         * The Telegram Star amount that was paid for the gift.
         */
        public long initialSaleStarCount;
        /**
         * Initial price of the gift; in the smallest units of the currency.
         */
        public long initialSalePrice;
        /**
         * Point in time (Unix timestamp) when the upgraded gift was purchased last time; 0 if never.
         */
        public int lastSaleDate;
        /**
         * Last purchase price of the gift; in the smallest units of the currency; 0 if the gift has never been resold.
         */
        public long lastSalePrice;
        /**
         * True, if the last sale was completed on Fragment.
         */
        public boolean isLastSaleOnFragment;
        /**
         * The current minimum price of gifts upgraded from the same gift; in the smallest units of the currency; 0 if there are no such gifts.
         */
        public long minimumPrice;
        /**
         * The average sale price in the last month of gifts upgraded from the same gift; in the smallest units of the currency; 0 if there were no such sales.
         */
        public long averageSalePrice;
        /**
         * Number of gifts upgraded from the same gift being resold on Telegram.
         */
        public int telegramListedGiftCount;
        /**
         * Number of gifts upgraded from the same gift being resold on Fragment.
         */
        public int fragmentListedGiftCount;
        /**
         * The HTTPS link to the Fragment for the gift; may be empty if there are no such gifts being sold on Fragment.
         */
        public String fragmentUrl;

        /**
         * Contains information about value of an upgraded gift.
         */
        public UpgradedGiftValueInfo() {
        }

        /**
         * Contains information about value of an upgraded gift.
         *
         * @param currency ISO 4217 currency code of the currency in which the prices are represented.
         * @param value Estimated value of the gift; in the smallest units of the currency.
         * @param isValueAverage True, if the value is calculated as average value of similar sold gifts. Otherwise, it is based on the sale price of the gift.
         * @param initialSaleDate Point in time (Unix timestamp) when the corresponding regular gift was originally purchased.
         * @param initialSaleStarCount The Telegram Star amount that was paid for the gift.
         * @param initialSalePrice Initial price of the gift; in the smallest units of the currency.
         * @param lastSaleDate Point in time (Unix timestamp) when the upgraded gift was purchased last time; 0 if never.
         * @param lastSalePrice Last purchase price of the gift; in the smallest units of the currency; 0 if the gift has never been resold.
         * @param isLastSaleOnFragment True, if the last sale was completed on Fragment.
         * @param minimumPrice The current minimum price of gifts upgraded from the same gift; in the smallest units of the currency; 0 if there are no such gifts.
         * @param averageSalePrice The average sale price in the last month of gifts upgraded from the same gift; in the smallest units of the currency; 0 if there were no such sales.
         * @param telegramListedGiftCount Number of gifts upgraded from the same gift being resold on Telegram.
         * @param fragmentListedGiftCount Number of gifts upgraded from the same gift being resold on Fragment.
         * @param fragmentUrl The HTTPS link to the Fragment for the gift; may be empty if there are no such gifts being sold on Fragment.
         */
        public UpgradedGiftValueInfo(String currency, long value, boolean isValueAverage, int initialSaleDate, long initialSaleStarCount, long initialSalePrice, int lastSaleDate, long lastSalePrice, boolean isLastSaleOnFragment, long minimumPrice, long averageSalePrice, int telegramListedGiftCount, int fragmentListedGiftCount, String fragmentUrl) {
            this.currency = currency;
            this.value = value;
            this.isValueAverage = isValueAverage;
            this.initialSaleDate = initialSaleDate;
            this.initialSaleStarCount = initialSaleStarCount;
            this.initialSalePrice = initialSalePrice;
            this.lastSaleDate = lastSaleDate;
            this.lastSalePrice = lastSalePrice;
            this.isLastSaleOnFragment = isLastSaleOnFragment;
            this.minimumPrice = minimumPrice;
            this.averageSalePrice = averageSalePrice;
            this.telegramListedGiftCount = telegramListedGiftCount;
            this.fragmentListedGiftCount = fragmentListedGiftCount;
            this.fragmentUrl = fragmentUrl;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1729877677;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a user.
     */
    public static class User extends Object {
        /**
         * User identifier.
         */
        public long id;
        /**
         * First name of the user.
         */
        public String firstName;
        /**
         * Last name of the user.
         */
        public String lastName;
        /**
         * Usernames of the user; may be null.
         */
        @Nullable public Usernames usernames;
        /**
         * Phone number of the user.
         */
        public String phoneNumber;
        /**
         * Current online status of the user.
         */
        public UserStatus status;
        /**
         * Profile photo of the user; may be null.
         */
        @Nullable public ProfilePhoto profilePhoto;
        /**
         * Identifier of the accent color for name, and backgrounds of profile photo, reply header, and link preview.
         */
        public int accentColorId;
        /**
         * Identifier of a custom emoji to be shown on the reply header and link preview background; 0 if none.
         */
        public long backgroundCustomEmojiId;
        /**
         * Color scheme based on an upgraded gift to be used for the user instead of accentColorId and backgroundCustomEmojiId; may be null if none.
         */
        @Nullable public UpgradedGiftColors upgradedGiftColors;
        /**
         * Identifier of the accent color for the user's profile; -1 if none.
         */
        public int profileAccentColorId;
        /**
         * Identifier of a custom emoji to be shown on the background of the user's profile; 0 if none.
         */
        public long profileBackgroundCustomEmojiId;
        /**
         * Emoji status to be shown instead of the default Telegram Premium badge; may be null.
         */
        @Nullable public EmojiStatus emojiStatus;
        /**
         * The user is a contact of the current user.
         */
        public boolean isContact;
        /**
         * The user is a contact of the current user and the current user is a contact of the user.
         */
        public boolean isMutualContact;
        /**
         * The user is a close friend of the current user; implies that the user is a contact.
         */
        public boolean isCloseFriend;
        /**
         * Information about verification status of the user; may be null if none.
         */
        @Nullable public VerificationStatus verificationStatus;
        /**
         * True, if the user is a Telegram Premium user.
         */
        public boolean isPremium;
        /**
         * True, if the user is Telegram support account.
         */
        public boolean isSupport;
        /**
         * Information about restrictions that must be applied to the corresponding private chat; may be null if none.
         */
        @Nullable public RestrictionInfo restrictionInfo;
        /**
         * State of active stories of the user; may be null if the user has no active stories.
         */
        @Nullable public ActiveStoryState activeStoryState;
        /**
         * True, if the user may restrict new chats with non-contacts. Use canSendMessageToUser to check whether the current user can message the user or try to create a chat with them.
         */
        public boolean restrictsNewChats;
        /**
         * Number of Telegram Stars that must be paid by general user for each sent message to the user. If positive and userFullInfo is unknown, use canSendMessageToUser to check whether the current user must pay.
         */
        public long paidMessageStarCount;
        /**
         * If false, the user is inaccessible, and the only information known about the user is inside this class. Identifier of the user can't be passed to any method.
         */
        public boolean haveAccess;
        /**
         * Type of the user.
         */
        public UserType type;
        /**
         * IETF language tag of the user's language; only available to bots.
         */
        public String languageCode;
        /**
         * True, if the user added the current bot to attachment menu; only available to bots.
         */
        public boolean addedToAttachmentMenu;

        /**
         * Represents a user.
         */
        public User() {
        }

        /**
         * Represents a user.
         *
         * @param id User identifier.
         * @param firstName First name of the user.
         * @param lastName Last name of the user.
         * @param usernames Usernames of the user; may be null.
         * @param phoneNumber Phone number of the user.
         * @param status Current online status of the user.
         * @param profilePhoto Profile photo of the user; may be null.
         * @param accentColorId Identifier of the accent color for name, and backgrounds of profile photo, reply header, and link preview.
         * @param backgroundCustomEmojiId Identifier of a custom emoji to be shown on the reply header and link preview background; 0 if none.
         * @param upgradedGiftColors Color scheme based on an upgraded gift to be used for the user instead of accentColorId and backgroundCustomEmojiId; may be null if none.
         * @param profileAccentColorId Identifier of the accent color for the user's profile; -1 if none.
         * @param profileBackgroundCustomEmojiId Identifier of a custom emoji to be shown on the background of the user's profile; 0 if none.
         * @param emojiStatus Emoji status to be shown instead of the default Telegram Premium badge; may be null.
         * @param isContact The user is a contact of the current user.
         * @param isMutualContact The user is a contact of the current user and the current user is a contact of the user.
         * @param isCloseFriend The user is a close friend of the current user; implies that the user is a contact.
         * @param verificationStatus Information about verification status of the user; may be null if none.
         * @param isPremium True, if the user is a Telegram Premium user.
         * @param isSupport True, if the user is Telegram support account.
         * @param restrictionInfo Information about restrictions that must be applied to the corresponding private chat; may be null if none.
         * @param activeStoryState State of active stories of the user; may be null if the user has no active stories.
         * @param restrictsNewChats True, if the user may restrict new chats with non-contacts. Use canSendMessageToUser to check whether the current user can message the user or try to create a chat with them.
         * @param paidMessageStarCount Number of Telegram Stars that must be paid by general user for each sent message to the user. If positive and userFullInfo is unknown, use canSendMessageToUser to check whether the current user must pay.
         * @param haveAccess If false, the user is inaccessible, and the only information known about the user is inside this class. Identifier of the user can't be passed to any method.
         * @param type Type of the user.
         * @param languageCode IETF language tag of the user's language; only available to bots.
         * @param addedToAttachmentMenu True, if the user added the current bot to attachment menu; only available to bots.
         */
        public User(long id, String firstName, String lastName, Usernames usernames, String phoneNumber, UserStatus status, ProfilePhoto profilePhoto, int accentColorId, long backgroundCustomEmojiId, UpgradedGiftColors upgradedGiftColors, int profileAccentColorId, long profileBackgroundCustomEmojiId, EmojiStatus emojiStatus, boolean isContact, boolean isMutualContact, boolean isCloseFriend, VerificationStatus verificationStatus, boolean isPremium, boolean isSupport, RestrictionInfo restrictionInfo, ActiveStoryState activeStoryState, boolean restrictsNewChats, long paidMessageStarCount, boolean haveAccess, UserType type, String languageCode, boolean addedToAttachmentMenu) {
            this.id = id;
            this.firstName = firstName;
            this.lastName = lastName;
            this.usernames = usernames;
            this.phoneNumber = phoneNumber;
            this.status = status;
            this.profilePhoto = profilePhoto;
            this.accentColorId = accentColorId;
            this.backgroundCustomEmojiId = backgroundCustomEmojiId;
            this.upgradedGiftColors = upgradedGiftColors;
            this.profileAccentColorId = profileAccentColorId;
            this.profileBackgroundCustomEmojiId = profileBackgroundCustomEmojiId;
            this.emojiStatus = emojiStatus;
            this.isContact = isContact;
            this.isMutualContact = isMutualContact;
            this.isCloseFriend = isCloseFriend;
            this.verificationStatus = verificationStatus;
            this.isPremium = isPremium;
            this.isSupport = isSupport;
            this.restrictionInfo = restrictionInfo;
            this.activeStoryState = activeStoryState;
            this.restrictsNewChats = restrictsNewChats;
            this.paidMessageStarCount = paidMessageStarCount;
            this.haveAccess = haveAccess;
            this.type = type;
            this.languageCode = languageCode;
            this.addedToAttachmentMenu = addedToAttachmentMenu;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1874921182;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a bid of the current user in an auction.
     */
    public static class UserAuctionBid extends Object {
        /**
         * The number of Telegram Stars that were put in the bid.
         */
        public long starCount;
        /**
         * Point in time (Unix timestamp) when the bid was made.
         */
        public int bidDate;
        /**
         * The minimum number of Telegram Stars that can be put for the next bid.
         */
        public long nextBidStarCount;
        /**
         * Identifier of the user or the chat that will receive the auctioned item. If the auction is opened in context of another user or chat, then a warning is supposed to be shown to the current user.
         */
        public MessageSender ownerId;
        /**
         * True, if the bid was returned to the user, because it was outbid and can't win anymore.
         */
        public boolean wasReturned;

        /**
         * Describes a bid of the current user in an auction.
         */
        public UserAuctionBid() {
        }

        /**
         * Describes a bid of the current user in an auction.
         *
         * @param starCount The number of Telegram Stars that were put in the bid.
         * @param bidDate Point in time (Unix timestamp) when the bid was made.
         * @param nextBidStarCount The minimum number of Telegram Stars that can be put for the next bid.
         * @param ownerId Identifier of the user or the chat that will receive the auctioned item. If the auction is opened in context of another user or chat, then a warning is supposed to be shown to the current user.
         * @param wasReturned True, if the bid was returned to the user, because it was outbid and can't win anymore.
         */
        public UserAuctionBid(long starCount, int bidDate, long nextBidStarCount, MessageSender ownerId, boolean wasReturned) {
            this.starCount = starCount;
            this.bidDate = bidDate;
            this.nextBidStarCount = nextBidStarCount;
            this.ownerId = ownerId;
            this.wasReturned = wasReturned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 538448225;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains full information about a user.
     */
    public static class UserFullInfo extends Object {
        /**
         * User profile photo set by the current user for the contact; may be null. If null and user.profilePhoto is null, then the photo is empty; otherwise, it is unknown. If non-null, then it is the same photo as in user.profilePhoto and chat.photo. This photo isn't returned in the list of user photos.
         */
        @Nullable public ChatPhoto personalPhoto;
        /**
         * User profile photo; may be null. If null and user.profilePhoto is null, then the photo is empty; otherwise, it is unknown. If non-null and personalPhoto is null, then it is the same photo as in user.profilePhoto and chat.photo.
         */
        @Nullable public ChatPhoto photo;
        /**
         * User profile photo visible if the main photo is hidden by privacy settings; may be null. If null and user.profilePhoto is null, then the photo is empty; otherwise, it is unknown. If non-null and both photo and personalPhoto are null, then it is the same photo as in user.profilePhoto and chat.photo. This photo isn't returned in the list of user photos.
         */
        @Nullable public ChatPhoto publicPhoto;
        /**
         * Block list to which the user is added; may be null if none.
         */
        @Nullable public BlockList blockList;
        /**
         * True, if the user can be called.
         */
        public boolean canBeCalled;
        /**
         * True, if a video call can be created with the user.
         */
        public boolean supportsVideoCalls;
        /**
         * True, if the user can't be called due to their privacy settings.
         */
        public boolean hasPrivateCalls;
        /**
         * True, if the user can't be linked in forwarded messages due to their privacy settings.
         */
        public boolean hasPrivateForwards;
        /**
         * True, if voice and video notes can't be sent or forwarded to the user.
         */
        public boolean hasRestrictedVoiceAndVideoNoteMessages;
        /**
         * True, if the user has posted to profile stories.
         */
        public boolean hasPostedToProfileStories;
        /**
         * True, if the user always enabled sponsored messages; known only for the current user.
         */
        public boolean hasSponsoredMessagesEnabled;
        /**
         * True, if the current user needs to explicitly allow to share their phone number with the user when the method addContact is used.
         */
        public boolean needPhoneNumberPrivacyException;
        /**
         * True, if the user set chat background for both chat users and it wasn't reverted yet.
         */
        public boolean setChatBackground;
        /**
         * True, if the user uses an unofficial application that poses a security risk.
         */
        public boolean usesUnofficialApp;
        /**
         * A short user bio; may be null for bots.
         */
        @Nullable public FormattedText bio;
        /**
         * Birthdate of the user; may be null if unknown.
         */
        @Nullable public Birthdate birthdate;
        /**
         * Identifier of the personal chat of the user; 0 if none.
         */
        public long personalChatId;
        /**
         * Number of saved to profile gifts for other users or the total number of received gifts for the current user.
         */
        public int giftCount;
        /**
         * Number of group chats where both the other user and the current user are a member; 0 for the current user.
         */
        public int groupInCommonCount;
        /**
         * Number of Telegram Stars that must be paid by the user for each sent message to the current user.
         */
        public long incomingPaidMessageStarCount;
        /**
         * Number of Telegram Stars that must be paid by the current user for each sent message to the user.
         */
        public long outgoingPaidMessageStarCount;
        /**
         * Settings for gift receiving for the user.
         */
        public GiftSettings giftSettings;
        /**
         * Information about verification status of the user provided by a bot; may be null if none or unknown.
         */
        @Nullable public BotVerification botVerification;
        /**
         * The main tab chosen by the user; may be null if not chosen manually.
         */
        @Nullable public ProfileTab mainProfileTab;
        /**
         * The first audio file added to the user's profile; may be null if none.
         */
        @Nullable public Audio firstProfileAudio;
        /**
         * The current rating of the user; may be null if none.
         */
        @Nullable public UserRating rating;
        /**
         * The rating of the user after the next change; may be null if the user isn't the current user or there are no pending rating changes.
         */
        @Nullable public UserRating pendingRating;
        /**
         * Unix timestamp when rating of the user will change to pendingRating; 0 if the user isn't the current user or there are no pending rating changes.
         */
        public int pendingRatingDate;
        /**
         * Note added to the user's contact; may be null if none.
         */
        @Nullable public FormattedText note;
        /**
         * Information about business settings for Telegram Business accounts; may be null if none.
         */
        @Nullable public BusinessInfo businessInfo;
        /**
         * For bots, information about the bot; may be null if the user isn't a bot.
         */
        @Nullable public BotInfo botInfo;

        /**
         * Contains full information about a user.
         */
        public UserFullInfo() {
        }

        /**
         * Contains full information about a user.
         *
         * @param personalPhoto User profile photo set by the current user for the contact; may be null. If null and user.profilePhoto is null, then the photo is empty; otherwise, it is unknown. If non-null, then it is the same photo as in user.profilePhoto and chat.photo. This photo isn't returned in the list of user photos.
         * @param photo User profile photo; may be null. If null and user.profilePhoto is null, then the photo is empty; otherwise, it is unknown. If non-null and personalPhoto is null, then it is the same photo as in user.profilePhoto and chat.photo.
         * @param publicPhoto User profile photo visible if the main photo is hidden by privacy settings; may be null. If null and user.profilePhoto is null, then the photo is empty; otherwise, it is unknown. If non-null and both photo and personalPhoto are null, then it is the same photo as in user.profilePhoto and chat.photo. This photo isn't returned in the list of user photos.
         * @param blockList Block list to which the user is added; may be null if none.
         * @param canBeCalled True, if the user can be called.
         * @param supportsVideoCalls True, if a video call can be created with the user.
         * @param hasPrivateCalls True, if the user can't be called due to their privacy settings.
         * @param hasPrivateForwards True, if the user can't be linked in forwarded messages due to their privacy settings.
         * @param hasRestrictedVoiceAndVideoNoteMessages True, if voice and video notes can't be sent or forwarded to the user.
         * @param hasPostedToProfileStories True, if the user has posted to profile stories.
         * @param hasSponsoredMessagesEnabled True, if the user always enabled sponsored messages; known only for the current user.
         * @param needPhoneNumberPrivacyException True, if the current user needs to explicitly allow to share their phone number with the user when the method addContact is used.
         * @param setChatBackground True, if the user set chat background for both chat users and it wasn't reverted yet.
         * @param usesUnofficialApp True, if the user uses an unofficial application that poses a security risk.
         * @param bio A short user bio; may be null for bots.
         * @param birthdate Birthdate of the user; may be null if unknown.
         * @param personalChatId Identifier of the personal chat of the user; 0 if none.
         * @param giftCount Number of saved to profile gifts for other users or the total number of received gifts for the current user.
         * @param groupInCommonCount Number of group chats where both the other user and the current user are a member; 0 for the current user.
         * @param incomingPaidMessageStarCount Number of Telegram Stars that must be paid by the user for each sent message to the current user.
         * @param outgoingPaidMessageStarCount Number of Telegram Stars that must be paid by the current user for each sent message to the user.
         * @param giftSettings Settings for gift receiving for the user.
         * @param botVerification Information about verification status of the user provided by a bot; may be null if none or unknown.
         * @param mainProfileTab The main tab chosen by the user; may be null if not chosen manually.
         * @param firstProfileAudio The first audio file added to the user's profile; may be null if none.
         * @param rating The current rating of the user; may be null if none.
         * @param pendingRating The rating of the user after the next change; may be null if the user isn't the current user or there are no pending rating changes.
         * @param pendingRatingDate Unix timestamp when rating of the user will change to pendingRating; 0 if the user isn't the current user or there are no pending rating changes.
         * @param note Note added to the user's contact; may be null if none.
         * @param businessInfo Information about business settings for Telegram Business accounts; may be null if none.
         * @param botInfo For bots, information about the bot; may be null if the user isn't a bot.
         */
        public UserFullInfo(ChatPhoto personalPhoto, ChatPhoto photo, ChatPhoto publicPhoto, BlockList blockList, boolean canBeCalled, boolean supportsVideoCalls, boolean hasPrivateCalls, boolean hasPrivateForwards, boolean hasRestrictedVoiceAndVideoNoteMessages, boolean hasPostedToProfileStories, boolean hasSponsoredMessagesEnabled, boolean needPhoneNumberPrivacyException, boolean setChatBackground, boolean usesUnofficialApp, FormattedText bio, Birthdate birthdate, long personalChatId, int giftCount, int groupInCommonCount, long incomingPaidMessageStarCount, long outgoingPaidMessageStarCount, GiftSettings giftSettings, BotVerification botVerification, ProfileTab mainProfileTab, Audio firstProfileAudio, UserRating rating, UserRating pendingRating, int pendingRatingDate, FormattedText note, BusinessInfo businessInfo, BotInfo botInfo) {
            this.personalPhoto = personalPhoto;
            this.photo = photo;
            this.publicPhoto = publicPhoto;
            this.blockList = blockList;
            this.canBeCalled = canBeCalled;
            this.supportsVideoCalls = supportsVideoCalls;
            this.hasPrivateCalls = hasPrivateCalls;
            this.hasPrivateForwards = hasPrivateForwards;
            this.hasRestrictedVoiceAndVideoNoteMessages = hasRestrictedVoiceAndVideoNoteMessages;
            this.hasPostedToProfileStories = hasPostedToProfileStories;
            this.hasSponsoredMessagesEnabled = hasSponsoredMessagesEnabled;
            this.needPhoneNumberPrivacyException = needPhoneNumberPrivacyException;
            this.setChatBackground = setChatBackground;
            this.usesUnofficialApp = usesUnofficialApp;
            this.bio = bio;
            this.birthdate = birthdate;
            this.personalChatId = personalChatId;
            this.giftCount = giftCount;
            this.groupInCommonCount = groupInCommonCount;
            this.incomingPaidMessageStarCount = incomingPaidMessageStarCount;
            this.outgoingPaidMessageStarCount = outgoingPaidMessageStarCount;
            this.giftSettings = giftSettings;
            this.botVerification = botVerification;
            this.mainProfileTab = mainProfileTab;
            this.firstProfileAudio = firstProfileAudio;
            this.rating = rating;
            this.pendingRating = pendingRating;
            this.pendingRatingDate = pendingRatingDate;
            this.note = note;
            this.businessInfo = businessInfo;
            this.botInfo = botInfo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1176229971;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains an HTTPS URL, which can be used to get information about a user.
     */
    public static class UserLink extends Object {
        /**
         * The URL.
         */
        public String url;
        /**
         * Left time for which the link is valid, in seconds; 0 if the link is a public username link.
         */
        public int expiresIn;

        /**
         * Contains an HTTPS URL, which can be used to get information about a user.
         */
        public UserLink() {
        }

        /**
         * Contains an HTTPS URL, which can be used to get information about a user.
         *
         * @param url The URL.
         * @param expiresIn Left time for which the link is valid, in seconds; 0 if the link is a public username link.
         */
        public UserLink(String url, int expiresIn) {
            this.url = url;
            this.expiresIn = expiresIn;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 498138872;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes available user privacy settings.
     */
    public abstract static class UserPrivacySetting extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            UserPrivacySettingShowStatus.CONSTRUCTOR,
            UserPrivacySettingShowProfilePhoto.CONSTRUCTOR,
            UserPrivacySettingShowLinkInForwardedMessages.CONSTRUCTOR,
            UserPrivacySettingShowPhoneNumber.CONSTRUCTOR,
            UserPrivacySettingShowBio.CONSTRUCTOR,
            UserPrivacySettingShowBirthdate.CONSTRUCTOR,
            UserPrivacySettingShowProfileAudio.CONSTRUCTOR,
            UserPrivacySettingAllowChatInvites.CONSTRUCTOR,
            UserPrivacySettingAllowCalls.CONSTRUCTOR,
            UserPrivacySettingAllowPeerToPeerCalls.CONSTRUCTOR,
            UserPrivacySettingAllowFindingByPhoneNumber.CONSTRUCTOR,
            UserPrivacySettingAllowPrivateVoiceAndVideoNoteMessages.CONSTRUCTOR,
            UserPrivacySettingAutosaveGifts.CONSTRUCTOR,
            UserPrivacySettingAllowUnpaidMessages.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public UserPrivacySetting() {
        }
    }

    /**
     * A privacy setting for managing whether the user's online status is visible.
     */
    public static class UserPrivacySettingShowStatus extends UserPrivacySetting {

        /**
         * A privacy setting for managing whether the user's online status is visible.
         */
        public UserPrivacySettingShowStatus() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1862829310;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A privacy setting for managing whether the user's profile photo is visible.
     */
    public static class UserPrivacySettingShowProfilePhoto extends UserPrivacySetting {

        /**
         * A privacy setting for managing whether the user's profile photo is visible.
         */
        public UserPrivacySettingShowProfilePhoto() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1408485877;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A privacy setting for managing whether a link to the user's account is included in forwarded messages.
     */
    public static class UserPrivacySettingShowLinkInForwardedMessages extends UserPrivacySetting {

        /**
         * A privacy setting for managing whether a link to the user's account is included in forwarded messages.
         */
        public UserPrivacySettingShowLinkInForwardedMessages() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 592688870;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A privacy setting for managing whether the user's phone number is visible.
     */
    public static class UserPrivacySettingShowPhoneNumber extends UserPrivacySetting {

        /**
         * A privacy setting for managing whether the user's phone number is visible.
         */
        public UserPrivacySettingShowPhoneNumber() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -791567831;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A privacy setting for managing whether the user's bio is visible.
     */
    public static class UserPrivacySettingShowBio extends UserPrivacySetting {

        /**
         * A privacy setting for managing whether the user's bio is visible.
         */
        public UserPrivacySettingShowBio() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 959981409;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A privacy setting for managing whether the user's birthdate is visible.
     */
    public static class UserPrivacySettingShowBirthdate extends UserPrivacySetting {

        /**
         * A privacy setting for managing whether the user's birthdate is visible.
         */
        public UserPrivacySettingShowBirthdate() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1167504607;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A privacy setting for managing whether the user's profile audio files are visible.
     */
    public static class UserPrivacySettingShowProfileAudio extends UserPrivacySetting {

        /**
         * A privacy setting for managing whether the user's profile audio files are visible.
         */
        public UserPrivacySettingShowProfileAudio() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 610353549;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A privacy setting for managing whether the user can be invited to chats.
     */
    public static class UserPrivacySettingAllowChatInvites extends UserPrivacySetting {

        /**
         * A privacy setting for managing whether the user can be invited to chats.
         */
        public UserPrivacySettingAllowChatInvites() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1271668007;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A privacy setting for managing whether the user can be called.
     */
    public static class UserPrivacySettingAllowCalls extends UserPrivacySetting {

        /**
         * A privacy setting for managing whether the user can be called.
         */
        public UserPrivacySettingAllowCalls() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -906967291;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A privacy setting for managing whether peer-to-peer connections can be used for calls.
     */
    public static class UserPrivacySettingAllowPeerToPeerCalls extends UserPrivacySetting {

        /**
         * A privacy setting for managing whether peer-to-peer connections can be used for calls.
         */
        public UserPrivacySettingAllowPeerToPeerCalls() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 352500032;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A privacy setting for managing whether the user can be found by their phone number. Checked only if the phone number is not known to the other user. Can be set only to &quot;Allow contacts&quot; or &quot;Allow all&quot;.
     */
    public static class UserPrivacySettingAllowFindingByPhoneNumber extends UserPrivacySetting {

        /**
         * A privacy setting for managing whether the user can be found by their phone number. Checked only if the phone number is not known to the other user. Can be set only to &quot;Allow contacts&quot; or &quot;Allow all&quot;.
         */
        public UserPrivacySettingAllowFindingByPhoneNumber() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1846645423;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A privacy setting for managing whether the user can receive voice and video messages in private chats; for Telegram Premium users only.
     */
    public static class UserPrivacySettingAllowPrivateVoiceAndVideoNoteMessages extends UserPrivacySetting {

        /**
         * A privacy setting for managing whether the user can receive voice and video messages in private chats; for Telegram Premium users only.
         */
        public UserPrivacySettingAllowPrivateVoiceAndVideoNoteMessages() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 338112060;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A privacy setting for managing whether received gifts are automatically shown on the user's profile page.
     */
    public static class UserPrivacySettingAutosaveGifts extends UserPrivacySetting {

        /**
         * A privacy setting for managing whether received gifts are automatically shown on the user's profile page.
         */
        public UserPrivacySettingAutosaveGifts() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1889167821;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A privacy setting for managing whether the user can receive messages without additional payment.
     */
    public static class UserPrivacySettingAllowUnpaidMessages extends UserPrivacySetting {

        /**
         * A privacy setting for managing whether the user can receive messages without additional payment.
         */
        public UserPrivacySettingAllowUnpaidMessages() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1430051047;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents a single rule for managing user privacy settings.
     */
    public abstract static class UserPrivacySettingRule extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            UserPrivacySettingRuleAllowAll.CONSTRUCTOR,
            UserPrivacySettingRuleAllowContacts.CONSTRUCTOR,
            UserPrivacySettingRuleAllowBots.CONSTRUCTOR,
            UserPrivacySettingRuleAllowPremiumUsers.CONSTRUCTOR,
            UserPrivacySettingRuleAllowUsers.CONSTRUCTOR,
            UserPrivacySettingRuleAllowChatMembers.CONSTRUCTOR,
            UserPrivacySettingRuleRestrictAll.CONSTRUCTOR,
            UserPrivacySettingRuleRestrictContacts.CONSTRUCTOR,
            UserPrivacySettingRuleRestrictBots.CONSTRUCTOR,
            UserPrivacySettingRuleRestrictUsers.CONSTRUCTOR,
            UserPrivacySettingRuleRestrictChatMembers.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public UserPrivacySettingRule() {
        }
    }

    /**
     * A rule to allow all users to do something.
     */
    public static class UserPrivacySettingRuleAllowAll extends UserPrivacySettingRule {

        /**
         * A rule to allow all users to do something.
         */
        public UserPrivacySettingRuleAllowAll() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1967186881;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A rule to allow all contacts of the user to do something.
     */
    public static class UserPrivacySettingRuleAllowContacts extends UserPrivacySettingRule {

        /**
         * A rule to allow all contacts of the user to do something.
         */
        public UserPrivacySettingRuleAllowContacts() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1892733680;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A rule to allow all bots to do something.
     */
    public static class UserPrivacySettingRuleAllowBots extends UserPrivacySettingRule {

        /**
         * A rule to allow all bots to do something.
         */
        public UserPrivacySettingRuleAllowBots() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1404208925;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A rule to allow all Premium Users to do something; currently, allowed only for userPrivacySettingAllowChatInvites.
     */
    public static class UserPrivacySettingRuleAllowPremiumUsers extends UserPrivacySettingRule {

        /**
         * A rule to allow all Premium Users to do something; currently, allowed only for userPrivacySettingAllowChatInvites.
         */
        public UserPrivacySettingRuleAllowPremiumUsers() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1624147265;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A rule to allow certain specified users to do something.
     */
    public static class UserPrivacySettingRuleAllowUsers extends UserPrivacySettingRule {
        /**
         * The user identifiers, total number of users in all rules must not exceed 1000.
         */
        public long[] userIds;

        /**
         * A rule to allow certain specified users to do something.
         */
        public UserPrivacySettingRuleAllowUsers() {
        }

        /**
         * A rule to allow certain specified users to do something.
         *
         * @param userIds The user identifiers, total number of users in all rules must not exceed 1000.
         */
        public UserPrivacySettingRuleAllowUsers(long[] userIds) {
            this.userIds = userIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1110988334;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A rule to allow all members of certain specified basic groups and supergroups to doing something.
     */
    public static class UserPrivacySettingRuleAllowChatMembers extends UserPrivacySettingRule {
        /**
         * The chat identifiers, total number of chats in all rules must not exceed 20.
         */
        public long[] chatIds;

        /**
         * A rule to allow all members of certain specified basic groups and supergroups to doing something.
         */
        public UserPrivacySettingRuleAllowChatMembers() {
        }

        /**
         * A rule to allow all members of certain specified basic groups and supergroups to doing something.
         *
         * @param chatIds The chat identifiers, total number of chats in all rules must not exceed 20.
         */
        public UserPrivacySettingRuleAllowChatMembers(long[] chatIds) {
            this.chatIds = chatIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2048749863;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A rule to restrict all users from doing something.
     */
    public static class UserPrivacySettingRuleRestrictAll extends UserPrivacySettingRule {

        /**
         * A rule to restrict all users from doing something.
         */
        public UserPrivacySettingRuleRestrictAll() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1406495408;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A rule to restrict all contacts of the user from doing something.
     */
    public static class UserPrivacySettingRuleRestrictContacts extends UserPrivacySettingRule {

        /**
         * A rule to restrict all contacts of the user from doing something.
         */
        public UserPrivacySettingRuleRestrictContacts() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1008389378;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A rule to restrict all bots from doing something.
     */
    public static class UserPrivacySettingRuleRestrictBots extends UserPrivacySettingRule {

        /**
         * A rule to restrict all bots from doing something.
         */
        public UserPrivacySettingRuleRestrictBots() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1902547363;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A rule to restrict all specified users from doing something.
     */
    public static class UserPrivacySettingRuleRestrictUsers extends UserPrivacySettingRule {
        /**
         * The user identifiers, total number of users in all rules must not exceed 1000.
         */
        public long[] userIds;

        /**
         * A rule to restrict all specified users from doing something.
         */
        public UserPrivacySettingRuleRestrictUsers() {
        }

        /**
         * A rule to restrict all specified users from doing something.
         *
         * @param userIds The user identifiers, total number of users in all rules must not exceed 1000.
         */
        public UserPrivacySettingRuleRestrictUsers(long[] userIds) {
            this.userIds = userIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 622796522;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A rule to restrict all members of specified basic groups and supergroups from doing something.
     */
    public static class UserPrivacySettingRuleRestrictChatMembers extends UserPrivacySettingRule {
        /**
         * The chat identifiers, total number of chats in all rules must not exceed 20.
         */
        public long[] chatIds;

        /**
         * A rule to restrict all members of specified basic groups and supergroups from doing something.
         */
        public UserPrivacySettingRuleRestrictChatMembers() {
        }

        /**
         * A rule to restrict all members of specified basic groups and supergroups from doing something.
         *
         * @param chatIds The chat identifiers, total number of chats in all rules must not exceed 20.
         */
        public UserPrivacySettingRuleRestrictChatMembers(long[] chatIds) {
            this.chatIds = chatIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 392530897;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A list of privacy rules. Rules are matched in the specified order. The first matched rule defines the privacy setting for a given user. If no rule matches, the action is not allowed.
     */
    public static class UserPrivacySettingRules extends Object {
        /**
         * A list of rules.
         */
        public UserPrivacySettingRule[] rules;

        /**
         * A list of privacy rules. Rules are matched in the specified order. The first matched rule defines the privacy setting for a given user. If no rule matches, the action is not allowed.
         */
        public UserPrivacySettingRules() {
        }

        /**
         * A list of privacy rules. Rules are matched in the specified order. The first matched rule defines the privacy setting for a given user. If no rule matches, the action is not allowed.
         *
         * @param rules A list of rules.
         */
        public UserPrivacySettingRules(UserPrivacySettingRule[] rules) {
            this.rules = rules;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 322477541;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains description of user rating.
     */
    public static class UserRating extends Object {
        /**
         * The level of the user; may be negative.
         */
        public int level;
        /**
         * True, if the maximum level is reached.
         */
        public boolean isMaximumLevelReached;
        /**
         * Numerical value of the rating.
         */
        public long rating;
        /**
         * The rating required for the current level.
         */
        public long currentLevelRating;
        /**
         * The rating required for the next level; 0 if the maximum level is reached.
         */
        public long nextLevelRating;

        /**
         * Contains description of user rating.
         */
        public UserRating() {
        }

        /**
         * Contains description of user rating.
         *
         * @param level The level of the user; may be negative.
         * @param isMaximumLevelReached True, if the maximum level is reached.
         * @param rating Numerical value of the rating.
         * @param currentLevelRating The rating required for the current level.
         * @param nextLevelRating The rating required for the next level; 0 if the maximum level is reached.
         */
        public UserRating(int level, boolean isMaximumLevelReached, long rating, long currentLevelRating, long nextLevelRating) {
            this.level = level;
            this.isMaximumLevelReached = isMaximumLevelReached;
            this.rating = rating;
            this.currentLevelRating = currentLevelRating;
            this.nextLevelRating = nextLevelRating;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 532047235;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes the last time the user was online.
     */
    public abstract static class UserStatus extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            UserStatusEmpty.CONSTRUCTOR,
            UserStatusOnline.CONSTRUCTOR,
            UserStatusOffline.CONSTRUCTOR,
            UserStatusRecently.CONSTRUCTOR,
            UserStatusLastWeek.CONSTRUCTOR,
            UserStatusLastMonth.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public UserStatus() {
        }
    }

    /**
     * The user's status has never been changed.
     */
    public static class UserStatusEmpty extends UserStatus {

        /**
         * The user's status has never been changed.
         */
        public UserStatusEmpty() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 164646985;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user is online.
     */
    public static class UserStatusOnline extends UserStatus {
        /**
         * Point in time (Unix timestamp) when the user's online status will expire.
         */
        public int expires;

        /**
         * The user is online.
         */
        public UserStatusOnline() {
        }

        /**
         * The user is online.
         *
         * @param expires Point in time (Unix timestamp) when the user's online status will expire.
         */
        public UserStatusOnline(int expires) {
            this.expires = expires;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1529460876;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user is offline.
     */
    public static class UserStatusOffline extends UserStatus {
        /**
         * Point in time (Unix timestamp) when the user was last online.
         */
        public int wasOnline;

        /**
         * The user is offline.
         */
        public UserStatusOffline() {
        }

        /**
         * The user is offline.
         *
         * @param wasOnline Point in time (Unix timestamp) when the user was last online.
         */
        public UserStatusOffline(int wasOnline) {
            this.wasOnline = wasOnline;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -759984891;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user was online recently.
     */
    public static class UserStatusRecently extends UserStatus {
        /**
         * Exact user's status is hidden because the current user enabled userPrivacySettingShowStatus privacy setting for the user and has no Telegram Premium.
         */
        public boolean byMyPrivacySettings;

        /**
         * The user was online recently.
         */
        public UserStatusRecently() {
        }

        /**
         * The user was online recently.
         *
         * @param byMyPrivacySettings Exact user's status is hidden because the current user enabled userPrivacySettingShowStatus privacy setting for the user and has no Telegram Premium.
         */
        public UserStatusRecently(boolean byMyPrivacySettings) {
            this.byMyPrivacySettings = byMyPrivacySettings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 262824117;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user is offline, but was online last week.
     */
    public static class UserStatusLastWeek extends UserStatus {
        /**
         * Exact user's status is hidden because the current user enabled userPrivacySettingShowStatus privacy setting for the user and has no Telegram Premium.
         */
        public boolean byMyPrivacySettings;

        /**
         * The user is offline, but was online last week.
         */
        public UserStatusLastWeek() {
        }

        /**
         * The user is offline, but was online last week.
         *
         * @param byMyPrivacySettings Exact user's status is hidden because the current user enabled userPrivacySettingShowStatus privacy setting for the user and has no Telegram Premium.
         */
        public UserStatusLastWeek(boolean byMyPrivacySettings) {
            this.byMyPrivacySettings = byMyPrivacySettings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 310385495;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The user is offline, but was online last month.
     */
    public static class UserStatusLastMonth extends UserStatus {
        /**
         * Exact user's status is hidden because the current user enabled userPrivacySettingShowStatus privacy setting for the user and has no Telegram Premium.
         */
        public boolean byMyPrivacySettings;

        /**
         * The user is offline, but was online last month.
         */
        public UserStatusLastMonth() {
        }

        /**
         * The user is offline, but was online last month.
         *
         * @param byMyPrivacySettings Exact user's status is hidden because the current user enabled userPrivacySettingShowStatus privacy setting for the user and has no Telegram Premium.
         */
        public UserStatusLastMonth(boolean byMyPrivacySettings) {
            this.byMyPrivacySettings = byMyPrivacySettings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1194644996;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains custom information about the user.
     */
    public static class UserSupportInfo extends Object {
        /**
         * Information message.
         */
        public FormattedText message;
        /**
         * Information author.
         */
        public String author;
        /**
         * Information change date.
         */
        public int date;

        /**
         * Contains custom information about the user.
         */
        public UserSupportInfo() {
        }

        /**
         * Contains custom information about the user.
         *
         * @param message Information message.
         * @param author Information author.
         * @param date Information change date.
         */
        public UserSupportInfo(FormattedText message, String author, int date) {
            this.message = message;
            this.author = author;
            this.date = date;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1257366487;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents the type of user. The following types are possible: regular users, deleted users and bots.
     */
    public abstract static class UserType extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            UserTypeRegular.CONSTRUCTOR,
            UserTypeDeleted.CONSTRUCTOR,
            UserTypeBot.CONSTRUCTOR,
            UserTypeUnknown.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public UserType() {
        }
    }

    /**
     * A regular user.
     */
    public static class UserTypeRegular extends UserType {

        /**
         * A regular user.
         */
        public UserTypeRegular() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -598644325;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A deleted user or deleted bot. No information on the user besides the user identifier is available. It is not possible to perform any active actions on this type of user.
     */
    public static class UserTypeDeleted extends UserType {

        /**
         * A deleted user or deleted bot. No information on the user besides the user identifier is available. It is not possible to perform any active actions on this type of user.
         */
        public UserTypeDeleted() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1807729372;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A bot (see https://core.telegram.org/bots).
     */
    public static class UserTypeBot extends UserType {
        /**
         * True, if the bot is owned by the current user and can be edited using the methods toggleBotUsernameIsActive, reorderBotActiveUsernames, setBotProfilePhoto, setBotName, setBotInfoDescription, and setBotInfoShortDescription.
         */
        public boolean canBeEdited;
        /**
         * True, if the bot can be invited to basic group and supergroup chats.
         */
        public boolean canJoinGroups;
        /**
         * True, if the bot can read all messages in basic group or supergroup chats and not just those addressed to the bot. In private and channel chats a bot can always read all messages.
         */
        public boolean canReadAllGroupMessages;
        /**
         * True, if the bot has the main Web App.
         */
        public boolean hasMainWebApp;
        /**
         * True, if the bot has topics.
         */
        public boolean hasTopics;
        /**
         * True, if users can create and delete topics in the chat with the bot.
         */
        public boolean allowsUsersToCreateTopics;
        /**
         * True, if the bot can manage other bots.
         */
        public boolean canManageBots;
        /**
         * True, if the bot supports inline queries.
         */
        public boolean isInline;
        /**
         * Placeholder for inline queries (displayed on the application input field).
         */
        public String inlineQueryPlaceholder;
        /**
         * True, if the bot can be queried by username from any non-secret chat.
         */
        public boolean supportsGuestQueries;
        /**
         * True, if the location of the user is expected to be sent with every inline query to this bot.
         */
        public boolean needLocation;
        /**
         * True, if the bot supports connection to user accounts for chat automation.
         */
        public boolean canConnectToBusiness;
        /**
         * True, if the bot can be added to attachment or side menu.
         */
        public boolean canBeAddedToAttachmentMenu;
        /**
         * The number of recently active users of the bot.
         */
        public int activeUserCount;

        /**
         * A bot (see https://core.telegram.org/bots).
         */
        public UserTypeBot() {
        }

        /**
         * A bot (see https://core.telegram.org/bots).
         *
         * @param canBeEdited True, if the bot is owned by the current user and can be edited using the methods toggleBotUsernameIsActive, reorderBotActiveUsernames, setBotProfilePhoto, setBotName, setBotInfoDescription, and setBotInfoShortDescription.
         * @param canJoinGroups True, if the bot can be invited to basic group and supergroup chats.
         * @param canReadAllGroupMessages True, if the bot can read all messages in basic group or supergroup chats and not just those addressed to the bot. In private and channel chats a bot can always read all messages.
         * @param hasMainWebApp True, if the bot has the main Web App.
         * @param hasTopics True, if the bot has topics.
         * @param allowsUsersToCreateTopics True, if users can create and delete topics in the chat with the bot.
         * @param canManageBots True, if the bot can manage other bots.
         * @param isInline True, if the bot supports inline queries.
         * @param inlineQueryPlaceholder Placeholder for inline queries (displayed on the application input field).
         * @param supportsGuestQueries True, if the bot can be queried by username from any non-secret chat.
         * @param needLocation True, if the location of the user is expected to be sent with every inline query to this bot.
         * @param canConnectToBusiness True, if the bot supports connection to user accounts for chat automation.
         * @param canBeAddedToAttachmentMenu True, if the bot can be added to attachment or side menu.
         * @param activeUserCount The number of recently active users of the bot.
         */
        public UserTypeBot(boolean canBeEdited, boolean canJoinGroups, boolean canReadAllGroupMessages, boolean hasMainWebApp, boolean hasTopics, boolean allowsUsersToCreateTopics, boolean canManageBots, boolean isInline, String inlineQueryPlaceholder, boolean supportsGuestQueries, boolean needLocation, boolean canConnectToBusiness, boolean canBeAddedToAttachmentMenu, int activeUserCount) {
            this.canBeEdited = canBeEdited;
            this.canJoinGroups = canJoinGroups;
            this.canReadAllGroupMessages = canReadAllGroupMessages;
            this.hasMainWebApp = hasMainWebApp;
            this.hasTopics = hasTopics;
            this.allowsUsersToCreateTopics = allowsUsersToCreateTopics;
            this.canManageBots = canManageBots;
            this.isInline = isInline;
            this.inlineQueryPlaceholder = inlineQueryPlaceholder;
            this.supportsGuestQueries = supportsGuestQueries;
            this.needLocation = needLocation;
            this.canConnectToBusiness = canConnectToBusiness;
            this.canBeAddedToAttachmentMenu = canBeAddedToAttachmentMenu;
            this.activeUserCount = activeUserCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1040936013;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * No information on the user besides the user identifier is available, yet this user has not been deleted. This object is extremely rare and must be handled like a deleted user. It is not possible to perform any actions on users of this type.
     */
    public static class UserTypeUnknown extends UserType {

        /**
         * No information on the user besides the user identifier is available, yet this user has not been deleted. This object is extremely rare and must be handled like a deleted user. It is not possible to perform any actions on users of this type.
         */
        public UserTypeUnknown() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -724541123;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes usernames assigned to a user, a supergroup, or a channel.
     */
    public static class Usernames extends Object {
        /**
         * List of active usernames; the first one must be shown as the primary username. The order of active usernames can be changed with reorderActiveUsernames, reorderBotActiveUsernames or reorderSupergroupActiveUsernames.
         */
        public String[] activeUsernames;
        /**
         * List of currently disabled usernames; the username can be activated with toggleUsernameIsActive, toggleBotUsernameIsActive, or toggleSupergroupUsernameIsActive.
         */
        public String[] disabledUsernames;
        /**
         * Active or disabled username, which may be changed with setUsername or setSupergroupUsername.
         */
        public String editableUsername;
        /**
         * Collectible usernames that were purchased at https://fragment.com and can be passed to getCollectibleItemInfo for more details.
         */
        public String[] collectibleUsernames;

        /**
         * Describes usernames assigned to a user, a supergroup, or a channel.
         */
        public Usernames() {
        }

        /**
         * Describes usernames assigned to a user, a supergroup, or a channel.
         *
         * @param activeUsernames List of active usernames; the first one must be shown as the primary username. The order of active usernames can be changed with reorderActiveUsernames, reorderBotActiveUsernames or reorderSupergroupActiveUsernames.
         * @param disabledUsernames List of currently disabled usernames; the username can be activated with toggleUsernameIsActive, toggleBotUsernameIsActive, or toggleSupergroupUsernameIsActive.
         * @param editableUsername Active or disabled username, which may be changed with setUsername or setSupergroupUsername.
         * @param collectibleUsernames Collectible usernames that were purchased at https://fragment.com and can be passed to getCollectibleItemInfo for more details.
         */
        public Usernames(String[] activeUsernames, String[] disabledUsernames, String editableUsername, String[] collectibleUsernames) {
            this.activeUsernames = activeUsernames;
            this.disabledUsernames = disabledUsernames;
            this.editableUsername = editableUsername;
            this.collectibleUsernames = collectibleUsernames;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1263390614;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Represents a list of users.
     */
    public static class Users extends Object {
        /**
         * Approximate total number of users found.
         */
        public int totalCount;
        /**
         * A list of user identifiers.
         */
        public long[] userIds;

        /**
         * Represents a list of users.
         */
        public Users() {
        }

        /**
         * Represents a list of users.
         *
         * @param totalCount Approximate total number of users found.
         * @param userIds A list of user identifiers.
         */
        public Users(int totalCount, long[] userIds) {
            this.totalCount = totalCount;
            this.userIds = userIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 171203420;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a temporary identifier of validated order information, which is stored for one hour, and the available shipping options.
     */
    public static class ValidatedOrderInfo extends Object {
        /**
         * Temporary identifier of the order information.
         */
        public String orderInfoId;
        /**
         * Available shipping options.
         */
        public ShippingOption[] shippingOptions;

        /**
         * Contains a temporary identifier of validated order information, which is stored for one hour, and the available shipping options.
         */
        public ValidatedOrderInfo() {
        }

        /**
         * Contains a temporary identifier of validated order information, which is stored for one hour, and the available shipping options.
         *
         * @param orderInfoId Temporary identifier of the order information.
         * @param shippingOptions Available shipping options.
         */
        public ValidatedOrderInfo(String orderInfoId, ShippingOption[] shippingOptions) {
            this.orderInfoId = orderInfoId;
            this.shippingOptions = shippingOptions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1511451484;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Represents a vector path command.
     */
    public abstract static class VectorPathCommand extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            VectorPathCommandLine.CONSTRUCTOR,
            VectorPathCommandCubicBezierCurve.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public VectorPathCommand() {
        }
    }

    /**
     * A straight line to a given point.
     */
    public static class VectorPathCommandLine extends VectorPathCommand {
        /**
         * The end point of the straight line.
         */
        public Point endPoint;

        /**
         * A straight line to a given point.
         */
        public VectorPathCommandLine() {
        }

        /**
         * A straight line to a given point.
         *
         * @param endPoint The end point of the straight line.
         */
        public VectorPathCommandLine(Point endPoint) {
            this.endPoint = endPoint;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -614056822;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * A cubic Bézier curve to a given point.
     */
    public static class VectorPathCommandCubicBezierCurve extends VectorPathCommand {
        /**
         * The start control point of the curve.
         */
        public Point startControlPoint;
        /**
         * The end control point of the curve.
         */
        public Point endControlPoint;
        /**
         * The end point of the curve.
         */
        public Point endPoint;

        /**
         * A cubic Bézier curve to a given point.
         */
        public VectorPathCommandCubicBezierCurve() {
        }

        /**
         * A cubic Bézier curve to a given point.
         *
         * @param startControlPoint The start control point of the curve.
         * @param endControlPoint The end control point of the curve.
         * @param endPoint The end point of the curve.
         */
        public VectorPathCommandCubicBezierCurve(Point startControlPoint, Point endControlPoint, Point endPoint) {
            this.startControlPoint = startControlPoint;
            this.endControlPoint = endControlPoint;
            this.endPoint = endPoint;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1229733434;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a venue.
     */
    public static class Venue extends Object {
        /**
         * Venue location; as defined by the sender.
         */
        public Location location;
        /**
         * Venue name; as defined by the sender.
         */
        public String title;
        /**
         * Venue address; as defined by the sender.
         */
        public String address;
        /**
         * Provider of the venue database; as defined by the sender. Currently, only &quot;foursquare&quot; and &quot;gplaces&quot; (Google Places) need to be supported.
         */
        public String provider;
        /**
         * Identifier of the venue in the provider database; as defined by the sender.
         */
        public String id;
        /**
         * Type of the venue in the provider database; as defined by the sender.
         */
        public String type;

        /**
         * Describes a venue.
         */
        public Venue() {
        }

        /**
         * Describes a venue.
         *
         * @param location Venue location; as defined by the sender.
         * @param title Venue name; as defined by the sender.
         * @param address Venue address; as defined by the sender.
         * @param provider Provider of the venue database; as defined by the sender. Currently, only &quot;foursquare&quot; and &quot;gplaces&quot; (Google Places) need to be supported.
         * @param id Identifier of the venue in the provider database; as defined by the sender.
         * @param type Type of the venue in the provider database; as defined by the sender.
         */
        public Venue(Location location, String title, String address, String provider, String id, String type) {
            this.location = location;
            this.title = title;
            this.address = address;
            this.provider = provider;
            this.id = id;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1070406393;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about verification status of a chat or a user.
     */
    public static class VerificationStatus extends Object {
        /**
         * True, if the chat or the user is verified by Telegram.
         */
        public boolean isVerified;
        /**
         * True, if the chat or the user is marked as scam by Telegram.
         */
        public boolean isScam;
        /**
         * True, if the chat or the user is marked as fake by Telegram.
         */
        public boolean isFake;
        /**
         * Identifier of the custom emoji to be shown as verification sign provided by a bot for the user; 0 if none.
         */
        public long botVerificationIconCustomEmojiId;

        /**
         * Contains information about verification status of a chat or a user.
         */
        public VerificationStatus() {
        }

        /**
         * Contains information about verification status of a chat or a user.
         *
         * @param isVerified True, if the chat or the user is verified by Telegram.
         * @param isScam True, if the chat or the user is marked as scam by Telegram.
         * @param isFake True, if the chat or the user is marked as fake by Telegram.
         * @param botVerificationIconCustomEmojiId Identifier of the custom emoji to be shown as verification sign provided by a bot for the user; 0 if none.
         */
        public VerificationStatus(boolean isVerified, boolean isScam, boolean isFake, long botVerificationIconCustomEmojiId) {
            this.isVerified = isVerified;
            this.isScam = isScam;
            this.isFake = isFake;
            this.botVerificationIconCustomEmojiId = botVerificationIconCustomEmojiId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 988193164;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a video file.
     */
    public static class Video extends Object {
        /**
         * Duration of the video, in seconds; as defined by the sender.
         */
        public int duration;
        /**
         * Video width; as defined by the sender.
         */
        public int width;
        /**
         * Video height; as defined by the sender.
         */
        public int height;
        /**
         * Original name of the file; as defined by the sender.
         */
        public String fileName;
        /**
         * MIME type of the file; as defined by the sender.
         */
        public String mimeType;
        /**
         * True, if stickers were added to the video. The list of corresponding sticker sets can be received using getAttachedStickerSets.
         */
        public boolean hasStickers;
        /**
         * True, if the video is expected to be streamed.
         */
        public boolean supportsStreaming;
        /**
         * Video minithumbnail; may be null.
         */
        @Nullable public Minithumbnail minithumbnail;
        /**
         * Video thumbnail in JPEG or MPEG4 format; as defined by the sender; may be null.
         */
        @Nullable public Thumbnail thumbnail;
        /**
         * File containing the video.
         */
        public File video;

        /**
         * Describes a video file.
         */
        public Video() {
        }

        /**
         * Describes a video file.
         *
         * @param duration Duration of the video, in seconds; as defined by the sender.
         * @param width Video width; as defined by the sender.
         * @param height Video height; as defined by the sender.
         * @param fileName Original name of the file; as defined by the sender.
         * @param mimeType MIME type of the file; as defined by the sender.
         * @param hasStickers True, if stickers were added to the video. The list of corresponding sticker sets can be received using getAttachedStickerSets.
         * @param supportsStreaming True, if the video is expected to be streamed.
         * @param minithumbnail Video minithumbnail; may be null.
         * @param thumbnail Video thumbnail in JPEG or MPEG4 format; as defined by the sender; may be null.
         * @param video File containing the video.
         */
        public Video(int duration, int width, int height, String fileName, String mimeType, boolean hasStickers, boolean supportsStreaming, Minithumbnail minithumbnail, Thumbnail thumbnail, File video) {
            this.duration = duration;
            this.width = width;
            this.height = height;
            this.fileName = fileName;
            this.mimeType = mimeType;
            this.hasStickers = hasStickers;
            this.supportsStreaming = supportsStreaming;
            this.minithumbnail = minithumbnail;
            this.thumbnail = thumbnail;
            this.video = video;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 832856268;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a video chat, i.e. a group call bound to a chat.
     */
    public static class VideoChat extends Object {
        /**
         * Group call identifier of an active video chat; 0 if none. Full information about the video chat can be received through the method getGroupCall.
         */
        public int groupCallId;
        /**
         * True, if the video chat has participants.
         */
        public boolean hasParticipants;
        /**
         * Default group call participant identifier to join the video chat; may be null.
         */
        @Nullable public MessageSender defaultParticipantId;

        /**
         * Describes a video chat, i.e. a group call bound to a chat.
         */
        public VideoChat() {
        }

        /**
         * Describes a video chat, i.e. a group call bound to a chat.
         *
         * @param groupCallId Group call identifier of an active video chat; 0 if none. Full information about the video chat can be received through the method getGroupCall.
         * @param hasParticipants True, if the video chat has participants.
         * @param defaultParticipantId Default group call participant identifier to join the video chat; may be null.
         */
        public VideoChat(int groupCallId, boolean hasParticipants, MessageSender defaultParticipantId) {
            this.groupCallId = groupCallId;
            this.hasParticipants = hasParticipants;
            this.defaultParticipantId = defaultParticipantId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1374319320;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an advertisement to be shown while a video from a message is watched.
     */
    public static class VideoMessageAdvertisement extends Object {
        /**
         * Unique identifier of this result.
         */
        public long uniqueId;
        /**
         * Text of the advertisement.
         */
        public String text;
        /**
         * The minimum amount of time the advertisement must be displayed before it can be hidden by the user, in seconds.
         */
        public int minDisplayDuration;
        /**
         * The maximum amount of time the advertisement must be displayed before it must be automatically hidden, in seconds.
         */
        public int maxDisplayDuration;
        /**
         * True, if the advertisement can be reported to Telegram moderators through reportVideoMessageAdvertisement.
         */
        public boolean canBeReported;
        /**
         * Information about the sponsor of the advertisement.
         */
        public AdvertisementSponsor sponsor;
        /**
         * Title of the sponsored message.
         */
        public String title;
        /**
         * If non-empty, additional information about the sponsored message to be shown along with the message.
         */
        public String additionalInfo;

        /**
         * Describes an advertisement to be shown while a video from a message is watched.
         */
        public VideoMessageAdvertisement() {
        }

        /**
         * Describes an advertisement to be shown while a video from a message is watched.
         *
         * @param uniqueId Unique identifier of this result.
         * @param text Text of the advertisement.
         * @param minDisplayDuration The minimum amount of time the advertisement must be displayed before it can be hidden by the user, in seconds.
         * @param maxDisplayDuration The maximum amount of time the advertisement must be displayed before it must be automatically hidden, in seconds.
         * @param canBeReported True, if the advertisement can be reported to Telegram moderators through reportVideoMessageAdvertisement.
         * @param sponsor Information about the sponsor of the advertisement.
         * @param title Title of the sponsored message.
         * @param additionalInfo If non-empty, additional information about the sponsored message to be shown along with the message.
         */
        public VideoMessageAdvertisement(long uniqueId, String text, int minDisplayDuration, int maxDisplayDuration, boolean canBeReported, AdvertisementSponsor sponsor, String title, String additionalInfo) {
            this.uniqueId = uniqueId;
            this.text = text;
            this.minDisplayDuration = minDisplayDuration;
            this.maxDisplayDuration = maxDisplayDuration;
            this.canBeReported = canBeReported;
            this.sponsor = sponsor;
            this.title = title;
            this.additionalInfo = additionalInfo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -112391535;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains a list of advertisements to be shown while a video from a message is watched.
     */
    public static class VideoMessageAdvertisements extends Object {
        /**
         * List of advertisements.
         */
        public VideoMessageAdvertisement[] advertisements;
        /**
         * Delay before the first advertisement is shown, in seconds.
         */
        public int startDelay;
        /**
         * Delay between consecutive advertisements, in seconds.
         */
        public int betweenDelay;

        /**
         * Contains a list of advertisements to be shown while a video from a message is watched.
         */
        public VideoMessageAdvertisements() {
        }

        /**
         * Contains a list of advertisements to be shown while a video from a message is watched.
         *
         * @param advertisements List of advertisements.
         * @param startDelay Delay before the first advertisement is shown, in seconds.
         * @param betweenDelay Delay between consecutive advertisements, in seconds.
         */
        public VideoMessageAdvertisements(VideoMessageAdvertisement[] advertisements, int startDelay, int betweenDelay) {
            this.advertisements = advertisements;
            this.startDelay = startDelay;
            this.betweenDelay = betweenDelay;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1776370217;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a video note. The video must be equal in width and height, cropped to a circle, and stored in MPEG4 format.
     */
    public static class VideoNote extends Object {
        /**
         * Duration of the video, in seconds; as defined by the sender.
         */
        public int duration;
        /**
         * A waveform representation of the video note's audio in 5-bit format; may be empty if unknown.
         */
        public byte[] waveform;
        /**
         * Video width and height; as defined by the sender.
         */
        public int length;
        /**
         * Video minithumbnail; may be null.
         */
        @Nullable public Minithumbnail minithumbnail;
        /**
         * Video thumbnail in JPEG format; as defined by the sender; may be null.
         */
        @Nullable public Thumbnail thumbnail;
        /**
         * Result of speech recognition in the video note; may be null.
         */
        @Nullable public SpeechRecognitionResult speechRecognitionResult;
        /**
         * File containing the video.
         */
        public File video;

        /**
         * Describes a video note. The video must be equal in width and height, cropped to a circle, and stored in MPEG4 format.
         */
        public VideoNote() {
        }

        /**
         * Describes a video note. The video must be equal in width and height, cropped to a circle, and stored in MPEG4 format.
         *
         * @param duration Duration of the video, in seconds; as defined by the sender.
         * @param waveform A waveform representation of the video note's audio in 5-bit format; may be empty if unknown.
         * @param length Video width and height; as defined by the sender.
         * @param minithumbnail Video minithumbnail; may be null.
         * @param thumbnail Video thumbnail in JPEG format; as defined by the sender; may be null.
         * @param speechRecognitionResult Result of speech recognition in the video note; may be null.
         * @param video File containing the video.
         */
        public VideoNote(int duration, byte[] waveform, int length, Minithumbnail minithumbnail, Thumbnail thumbnail, SpeechRecognitionResult speechRecognitionResult, File video) {
            this.duration = duration;
            this.waveform = waveform;
            this.length = length;
            this.minithumbnail = minithumbnail;
            this.thumbnail = thumbnail;
            this.speechRecognitionResult = speechRecognitionResult;
            this.video = video;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2062096581;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a storyboard for a video.
     */
    public static class VideoStoryboard extends Object {
        /**
         * A JPEG file that contains tiled previews of video.
         */
        public File storyboardFile;
        /**
         * Width of a tile.
         */
        public int width;
        /**
         * Height of a tile.
         */
        public int height;
        /**
         * File that describes mapping of position in the video to a tile in the JPEG file.
         */
        public File mapFile;

        /**
         * Describes a storyboard for a video.
         */
        public VideoStoryboard() {
        }

        /**
         * Describes a storyboard for a video.
         *
         * @param storyboardFile A JPEG file that contains tiled previews of video.
         * @param width Width of a tile.
         * @param height Height of a tile.
         * @param mapFile File that describes mapping of position in the video to a tile in the JPEG file.
         */
        public VideoStoryboard(File storyboardFile, int width, int height, File mapFile) {
            this.storyboardFile = storyboardFile;
            this.width = width;
            this.height = height;
            this.mapFile = mapFile;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1731320034;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a voice note.
     */
    public static class VoiceNote extends Object {
        /**
         * Duration of the voice note, in seconds; as defined by the sender.
         */
        public int duration;
        /**
         * A waveform representation of the voice note in 5-bit format.
         */
        public byte[] waveform;
        /**
         * MIME type of the file; as defined by the sender. Usually, one of &quot;audio/ogg&quot; for Opus in an OGG container, &quot;audio/mpeg&quot; for an MP3 audio, or &quot;audio/mp4&quot; for an M4A audio.
         */
        public String mimeType;
        /**
         * Result of speech recognition in the voice note; may be null.
         */
        @Nullable public SpeechRecognitionResult speechRecognitionResult;
        /**
         * File containing the voice note.
         */
        public File voice;

        /**
         * Describes a voice note.
         */
        public VoiceNote() {
        }

        /**
         * Describes a voice note.
         *
         * @param duration Duration of the voice note, in seconds; as defined by the sender.
         * @param waveform A waveform representation of the voice note in 5-bit format.
         * @param mimeType MIME type of the file; as defined by the sender. Usually, one of &quot;audio/ogg&quot; for Opus in an OGG container, &quot;audio/mpeg&quot; for an MP3 audio, or &quot;audio/mp4&quot; for an M4A audio.
         * @param speechRecognitionResult Result of speech recognition in the voice note; may be null.
         * @param voice File containing the voice note.
         */
        public VoiceNote(int duration, byte[] waveform, String mimeType, SpeechRecognitionResult speechRecognitionResult, File voice) {
            this.duration = duration;
            this.waveform = waveform;
            this.mimeType = mimeType;
            this.speechRecognitionResult = speechRecognitionResult;
            this.voice = voice;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1175302923;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes a Web App. Use getInternalLink with internalLinkTypeWebApp to share the Web App.
     */
    public static class WebApp extends Object {
        /**
         * Web App short name.
         */
        public String shortName;
        /**
         * Web App title.
         */
        public String title;
        /**
         * Web App description.
         */
        public String description;
        /**
         * Web App photo.
         */
        public Photo photo;
        /**
         * Web App animation; may be null.
         */
        @Nullable public Animation animation;

        /**
         * Describes a Web App. Use getInternalLink with internalLinkTypeWebApp to share the Web App.
         */
        public WebApp() {
        }

        /**
         * Describes a Web App. Use getInternalLink with internalLinkTypeWebApp to share the Web App.
         *
         * @param shortName Web App short name.
         * @param title Web App title.
         * @param description Web App description.
         * @param photo Web App photo.
         * @param animation Web App animation; may be null.
         */
        public WebApp(String shortName, String title, String description, Photo photo, Animation animation) {
            this.shortName = shortName;
            this.title = title;
            this.description = description;
            this.photo = photo;
            this.animation = animation;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1616619763;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Contains information about a Web App.
     */
    public static class WebAppInfo extends Object {
        /**
         * Unique identifier for the Web App launch.
         */
        public long launchId;
        /**
         * A Web App URL to open in a web view.
         */
        public String url;

        /**
         * Contains information about a Web App.
         */
        public WebAppInfo() {
        }

        /**
         * Contains information about a Web App.
         *
         * @param launchId Unique identifier for the Web App launch.
         * @param url A Web App URL to open in a web view.
         */
        public WebAppInfo(long launchId, String url) {
            this.launchId = launchId;
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 788378344;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * This class is an abstract base class.
     * Describes mode in which a Web App is opened.
     */
    public abstract static class WebAppOpenMode extends Object {
        /**
         * Describes possible values returned by getConstructor().
         */
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({
            WebAppOpenModeCompact.CONSTRUCTOR,
            WebAppOpenModeFullSize.CONSTRUCTOR,
            WebAppOpenModeFullScreen.CONSTRUCTOR
        })
        public @interface Constructors {}

        /**
         * @return identifier uniquely determining type of the object.
         */
        @Constructors
        @Override
        public abstract int getConstructor();
        /**
         * Default class constructor.
         */
        public WebAppOpenMode() {
        }
    }

    /**
     * The Web App is opened in the compact mode.
     */
    public static class WebAppOpenModeCompact extends WebAppOpenMode {

        /**
         * The Web App is opened in the compact mode.
         */
        public WebAppOpenModeCompact() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1711603675;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The Web App is opened in the full-size mode.
     */
    public static class WebAppOpenModeFullSize extends WebAppOpenMode {

        /**
         * The Web App is opened in the full-size mode.
         */
        public WebAppOpenModeFullSize() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 189320513;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * The Web App is opened in the full-screen mode.
     */
    public static class WebAppOpenModeFullScreen extends WebAppOpenMode {

        /**
         * The Web App is opened in the full-screen mode.
         */
        public WebAppOpenModeFullScreen() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1871315357;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Options to be used when a Web App is opened.
     */
    public static class WebAppOpenParameters extends Object {
        /**
         * Preferred Web App theme; pass null to use the default theme.
         */
        public ThemeParameters theme;
        /**
         * Short name of the current application; 0-64 English letters, digits, and underscores.
         */
        public String applicationName;
        /**
         * The mode in which the Web App is opened; pass null to open in webAppOpenModeFullSize.
         */
        public WebAppOpenMode mode;

        /**
         * Options to be used when a Web App is opened.
         */
        public WebAppOpenParameters() {
        }

        /**
         * Options to be used when a Web App is opened.
         *
         * @param theme Preferred Web App theme; pass null to use the default theme.
         * @param applicationName Short name of the current application; 0-64 English letters, digits, and underscores.
         * @param mode The mode in which the Web App is opened; pass null to open in webAppOpenModeFullSize.
         */
        public WebAppOpenParameters(ThemeParameters theme, String applicationName, WebAppOpenMode mode) {
            this.theme = theme;
            this.applicationName = applicationName;
            this.mode = mode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1375356527;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Describes an instant view page for a web page.
     */
    public static class WebPageInstantView extends Object {
        /**
         * Content of the instant view page.
         */
        public PageBlock[] pageBlocks;
        /**
         * Number of the instant view views; 0 if unknown.
         */
        public int viewCount;
        /**
         * Version of the instant view; currently, can be 1 or 2.
         */
        public int version;
        /**
         * True, if the instant view must be shown from right to left.
         */
        public boolean isRtl;
        /**
         * True, if the instant view contains the full page. A network request might be needed to get the full instant view.
         */
        public boolean isFull;
        /**
         * An internal link to be opened to leave feedback about the instant view.
         */
        public InternalLinkType feedbackLink;

        /**
         * Describes an instant view page for a web page.
         */
        public WebPageInstantView() {
        }

        /**
         * Describes an instant view page for a web page.
         *
         * @param pageBlocks Content of the instant view page.
         * @param viewCount Number of the instant view views; 0 if unknown.
         * @param version Version of the instant view; currently, can be 1 or 2.
         * @param isRtl True, if the instant view must be shown from right to left.
         * @param isFull True, if the instant view contains the full page. A network request might be needed to get the full instant view.
         * @param feedbackLink An internal link to be opened to leave feedback about the instant view.
         */
        public WebPageInstantView(PageBlock[] pageBlocks, int viewCount, int version, boolean isRtl, boolean isFull, InternalLinkType feedbackLink) {
            this.pageBlocks = pageBlocks;
            this.viewCount = viewCount;
            this.version = version;
            this.isRtl = isRtl;
            this.isFull = isFull;
            this.feedbackLink = feedbackLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 778202453;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Accepts an incoming call.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AcceptCall extends Function<Ok> {
        /**
         * Call identifier.
         */
        public int callId;
        /**
         * The call protocols supported by the application.
         */
        public CallProtocol protocol;

        /**
         * Default constructor for a function, which accepts an incoming call.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AcceptCall() {
        }

        /**
         * Creates a function, which accepts an incoming call.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param callId Call identifier.
         * @param protocol The call protocols supported by the application.
         */
        public AcceptCall(int callId, CallProtocol protocol) {
            this.callId = callId;
            this.protocol = protocol;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -646618416;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Accepts an OAuth authorization request. Returns an HTTP URL to open after successful authorization. May return an empty link if just a toast about successful login has to be shown.
     *
     * <p> Returns {@link HttpUrl HttpUrl} </p>
     */
    public static class AcceptOauthRequest extends Function<HttpUrl> {
        /**
         * URL of the OAuth deep link.
         */
        public String url;
        /**
         * The matching code chosen by the user.
         */
        public String matchCode;
        /**
         * Pass true if the current user allowed the bot that was returned in getOauthLinkInfo, to send them messages.
         */
        public boolean allowWriteAccess;
        /**
         * Pass true if the current user allowed the bot that was returned in getOauthLinkInfo, to access their phone number.
         */
        public boolean allowPhoneNumberAccess;

        /**
         * Default constructor for a function, which accepts an OAuth authorization request. Returns an HTTP URL to open after successful authorization. May return an empty link if just a toast about successful login has to be shown.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         */
        public AcceptOauthRequest() {
        }

        /**
         * Creates a function, which accepts an OAuth authorization request. Returns an HTTP URL to open after successful authorization. May return an empty link if just a toast about successful login has to be shown.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         *
         * @param url URL of the OAuth deep link.
         * @param matchCode The matching code chosen by the user.
         * @param allowWriteAccess Pass true if the current user allowed the bot that was returned in getOauthLinkInfo, to send them messages.
         * @param allowPhoneNumberAccess Pass true if the current user allowed the bot that was returned in getOauthLinkInfo, to access their phone number.
         */
        public AcceptOauthRequest(String url, String matchCode, boolean allowWriteAccess, boolean allowPhoneNumberAccess) {
            this.url = url;
            this.matchCode = matchCode;
            this.allowWriteAccess = allowWriteAccess;
            this.allowPhoneNumberAccess = allowPhoneNumberAccess;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -427442108;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Accepts Telegram terms of services.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AcceptTermsOfService extends Function<Ok> {
        /**
         * Terms of service identifier.
         */
        public String termsOfServiceId;

        /**
         * Default constructor for a function, which accepts Telegram terms of services.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AcceptTermsOfService() {
        }

        /**
         * Creates a function, which accepts Telegram terms of services.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param termsOfServiceId Terms of service identifier.
         */
        public AcceptTermsOfService(String termsOfServiceId) {
            this.termsOfServiceId = termsOfServiceId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2130576356;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Activates stealth mode for stories, which hides all views of stories from the current user in the last &quot;story_stealth_mode_past_period&quot; seconds and for the next &quot;story_stealth_mode_future_period&quot; seconds; for Telegram Premium users only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ActivateStoryStealthMode extends Function<Ok> {

        /**
         * Default constructor for a function, which activates stealth mode for stories, which hides all views of stories from the current user in the last &quot;story_stealth_mode_past_period&quot; seconds and for the next &quot;story_stealth_mode_future_period&quot; seconds; for Telegram Premium users only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ActivateStoryStealthMode() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1009023855;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds a new media preview to the beginning of the list of media previews of a bot. Returns the added preview after addition is completed server-side. The total number of previews must not exceed getOption(&quot;bot_media_preview_count_max&quot;) for the given language.
     *
     * <p> Returns {@link BotMediaPreview BotMediaPreview} </p>
     */
    public static class AddBotMediaPreview extends Function<BotMediaPreview> {
        /**
         * Identifier of the target bot. The bot must be owned and must have the main Web App.
         */
        public long botUserId;
        /**
         * A two-letter ISO 639-1 language code for which preview is added. If empty, then the preview will be shown to all users for whose languages there are no dedicated previews. If non-empty, then there must be an official language pack of the same name, which is returned by getLocalizationTargetInfo.
         */
        public String languageCode;
        /**
         * Content of the added preview.
         */
        public InputStoryContent content;

        /**
         * Default constructor for a function, which adds a new media preview to the beginning of the list of media previews of a bot. Returns the added preview after addition is completed server-side. The total number of previews must not exceed getOption(&quot;bot_media_preview_count_max&quot;) for the given language.
         *
         * <p> Returns {@link BotMediaPreview BotMediaPreview} </p>
         */
        public AddBotMediaPreview() {
        }

        /**
         * Creates a function, which adds a new media preview to the beginning of the list of media previews of a bot. Returns the added preview after addition is completed server-side. The total number of previews must not exceed getOption(&quot;bot_media_preview_count_max&quot;) for the given language.
         *
         * <p> Returns {@link BotMediaPreview BotMediaPreview} </p>
         *
         * @param botUserId Identifier of the target bot. The bot must be owned and must have the main Web App.
         * @param languageCode A two-letter ISO 639-1 language code for which preview is added. If empty, then the preview will be shown to all users for whose languages there are no dedicated previews. If non-empty, then there must be an official language pack of the same name, which is returned by getLocalizationTargetInfo.
         * @param content Content of the added preview.
         */
        public AddBotMediaPreview(long botUserId, String languageCode, InputStoryContent content) {
            this.botUserId = botUserId;
            this.languageCode = languageCode;
            this.content = content;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1347126571;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds a chat folder by an invite link.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AddChatFolderByInviteLink extends Function<Ok> {
        /**
         * Invite link for the chat folder.
         */
        public String inviteLink;
        /**
         * Identifiers of the chats added to the chat folder. The chats are automatically joined if they aren't joined yet.
         */
        public long[] chatIds;

        /**
         * Default constructor for a function, which adds a chat folder by an invite link.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AddChatFolderByInviteLink() {
        }

        /**
         * Creates a function, which adds a chat folder by an invite link.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param inviteLink Invite link for the chat folder.
         * @param chatIds Identifiers of the chats added to the chat folder. The chats are automatically joined if they aren't joined yet.
         */
        public AddChatFolderByInviteLink(String inviteLink, long[] chatIds) {
            this.inviteLink = inviteLink;
            this.chatIds = chatIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -858593816;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds a new member to a chat; requires canInviteUsers member right. Members can't be added to private or secret chats. Returns information about members that weren't added.
     *
     * <p> Returns {@link FailedToAddMembers FailedToAddMembers} </p>
     */
    public static class AddChatMember extends Function<FailedToAddMembers> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifier of the user.
         */
        public long userId;
        /**
         * The number of earlier messages from the chat to be forwarded to the new member; up to 100. Ignored for supergroups and channels, or if the added user is a bot.
         */
        public int forwardLimit;

        /**
         * Default constructor for a function, which adds a new member to a chat; requires canInviteUsers member right. Members can't be added to private or secret chats. Returns information about members that weren't added.
         *
         * <p> Returns {@link FailedToAddMembers FailedToAddMembers} </p>
         */
        public AddChatMember() {
        }

        /**
         * Creates a function, which adds a new member to a chat; requires canInviteUsers member right. Members can't be added to private or secret chats. Returns information about members that weren't added.
         *
         * <p> Returns {@link FailedToAddMembers FailedToAddMembers} </p>
         *
         * @param chatId Chat identifier.
         * @param userId Identifier of the user.
         * @param forwardLimit The number of earlier messages from the chat to be forwarded to the new member; up to 100. Ignored for supergroups and channels, or if the added user is a bot.
         */
        public AddChatMember(long chatId, long userId, int forwardLimit) {
            this.chatId = chatId;
            this.userId = userId;
            this.forwardLimit = forwardLimit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1720144407;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds multiple new members to a chat; requires canInviteUsers member right. Currently, this method is only available for supergroups and channels. This method can't be used to join a chat. Members can't be added to a channel if it has more than 200 members. Returns information about members that weren't added.
     *
     * <p> Returns {@link FailedToAddMembers FailedToAddMembers} </p>
     */
    public static class AddChatMembers extends Function<FailedToAddMembers> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifiers of the users to be added to the chat. The maximum number of added users is 20 for supergroups and 100 for channels.
         */
        public long[] userIds;

        /**
         * Default constructor for a function, which adds multiple new members to a chat; requires canInviteUsers member right. Currently, this method is only available for supergroups and channels. This method can't be used to join a chat. Members can't be added to a channel if it has more than 200 members. Returns information about members that weren't added.
         *
         * <p> Returns {@link FailedToAddMembers FailedToAddMembers} </p>
         */
        public AddChatMembers() {
        }

        /**
         * Creates a function, which adds multiple new members to a chat; requires canInviteUsers member right. Currently, this method is only available for supergroups and channels. This method can't be used to join a chat. Members can't be added to a channel if it has more than 200 members. Returns information about members that weren't added.
         *
         * <p> Returns {@link FailedToAddMembers FailedToAddMembers} </p>
         *
         * @param chatId Chat identifier.
         * @param userIds Identifiers of the users to be added to the chat. The maximum number of added users is 20 for supergroups and 100 for channels.
         */
        public AddChatMembers(long chatId, long[] userIds) {
            this.chatId = chatId;
            this.userIds = userIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1675991329;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds a chat to a chat list. A chat can't be simultaneously in Main and Archive chat lists, so it is automatically removed from another one if needed.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AddChatToList extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The chat list. Use getChatListsToAddChat to get suitable chat lists.
         */
        public ChatList chatList;

        /**
         * Default constructor for a function, which adds a chat to a chat list. A chat can't be simultaneously in Main and Archive chat lists, so it is automatically removed from another one if needed.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AddChatToList() {
        }

        /**
         * Creates a function, which adds a chat to a chat list. A chat can't be simultaneously in Main and Archive chat lists, so it is automatically removed from another one if needed.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param chatList The chat list. Use getChatListsToAddChat to get suitable chat lists.
         */
        public AddChatToList(long chatId, ChatList chatList) {
            this.chatId = chatId;
            this.chatList = chatList;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -80523595;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds tasks to a checklist in a message.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AddChecklistTasks extends Function<Ok> {
        /**
         * Identifier of the chat with the message.
         */
        public long chatId;
        /**
         * Identifier of the message containing the checklist. Use messageProperties.canAddTasks to check whether the tasks can be added.
         */
        public long messageId;
        /**
         * List of added tasks.
         */
        public InputChecklistTask[] tasks;

        /**
         * Default constructor for a function, which adds tasks to a checklist in a message.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AddChecklistTasks() {
        }

        /**
         * Creates a function, which adds tasks to a checklist in a message.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat with the message.
         * @param messageId Identifier of the message containing the checklist. Use messageProperties.canAddTasks to check whether the tasks can be added.
         * @param tasks List of added tasks.
         */
        public AddChecklistTasks(long chatId, long messageId, InputChecklistTask[] tasks) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.tasks = tasks;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1554619499;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds a user to the contact list or edits an existing contact by their user identifier.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AddContact extends Function<Ok> {
        /**
         * Identifier of the user.
         */
        public long userId;
        /**
         * The contact to add or edit; phone number may be empty and needs to be specified only if known.
         */
        public ImportedContact contact;
        /**
         * Pass true to share the current user's phone number with the new contact. A corresponding rule to userPrivacySettingShowPhoneNumber will be added if needed. Use the field userFullInfo.needPhoneNumberPrivacyException to check whether the current user needs to be asked to share their phone number.
         */
        public boolean sharePhoneNumber;

        /**
         * Default constructor for a function, which adds a user to the contact list or edits an existing contact by their user identifier.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AddContact() {
        }

        /**
         * Creates a function, which adds a user to the contact list or edits an existing contact by their user identifier.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param userId Identifier of the user.
         * @param contact The contact to add or edit; phone number may be empty and needs to be specified only if known.
         * @param sharePhoneNumber Pass true to share the current user's phone number with the new contact. A corresponding rule to userPrivacySettingShowPhoneNumber will be added if needed. Use the field userFullInfo.needPhoneNumberPrivacyException to check whether the current user needs to be asked to share their phone number.
         */
        public AddContact(long userId, ImportedContact contact, boolean sharePhoneNumber) {
            this.userId = userId;
            this.contact = contact;
            this.sharePhoneNumber = sharePhoneNumber;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2098628252;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds a custom server language pack to the list of installed language packs in current localization target. Can be called before authorization.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AddCustomServerLanguagePack extends Function<Ok> {
        /**
         * Identifier of a language pack to be added.
         */
        public String languagePackId;

        /**
         * Default constructor for a function, which adds a custom server language pack to the list of installed language packs in current localization target. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AddCustomServerLanguagePack() {
        }

        /**
         * Creates a function, which adds a custom server language pack to the list of installed language packs in current localization target. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param languagePackId Identifier of a language pack to be added.
         */
        public AddCustomServerLanguagePack(String languagePackId) {
            this.languagePackId = languagePackId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 4492771;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds a new sticker to the list of favorite stickers. The new sticker is added to the top of the list. If the sticker was already in the list, it is removed from the list first. Only stickers belonging to a sticker set or in WEBP or WEBM format can be added to this list. Emoji stickers can't be added to favorite stickers.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AddFavoriteSticker extends Function<Ok> {
        /**
         * Sticker file to add.
         */
        public InputFile sticker;

        /**
         * Default constructor for a function, which adds a new sticker to the list of favorite stickers. The new sticker is added to the top of the list. If the sticker was already in the list, it is removed from the list first. Only stickers belonging to a sticker set or in WEBP or WEBM format can be added to this list. Emoji stickers can't be added to favorite stickers.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AddFavoriteSticker() {
        }

        /**
         * Creates a function, which adds a new sticker to the list of favorite stickers. The new sticker is added to the top of the list. If the sticker was already in the list, it is removed from the list first. Only stickers belonging to a sticker set or in WEBP or WEBM format can be added to this list. Emoji stickers can't be added to favorite stickers.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param sticker Sticker file to add.
         */
        public AddFavoriteSticker(InputFile sticker) {
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 324504799;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds a file from a message to the list of file downloads. Download progress and completion of the download will be notified through updateFile updates. If message database is used, the list of file downloads is persistent across application restarts. The downloading is independent of download using downloadFile, i.e. it continues if downloadFile is canceled or is used to download a part of the file.
     *
     * <p> Returns {@link File File} </p>
     */
    public static class AddFileToDownloads extends Function<File> {
        /**
         * Identifier of the file to download.
         */
        public int fileId;
        /**
         * Chat identifier of the message with the file.
         */
        public long chatId;
        /**
         * Message identifier.
         */
        public long messageId;
        /**
         * Priority of the download (1-32). The higher the priority, the earlier the file will be downloaded. If the priorities of two files are equal, then the last one for which downloadFile/addFileToDownloads was called will be downloaded first.
         */
        public int priority;

        /**
         * Default constructor for a function, which adds a file from a message to the list of file downloads. Download progress and completion of the download will be notified through updateFile updates. If message database is used, the list of file downloads is persistent across application restarts. The downloading is independent of download using downloadFile, i.e. it continues if downloadFile is canceled or is used to download a part of the file.
         *
         * <p> Returns {@link File File} </p>
         */
        public AddFileToDownloads() {
        }

        /**
         * Creates a function, which adds a file from a message to the list of file downloads. Download progress and completion of the download will be notified through updateFile updates. If message database is used, the list of file downloads is persistent across application restarts. The downloading is independent of download using downloadFile, i.e. it continues if downloadFile is canceled or is used to download a part of the file.
         *
         * <p> Returns {@link File File} </p>
         *
         * @param fileId Identifier of the file to download.
         * @param chatId Chat identifier of the message with the file.
         * @param messageId Message identifier.
         * @param priority Priority of the download (1-32). The higher the priority, the earlier the file will be downloaded. If the priorities of two files are equal, then the last one for which downloadFile/addFileToDownloads was called will be downloaded first.
         */
        public AddFileToDownloads(int fileId, long chatId, long messageId, int priority) {
            this.fileId = fileId;
            this.chatId = chatId;
            this.messageId = messageId;
            this.priority = priority;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 867533751;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds gifts to the beginning of a previously created collection. If the collection is owned by a channel chat, then requires canPostMessages administrator right in the channel chat. Returns the changed collection.
     *
     * <p> Returns {@link GiftCollection GiftCollection} </p>
     */
    public static class AddGiftCollectionGifts extends Function<GiftCollection> {
        /**
         * Identifier of the user or the channel chat that owns the collection.
         */
        public MessageSender ownerId;
        /**
         * Identifier of the gift collection.
         */
        public int collectionId;
        /**
         * Identifier of the gifts to add to the collection; 1-getOption(&quot;gift_collection_size_max&quot;) identifiers. If after addition the collection has more than getOption(&quot;gift_collection_size_max&quot;) gifts, then the last one are removed from the collection.
         */
        public String[] receivedGiftIds;

        /**
         * Default constructor for a function, which adds gifts to the beginning of a previously created collection. If the collection is owned by a channel chat, then requires canPostMessages administrator right in the channel chat. Returns the changed collection.
         *
         * <p> Returns {@link GiftCollection GiftCollection} </p>
         */
        public AddGiftCollectionGifts() {
        }

        /**
         * Creates a function, which adds gifts to the beginning of a previously created collection. If the collection is owned by a channel chat, then requires canPostMessages administrator right in the channel chat. Returns the changed collection.
         *
         * <p> Returns {@link GiftCollection GiftCollection} </p>
         *
         * @param ownerId Identifier of the user or the channel chat that owns the collection.
         * @param collectionId Identifier of the gift collection.
         * @param receivedGiftIds Identifier of the gifts to add to the collection; 1-getOption(&quot;gift_collection_size_max&quot;) identifiers. If after addition the collection has more than getOption(&quot;gift_collection_size_max&quot;) gifts, then the last one are removed from the collection.
         */
        public AddGiftCollectionGifts(MessageSender ownerId, int collectionId, String[] receivedGiftIds) {
            this.ownerId = ownerId;
            this.collectionId = collectionId;
            this.receivedGiftIds = receivedGiftIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -263464606;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds a local message to a chat. The message is persistent across application restarts only if the message database is used. Returns the added message.
     *
     * <p> Returns {@link Message Message} </p>
     */
    public static class AddLocalMessage extends Function<Message> {
        /**
         * Target chat; channel direct messages chats aren't supported.
         */
        public long chatId;
        /**
         * Identifier of the sender of the message.
         */
        public MessageSender senderId;
        /**
         * Information about the message or story to be replied; pass null if none.
         */
        public InputMessageReplyTo replyTo;
        /**
         * Pass true to disable notification for the message.
         */
        public boolean disableNotification;
        /**
         * The content of the message to be added.
         */
        public InputMessageContent inputMessageContent;

        /**
         * Default constructor for a function, which adds a local message to a chat. The message is persistent across application restarts only if the message database is used. Returns the added message.
         *
         * <p> Returns {@link Message Message} </p>
         */
        public AddLocalMessage() {
        }

        /**
         * Creates a function, which adds a local message to a chat. The message is persistent across application restarts only if the message database is used. Returns the added message.
         *
         * <p> Returns {@link Message Message} </p>
         *
         * @param chatId Target chat; channel direct messages chats aren't supported.
         * @param senderId Identifier of the sender of the message.
         * @param replyTo Information about the message or story to be replied; pass null if none.
         * @param disableNotification Pass true to disable notification for the message.
         * @param inputMessageContent The content of the message to be added.
         */
        public AddLocalMessage(long chatId, MessageSender senderId, InputMessageReplyTo replyTo, boolean disableNotification, InputMessageContent inputMessageContent) {
            this.chatId = chatId;
            this.senderId = senderId;
            this.replyTo = replyTo;
            this.disableNotification = disableNotification;
            this.inputMessageContent = inputMessageContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -166217823;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds a message to TDLib internal log. Can be called synchronously.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AddLogMessage extends Function<Ok> {
        /**
         * The minimum verbosity level needed for the message to be logged; 0-1023.
         */
        public int verbosityLevel;
        /**
         * Text of a message to log.
         */
        public String text;

        /**
         * Default constructor for a function, which adds a message to TDLib internal log. Can be called synchronously.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AddLogMessage() {
        }

        /**
         * Creates a function, which adds a message to TDLib internal log. Can be called synchronously.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param verbosityLevel The minimum verbosity level needed for the message to be logged; 0-1023.
         * @param text Text of a message to log.
         */
        public AddLogMessage(int verbosityLevel, String text) {
            this.verbosityLevel = verbosityLevel;
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1597427692;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds a passkey allowed to be used for the login by the current user and returns the added passkey. Call getPasskeyParameters to get parameters for creating of the passkey.
     *
     * <p> Returns {@link Passkey Passkey} </p>
     */
    public static class AddLoginPasskey extends Function<Passkey> {
        /**
         * JSON-encoded client data.
         */
        public String clientData;
        /**
         * Passkey attestation object.
         */
        public byte[] attestationObject;

        /**
         * Default constructor for a function, which adds a passkey allowed to be used for the login by the current user and returns the added passkey. Call getPasskeyParameters to get parameters for creating of the passkey.
         *
         * <p> Returns {@link Passkey Passkey} </p>
         */
        public AddLoginPasskey() {
        }

        /**
         * Creates a function, which adds a passkey allowed to be used for the login by the current user and returns the added passkey. Call getPasskeyParameters to get parameters for creating of the passkey.
         *
         * <p> Returns {@link Passkey Passkey} </p>
         *
         * @param clientData JSON-encoded client data.
         * @param attestationObject Passkey attestation object.
         */
        public AddLoginPasskey(String clientData, byte[] attestationObject) {
            this.clientData = clientData;
            this.attestationObject = attestationObject;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1838899694;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds a reaction or a tag to a message. Use getMessageAvailableReactions to receive the list of available reactions for the message.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AddMessageReaction extends Function<Ok> {
        /**
         * Identifier of the chat to which the message belongs.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * Type of the reaction to add. Use addPendingPaidMessageReaction instead to add the paid reaction.
         */
        public ReactionType reactionType;
        /**
         * Pass true if the reaction is added with a big animation.
         */
        public boolean isBig;
        /**
         * Pass true if the reaction needs to be added to recent reactions; tags are never added to the list of recent reactions.
         */
        public boolean updateRecentReactions;

        /**
         * Default constructor for a function, which adds a reaction or a tag to a message. Use getMessageAvailableReactions to receive the list of available reactions for the message.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AddMessageReaction() {
        }

        /**
         * Creates a function, which adds a reaction or a tag to a message. Use getMessageAvailableReactions to receive the list of available reactions for the message.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat to which the message belongs.
         * @param messageId Identifier of the message.
         * @param reactionType Type of the reaction to add. Use addPendingPaidMessageReaction instead to add the paid reaction.
         * @param isBig Pass true if the reaction is added with a big animation.
         * @param updateRecentReactions Pass true if the reaction needs to be added to recent reactions; tags are never added to the list of recent reactions.
         */
        public AddMessageReaction(long chatId, long messageId, ReactionType reactionType, boolean isBig, boolean updateRecentReactions) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.reactionType = reactionType;
            this.isBig = isBig;
            this.updateRecentReactions = updateRecentReactions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1419269613;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds the specified data to data usage statistics. Can be called before authorization.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AddNetworkStatistics extends Function<Ok> {
        /**
         * The network statistics entry with the data to be added to statistics.
         */
        public NetworkStatisticsEntry entry;

        /**
         * Default constructor for a function, which adds the specified data to data usage statistics. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AddNetworkStatistics() {
        }

        /**
         * Creates a function, which adds the specified data to data usage statistics. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param entry The network statistics entry with the data to be added to statistics.
         */
        public AddNetworkStatistics(NetworkStatisticsEntry entry) {
            this.entry = entry;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1264825305;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends a suggested post based on a previously sent message in a channel direct messages chat. Can be also used to suggest price or time change for an existing suggested post. Returns the sent message.
     *
     * <p> Returns {@link Message Message} </p>
     */
    public static class AddOffer extends Function<Message> {
        /**
         * Identifier of the channel direct messages chat.
         */
        public long chatId;
        /**
         * Identifier of the message in the chat which will be sent as suggested post. Use messageProperties.canAddOffer to check whether an offer can be added or messageProperties.canEditSuggestedPostInfo to check whether price or time of sending of the post can be changed.
         */
        public long messageId;
        /**
         * Options to be used to send the message. New information about the suggested post must always be specified.
         */
        public MessageSendOptions options;

        /**
         * Default constructor for a function, which sends a suggested post based on a previously sent message in a channel direct messages chat. Can be also used to suggest price or time change for an existing suggested post. Returns the sent message.
         *
         * <p> Returns {@link Message Message} </p>
         */
        public AddOffer() {
        }

        /**
         * Creates a function, which sends a suggested post based on a previously sent message in a channel direct messages chat. Can be also used to suggest price or time change for an existing suggested post. Returns the sent message.
         *
         * <p> Returns {@link Message Message} </p>
         *
         * @param chatId Identifier of the channel direct messages chat.
         * @param messageId Identifier of the message in the chat which will be sent as suggested post. Use messageProperties.canAddOffer to check whether an offer can be added or messageProperties.canEditSuggestedPostInfo to check whether price or time of sending of the post can be changed.
         * @param options Options to be used to send the message. New information about the suggested post must always be specified.
         */
        public AddOffer(long chatId, long messageId, MessageSendOptions options) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.options = options;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 682451739;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds pending paid reaction in a live story group call. Can't be used in live stories posted by the current user. Call commitPendingLiveStoryReactions or removePendingLiveStoryReactions to actually send all pending reactions when the undo timer is over or abort the sending.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AddPendingLiveStoryReaction extends Function<Ok> {
        /**
         * Group call identifier.
         */
        public int groupCallId;
        /**
         * Number of Telegram Stars to be used for the reaction. The total number of pending paid reactions must not exceed getOption(&quot;paid_group_call_message_star_count_max&quot;).
         */
        public long starCount;

        /**
         * Default constructor for a function, which adds pending paid reaction in a live story group call. Can't be used in live stories posted by the current user. Call commitPendingLiveStoryReactions or removePendingLiveStoryReactions to actually send all pending reactions when the undo timer is over or abort the sending.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AddPendingLiveStoryReaction() {
        }

        /**
         * Creates a function, which adds pending paid reaction in a live story group call. Can't be used in live stories posted by the current user. Call commitPendingLiveStoryReactions or removePendingLiveStoryReactions to actually send all pending reactions when the undo timer is over or abort the sending.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier.
         * @param starCount Number of Telegram Stars to be used for the reaction. The total number of pending paid reactions must not exceed getOption(&quot;paid_group_call_message_star_count_max&quot;).
         */
        public AddPendingLiveStoryReaction(int groupCallId, long starCount) {
            this.groupCallId = groupCallId;
            this.starCount = starCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 661166197;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds the paid message reaction to a message. Use getMessageAvailableReactions to check whether the reaction is available for the message.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AddPendingPaidMessageReaction extends Function<Ok> {
        /**
         * Identifier of the chat to which the message belongs.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * Number of Telegram Stars to be used for the reaction. The total number of pending paid reactions must not exceed getOption(&quot;paid_reaction_star_count_max&quot;).
         */
        public long starCount;
        /**
         * Type of the paid reaction; pass null if the user didn't choose reaction type explicitly, for example, the reaction is set from the message bubble.
         */
        public PaidReactionType type;

        /**
         * Default constructor for a function, which adds the paid message reaction to a message. Use getMessageAvailableReactions to check whether the reaction is available for the message.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AddPendingPaidMessageReaction() {
        }

        /**
         * Creates a function, which adds the paid message reaction to a message. Use getMessageAvailableReactions to check whether the reaction is available for the message.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat to which the message belongs.
         * @param messageId Identifier of the message.
         * @param starCount Number of Telegram Stars to be used for the reaction. The total number of pending paid reactions must not exceed getOption(&quot;paid_reaction_star_count_max&quot;).
         * @param type Type of the paid reaction; pass null if the user didn't choose reaction type explicitly, for example, the reaction is set from the message bubble.
         */
        public AddPendingPaidMessageReaction(long chatId, long messageId, long starCount, PaidReactionType type) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.starCount = starCount;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -342110765;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds an option to a poll.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AddPollOption extends Function<Ok> {
        /**
         * Identifier of the chat to which the poll belongs.
         */
        public long chatId;
        /**
         * Identifier of the message containing the poll. Use messagePoll.canAddOption to check whether an option can be added.
         */
        public long messageId;
        /**
         * The new option.
         */
        public InputPollOption option;

        /**
         * Default constructor for a function, which adds an option to a poll.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AddPollOption() {
        }

        /**
         * Creates a function, which adds an option to a poll.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat to which the poll belongs.
         * @param messageId Identifier of the message containing the poll. Use messagePoll.canAddOption to check whether an option can be added.
         * @param option The new option.
         */
        public AddPollOption(long chatId, long messageId, InputPollOption option) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.option = option;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -382845167;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds an audio file to the beginning of the profile audio files of the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AddProfileAudio extends Function<Ok> {
        /**
         * The audio file to be added.
         */
        public InputFile audio;
        /**
         * Duration of the audio, in seconds; may be replaced by the server; ignored for already uploaded files.
         */
        public int duration;
        /**
         * Title of the audio; 0-64 characters; may be replaced by the server; ignored for already uploaded files.
         */
        public String title;
        /**
         * Performer of the audio; 0-64 characters, may be replaced by the server; ignored for already uploaded files.
         */
        public String performer;

        /**
         * Default constructor for a function, which adds an audio file to the beginning of the profile audio files of the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AddProfileAudio() {
        }

        /**
         * Creates a function, which adds an audio file to the beginning of the profile audio files of the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param audio The audio file to be added.
         * @param duration Duration of the audio, in seconds; may be replaced by the server; ignored for already uploaded files.
         * @param title Title of the audio; 0-64 characters; may be replaced by the server; ignored for already uploaded files.
         * @param performer Performer of the audio; 0-64 characters, may be replaced by the server; ignored for already uploaded files.
         */
        public AddProfileAudio(InputFile audio, int duration, String title, String performer) {
            this.audio = audio;
            this.duration = duration;
            this.title = title;
            this.performer = performer;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 919192907;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds a proxy server for network requests. Can be called before authorization.
     *
     * <p> Returns {@link AddedProxy AddedProxy} </p>
     */
    public static class AddProxy extends Function<AddedProxy> {
        /**
         * The proxy to add.
         */
        public Proxy proxy;
        /**
         * Pass true to immediately enable the proxy.
         */
        public boolean enable;
        /**
         * Comment to set for the proxy.
         */
        public String comment;

        /**
         * Default constructor for a function, which adds a proxy server for network requests. Can be called before authorization.
         *
         * <p> Returns {@link AddedProxy AddedProxy} </p>
         */
        public AddProxy() {
        }

        /**
         * Creates a function, which adds a proxy server for network requests. Can be called before authorization.
         *
         * <p> Returns {@link AddedProxy AddedProxy} </p>
         *
         * @param proxy The proxy to add.
         * @param enable Pass true to immediately enable the proxy.
         * @param comment Comment to set for the proxy.
         */
        public AddProxy(Proxy proxy, boolean enable, String comment) {
            this.proxy = proxy;
            this.enable = enable;
            this.comment = comment;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 267660616;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds a message to a quick reply shortcut via inline bot. If shortcut doesn't exist and there are less than getOption(&quot;quick_reply_shortcut_count_max&quot;) shortcuts, then a new shortcut is created. The shortcut must not contain more than getOption(&quot;quick_reply_shortcut_message_count_max&quot;) messages after adding the new message. Returns the added message.
     *
     * <p> Returns {@link QuickReplyMessage QuickReplyMessage} </p>
     */
    public static class AddQuickReplyShortcutInlineQueryResultMessage extends Function<QuickReplyMessage> {
        /**
         * Name of the target shortcut.
         */
        public String shortcutName;
        /**
         * Identifier of a quick reply message in the same shortcut to be replied; pass 0 if none.
         */
        public long replyToMessageId;
        /**
         * Identifier of the inline query.
         */
        public long queryId;
        /**
         * Identifier of the inline query result.
         */
        public String resultId;
        /**
         * Pass true to hide the bot, via which the message is sent. Can be used only for bots getOption(&quot;animation_search_bot_username&quot;), getOption(&quot;photo_search_bot_username&quot;), and getOption(&quot;venue_search_bot_username&quot;).
         */
        public boolean hideViaBot;

        /**
         * Default constructor for a function, which adds a message to a quick reply shortcut via inline bot. If shortcut doesn't exist and there are less than getOption(&quot;quick_reply_shortcut_count_max&quot;) shortcuts, then a new shortcut is created. The shortcut must not contain more than getOption(&quot;quick_reply_shortcut_message_count_max&quot;) messages after adding the new message. Returns the added message.
         *
         * <p> Returns {@link QuickReplyMessage QuickReplyMessage} </p>
         */
        public AddQuickReplyShortcutInlineQueryResultMessage() {
        }

        /**
         * Creates a function, which adds a message to a quick reply shortcut via inline bot. If shortcut doesn't exist and there are less than getOption(&quot;quick_reply_shortcut_count_max&quot;) shortcuts, then a new shortcut is created. The shortcut must not contain more than getOption(&quot;quick_reply_shortcut_message_count_max&quot;) messages after adding the new message. Returns the added message.
         *
         * <p> Returns {@link QuickReplyMessage QuickReplyMessage} </p>
         *
         * @param shortcutName Name of the target shortcut.
         * @param replyToMessageId Identifier of a quick reply message in the same shortcut to be replied; pass 0 if none.
         * @param queryId Identifier of the inline query.
         * @param resultId Identifier of the inline query result.
         * @param hideViaBot Pass true to hide the bot, via which the message is sent. Can be used only for bots getOption(&quot;animation_search_bot_username&quot;), getOption(&quot;photo_search_bot_username&quot;), and getOption(&quot;venue_search_bot_username&quot;).
         */
        public AddQuickReplyShortcutInlineQueryResultMessage(String shortcutName, long replyToMessageId, long queryId, String resultId, boolean hideViaBot) {
            this.shortcutName = shortcutName;
            this.replyToMessageId = replyToMessageId;
            this.queryId = queryId;
            this.resultId = resultId;
            this.hideViaBot = hideViaBot;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2017449468;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds a message to a quick reply shortcut. If shortcut doesn't exist and there are less than getOption(&quot;quick_reply_shortcut_count_max&quot;) shortcuts, then a new shortcut is created. The shortcut must not contain more than getOption(&quot;quick_reply_shortcut_message_count_max&quot;) messages after adding the new message. Returns the added message.
     *
     * <p> Returns {@link QuickReplyMessage QuickReplyMessage} </p>
     */
    public static class AddQuickReplyShortcutMessage extends Function<QuickReplyMessage> {
        /**
         * Name of the target shortcut.
         */
        public String shortcutName;
        /**
         * Identifier of a quick reply message in the same shortcut to be replied; pass 0 if none.
         */
        public long replyToMessageId;
        /**
         * The content of the message to be added; inputMessagePaidMedia, inputMessageForwarded and inputMessageLocation with livePeriod aren't supported.
         */
        public InputMessageContent inputMessageContent;

        /**
         * Default constructor for a function, which adds a message to a quick reply shortcut. If shortcut doesn't exist and there are less than getOption(&quot;quick_reply_shortcut_count_max&quot;) shortcuts, then a new shortcut is created. The shortcut must not contain more than getOption(&quot;quick_reply_shortcut_message_count_max&quot;) messages after adding the new message. Returns the added message.
         *
         * <p> Returns {@link QuickReplyMessage QuickReplyMessage} </p>
         */
        public AddQuickReplyShortcutMessage() {
        }

        /**
         * Creates a function, which adds a message to a quick reply shortcut. If shortcut doesn't exist and there are less than getOption(&quot;quick_reply_shortcut_count_max&quot;) shortcuts, then a new shortcut is created. The shortcut must not contain more than getOption(&quot;quick_reply_shortcut_message_count_max&quot;) messages after adding the new message. Returns the added message.
         *
         * <p> Returns {@link QuickReplyMessage QuickReplyMessage} </p>
         *
         * @param shortcutName Name of the target shortcut.
         * @param replyToMessageId Identifier of a quick reply message in the same shortcut to be replied; pass 0 if none.
         * @param inputMessageContent The content of the message to be added; inputMessagePaidMedia, inputMessageForwarded and inputMessageLocation with livePeriod aren't supported.
         */
        public AddQuickReplyShortcutMessage(String shortcutName, long replyToMessageId, InputMessageContent inputMessageContent) {
            this.shortcutName = shortcutName;
            this.replyToMessageId = replyToMessageId;
            this.inputMessageContent = inputMessageContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1058573098;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds 2-10 messages grouped together into an album to a quick reply shortcut. Currently, only audio, document, photo and video messages can be grouped into an album. Documents and audio files can be only grouped in an album with messages of the same type. Returns sent messages.
     *
     * <p> Returns {@link QuickReplyMessages QuickReplyMessages} </p>
     */
    public static class AddQuickReplyShortcutMessageAlbum extends Function<QuickReplyMessages> {
        /**
         * Name of the target shortcut.
         */
        public String shortcutName;
        /**
         * Identifier of a quick reply message in the same shortcut to be replied; pass 0 if none.
         */
        public long replyToMessageId;
        /**
         * Contents of messages to be sent. At most 10 messages can be added to an album. All messages must have the same value of showCaptionAboveMedia.
         */
        public InputMessageContent[] inputMessageContents;

        /**
         * Default constructor for a function, which adds 2-10 messages grouped together into an album to a quick reply shortcut. Currently, only audio, document, photo and video messages can be grouped into an album. Documents and audio files can be only grouped in an album with messages of the same type. Returns sent messages.
         *
         * <p> Returns {@link QuickReplyMessages QuickReplyMessages} </p>
         */
        public AddQuickReplyShortcutMessageAlbum() {
        }

        /**
         * Creates a function, which adds 2-10 messages grouped together into an album to a quick reply shortcut. Currently, only audio, document, photo and video messages can be grouped into an album. Documents and audio files can be only grouped in an album with messages of the same type. Returns sent messages.
         *
         * <p> Returns {@link QuickReplyMessages QuickReplyMessages} </p>
         *
         * @param shortcutName Name of the target shortcut.
         * @param replyToMessageId Identifier of a quick reply message in the same shortcut to be replied; pass 0 if none.
         * @param inputMessageContents Contents of messages to be sent. At most 10 messages can be added to an album. All messages must have the same value of showCaptionAboveMedia.
         */
        public AddQuickReplyShortcutMessageAlbum(String shortcutName, long replyToMessageId, InputMessageContent[] inputMessageContents) {
            this.shortcutName = shortcutName;
            this.replyToMessageId = replyToMessageId;
            this.inputMessageContents = inputMessageContents;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1348436244;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Manually adds a new sticker to the list of recently used stickers. The new sticker is added to the top of the list. If the sticker was already in the list, it is removed from the list first. Only stickers belonging to a sticker set or in WEBP or WEBM format can be added to this list. Emoji stickers can't be added to recent stickers.
     *
     * <p> Returns {@link Stickers Stickers} </p>
     */
    public static class AddRecentSticker extends Function<Stickers> {
        /**
         * Pass true to add the sticker to the list of stickers recently attached to photo or video files; pass false to add the sticker to the list of recently sent stickers.
         */
        public boolean isAttached;
        /**
         * Sticker file to add.
         */
        public InputFile sticker;

        /**
         * Default constructor for a function, which manually adds a new sticker to the list of recently used stickers. The new sticker is added to the top of the list. If the sticker was already in the list, it is removed from the list first. Only stickers belonging to a sticker set or in WEBP or WEBM format can be added to this list. Emoji stickers can't be added to recent stickers.
         *
         * <p> Returns {@link Stickers Stickers} </p>
         */
        public AddRecentSticker() {
        }

        /**
         * Creates a function, which manually adds a new sticker to the list of recently used stickers. The new sticker is added to the top of the list. If the sticker was already in the list, it is removed from the list first. Only stickers belonging to a sticker set or in WEBP or WEBM format can be added to this list. Emoji stickers can't be added to recent stickers.
         *
         * <p> Returns {@link Stickers Stickers} </p>
         *
         * @param isAttached Pass true to add the sticker to the list of stickers recently attached to photo or video files; pass false to add the sticker to the list of recently sent stickers.
         * @param sticker Sticker file to add.
         */
        public AddRecentSticker(boolean isAttached, InputFile sticker) {
            this.isAttached = isAttached;
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1478109026;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds a chat to the list of recently found chats. The chat is added to the beginning of the list. If the chat is already in the list, it will be removed from the list first.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AddRecentlyFoundChat extends Function<Ok> {
        /**
         * Identifier of the chat to add.
         */
        public long chatId;

        /**
         * Default constructor for a function, which adds a chat to the list of recently found chats. The chat is added to the beginning of the list. If the chat is already in the list, it will be removed from the list first.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AddRecentlyFoundChat() {
        }

        /**
         * Creates a function, which adds a chat to the list of recently found chats. The chat is added to the beginning of the list. If the chat is already in the list, it will be removed from the list first.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat to add.
         */
        public AddRecentlyFoundChat(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1746396787;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Manually adds a new animation to the list of saved animations. The new animation is added to the beginning of the list. If the animation was already in the list, it is removed first. Only non-secret video animations with MIME type &quot;video/mp4&quot; can be added to the list.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AddSavedAnimation extends Function<Ok> {
        /**
         * The animation file to be added. Only animations known to the server (i.e., successfully sent via a message) can be added to the list.
         */
        public InputFile animation;

        /**
         * Default constructor for a function, which manually adds a new animation to the list of saved animations. The new animation is added to the beginning of the list. If the animation was already in the list, it is removed first. Only non-secret video animations with MIME type &quot;video/mp4&quot; can be added to the list.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AddSavedAnimation() {
        }

        /**
         * Creates a function, which manually adds a new animation to the list of saved animations. The new animation is added to the beginning of the list. If the animation was already in the list, it is removed first. Only non-secret video animations with MIME type &quot;video/mp4&quot; can be added to the list.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param animation The animation file to be added. Only animations known to the server (i.e., successfully sent via a message) can be added to the list.
         */
        public AddSavedAnimation(InputFile animation) {
            this.animation = animation;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1538525088;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds a new notification sound to the list of saved notification sounds. The new notification sound is added to the top of the list. If it is already in the list, its position isn't changed.
     *
     * <p> Returns {@link NotificationSound NotificationSound} </p>
     */
    public static class AddSavedNotificationSound extends Function<NotificationSound> {
        /**
         * Notification sound file to add.
         */
        public InputFile sound;

        /**
         * Default constructor for a function, which adds a new notification sound to the list of saved notification sounds. The new notification sound is added to the top of the list. If it is already in the list, its position isn't changed.
         *
         * <p> Returns {@link NotificationSound NotificationSound} </p>
         */
        public AddSavedNotificationSound() {
        }

        /**
         * Creates a function, which adds a new notification sound to the list of saved notification sounds. The new notification sound is added to the top of the list. If it is already in the list, its position isn't changed.
         *
         * <p> Returns {@link NotificationSound NotificationSound} </p>
         *
         * @param sound Notification sound file to add.
         */
        public AddSavedNotificationSound(InputFile sound) {
            this.sound = sound;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1043956975;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds a new sticker to a set.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AddStickerToSet extends Function<Ok> {
        /**
         * Sticker set owner; ignored for regular users.
         */
        public long userId;
        /**
         * Sticker set name. The sticker set must be owned by the current user, and contain less than 200 stickers for custom emoji sticker sets and less than 120 otherwise.
         */
        public String name;
        /**
         * Sticker to add to the set.
         */
        public InputSticker sticker;

        /**
         * Default constructor for a function, which adds a new sticker to a set.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AddStickerToSet() {
        }

        /**
         * Creates a function, which adds a new sticker to a set.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param userId Sticker set owner; ignored for regular users.
         * @param name Sticker set name. The sticker set must be owned by the current user, and contain less than 200 stickers for custom emoji sticker sets and less than 120 otherwise.
         * @param sticker Sticker to add to the set.
         */
        public AddStickerToSet(long userId, String name, InputSticker sticker) {
            this.userId = userId;
            this.name = name;
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1457266235;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds stories to the beginning of a previously created story album. If the album is owned by a supergroup or a channel chat, then requires canEditStories administrator right in the chat. Returns the changed album.
     *
     * <p> Returns {@link StoryAlbum StoryAlbum} </p>
     */
    public static class AddStoryAlbumStories extends Function<StoryAlbum> {
        /**
         * Identifier of the chat that owns the stories.
         */
        public long chatId;
        /**
         * Identifier of the story album.
         */
        public int storyAlbumId;
        /**
         * Identifier of the stories to add to the album; 1-getOption(&quot;story_album_size_max&quot;) identifiers. If after addition the album has more than getOption(&quot;story_album_size_max&quot;) stories, then the last one are removed from the album.
         */
        public int[] storyIds;

        /**
         * Default constructor for a function, which adds stories to the beginning of a previously created story album. If the album is owned by a supergroup or a channel chat, then requires canEditStories administrator right in the chat. Returns the changed album.
         *
         * <p> Returns {@link StoryAlbum StoryAlbum} </p>
         */
        public AddStoryAlbumStories() {
        }

        /**
         * Creates a function, which adds stories to the beginning of a previously created story album. If the album is owned by a supergroup or a channel chat, then requires canEditStories administrator right in the chat. Returns the changed album.
         *
         * <p> Returns {@link StoryAlbum StoryAlbum} </p>
         *
         * @param chatId Identifier of the chat that owns the stories.
         * @param storyAlbumId Identifier of the story album.
         * @param storyIds Identifier of the stories to add to the album; 1-getOption(&quot;story_album_size_max&quot;) identifiers. If after addition the album has more than getOption(&quot;story_album_size_max&quot;) stories, then the last one are removed from the album.
         */
        public AddStoryAlbumStories(long chatId, int storyAlbumId, int[] storyIds) {
            this.chatId = chatId;
            this.storyAlbumId = storyAlbumId;
            this.storyIds = storyIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -537692984;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds a custom text composition style to the list of used by the user styles. May return an error with a message &quot;TONES_SAVED_TOO_MANY&quot; if the maximum number of added custom styles has been reached.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AddTextCompositionStyle extends Function<Ok> {
        /**
         * Name of the style.
         */
        public String name;

        /**
         * Default constructor for a function, which adds a custom text composition style to the list of used by the user styles. May return an error with a message &quot;TONES_SAVED_TOO_MANY&quot; if the maximum number of added custom styles has been reached.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AddTextCompositionStyle() {
        }

        /**
         * Creates a function, which adds a custom text composition style to the list of used by the user styles. May return an error with a message &quot;TONES_SAVED_TOO_MANY&quot; if the maximum number of added custom styles has been reached.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param name Name of the style.
         */
        public AddTextCompositionStyle(String name) {
            this.name = name;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1478640138;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Allows the specified bot to send messages to the user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AllowBotToSendMessages extends Function<Ok> {
        /**
         * Identifier of the target bot.
         */
        public long botUserId;

        /**
         * Default constructor for a function, which allows the specified bot to send messages to the user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AllowBotToSendMessages() {
        }

        /**
         * Creates a function, which allows the specified bot to send messages to the user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param botUserId Identifier of the target bot.
         */
        public AllowBotToSendMessages(long botUserId) {
            this.botUserId = botUserId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1776928142;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Allows the specified user to send unpaid private messages to the current user by adding a rule to userPrivacySettingAllowUnpaidMessages.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AllowUnpaidMessagesFromUser extends Function<Ok> {
        /**
         * Identifier of the user.
         */
        public long userId;
        /**
         * Pass true to refund the user previously paid messages.
         */
        public boolean refundPayments;

        /**
         * Default constructor for a function, which allows the specified user to send unpaid private messages to the current user by adding a rule to userPrivacySettingAllowUnpaidMessages.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AllowUnpaidMessagesFromUser() {
        }

        /**
         * Creates a function, which allows the specified user to send unpaid private messages to the current user by adding a rule to userPrivacySettingAllowUnpaidMessages.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param userId Identifier of the user.
         * @param refundPayments Pass true to refund the user previously paid messages.
         */
        public AllowUnpaidMessagesFromUser(long userId, boolean refundPayments) {
            this.userId = userId;
            this.refundPayments = refundPayments;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 803569495;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets the result of a callback query; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AnswerCallbackQuery extends Function<Ok> {
        /**
         * Identifier of the callback query.
         */
        public long callbackQueryId;
        /**
         * Text of the answer.
         */
        public String text;
        /**
         * Pass true to show an alert to the user instead of a toast notification.
         */
        public boolean showAlert;
        /**
         * URL to be opened.
         */
        public String url;
        /**
         * Time during which the result of the query can be cached, in seconds.
         */
        public int cacheTime;

        /**
         * Default constructor for a function, which sets the result of a callback query; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AnswerCallbackQuery() {
        }

        /**
         * Creates a function, which sets the result of a callback query; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param callbackQueryId Identifier of the callback query.
         * @param text Text of the answer.
         * @param showAlert Pass true to show an alert to the user instead of a toast notification.
         * @param url URL to be opened.
         * @param cacheTime Time during which the result of the query can be cached, in seconds.
         */
        public AnswerCallbackQuery(long callbackQueryId, String text, boolean showAlert, String url, int cacheTime) {
            this.callbackQueryId = callbackQueryId;
            this.text = text;
            this.showAlert = showAlert;
            this.url = url;
            this.cacheTime = cacheTime;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1153028490;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Answers a custom query; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AnswerCustomQuery extends Function<Ok> {
        /**
         * Identifier of a custom query.
         */
        public long customQueryId;
        /**
         * JSON-serialized answer to the query.
         */
        public String data;

        /**
         * Default constructor for a function, which answers a custom query; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AnswerCustomQuery() {
        }

        /**
         * Creates a function, which answers a custom query; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param customQueryId Identifier of a custom query.
         * @param data JSON-serialized answer to the query.
         */
        public AnswerCustomQuery(long customQueryId, String data) {
            this.customQueryId = customQueryId;
            this.data = data;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1293603521;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets the result of a guest query; for bots only.
     *
     * <p> Returns {@link InlineMessageId InlineMessageId} </p>
     */
    public static class AnswerGuestQuery extends Function<InlineMessageId> {
        /**
         * Identifier of the guest query.
         */
        public long guestQueryId;
        /**
         * The result of the query.
         */
        public InputInlineQueryResult result;

        /**
         * Default constructor for a function, which sets the result of a guest query; for bots only.
         *
         * <p> Returns {@link InlineMessageId InlineMessageId} </p>
         */
        public AnswerGuestQuery() {
        }

        /**
         * Creates a function, which sets the result of a guest query; for bots only.
         *
         * <p> Returns {@link InlineMessageId InlineMessageId} </p>
         *
         * @param guestQueryId Identifier of the guest query.
         * @param result The result of the query.
         */
        public AnswerGuestQuery(long guestQueryId, InputInlineQueryResult result) {
            this.guestQueryId = guestQueryId;
            this.result = result;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -41729622;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets the result of an inline query; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AnswerInlineQuery extends Function<Ok> {
        /**
         * Identifier of the inline query.
         */
        public long inlineQueryId;
        /**
         * Pass true if results may be cached and returned only for the user who sent the query. By default, results may be returned to any user who sends the same query.
         */
        public boolean isPersonal;
        /**
         * Button to be shown above inline query results; pass null if none.
         */
        public InlineQueryResultsButton button;
        /**
         * The results of the query.
         */
        public InputInlineQueryResult[] results;
        /**
         * Allowed time to cache the results of the query, in seconds.
         */
        public int cacheTime;
        /**
         * Offset for the next inline query; pass an empty string if there are no more results.
         */
        public String nextOffset;

        /**
         * Default constructor for a function, which sets the result of an inline query; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AnswerInlineQuery() {
        }

        /**
         * Creates a function, which sets the result of an inline query; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param inlineQueryId Identifier of the inline query.
         * @param isPersonal Pass true if results may be cached and returned only for the user who sent the query. By default, results may be returned to any user who sends the same query.
         * @param button Button to be shown above inline query results; pass null if none.
         * @param results The results of the query.
         * @param cacheTime Allowed time to cache the results of the query, in seconds.
         * @param nextOffset Offset for the next inline query; pass an empty string if there are no more results.
         */
        public AnswerInlineQuery(long inlineQueryId, boolean isPersonal, InlineQueryResultsButton button, InputInlineQueryResult[] results, int cacheTime, String nextOffset) {
            this.inlineQueryId = inlineQueryId;
            this.isPersonal = isPersonal;
            this.button = button;
            this.results = results;
            this.cacheTime = cacheTime;
            this.nextOffset = nextOffset;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1343853844;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets the result of a pre-checkout query; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AnswerPreCheckoutQuery extends Function<Ok> {
        /**
         * Identifier of the pre-checkout query.
         */
        public long preCheckoutQueryId;
        /**
         * An error message, empty on success.
         */
        public String errorMessage;

        /**
         * Default constructor for a function, which sets the result of a pre-checkout query; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AnswerPreCheckoutQuery() {
        }

        /**
         * Creates a function, which sets the result of a pre-checkout query; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param preCheckoutQueryId Identifier of the pre-checkout query.
         * @param errorMessage An error message, empty on success.
         */
        public AnswerPreCheckoutQuery(long preCheckoutQueryId, String errorMessage) {
            this.preCheckoutQueryId = preCheckoutQueryId;
            this.errorMessage = errorMessage;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1486789653;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets the result of a shipping query; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AnswerShippingQuery extends Function<Ok> {
        /**
         * Identifier of the shipping query.
         */
        public long shippingQueryId;
        /**
         * Available shipping options.
         */
        public ShippingOption[] shippingOptions;
        /**
         * An error message, empty on success.
         */
        public String errorMessage;

        /**
         * Default constructor for a function, which sets the result of a shipping query; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AnswerShippingQuery() {
        }

        /**
         * Creates a function, which sets the result of a shipping query; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param shippingQueryId Identifier of the shipping query.
         * @param shippingOptions Available shipping options.
         * @param errorMessage An error message, empty on success.
         */
        public AnswerShippingQuery(long shippingQueryId, ShippingOption[] shippingOptions, String errorMessage) {
            this.shippingQueryId = shippingQueryId;
            this.shippingOptions = shippingOptions;
            this.errorMessage = errorMessage;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -434601324;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets the result of interaction with a Web App and sends corresponding message on behalf of the user to the chat from which the query originated; for bots only.
     *
     * <p> Returns {@link InlineMessageId InlineMessageId} </p>
     */
    public static class AnswerWebAppQuery extends Function<InlineMessageId> {
        /**
         * Identifier of the Web App query.
         */
        public String webAppQueryId;
        /**
         * The result of the query.
         */
        public InputInlineQueryResult result;

        /**
         * Default constructor for a function, which sets the result of interaction with a Web App and sends corresponding message on behalf of the user to the chat from which the query originated; for bots only.
         *
         * <p> Returns {@link InlineMessageId InlineMessageId} </p>
         */
        public AnswerWebAppQuery() {
        }

        /**
         * Creates a function, which sets the result of interaction with a Web App and sends corresponding message on behalf of the user to the chat from which the query originated; for bots only.
         *
         * <p> Returns {@link InlineMessageId InlineMessageId} </p>
         *
         * @param webAppQueryId Identifier of the Web App query.
         * @param result The result of the query.
         */
        public AnswerWebAppQuery(String webAppQueryId, InputInlineQueryResult result) {
            this.webAppQueryId = webAppQueryId;
            this.result = result;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1447316391;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Applies a Telegram Premium gift code.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ApplyPremiumGiftCode extends Function<Ok> {
        /**
         * The code to apply.
         */
        public String code;

        /**
         * Default constructor for a function, which applies a Telegram Premium gift code.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ApplyPremiumGiftCode() {
        }

        /**
         * Creates a function, which applies a Telegram Premium gift code.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param code The code to apply.
         */
        public ApplyPremiumGiftCode(String code) {
            this.code = code;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1347138530;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Approves a suggested post in a channel direct messages chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ApproveSuggestedPost extends Function<Ok> {
        /**
         * Chat identifier of the channel direct messages chat.
         */
        public long chatId;
        /**
         * Identifier of the message with the suggested post. Use messageProperties.canBeApproved to check whether the suggested post can be approved.
         */
        public long messageId;
        /**
         * Point in time (Unix timestamp) when the post is expected to be published; pass 0 if the date has already been chosen. If specified, then the date must be in the future, but at most getOption(&quot;suggested_post_send_delay_max&quot;) seconds in the future.
         */
        public int sendDate;

        /**
         * Default constructor for a function, which approves a suggested post in a channel direct messages chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ApproveSuggestedPost() {
        }

        /**
         * Creates a function, which approves a suggested post in a channel direct messages chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier of the channel direct messages chat.
         * @param messageId Identifier of the message with the suggested post. Use messageProperties.canBeApproved to check whether the suggested post can be approved.
         * @param sendDate Point in time (Unix timestamp) when the post is expected to be published; pass 0 if the date has already been chosen. If specified, then the date must be in the future, but at most getOption(&quot;suggested_post_send_delay_max&quot;) seconds in the future.
         */
        public ApproveSuggestedPost(long chatId, long messageId, int sendDate) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.sendDate = sendDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -924807202;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs server about an in-store purchase. For official applications only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class AssignStoreTransaction extends Function<Ok> {
        /**
         * Information about the transaction.
         */
        public StoreTransaction transaction;
        /**
         * Transaction purpose.
         */
        public StorePaymentPurpose purpose;

        /**
         * Default constructor for a function, which informs server about an in-store purchase. For official applications only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public AssignStoreTransaction() {
        }

        /**
         * Creates a function, which informs server about an in-store purchase. For official applications only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param transaction Information about the transaction.
         * @param purpose Transaction purpose.
         */
        public AssignStoreTransaction(StoreTransaction transaction, StorePaymentPurpose purpose) {
            this.transaction = transaction;
            this.purpose = purpose;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2046202900;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Bans a member in a chat; requires canRestrictMembers administrator right. Members can't be banned in private or secret chats. In supergroups and channels, the user will not be able to return to the group on their own using invite links, etc., unless unbanned first.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class BanChatMember extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Member identifier.
         */
        public MessageSender memberId;
        /**
         * Point in time (Unix timestamp) when the user will be unbanned; 0 if never. If the user is banned for more than 366 days or for less than 30 seconds from the current time, the user is considered to be banned forever. Ignored in basic groups and if a chat is banned.
         */
        public int bannedUntilDate;
        /**
         * Pass true to delete all messages in the chat for the user who is being removed. Always true for supergroups and channels.
         */
        public boolean revokeMessages;

        /**
         * Default constructor for a function, which bans a member in a chat; requires canRestrictMembers administrator right. Members can't be banned in private or secret chats. In supergroups and channels, the user will not be able to return to the group on their own using invite links, etc., unless unbanned first.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public BanChatMember() {
        }

        /**
         * Creates a function, which bans a member in a chat; requires canRestrictMembers administrator right. Members can't be banned in private or secret chats. In supergroups and channels, the user will not be able to return to the group on their own using invite links, etc., unless unbanned first.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param memberId Member identifier.
         * @param bannedUntilDate Point in time (Unix timestamp) when the user will be unbanned; 0 if never. If the user is banned for more than 366 days or for less than 30 seconds from the current time, the user is considered to be banned forever. Ignored in basic groups and if a chat is banned.
         * @param revokeMessages Pass true to delete all messages in the chat for the user who is being removed. Always true for supergroups and channels.
         */
        public BanChatMember(long chatId, MessageSender memberId, int bannedUntilDate, boolean revokeMessages) {
            this.chatId = chatId;
            this.memberId = memberId;
            this.bannedUntilDate = bannedUntilDate;
            this.revokeMessages = revokeMessages;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -888111748;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Bans users from a group call not bound to a chat; requires groupCall.isOwned. Only the owner of the group call can invite the banned users back.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class BanGroupCallParticipants extends Function<Ok> {
        /**
         * Group call identifier.
         */
        public int groupCallId;
        /**
         * Identifiers of group call participants to ban; identifiers of unknown users from the update updateGroupCallParticipants can be also passed to the method.
         */
        public long[] userIds;

        /**
         * Default constructor for a function, which bans users from a group call not bound to a chat; requires groupCall.isOwned. Only the owner of the group call can invite the banned users back.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public BanGroupCallParticipants() {
        }

        /**
         * Creates a function, which bans users from a group call not bound to a chat; requires groupCall.isOwned. Only the owner of the group call can invite the banned users back.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier.
         * @param userIds Identifiers of group call participants to ban; identifiers of unknown users from the update updateGroupCallParticipants can be also passed to the method.
         */
        public BanGroupCallParticipants(int groupCallId, long[] userIds) {
            this.groupCallId = groupCallId;
            this.userIds = userIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 624883173;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Blocks an original sender of a message in the Replies chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class BlockMessageSenderFromReplies extends Function<Ok> {
        /**
         * The identifier of an incoming message in the Replies chat.
         */
        public long messageId;
        /**
         * Pass true to delete the message.
         */
        public boolean deleteMessage;
        /**
         * Pass true to delete all messages from the same sender.
         */
        public boolean deleteAllMessages;
        /**
         * Pass true to report the sender to the Telegram moderators.
         */
        public boolean reportSpam;

        /**
         * Default constructor for a function, which blocks an original sender of a message in the Replies chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public BlockMessageSenderFromReplies() {
        }

        /**
         * Creates a function, which blocks an original sender of a message in the Replies chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param messageId The identifier of an incoming message in the Replies chat.
         * @param deleteMessage Pass true to delete the message.
         * @param deleteAllMessages Pass true to delete all messages from the same sender.
         * @param reportSpam Pass true to report the sender to the Telegram moderators.
         */
        public BlockMessageSenderFromReplies(long messageId, boolean deleteMessage, boolean deleteAllMessages, boolean reportSpam) {
            this.messageId = messageId;
            this.deleteMessage = deleteMessage;
            this.deleteAllMessages = deleteAllMessages;
            this.reportSpam = reportSpam;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1214384757;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Boosts a chat and returns the list of available chat boost slots for the current user after the boost.
     *
     * <p> Returns {@link ChatBoostSlots ChatBoostSlots} </p>
     */
    public static class BoostChat extends Function<ChatBoostSlots> {
        /**
         * Identifier of the chat.
         */
        public long chatId;
        /**
         * Identifiers of boost slots of the current user from which to apply boosts to the chat.
         */
        public int[] slotIds;

        /**
         * Default constructor for a function, which boosts a chat and returns the list of available chat boost slots for the current user after the boost.
         *
         * <p> Returns {@link ChatBoostSlots ChatBoostSlots} </p>
         */
        public BoostChat() {
        }

        /**
         * Creates a function, which boosts a chat and returns the list of available chat boost slots for the current user after the boost.
         *
         * <p> Returns {@link ChatBoostSlots ChatBoostSlots} </p>
         *
         * @param chatId Identifier of the chat.
         * @param slotIds Identifiers of boost slots of the current user from which to apply boosts to the chat.
         */
        public BoostChat(long chatId, int[] slotIds) {
            this.chatId = chatId;
            this.slotIds = slotIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1945750252;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Pays for upgrade of a regular gift that is owned by another user or channel chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class BuyGiftUpgrade extends Function<Ok> {
        /**
         * Identifier of the user or the channel chat that owns the gift.
         */
        public MessageSender ownerId;
        /**
         * Prepaid upgrade hash as received along with the gift.
         */
        public String prepaidUpgradeHash;
        /**
         * The Telegram Star amount the user agreed to pay for the upgrade; must be equal to gift.upgradeStarCount.
         */
        public long starCount;

        /**
         * Default constructor for a function, which pays for upgrade of a regular gift that is owned by another user or channel chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public BuyGiftUpgrade() {
        }

        /**
         * Creates a function, which pays for upgrade of a regular gift that is owned by another user or channel chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param ownerId Identifier of the user or the channel chat that owns the gift.
         * @param prepaidUpgradeHash Prepaid upgrade hash as received along with the gift.
         * @param starCount The Telegram Star amount the user agreed to pay for the upgrade; must be equal to gift.upgradeStarCount.
         */
        public BuyGiftUpgrade(MessageSender ownerId, String prepaidUpgradeHash, long starCount) {
            this.ownerId = ownerId;
            this.prepaidUpgradeHash = prepaidUpgradeHash;
            this.starCount = starCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 154296026;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks whether the specified bot can send messages to the user. Returns a 404 error if can't and the access can be granted by call to allowBotToSendMessages.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CanBotSendMessages extends Function<Ok> {
        /**
         * Identifier of the target bot.
         */
        public long botUserId;

        /**
         * Default constructor for a function, which checks whether the specified bot can send messages to the user. Returns a 404 error if can't and the access can be granted by call to allowBotToSendMessages.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CanBotSendMessages() {
        }

        /**
         * Creates a function, which checks whether the specified bot can send messages to the user. Returns a 404 error if can't and the access can be granted by call to allowBotToSendMessages.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param botUserId Identifier of the target bot.
         */
        public CanBotSendMessages(long botUserId) {
            this.botUserId = botUserId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 544052364;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks whether the current user can post a story on behalf of a chat; requires canPostStories administrator right for supergroup and channel chats.
     *
     * <p> Returns {@link CanPostStoryResult CanPostStoryResult} </p>
     */
    public static class CanPostStory extends Function<CanPostStoryResult> {
        /**
         * Chat identifier. Pass Saved Messages chat identifier when posting a story on behalf of the current user.
         */
        public long chatId;

        /**
         * Default constructor for a function, which checks whether the current user can post a story on behalf of a chat; requires canPostStories administrator right for supergroup and channel chats.
         *
         * <p> Returns {@link CanPostStoryResult CanPostStoryResult} </p>
         */
        public CanPostStory() {
        }

        /**
         * Creates a function, which checks whether the current user can post a story on behalf of a chat; requires canPostStories administrator right for supergroup and channel chats.
         *
         * <p> Returns {@link CanPostStoryResult CanPostStoryResult} </p>
         *
         * @param chatId Chat identifier. Pass Saved Messages chat identifier when posting a story on behalf of the current user.
         */
        public CanPostStory(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 668621518;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks whether an in-store purchase is possible. Must be called before any in-store purchase. For official applications only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CanPurchaseFromStore extends Function<Ok> {
        /**
         * Transaction purpose.
         */
        public StorePaymentPurpose purpose;

        /**
         * Default constructor for a function, which checks whether an in-store purchase is possible. Must be called before any in-store purchase. For official applications only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CanPurchaseFromStore() {
        }

        /**
         * Creates a function, which checks whether an in-store purchase is possible. Must be called before any in-store purchase. For official applications only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param purpose Transaction purpose.
         */
        public CanPurchaseFromStore(StorePaymentPurpose purpose) {
            this.purpose = purpose;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1017811816;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks whether a gift with nextSendDate in the future can be sent already.
     *
     * <p> Returns {@link CanSendGiftResult CanSendGiftResult} </p>
     */
    public static class CanSendGift extends Function<CanSendGiftResult> {
        /**
         * Identifier of the gift to send.
         */
        public long giftId;

        /**
         * Default constructor for a function, which checks whether a gift with nextSendDate in the future can be sent already.
         *
         * <p> Returns {@link CanSendGiftResult CanSendGiftResult} </p>
         */
        public CanSendGift() {
        }

        /**
         * Creates a function, which checks whether a gift with nextSendDate in the future can be sent already.
         *
         * <p> Returns {@link CanSendGiftResult CanSendGiftResult} </p>
         *
         * @param giftId Identifier of the gift to send.
         */
        public CanSendGift(long giftId) {
            this.giftId = giftId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1307059830;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks whether the current user can message another user or try to create a chat with them.
     *
     * <p> Returns {@link CanSendMessageToUserResult CanSendMessageToUserResult} </p>
     */
    public static class CanSendMessageToUser extends Function<CanSendMessageToUserResult> {
        /**
         * Identifier of the other user.
         */
        public long userId;
        /**
         * Pass true to get only locally available information without sending network requests.
         */
        public boolean onlyLocal;

        /**
         * Default constructor for a function, which checks whether the current user can message another user or try to create a chat with them.
         *
         * <p> Returns {@link CanSendMessageToUserResult CanSendMessageToUserResult} </p>
         */
        public CanSendMessageToUser() {
        }

        /**
         * Creates a function, which checks whether the current user can message another user or try to create a chat with them.
         *
         * <p> Returns {@link CanSendMessageToUserResult CanSendMessageToUserResult} </p>
         *
         * @param userId Identifier of the other user.
         * @param onlyLocal Pass true to get only locally available information without sending network requests.
         */
        public CanSendMessageToUser(long userId, boolean onlyLocal) {
            this.userId = userId;
            this.onlyLocal = onlyLocal;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1529489462;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks whether the current session can be used to transfer a chat ownership to another user.
     *
     * <p> Returns {@link CanTransferOwnershipResult CanTransferOwnershipResult} </p>
     */
    public static class CanTransferOwnership extends Function<CanTransferOwnershipResult> {

        /**
         * Default constructor for a function, which checks whether the current session can be used to transfer a chat ownership to another user.
         *
         * <p> Returns {@link CanTransferOwnershipResult CanTransferOwnershipResult} </p>
         */
        public CanTransferOwnership() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 634602508;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Stops the downloading of a file. If a file has already been downloaded, does nothing.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CancelDownloadFile extends Function<Ok> {
        /**
         * Identifier of a file to stop downloading.
         */
        public int fileId;
        /**
         * Pass true to stop downloading only if it hasn't been started, i.e. request hasn't been sent to server.
         */
        public boolean onlyIfPending;

        /**
         * Default constructor for a function, which stops the downloading of a file. If a file has already been downloaded, does nothing.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CancelDownloadFile() {
        }

        /**
         * Creates a function, which stops the downloading of a file. If a file has already been downloaded, does nothing.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param fileId Identifier of a file to stop downloading.
         * @param onlyIfPending Pass true to stop downloading only if it hasn't been started, i.e. request hasn't been sent to server.
         */
        public CancelDownloadFile(int fileId, boolean onlyIfPending) {
            this.fileId = fileId;
            this.onlyIfPending = onlyIfPending;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1954524450;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Cancels reset of 2-step verification password. The method can be called if passwordState.pendingResetDate &gt; 0.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CancelPasswordReset extends Function<Ok> {

        /**
         * Default constructor for a function, which cancels reset of 2-step verification password. The method can be called if passwordState.pendingResetDate &gt; 0.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CancelPasswordReset() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 940733538;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Stops the preliminary uploading of a file. Supported only for files uploaded by using preliminaryUploadFile.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CancelPreliminaryUploadFile extends Function<Ok> {
        /**
         * Identifier of the file to stop uploading.
         */
        public int fileId;

        /**
         * Default constructor for a function, which stops the preliminary uploading of a file. Supported only for files uploaded by using preliminaryUploadFile.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CancelPreliminaryUploadFile() {
        }

        /**
         * Creates a function, which stops the preliminary uploading of a file. Supported only for files uploaded by using preliminaryUploadFile.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param fileId Identifier of the file to stop uploading.
         */
        public CancelPreliminaryUploadFile(int fileId) {
            this.fileId = fileId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 823412414;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Cancels verification of the 2-step verification recovery email address.
     *
     * <p> Returns {@link PasswordState PasswordState} </p>
     */
    public static class CancelRecoveryEmailAddressVerification extends Function<PasswordState> {

        /**
         * Default constructor for a function, which cancels verification of the 2-step verification recovery email address.
         *
         * <p> Returns {@link PasswordState PasswordState} </p>
         */
        public CancelRecoveryEmailAddressVerification() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1516728691;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes imported contacts using the list of contacts saved on the device. Imports newly added contacts and, if at least the file database is enabled, deletes recently deleted contacts. Query result depends on the result of the previous query, so only one query is possible at the same time.
     *
     * <p> Returns {@link ImportedContacts ImportedContacts} </p>
     */
    public static class ChangeImportedContacts extends Function<ImportedContacts> {
        /**
         * The new list of contacts to import.
         */
        public ImportedContact[] contacts;

        /**
         * Default constructor for a function, which changes imported contacts using the list of contacts saved on the device. Imports newly added contacts and, if at least the file database is enabled, deletes recently deleted contacts. Query result depends on the result of the previous query, so only one query is possible at the same time.
         *
         * <p> Returns {@link ImportedContacts ImportedContacts} </p>
         */
        public ChangeImportedContacts() {
        }

        /**
         * Creates a function, which changes imported contacts using the list of contacts saved on the device. Imports newly added contacts and, if at least the file database is enabled, deletes recently deleted contacts. Query result depends on the result of the previous query, so only one query is possible at the same time.
         *
         * <p> Returns {@link ImportedContacts ImportedContacts} </p>
         *
         * @param contacts The new list of contacts to import.
         */
        public ChangeImportedContacts(ImportedContact[] contacts) {
            this.contacts = contacts;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1119625871;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Installs/uninstalls or activates/archives a sticker set.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ChangeStickerSet extends Function<Ok> {
        /**
         * Identifier of the sticker set.
         */
        public long setId;
        /**
         * The new value of isInstalled.
         */
        public boolean isInstalled;
        /**
         * The new value of isArchived. A sticker set can't be installed and archived simultaneously.
         */
        public boolean isArchived;

        /**
         * Default constructor for a function, which installs/uninstalls or activates/archives a sticker set.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ChangeStickerSet() {
        }

        /**
         * Creates a function, which installs/uninstalls or activates/archives a sticker set.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param setId Identifier of the sticker set.
         * @param isInstalled The new value of isInstalled.
         * @param isArchived The new value of isArchived. A sticker set can't be installed and archived simultaneously.
         */
        public ChangeStickerSet(long setId, boolean isInstalled, boolean isArchived) {
            this.setId = setId;
            this.isInstalled = isInstalled;
            this.isArchived = isArchived;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 449357293;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks the authentication token of a bot; to log in as a bot. Works only when the current authorization state is authorizationStateWaitPhoneNumber. Can be used instead of setAuthenticationPhoneNumber and checkAuthenticationCode to log in.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CheckAuthenticationBotToken extends Function<Ok> {
        /**
         * The bot token.
         */
        public String token;

        /**
         * Default constructor for a function, which checks the authentication token of a bot; to log in as a bot. Works only when the current authorization state is authorizationStateWaitPhoneNumber. Can be used instead of setAuthenticationPhoneNumber and checkAuthenticationCode to log in.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CheckAuthenticationBotToken() {
        }

        /**
         * Creates a function, which checks the authentication token of a bot; to log in as a bot. Works only when the current authorization state is authorizationStateWaitPhoneNumber. Can be used instead of setAuthenticationPhoneNumber and checkAuthenticationCode to log in.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param token The bot token.
         */
        public CheckAuthenticationBotToken(String token) {
            this.token = token;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 639321206;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks the authentication code. Works only when the current authorization state is authorizationStateWaitCode.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CheckAuthenticationCode extends Function<Ok> {
        /**
         * Authentication code to check.
         */
        public String code;

        /**
         * Default constructor for a function, which checks the authentication code. Works only when the current authorization state is authorizationStateWaitCode.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CheckAuthenticationCode() {
        }

        /**
         * Creates a function, which checks the authentication code. Works only when the current authorization state is authorizationStateWaitCode.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param code Authentication code to check.
         */
        public CheckAuthenticationCode(String code) {
            this.code = code;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -302103382;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks the authentication of an email address. Works only when the current authorization state is authorizationStateWaitEmailCode.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CheckAuthenticationEmailCode extends Function<Ok> {
        /**
         * Email address authentication to check.
         */
        public EmailAddressAuthentication code;

        /**
         * Default constructor for a function, which checks the authentication of an email address. Works only when the current authorization state is authorizationStateWaitEmailCode.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CheckAuthenticationEmailCode() {
        }

        /**
         * Creates a function, which checks the authentication of an email address. Works only when the current authorization state is authorizationStateWaitEmailCode.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param code Email address authentication to check.
         */
        public CheckAuthenticationEmailCode(EmailAddressAuthentication code) {
            this.code = code;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -582827361;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks a passkey to log in to the corresponding account. Call getAuthenticationPasskeyParameters to get parameters for the passkey. Works only when the current authorization state is authorizationStateWaitPhoneNumber or authorizationStateWaitOtherDeviceConfirmation, or if there is no pending authentication query and the current authorization state is authorizationStateWaitPremiumPurchase, authorizationStateWaitEmailAddress, authorizationStateWaitEmailCode, authorizationStateWaitCode, authorizationStateWaitRegistration, or authorizationStateWaitPassword.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CheckAuthenticationPasskey extends Function<Ok> {
        /**
         * Base64url-encoded identifier of the credential.
         */
        public String credentialId;
        /**
         * JSON-encoded client data.
         */
        public String clientData;
        /**
         * Authenticator data of the application that created the credential.
         */
        public byte[] authenticatorData;
        /**
         * Cryptographic signature of the credential.
         */
        public byte[] signature;
        /**
         * User handle of the passkey.
         */
        public byte[] userHandle;

        /**
         * Default constructor for a function, which checks a passkey to log in to the corresponding account. Call getAuthenticationPasskeyParameters to get parameters for the passkey. Works only when the current authorization state is authorizationStateWaitPhoneNumber or authorizationStateWaitOtherDeviceConfirmation, or if there is no pending authentication query and the current authorization state is authorizationStateWaitPremiumPurchase, authorizationStateWaitEmailAddress, authorizationStateWaitEmailCode, authorizationStateWaitCode, authorizationStateWaitRegistration, or authorizationStateWaitPassword.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CheckAuthenticationPasskey() {
        }

        /**
         * Creates a function, which checks a passkey to log in to the corresponding account. Call getAuthenticationPasskeyParameters to get parameters for the passkey. Works only when the current authorization state is authorizationStateWaitPhoneNumber or authorizationStateWaitOtherDeviceConfirmation, or if there is no pending authentication query and the current authorization state is authorizationStateWaitPremiumPurchase, authorizationStateWaitEmailAddress, authorizationStateWaitEmailCode, authorizationStateWaitCode, authorizationStateWaitRegistration, or authorizationStateWaitPassword.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param credentialId Base64url-encoded identifier of the credential.
         * @param clientData JSON-encoded client data.
         * @param authenticatorData Authenticator data of the application that created the credential.
         * @param signature Cryptographic signature of the credential.
         * @param userHandle User handle of the passkey.
         */
        public CheckAuthenticationPasskey(String credentialId, String clientData, byte[] authenticatorData, byte[] signature, byte[] userHandle) {
            this.credentialId = credentialId;
            this.clientData = clientData;
            this.authenticatorData = authenticatorData;
            this.signature = signature;
            this.userHandle = userHandle;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1225325317;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks the 2-step verification password for correctness. Works only when the current authorization state is authorizationStateWaitPassword.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CheckAuthenticationPassword extends Function<Ok> {
        /**
         * The 2-step verification password to check.
         */
        public String password;

        /**
         * Default constructor for a function, which checks the 2-step verification password for correctness. Works only when the current authorization state is authorizationStateWaitPassword.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CheckAuthenticationPassword() {
        }

        /**
         * Creates a function, which checks the 2-step verification password for correctness. Works only when the current authorization state is authorizationStateWaitPassword.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param password The 2-step verification password to check.
         */
        public CheckAuthenticationPassword(String password) {
            this.password = password;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2025698400;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks whether a 2-step verification password recovery code sent to an email address is valid. Works only when the current authorization state is authorizationStateWaitPassword.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CheckAuthenticationPasswordRecoveryCode extends Function<Ok> {
        /**
         * Recovery code to check.
         */
        public String recoveryCode;

        /**
         * Default constructor for a function, which checks whether a 2-step verification password recovery code sent to an email address is valid. Works only when the current authorization state is authorizationStateWaitPassword.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CheckAuthenticationPasswordRecoveryCode() {
        }

        /**
         * Creates a function, which checks whether a 2-step verification password recovery code sent to an email address is valid. Works only when the current authorization state is authorizationStateWaitPassword.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param recoveryCode Recovery code to check.
         */
        public CheckAuthenticationPasswordRecoveryCode(String recoveryCode) {
            this.recoveryCode = recoveryCode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -603309083;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks whether an in-store purchase of Telegram Premium is possible before authorization. Works only when the current authorization state is authorizationStateWaitPremiumPurchase.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CheckAuthenticationPremiumPurchase extends Function<Ok> {
        /**
         * The number of days for which the Telegram Premium subscription will be granted.
         */
        public int premiumDayCount;
        /**
         * ISO 4217 currency code of the payment currency.
         */
        public String currency;
        /**
         * Paid amount, in the smallest units of the currency.
         */
        public long amount;

        /**
         * Default constructor for a function, which checks whether an in-store purchase of Telegram Premium is possible before authorization. Works only when the current authorization state is authorizationStateWaitPremiumPurchase.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CheckAuthenticationPremiumPurchase() {
        }

        /**
         * Creates a function, which checks whether an in-store purchase of Telegram Premium is possible before authorization. Works only when the current authorization state is authorizationStateWaitPremiumPurchase.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param premiumDayCount The number of days for which the Telegram Premium subscription will be granted.
         * @param currency ISO 4217 currency code of the payment currency.
         * @param amount Paid amount, in the smallest units of the currency.
         */
        public CheckAuthenticationPremiumPurchase(int premiumDayCount, String currency, long amount) {
            this.premiumDayCount = premiumDayCount;
            this.currency = currency;
            this.amount = amount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 876306570;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks whether a username can be set for a new bot. Use checkChatUsername to check username for other chat types.
     *
     * <p> Returns {@link CheckChatUsernameResult CheckChatUsernameResult} </p>
     */
    public static class CheckBotUsername extends Function<CheckChatUsernameResult> {
        /**
         * Username to be checked.
         */
        public String username;

        /**
         * Default constructor for a function, which checks whether a username can be set for a new bot. Use checkChatUsername to check username for other chat types.
         *
         * <p> Returns {@link CheckChatUsernameResult CheckChatUsernameResult} </p>
         */
        public CheckBotUsername() {
        }

        /**
         * Creates a function, which checks whether a username can be set for a new bot. Use checkChatUsername to check username for other chat types.
         *
         * <p> Returns {@link CheckChatUsernameResult CheckChatUsernameResult} </p>
         *
         * @param username Username to be checked.
         */
        public CheckBotUsername(String username) {
            this.username = username;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1358454679;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks the validity of an invite link for a chat folder and returns information about the corresponding chat folder.
     *
     * <p> Returns {@link ChatFolderInviteLinkInfo ChatFolderInviteLinkInfo} </p>
     */
    public static class CheckChatFolderInviteLink extends Function<ChatFolderInviteLinkInfo> {
        /**
         * Invite link to be checked.
         */
        public String inviteLink;

        /**
         * Default constructor for a function, which checks the validity of an invite link for a chat folder and returns information about the corresponding chat folder.
         *
         * <p> Returns {@link ChatFolderInviteLinkInfo ChatFolderInviteLinkInfo} </p>
         */
        public CheckChatFolderInviteLink() {
        }

        /**
         * Creates a function, which checks the validity of an invite link for a chat folder and returns information about the corresponding chat folder.
         *
         * <p> Returns {@link ChatFolderInviteLinkInfo ChatFolderInviteLinkInfo} </p>
         *
         * @param inviteLink Invite link to be checked.
         */
        public CheckChatFolderInviteLink(String inviteLink) {
            this.inviteLink = inviteLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 522557851;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks the validity of an invite link for a chat and returns information about the corresponding chat.
     *
     * <p> Returns {@link ChatInviteLinkInfo ChatInviteLinkInfo} </p>
     */
    public static class CheckChatInviteLink extends Function<ChatInviteLinkInfo> {
        /**
         * Invite link to be checked.
         */
        public String inviteLink;

        /**
         * Default constructor for a function, which checks the validity of an invite link for a chat and returns information about the corresponding chat.
         *
         * <p> Returns {@link ChatInviteLinkInfo ChatInviteLinkInfo} </p>
         */
        public CheckChatInviteLink() {
        }

        /**
         * Creates a function, which checks the validity of an invite link for a chat and returns information about the corresponding chat.
         *
         * <p> Returns {@link ChatInviteLinkInfo ChatInviteLinkInfo} </p>
         *
         * @param inviteLink Invite link to be checked.
         */
        public CheckChatInviteLink(String inviteLink) {
            this.inviteLink = inviteLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -496940997;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks whether a username can be set for a chat.
     *
     * <p> Returns {@link CheckChatUsernameResult CheckChatUsernameResult} </p>
     */
    public static class CheckChatUsername extends Function<CheckChatUsernameResult> {
        /**
         * Chat identifier; must be identifier of a supergroup chat, or a channel chat, or a private chat with self, or 0 if the chat is being created.
         */
        public long chatId;
        /**
         * Username to be checked.
         */
        public String username;

        /**
         * Default constructor for a function, which checks whether a username can be set for a chat.
         *
         * <p> Returns {@link CheckChatUsernameResult CheckChatUsernameResult} </p>
         */
        public CheckChatUsername() {
        }

        /**
         * Creates a function, which checks whether a username can be set for a chat.
         *
         * <p> Returns {@link CheckChatUsernameResult CheckChatUsernameResult} </p>
         *
         * @param chatId Chat identifier; must be identifier of a supergroup chat, or a channel chat, or a private chat with self, or 0 if the chat is being created.
         * @param username Username to be checked.
         */
        public CheckChatUsername(long chatId, String username) {
            this.chatId = chatId;
            this.username = username;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -119119344;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks whether the maximum number of owned public chats has been reached. Returns corresponding error if the limit was reached. The limit can be increased with Telegram Premium.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CheckCreatedPublicChatsLimit extends Function<Ok> {
        /**
         * Type of the public chats, for which to check the limit.
         */
        public PublicChatType type;

        /**
         * Default constructor for a function, which checks whether the maximum number of owned public chats has been reached. Returns corresponding error if the limit was reached. The limit can be increased with Telegram Premium.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CheckCreatedPublicChatsLimit() {
        }

        /**
         * Creates a function, which checks whether the maximum number of owned public chats has been reached. Returns corresponding error if the limit was reached. The limit can be increased with Telegram Premium.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param type Type of the public chats, for which to check the limit.
         */
        public CheckCreatedPublicChatsLimit(PublicChatType type) {
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -445546591;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks the email address verification code for Telegram Passport.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CheckEmailAddressVerificationCode extends Function<Ok> {
        /**
         * Verification code to check.
         */
        public String code;

        /**
         * Default constructor for a function, which checks the email address verification code for Telegram Passport.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CheckEmailAddressVerificationCode() {
        }

        /**
         * Creates a function, which checks the email address verification code for Telegram Passport.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param code Verification code to check.
         */
        public CheckEmailAddressVerificationCode(String code) {
            this.code = code;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -426386685;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks the login email address authentication.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CheckLoginEmailAddressCode extends Function<Ok> {
        /**
         * Email address authentication to check.
         */
        public EmailAddressAuthentication code;

        /**
         * Default constructor for a function, which checks the login email address authentication.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CheckLoginEmailAddressCode() {
        }

        /**
         * Creates a function, which checks the login email address authentication.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param code Email address authentication to check.
         */
        public CheckLoginEmailAddressCode(EmailAddressAuthentication code) {
            this.code = code;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1454244766;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks a match-code for an OAuth authorization request. If fails, then the authorization request has failed. Otherwise, authorization confirmation dialog must be shown and the link must be processed using acceptOauthRequest or declineOauthRequest.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CheckOauthRequestMatchCode extends Function<Ok> {
        /**
         * URL of the OAuth deep link.
         */
        public String url;
        /**
         * The matching code chosen by the user.
         */
        public String matchCode;

        /**
         * Default constructor for a function, which checks a match-code for an OAuth authorization request. If fails, then the authorization request has failed. Otherwise, authorization confirmation dialog must be shown and the link must be processed using acceptOauthRequest or declineOauthRequest.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CheckOauthRequestMatchCode() {
        }

        /**
         * Creates a function, which checks a match-code for an OAuth authorization request. If fails, then the authorization request has failed. Otherwise, authorization confirmation dialog must be shown and the link must be processed using acceptOauthRequest or declineOauthRequest.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param url URL of the OAuth deep link.
         * @param matchCode The matching code chosen by the user.
         */
        public CheckOauthRequestMatchCode(String url, String matchCode) {
            this.url = url;
            this.matchCode = matchCode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1383896724;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks whether a 2-step verification password recovery code sent to an email address is valid.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CheckPasswordRecoveryCode extends Function<Ok> {
        /**
         * Recovery code to check.
         */
        public String recoveryCode;

        /**
         * Default constructor for a function, which checks whether a 2-step verification password recovery code sent to an email address is valid.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CheckPasswordRecoveryCode() {
        }

        /**
         * Creates a function, which checks whether a 2-step verification password recovery code sent to an email address is valid.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param recoveryCode Recovery code to check.
         */
        public CheckPasswordRecoveryCode(String recoveryCode) {
            this.recoveryCode = recoveryCode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -200794600;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks the authentication code and completes the request for which the code was sent if appropriate.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CheckPhoneNumberCode extends Function<Ok> {
        /**
         * Authentication code to check.
         */
        public String code;

        /**
         * Default constructor for a function, which checks the authentication code and completes the request for which the code was sent if appropriate.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CheckPhoneNumberCode() {
        }

        /**
         * Creates a function, which checks the authentication code and completes the request for which the code was sent if appropriate.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param code Authentication code to check.
         */
        public CheckPhoneNumberCode(String code) {
            this.code = code;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -603626079;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a Telegram Premium gift code.
     *
     * <p> Returns {@link PremiumGiftCodeInfo PremiumGiftCodeInfo} </p>
     */
    public static class CheckPremiumGiftCode extends Function<PremiumGiftCodeInfo> {
        /**
         * The code to check.
         */
        public String code;

        /**
         * Default constructor for a function, which returns information about a Telegram Premium gift code.
         *
         * <p> Returns {@link PremiumGiftCodeInfo PremiumGiftCodeInfo} </p>
         */
        public CheckPremiumGiftCode() {
        }

        /**
         * Creates a function, which returns information about a Telegram Premium gift code.
         *
         * <p> Returns {@link PremiumGiftCodeInfo PremiumGiftCodeInfo} </p>
         *
         * @param code The code to check.
         */
        public CheckPremiumGiftCode(String code) {
            this.code = code;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1786063260;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks validness of a name for a quick reply shortcut. Can be called synchronously.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CheckQuickReplyShortcutName extends Function<Ok> {
        /**
         * The name of the shortcut; 1-32 characters.
         */
        public String name;

        /**
         * Default constructor for a function, which checks validness of a name for a quick reply shortcut. Can be called synchronously.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CheckQuickReplyShortcutName() {
        }

        /**
         * Creates a function, which checks validness of a name for a quick reply shortcut. Can be called synchronously.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param name The name of the shortcut; 1-32 characters.
         */
        public CheckQuickReplyShortcutName(String name) {
            this.name = name;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2101203241;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks the 2-step verification recovery email address verification code.
     *
     * <p> Returns {@link PasswordState PasswordState} </p>
     */
    public static class CheckRecoveryEmailAddressCode extends Function<PasswordState> {
        /**
         * Verification code to check.
         */
        public String code;

        /**
         * Default constructor for a function, which checks the 2-step verification recovery email address verification code.
         *
         * <p> Returns {@link PasswordState PasswordState} </p>
         */
        public CheckRecoveryEmailAddressCode() {
        }

        /**
         * Creates a function, which checks the 2-step verification recovery email address verification code.
         *
         * <p> Returns {@link PasswordState PasswordState} </p>
         *
         * @param code Verification code to check.
         */
        public CheckRecoveryEmailAddressCode(String code) {
            this.code = code;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1997039589;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks whether a name can be used for a new sticker set.
     *
     * <p> Returns {@link CheckStickerSetNameResult CheckStickerSetNameResult} </p>
     */
    public static class CheckStickerSetName extends Function<CheckStickerSetNameResult> {
        /**
         * Name to be checked.
         */
        public String name;

        /**
         * Default constructor for a function, which checks whether a name can be used for a new sticker set.
         *
         * <p> Returns {@link CheckStickerSetNameResult CheckStickerSetNameResult} </p>
         */
        public CheckStickerSetName() {
        }

        /**
         * Creates a function, which checks whether a name can be used for a new sticker set.
         *
         * <p> Returns {@link CheckStickerSetNameResult CheckStickerSetNameResult} </p>
         *
         * @param name Name to be checked.
         */
        public CheckStickerSetName(String name) {
            this.name = name;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1789392642;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks whether a file can be downloaded and saved locally by Web App request.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CheckWebAppFileDownload extends Function<Ok> {
        /**
         * Identifier of the bot, providing the Web App.
         */
        public long botUserId;
        /**
         * Name of the file.
         */
        public String fileName;
        /**
         * URL of the file.
         */
        public String url;

        /**
         * Default constructor for a function, which checks whether a file can be downloaded and saved locally by Web App request.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CheckWebAppFileDownload() {
        }

        /**
         * Creates a function, which checks whether a file can be downloaded and saved locally by Web App request.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param botUserId Identifier of the bot, providing the Web App.
         * @param fileName Name of the file.
         * @param url URL of the file.
         */
        public CheckWebAppFileDownload(long botUserId, String fileName, String url) {
            this.botUserId = botUserId;
            this.fileName = fileName;
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -389397278;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes potentially dangerous characters from the name of a file. Returns an empty string on failure. Can be called synchronously.
     *
     * <p> Returns {@link Text Text} </p>
     */
    public static class CleanFileName extends Function<Text> {
        /**
         * File name or path to the file.
         */
        public String fileName;

        /**
         * Default constructor for a function, which removes potentially dangerous characters from the name of a file. Returns an empty string on failure. Can be called synchronously.
         *
         * <p> Returns {@link Text Text} </p>
         */
        public CleanFileName() {
        }

        /**
         * Creates a function, which removes potentially dangerous characters from the name of a file. Returns an empty string on failure. Can be called synchronously.
         *
         * <p> Returns {@link Text Text} </p>
         *
         * @param fileName File name or path to the file.
         */
        public CleanFileName(String fileName) {
            this.fileName = fileName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 967964667;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Clears message drafts in all chats.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ClearAllDraftMessages extends Function<Ok> {
        /**
         * Pass true to keep local message drafts in secret chats.
         */
        public boolean excludeSecretChats;

        /**
         * Default constructor for a function, which clears message drafts in all chats.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ClearAllDraftMessages() {
        }

        /**
         * Creates a function, which clears message drafts in all chats.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param excludeSecretChats Pass true to keep local message drafts in secret chats.
         */
        public ClearAllDraftMessages(boolean excludeSecretChats) {
            this.excludeSecretChats = excludeSecretChats;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -46369573;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Clears the list of all autosave settings exceptions. The method is guaranteed to work only after at least one call to getAutosaveSettings.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ClearAutosaveSettingsExceptions extends Function<Ok> {

        /**
         * Default constructor for a function, which clears the list of all autosave settings exceptions. The method is guaranteed to work only after at least one call to getAutosaveSettings.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ClearAutosaveSettingsExceptions() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1475109874;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Clears all imported contacts, contact list remains unchanged.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ClearImportedContacts extends Function<Ok> {

        /**
         * Default constructor for a function, which clears all imported contacts, contact list remains unchanged.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ClearImportedContacts() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 869503298;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Clears the list of recently used emoji statuses for self status.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ClearRecentEmojiStatuses extends Function<Ok> {

        /**
         * Default constructor for a function, which clears the list of recently used emoji statuses for self status.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ClearRecentEmojiStatuses() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -428749986;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Clears the list of recently used reactions.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ClearRecentReactions extends Function<Ok> {

        /**
         * Default constructor for a function, which clears the list of recently used reactions.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ClearRecentReactions() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1298253650;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Clears the list of recently used stickers.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ClearRecentStickers extends Function<Ok> {
        /**
         * Pass true to clear the list of stickers recently attached to photo or video files; pass false to clear the list of recently sent stickers.
         */
        public boolean isAttached;

        /**
         * Default constructor for a function, which clears the list of recently used stickers.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ClearRecentStickers() {
        }

        /**
         * Creates a function, which clears the list of recently used stickers.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param isAttached Pass true to clear the list of stickers recently attached to photo or video files; pass false to clear the list of recently sent stickers.
         */
        public ClearRecentStickers(boolean isAttached) {
            this.isAttached = isAttached;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -321242684;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Clears the list of recently found chats.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ClearRecentlyFoundChats extends Function<Ok> {

        /**
         * Default constructor for a function, which clears the list of recently found chats.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ClearRecentlyFoundChats() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -285582542;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Clears the list of recently searched for hashtags or cashtags.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ClearSearchedForTags extends Function<Ok> {
        /**
         * Pass true to clear the list of recently searched for cashtags; otherwise, the list of recently searched for hashtags will be cleared.
         */
        public boolean clearCashtags;

        /**
         * Default constructor for a function, which clears the list of recently searched for hashtags or cashtags.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ClearSearchedForTags() {
        }

        /**
         * Creates a function, which clears the list of recently searched for hashtags or cashtags.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param clearCashtags Pass true to clear the list of recently searched for cashtags; otherwise, the list of recently searched for hashtags will be cleared.
         */
        public ClearSearchedForTags(boolean clearCashtags) {
            this.clearCashtags = clearCashtags;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 512017238;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs TDLib that a message with an animated emoji was clicked by the user. Returns a big animated sticker to be played or a 404 error if usual animation needs to be played.
     *
     * <p> Returns {@link Sticker Sticker} </p>
     */
    public static class ClickAnimatedEmojiMessage extends Function<Sticker> {
        /**
         * Chat identifier of the message.
         */
        public long chatId;
        /**
         * Identifier of the clicked message.
         */
        public long messageId;

        /**
         * Default constructor for a function, which informs TDLib that a message with an animated emoji was clicked by the user. Returns a big animated sticker to be played or a 404 error if usual animation needs to be played.
         *
         * <p> Returns {@link Sticker Sticker} </p>
         */
        public ClickAnimatedEmojiMessage() {
        }

        /**
         * Creates a function, which informs TDLib that a message with an animated emoji was clicked by the user. Returns a big animated sticker to be played or a 404 error if usual animation needs to be played.
         *
         * <p> Returns {@link Sticker Sticker} </p>
         *
         * @param chatId Chat identifier of the message.
         * @param messageId Identifier of the clicked message.
         */
        public ClickAnimatedEmojiMessage(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 196179554;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs TDLib that the user opened the sponsored chat via the button, the name, the chat photo, a mention in the sponsored message text, or the media in the sponsored message.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ClickChatSponsoredMessage extends Function<Ok> {
        /**
         * Chat identifier of the sponsored message.
         */
        public long chatId;
        /**
         * Identifier of the sponsored message.
         */
        public long messageId;
        /**
         * Pass true if the media was clicked in the sponsored message.
         */
        public boolean isMediaClick;
        /**
         * Pass true if the user expanded the video from the sponsored message fullscreen before the click.
         */
        public boolean fromFullscreen;

        /**
         * Default constructor for a function, which informs TDLib that the user opened the sponsored chat via the button, the name, the chat photo, a mention in the sponsored message text, or the media in the sponsored message.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ClickChatSponsoredMessage() {
        }

        /**
         * Creates a function, which informs TDLib that the user opened the sponsored chat via the button, the name, the chat photo, a mention in the sponsored message text, or the media in the sponsored message.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier of the sponsored message.
         * @param messageId Identifier of the sponsored message.
         * @param isMediaClick Pass true if the media was clicked in the sponsored message.
         * @param fromFullscreen Pass true if the user expanded the video from the sponsored message fullscreen before the click.
         */
        public ClickChatSponsoredMessage(long chatId, long messageId, boolean isMediaClick, boolean fromFullscreen) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.isMediaClick = isMediaClick;
            this.fromFullscreen = fromFullscreen;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 971995671;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs TDLib that the user clicked Premium subscription button on the Premium features screen.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ClickPremiumSubscriptionButton extends Function<Ok> {

        /**
         * Default constructor for a function, which informs TDLib that the user clicked Premium subscription button on the Premium features screen.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ClickPremiumSubscriptionButton() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -369319162;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs TDLib that the user clicked a video message advertisement.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ClickVideoMessageAdvertisement extends Function<Ok> {
        /**
         * Unique identifier of the advertisement.
         */
        public long advertisementUniqueId;

        /**
         * Default constructor for a function, which informs TDLib that the user clicked a video message advertisement.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ClickVideoMessageAdvertisement() {
        }

        /**
         * Creates a function, which informs TDLib that the user clicked a video message advertisement.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param advertisementUniqueId Unique identifier of the advertisement.
         */
        public ClickVideoMessageAdvertisement(long advertisementUniqueId) {
            this.advertisementUniqueId = advertisementUniqueId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1367156622;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Closes the TDLib instance. All databases will be flushed to disk and properly closed. After the close completes, updateAuthorizationState with authorizationStateClosed will be sent. Can be called before initialization.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class Close extends Function<Ok> {

        /**
         * Default constructor for a function, which closes the TDLib instance. All databases will be flushed to disk and properly closed. After the close completes, updateAuthorizationState with authorizationStateClosed will be sent. Can be called before initialization.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public Close() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1187782273;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs TDLib that the chat is closed by the user. Many useful activities depend on the chat being opened or closed.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CloseChat extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which informs TDLib that the chat is closed by the user. Many useful activities depend on the chat being opened or closed.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CloseChat() {
        }

        /**
         * Creates a function, which informs TDLib that the chat is closed by the user. Many useful activities depend on the chat being opened or closed.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         */
        public CloseChat(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 39749353;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs TDLib that a gift auction was closed by the user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CloseGiftAuction extends Function<Ok> {
        /**
         * Identifier of the gift, which auction was closed.
         */
        public long giftId;

        /**
         * Default constructor for a function, which informs TDLib that a gift auction was closed by the user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CloseGiftAuction() {
        }

        /**
         * Creates a function, which informs TDLib that a gift auction was closed by the user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param giftId Identifier of the gift, which auction was closed.
         */
        public CloseGiftAuction(long giftId) {
            this.giftId = giftId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 115495644;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Closes a secret chat, effectively transferring its state to secretChatStateClosed.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CloseSecretChat extends Function<Ok> {
        /**
         * Secret chat identifier.
         */
        public int secretChatId;

        /**
         * Default constructor for a function, which closes a secret chat, effectively transferring its state to secretChatStateClosed.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CloseSecretChat() {
        }

        /**
         * Creates a function, which closes a secret chat, effectively transferring its state to secretChatStateClosed.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param secretChatId Secret chat identifier.
         */
        public CloseSecretChat(int secretChatId) {
            this.secretChatId = secretChatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -471006133;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs TDLib that a story is closed by the user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CloseStory extends Function<Ok> {
        /**
         * The identifier of the poster of the story to close.
         */
        public long storyPosterChatId;
        /**
         * The identifier of the story.
         */
        public int storyId;

        /**
         * Default constructor for a function, which informs TDLib that a story is closed by the user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CloseStory() {
        }

        /**
         * Creates a function, which informs TDLib that a story is closed by the user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param storyPosterChatId The identifier of the poster of the story to close.
         * @param storyId The identifier of the story.
         */
        public CloseStory(long storyPosterChatId, int storyId) {
            this.storyPosterChatId = storyPosterChatId;
            this.storyId = storyId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1553967851;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs TDLib that a previously opened Web App was closed.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CloseWebApp extends Function<Ok> {
        /**
         * Identifier of Web App launch, received from openWebApp.
         */
        public long webAppLaunchId;

        /**
         * Default constructor for a function, which informs TDLib that a previously opened Web App was closed.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CloseWebApp() {
        }

        /**
         * Creates a function, which informs TDLib that a previously opened Web App was closed.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param webAppLaunchId Identifier of Web App launch, received from openWebApp.
         */
        public CloseWebApp(long webAppLaunchId) {
            this.webAppLaunchId = webAppLaunchId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1755391174;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Applies all pending paid reactions in a live story group call.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CommitPendingLiveStoryReactions extends Function<Ok> {
        /**
         * Group call identifier.
         */
        public int groupCallId;

        /**
         * Default constructor for a function, which applies all pending paid reactions in a live story group call.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CommitPendingLiveStoryReactions() {
        }

        /**
         * Creates a function, which applies all pending paid reactions in a live story group call.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier.
         */
        public CommitPendingLiveStoryReactions(int groupCallId) {
            this.groupCallId = groupCallId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1786229016;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Applies all pending paid reactions on a message.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class CommitPendingPaidMessageReactions extends Function<Ok> {
        /**
         * Identifier of the chat to which the message belongs.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;

        /**
         * Default constructor for a function, which applies all pending paid reactions on a message.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public CommitPendingPaidMessageReactions() {
        }

        /**
         * Creates a function, which applies all pending paid reactions on a message.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat to which the message belongs.
         * @param messageId Identifier of the message.
         */
        public CommitPendingPaidMessageReactions(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -171354618;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes text using an AI model; must not be used in secret chats. May return an error with a message &quot;AICOMPOSE_FLOOD_PREMIUM&quot; if Telegram Premium is required to send further requests.
     *
     * <p> Returns {@link FormattedText FormattedText} </p>
     */
    public static class ComposeTextWithAi extends Function<FormattedText> {
        /**
         * The original text.
         */
        public FormattedText text;
        /**
         * Pass a language code to which the text will be translated; pass an empty string if translation isn't needed. See translateText.toLanguageCode for the list of supported values.
         */
        public String translateToLanguageCode;
        /**
         * Name of the style of the resulted text; handle updateTextCompositionStyles to get the list of supported styles; pass an empty string to keep the current style of the text.
         */
        public String styleName;
        /**
         * Pass true to add emoji to the text.
         */
        public boolean addEmojis;

        /**
         * Default constructor for a function, which changes text using an AI model; must not be used in secret chats. May return an error with a message &quot;AICOMPOSE_FLOOD_PREMIUM&quot; if Telegram Premium is required to send further requests.
         *
         * <p> Returns {@link FormattedText FormattedText} </p>
         */
        public ComposeTextWithAi() {
        }

        /**
         * Creates a function, which changes text using an AI model; must not be used in secret chats. May return an error with a message &quot;AICOMPOSE_FLOOD_PREMIUM&quot; if Telegram Premium is required to send further requests.
         *
         * <p> Returns {@link FormattedText FormattedText} </p>
         *
         * @param text The original text.
         * @param translateToLanguageCode Pass a language code to which the text will be translated; pass an empty string if translation isn't needed. See translateText.toLanguageCode for the list of supported values.
         * @param styleName Name of the style of the resulted text; handle updateTextCompositionStyles to get the list of supported styles; pass an empty string to keep the current style of the text.
         * @param addEmojis Pass true to add emoji to the text.
         */
        public ComposeTextWithAi(FormattedText text, String translateToLanguageCode, String styleName, boolean addEmojis) {
            this.text = text;
            this.translateToLanguageCode = translateToLanguageCode;
            this.styleName = styleName;
            this.addEmojis = addEmojis;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1121392794;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Confirms QR code authentication on another device. Returns created session on success.
     *
     * <p> Returns {@link Session Session} </p>
     */
    public static class ConfirmQrCodeAuthentication extends Function<Session> {
        /**
         * A link from a QR code. The link must be scanned by the in-app camera.
         */
        public String link;

        /**
         * Default constructor for a function, which confirms QR code authentication on another device. Returns created session on success.
         *
         * <p> Returns {@link Session Session} </p>
         */
        public ConfirmQrCodeAuthentication() {
        }

        /**
         * Creates a function, which confirms QR code authentication on another device. Returns created session on success.
         *
         * <p> Returns {@link Session Session} </p>
         *
         * @param link A link from a QR code. The link must be scanned by the in-app camera.
         */
        public ConfirmQrCodeAuthentication(String link) {
            this.link = link;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -376199379;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Confirms an unconfirmed session of the current user from another device.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ConfirmSession extends Function<Ok> {
        /**
         * Session identifier.
         */
        public long sessionId;

        /**
         * Default constructor for a function, which confirms an unconfirmed session of the current user from another device.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ConfirmSession() {
        }

        /**
         * Creates a function, which confirms an unconfirmed session of the current user from another device.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param sessionId Session identifier.
         */
        public ConfirmSession(long sessionId) {
            this.sessionId = sessionId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -674647009;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Connects an affiliate program to the given affiliate. Returns information about the connected affiliate program.
     *
     * <p> Returns {@link ConnectedAffiliateProgram ConnectedAffiliateProgram} </p>
     */
    public static class ConnectAffiliateProgram extends Function<ConnectedAffiliateProgram> {
        /**
         * The affiliate to which the affiliate program will be connected.
         */
        public AffiliateType affiliate;
        /**
         * Identifier of the bot, which affiliate program is connected.
         */
        public long botUserId;

        /**
         * Default constructor for a function, which connects an affiliate program to the given affiliate. Returns information about the connected affiliate program.
         *
         * <p> Returns {@link ConnectedAffiliateProgram ConnectedAffiliateProgram} </p>
         */
        public ConnectAffiliateProgram() {
        }

        /**
         * Creates a function, which connects an affiliate program to the given affiliate. Returns information about the connected affiliate program.
         *
         * <p> Returns {@link ConnectedAffiliateProgram ConnectedAffiliateProgram} </p>
         *
         * @param affiliate The affiliate to which the affiliate program will be connected.
         * @param botUserId Identifier of the bot, which affiliate program is connected.
         */
        public ConnectAffiliateProgram(AffiliateType affiliate, long botUserId) {
            this.affiliate = affiliate;
            this.botUserId = botUserId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1661392684;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Crafts a new gift from other gifts that will be permanently lost.
     *
     * <p> Returns {@link CraftGiftResult CraftGiftResult} </p>
     */
    public static class CraftGift extends Function<CraftGiftResult> {
        /**
         * Identifier of the gifts to use for crafting. In the case of a successful craft, the resulting gift will have the number of the first gift. Consequently, the first gift must not have been withdrawn to the TON blockchain as an NFT and must have an empty giftAddress.
         */
        public String[] receivedGiftIds;

        /**
         * Default constructor for a function, which crafts a new gift from other gifts that will be permanently lost.
         *
         * <p> Returns {@link CraftGiftResult CraftGiftResult} </p>
         */
        public CraftGift() {
        }

        /**
         * Creates a function, which crafts a new gift from other gifts that will be permanently lost.
         *
         * <p> Returns {@link CraftGiftResult CraftGiftResult} </p>
         *
         * @param receivedGiftIds Identifier of the gifts to use for crafting. In the case of a successful craft, the resulting gift will have the number of the first gift. Consequently, the first gift must not have been withdrawn to the TON blockchain as an NFT and must have an empty giftAddress.
         */
        public CraftGift(String[] receivedGiftIds) {
            this.receivedGiftIds = receivedGiftIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2124593259;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an existing chat corresponding to a known basic group.
     *
     * <p> Returns {@link Chat Chat} </p>
     */
    public static class CreateBasicGroupChat extends Function<Chat> {
        /**
         * Basic group identifier.
         */
        public long basicGroupId;
        /**
         * Pass true to create the chat without a network request. In this case all information about the chat except its type, title and photo can be incorrect.
         */
        public boolean force;

        /**
         * Default constructor for a function, which returns an existing chat corresponding to a known basic group.
         *
         * <p> Returns {@link Chat Chat} </p>
         */
        public CreateBasicGroupChat() {
        }

        /**
         * Creates a function, which returns an existing chat corresponding to a known basic group.
         *
         * <p> Returns {@link Chat Chat} </p>
         *
         * @param basicGroupId Basic group identifier.
         * @param force Pass true to create the chat without a network request. In this case all information about the chat except its type, title and photo can be incorrect.
         */
        public CreateBasicGroupChat(long basicGroupId, boolean force) {
            this.basicGroupId = basicGroupId;
            this.force = force;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1972024548;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Creates a bot which will be managed by another bot. Returns the created bot. May return an error with a message &quot;BOT_CREATE_LIMIT_EXCEEDED&quot; if the user already owns the maximum allowed number of bots as per premiumLimitTypeOwnedBotCount. An internal link &quot;https://t.me/BotFather?start=deletebot&quot; can be processed to handle the error.
     *
     * <p> Returns {@link User User} </p>
     */
    public static class CreateBot extends Function<User> {
        /**
         * Identifier of the bot that will manage the created bot.
         */
        public long managerBotUserId;
        /**
         * Name of the bot; 1-64 characters.
         */
        public String name;
        /**
         * Username of the bot. The username must end with &quot;bot&quot;. Use checkBotUsername to find whether the name is suitable.
         */
        public String username;
        /**
         * Pass true if the bot is created from an internalLinkTypeRequestManagedBot link.
         */
        public boolean viaLink;

        /**
         * Default constructor for a function, which creates a bot which will be managed by another bot. Returns the created bot. May return an error with a message &quot;BOT_CREATE_LIMIT_EXCEEDED&quot; if the user already owns the maximum allowed number of bots as per premiumLimitTypeOwnedBotCount. An internal link &quot;https://t.me/BotFather?start=deletebot&quot; can be processed to handle the error.
         *
         * <p> Returns {@link User User} </p>
         */
        public CreateBot() {
        }

        /**
         * Creates a function, which creates a bot which will be managed by another bot. Returns the created bot. May return an error with a message &quot;BOT_CREATE_LIMIT_EXCEEDED&quot; if the user already owns the maximum allowed number of bots as per premiumLimitTypeOwnedBotCount. An internal link &quot;https://t.me/BotFather?start=deletebot&quot; can be processed to handle the error.
         *
         * <p> Returns {@link User User} </p>
         *
         * @param managerBotUserId Identifier of the bot that will manage the created bot.
         * @param name Name of the bot; 1-64 characters.
         * @param username Username of the bot. The username must end with &quot;bot&quot;. Use checkBotUsername to find whether the name is suitable.
         * @param viaLink Pass true if the bot is created from an internalLinkTypeRequestManagedBot link.
         */
        public CreateBot(long managerBotUserId, String name, String username, boolean viaLink) {
            this.managerBotUserId = managerBotUserId;
            this.name = name;
            this.username = username;
            this.viaLink = viaLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1890858327;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Creates a business chat link for the current account. Requires Telegram Business subscription. There can be up to getOption(&quot;business_chat_link_count_max&quot;) links created. Returns the created link.
     *
     * <p> Returns {@link BusinessChatLink BusinessChatLink} </p>
     */
    public static class CreateBusinessChatLink extends Function<BusinessChatLink> {
        /**
         * Information about the link to create.
         */
        public InputBusinessChatLink linkInfo;

        /**
         * Default constructor for a function, which creates a business chat link for the current account. Requires Telegram Business subscription. There can be up to getOption(&quot;business_chat_link_count_max&quot;) links created. Returns the created link.
         *
         * <p> Returns {@link BusinessChatLink BusinessChatLink} </p>
         */
        public CreateBusinessChatLink() {
        }

        /**
         * Creates a function, which creates a business chat link for the current account. Requires Telegram Business subscription. There can be up to getOption(&quot;business_chat_link_count_max&quot;) links created. Returns the created link.
         *
         * <p> Returns {@link BusinessChatLink BusinessChatLink} </p>
         *
         * @param linkInfo Information about the link to create.
         */
        public CreateBusinessChatLink(InputBusinessChatLink linkInfo) {
            this.linkInfo = linkInfo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1861018304;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Creates a new call.
     *
     * <p> Returns {@link CallId CallId} </p>
     */
    public static class CreateCall extends Function<CallId> {
        /**
         * Identifier of the user to be called.
         */
        public long userId;
        /**
         * The call protocols supported by the application.
         */
        public CallProtocol protocol;
        /**
         * Pass true to create a video call.
         */
        public boolean isVideo;

        /**
         * Default constructor for a function, which creates a new call.
         *
         * <p> Returns {@link CallId CallId} </p>
         */
        public CreateCall() {
        }

        /**
         * Creates a function, which creates a new call.
         *
         * <p> Returns {@link CallId CallId} </p>
         *
         * @param userId Identifier of the user to be called.
         * @param protocol The call protocols supported by the application.
         * @param isVideo Pass true to create a video call.
         */
        public CreateCall(long userId, CallProtocol protocol, boolean isVideo) {
            this.userId = userId;
            this.protocol = protocol;
            this.isVideo = isVideo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1104663024;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Creates new chat folder. Returns information about the created chat folder. There can be up to getOption(&quot;chat_folder_count_max&quot;) chat folders, but the limit can be increased with Telegram Premium.
     *
     * <p> Returns {@link ChatFolderInfo ChatFolderInfo} </p>
     */
    public static class CreateChatFolder extends Function<ChatFolderInfo> {
        /**
         * The new chat folder.
         */
        public ChatFolder folder;

        /**
         * Default constructor for a function, which creates new chat folder. Returns information about the created chat folder. There can be up to getOption(&quot;chat_folder_count_max&quot;) chat folders, but the limit can be increased with Telegram Premium.
         *
         * <p> Returns {@link ChatFolderInfo ChatFolderInfo} </p>
         */
        public CreateChatFolder() {
        }

        /**
         * Creates a function, which creates new chat folder. Returns information about the created chat folder. There can be up to getOption(&quot;chat_folder_count_max&quot;) chat folders, but the limit can be increased with Telegram Premium.
         *
         * <p> Returns {@link ChatFolderInfo ChatFolderInfo} </p>
         *
         * @param folder The new chat folder.
         */
        public CreateChatFolder(ChatFolder folder) {
            this.folder = folder;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1015399680;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Creates a new invite link for a chat folder. A link can be created for a chat folder if it has only pinned and included chats.
     *
     * <p> Returns {@link ChatFolderInviteLink ChatFolderInviteLink} </p>
     */
    public static class CreateChatFolderInviteLink extends Function<ChatFolderInviteLink> {
        /**
         * Chat folder identifier.
         */
        public int chatFolderId;
        /**
         * Name of the link; 0-32 characters.
         */
        public String name;
        /**
         * Identifiers of chats to be accessible by the invite link. Use getChatsForChatFolderInviteLink to get suitable chats. Basic groups will be automatically converted to supergroups before link creation.
         */
        public long[] chatIds;

        /**
         * Default constructor for a function, which creates a new invite link for a chat folder. A link can be created for a chat folder if it has only pinned and included chats.
         *
         * <p> Returns {@link ChatFolderInviteLink ChatFolderInviteLink} </p>
         */
        public CreateChatFolderInviteLink() {
        }

        /**
         * Creates a function, which creates a new invite link for a chat folder. A link can be created for a chat folder if it has only pinned and included chats.
         *
         * <p> Returns {@link ChatFolderInviteLink ChatFolderInviteLink} </p>
         *
         * @param chatFolderId Chat folder identifier.
         * @param name Name of the link; 0-32 characters.
         * @param chatIds Identifiers of chats to be accessible by the invite link. Use getChatsForChatFolderInviteLink to get suitable chats. Basic groups will be automatically converted to supergroups before link creation.
         */
        public CreateChatFolderInviteLink(int chatFolderId, String name, long[] chatIds) {
            this.chatFolderId = chatFolderId;
            this.name = name;
            this.chatIds = chatIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2037911099;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Creates a new invite link for a chat. Available for basic groups, supergroups, and channels. Requires administrator privileges and canInviteUsers right in the chat.
     *
     * <p> Returns {@link ChatInviteLink ChatInviteLink} </p>
     */
    public static class CreateChatInviteLink extends Function<ChatInviteLink> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Invite link name; 0-32 characters.
         */
        public String name;
        /**
         * Point in time (Unix timestamp) when the link will expire; pass 0 if never.
         */
        public int expirationDate;
        /**
         * The maximum number of chat members that can join the chat via the link simultaneously; 0-99999; pass 0 if not limited.
         */
        public int memberLimit;
        /**
         * Pass true if users joining the chat via the link need to be approved by chat administrators. In this case, memberLimit must be 0.
         */
        public boolean createsJoinRequest;

        /**
         * Default constructor for a function, which creates a new invite link for a chat. Available for basic groups, supergroups, and channels. Requires administrator privileges and canInviteUsers right in the chat.
         *
         * <p> Returns {@link ChatInviteLink ChatInviteLink} </p>
         */
        public CreateChatInviteLink() {
        }

        /**
         * Creates a function, which creates a new invite link for a chat. Available for basic groups, supergroups, and channels. Requires administrator privileges and canInviteUsers right in the chat.
         *
         * <p> Returns {@link ChatInviteLink ChatInviteLink} </p>
         *
         * @param chatId Chat identifier.
         * @param name Invite link name; 0-32 characters.
         * @param expirationDate Point in time (Unix timestamp) when the link will expire; pass 0 if never.
         * @param memberLimit The maximum number of chat members that can join the chat via the link simultaneously; 0-99999; pass 0 if not limited.
         * @param createsJoinRequest Pass true if users joining the chat via the link need to be approved by chat administrators. In this case, memberLimit must be 0.
         */
        public CreateChatInviteLink(long chatId, String name, int expirationDate, int memberLimit, boolean createsJoinRequest) {
            this.chatId = chatId;
            this.name = name;
            this.expirationDate = expirationDate;
            this.memberLimit = memberLimit;
            this.createsJoinRequest = createsJoinRequest;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 287744833;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Creates a new subscription invite link for a channel chat. Requires canInviteUsers right in the chat.
     *
     * <p> Returns {@link ChatInviteLink ChatInviteLink} </p>
     */
    public static class CreateChatSubscriptionInviteLink extends Function<ChatInviteLink> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Invite link name; 0-32 characters.
         */
        public String name;
        /**
         * Information about subscription plan that will be applied to the users joining the chat via the link. Subscription period must be 2592000 in production environment, and 60 or 300 if Telegram test environment is used.
         */
        public StarSubscriptionPricing subscriptionPricing;

        /**
         * Default constructor for a function, which creates a new subscription invite link for a channel chat. Requires canInviteUsers right in the chat.
         *
         * <p> Returns {@link ChatInviteLink ChatInviteLink} </p>
         */
        public CreateChatSubscriptionInviteLink() {
        }

        /**
         * Creates a function, which creates a new subscription invite link for a channel chat. Requires canInviteUsers right in the chat.
         *
         * <p> Returns {@link ChatInviteLink ChatInviteLink} </p>
         *
         * @param chatId Chat identifier.
         * @param name Invite link name; 0-32 characters.
         * @param subscriptionPricing Information about subscription plan that will be applied to the users joining the chat via the link. Subscription period must be 2592000 in production environment, and 60 or 300 if Telegram test environment is used.
         */
        public CreateChatSubscriptionInviteLink(long chatId, String name, StarSubscriptionPricing subscriptionPricing) {
            this.chatId = chatId;
            this.name = name;
            this.subscriptionPricing = subscriptionPricing;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2255717;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Creates a topic in a forum supergroup chat or a chat with a bot with topics; requires canManageTopics administrator or canCreateTopics member right in the supergroup.
     *
     * <p> Returns {@link ForumTopicInfo ForumTopicInfo} </p>
     */
    public static class CreateForumTopic extends Function<ForumTopicInfo> {
        /**
         * Identifier of the chat.
         */
        public long chatId;
        /**
         * Name of the topic; 1-128 characters.
         */
        public String name;
        /**
         * Pass true if the name of the topic wasn't entered explicitly; for chats with bots only.
         */
        public boolean isNameImplicit;
        /**
         * Icon of the topic. Icon color must be one of 0x6FB9F0, 0xFFD67E, 0xCB86DB, 0x8EEE98, 0xFF93B2, or 0xFB6F5F. Telegram Premium users can use any custom emoji as topic icon, other users can use only a custom emoji returned by getForumTopicDefaultIcons.
         */
        public ForumTopicIcon icon;

        /**
         * Default constructor for a function, which creates a topic in a forum supergroup chat or a chat with a bot with topics; requires canManageTopics administrator or canCreateTopics member right in the supergroup.
         *
         * <p> Returns {@link ForumTopicInfo ForumTopicInfo} </p>
         */
        public CreateForumTopic() {
        }

        /**
         * Creates a function, which creates a topic in a forum supergroup chat or a chat with a bot with topics; requires canManageTopics administrator or canCreateTopics member right in the supergroup.
         *
         * <p> Returns {@link ForumTopicInfo ForumTopicInfo} </p>
         *
         * @param chatId Identifier of the chat.
         * @param name Name of the topic; 1-128 characters.
         * @param isNameImplicit Pass true if the name of the topic wasn't entered explicitly; for chats with bots only.
         * @param icon Icon of the topic. Icon color must be one of 0x6FB9F0, 0xFFD67E, 0xCB86DB, 0x8EEE98, 0xFF93B2, or 0xFB6F5F. Telegram Premium users can use any custom emoji as topic icon, other users can use only a custom emoji returned by getForumTopicDefaultIcons.
         */
        public CreateForumTopic(long chatId, String name, boolean isNameImplicit, ForumTopicIcon icon) {
            this.chatId = chatId;
            this.name = name;
            this.isNameImplicit = isNameImplicit;
            this.icon = icon;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -15242103;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Creates a collection from gifts on the current user's or a channel's profile page; requires canPostMessages administrator right in the channel chat. An owner can have up to getOption(&quot;gift_collection_count_max&quot;) gift collections. The new collection will be added to the end of the gift collection list of the owner. Returns the created collection.
     *
     * <p> Returns {@link GiftCollection GiftCollection} </p>
     */
    public static class CreateGiftCollection extends Function<GiftCollection> {
        /**
         * Identifier of the user or the channel chat that received the gifts.
         */
        public MessageSender ownerId;
        /**
         * Name of the collection; 1-12 characters.
         */
        public String name;
        /**
         * Identifier of the gifts to add to the collection; 0-getOption(&quot;gift_collection_size_max&quot;) identifiers.
         */
        public String[] receivedGiftIds;

        /**
         * Default constructor for a function, which creates a collection from gifts on the current user's or a channel's profile page; requires canPostMessages administrator right in the channel chat. An owner can have up to getOption(&quot;gift_collection_count_max&quot;) gift collections. The new collection will be added to the end of the gift collection list of the owner. Returns the created collection.
         *
         * <p> Returns {@link GiftCollection GiftCollection} </p>
         */
        public CreateGiftCollection() {
        }

        /**
         * Creates a function, which creates a collection from gifts on the current user's or a channel's profile page; requires canPostMessages administrator right in the channel chat. An owner can have up to getOption(&quot;gift_collection_count_max&quot;) gift collections. The new collection will be added to the end of the gift collection list of the owner. Returns the created collection.
         *
         * <p> Returns {@link GiftCollection GiftCollection} </p>
         *
         * @param ownerId Identifier of the user or the channel chat that received the gifts.
         * @param name Name of the collection; 1-12 characters.
         * @param receivedGiftIds Identifier of the gifts to add to the collection; 0-getOption(&quot;gift_collection_size_max&quot;) identifiers.
         */
        public CreateGiftCollection(MessageSender ownerId, String name, String[] receivedGiftIds) {
            this.ownerId = ownerId;
            this.name = name;
            this.receivedGiftIds = receivedGiftIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -397088099;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Creates a new group call that isn't bound to a chat.
     *
     * <p> Returns {@link GroupCallInfo GroupCallInfo} </p>
     */
    public static class CreateGroupCall extends Function<GroupCallInfo> {
        /**
         * Parameters to join the call; pass null to only create call link without joining the call.
         */
        public GroupCallJoinParameters joinParameters;

        /**
         * Default constructor for a function, which creates a new group call that isn't bound to a chat.
         *
         * <p> Returns {@link GroupCallInfo GroupCallInfo} </p>
         */
        public CreateGroupCall() {
        }

        /**
         * Creates a function, which creates a new group call that isn't bound to a chat.
         *
         * <p> Returns {@link GroupCallInfo GroupCallInfo} </p>
         *
         * @param joinParameters Parameters to join the call; pass null to only create call link without joining the call.
         */
        public CreateGroupCall(GroupCallJoinParameters joinParameters) {
            this.joinParameters = joinParameters;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1930068672;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Creates a link for the given invoice; for bots only.
     *
     * <p> Returns {@link HttpUrl HttpUrl} </p>
     */
    public static class CreateInvoiceLink extends Function<HttpUrl> {
        /**
         * Unique identifier of business connection on behalf of which to send the request.
         */
        public String businessConnectionId;
        /**
         * Information about the invoice of the type inputMessageInvoice.
         */
        public InputMessageContent invoice;

        /**
         * Default constructor for a function, which creates a link for the given invoice; for bots only.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         */
        public CreateInvoiceLink() {
        }

        /**
         * Creates a function, which creates a link for the given invoice; for bots only.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         *
         * @param businessConnectionId Unique identifier of business connection on behalf of which to send the request.
         * @param invoice Information about the invoice of the type inputMessageInvoice.
         */
        public CreateInvoiceLink(String businessConnectionId, InputMessageContent invoice) {
            this.businessConnectionId = businessConnectionId;
            this.invoice = invoice;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -814692249;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Creates a new basic group and sends a corresponding messageBasicGroupChatCreate. Returns information about the newly created chat.
     *
     * <p> Returns {@link CreatedBasicGroupChat CreatedBasicGroupChat} </p>
     */
    public static class CreateNewBasicGroupChat extends Function<CreatedBasicGroupChat> {
        /**
         * Identifiers of users to be added to the basic group; may be empty to create a basic group without other members.
         */
        public long[] userIds;
        /**
         * Title of the new basic group; 1-128 characters.
         */
        public String title;
        /**
         * Message auto-delete time value, in seconds; must be from 0 up to 365 * 86400 and be divisible by 86400. If 0, then messages aren't deleted automatically.
         */
        public int messageAutoDeleteTime;

        /**
         * Default constructor for a function, which creates a new basic group and sends a corresponding messageBasicGroupChatCreate. Returns information about the newly created chat.
         *
         * <p> Returns {@link CreatedBasicGroupChat CreatedBasicGroupChat} </p>
         */
        public CreateNewBasicGroupChat() {
        }

        /**
         * Creates a function, which creates a new basic group and sends a corresponding messageBasicGroupChatCreate. Returns information about the newly created chat.
         *
         * <p> Returns {@link CreatedBasicGroupChat CreatedBasicGroupChat} </p>
         *
         * @param userIds Identifiers of users to be added to the basic group; may be empty to create a basic group without other members.
         * @param title Title of the new basic group; 1-128 characters.
         * @param messageAutoDeleteTime Message auto-delete time value, in seconds; must be from 0 up to 365 * 86400 and be divisible by 86400. If 0, then messages aren't deleted automatically.
         */
        public CreateNewBasicGroupChat(long[] userIds, String title, int messageAutoDeleteTime) {
            this.userIds = userIds;
            this.title = title;
            this.messageAutoDeleteTime = messageAutoDeleteTime;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1806454709;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Creates a new secret chat. Returns the newly created chat.
     *
     * <p> Returns {@link Chat Chat} </p>
     */
    public static class CreateNewSecretChat extends Function<Chat> {
        /**
         * Identifier of the target user.
         */
        public long userId;

        /**
         * Default constructor for a function, which creates a new secret chat. Returns the newly created chat.
         *
         * <p> Returns {@link Chat Chat} </p>
         */
        public CreateNewSecretChat() {
        }

        /**
         * Creates a function, which creates a new secret chat. Returns the newly created chat.
         *
         * <p> Returns {@link Chat Chat} </p>
         *
         * @param userId Identifier of the target user.
         */
        public CreateNewSecretChat(long userId) {
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -620682651;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Creates a new sticker set. Returns the newly created sticker set.
     *
     * <p> Returns {@link StickerSet StickerSet} </p>
     */
    public static class CreateNewStickerSet extends Function<StickerSet> {
        /**
         * Sticker set owner; ignored for regular users.
         */
        public long userId;
        /**
         * Sticker set title; 1-64 characters.
         */
        public String title;
        /**
         * Sticker set name. Can contain only English letters, digits and underscores. Must end with *&quot;_by_&lt;bot username&gt;&quot;* (*&lt;botUsername&gt;* is case insensitive) for bots; 0-64 characters. If empty, then the name returned by getSuggestedStickerSetName will be used automatically.
         */
        public String name;
        /**
         * Type of the stickers in the set.
         */
        public StickerType stickerType;
        /**
         * Pass true if stickers in the sticker set must be repainted; for custom emoji sticker sets only.
         */
        public boolean needsRepainting;
        /**
         * List of stickers to be added to the set; 1-200 stickers for custom emoji sticker sets, and 1-120 stickers otherwise. For TGS stickers, uploadStickerFile must be used before the sticker is shown.
         */
        public InputSticker[] stickers;
        /**
         * Source of the sticker set; may be empty if unknown.
         */
        public String source;

        /**
         * Default constructor for a function, which creates a new sticker set. Returns the newly created sticker set.
         *
         * <p> Returns {@link StickerSet StickerSet} </p>
         */
        public CreateNewStickerSet() {
        }

        /**
         * Creates a function, which creates a new sticker set. Returns the newly created sticker set.
         *
         * <p> Returns {@link StickerSet StickerSet} </p>
         *
         * @param userId Sticker set owner; ignored for regular users.
         * @param title Sticker set title; 1-64 characters.
         * @param name Sticker set name. Can contain only English letters, digits and underscores. Must end with *&quot;_by_&lt;bot username&gt;&quot;* (*&lt;botUsername&gt;* is case insensitive) for bots; 0-64 characters. If empty, then the name returned by getSuggestedStickerSetName will be used automatically.
         * @param stickerType Type of the stickers in the set.
         * @param needsRepainting Pass true if stickers in the sticker set must be repainted; for custom emoji sticker sets only.
         * @param stickers List of stickers to be added to the set; 1-200 stickers for custom emoji sticker sets, and 1-120 stickers otherwise. For TGS stickers, uploadStickerFile must be used before the sticker is shown.
         * @param source Source of the sticker set; may be empty if unknown.
         */
        public CreateNewStickerSet(long userId, String title, String name, StickerType stickerType, boolean needsRepainting, InputSticker[] stickers, String source) {
            this.userId = userId;
            this.title = title;
            this.name = name;
            this.stickerType = stickerType;
            this.needsRepainting = needsRepainting;
            this.stickers = stickers;
            this.source = source;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -481065727;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Creates a new supergroup or channel and sends a corresponding messageSupergroupChatCreate. Returns the newly created chat.
     *
     * <p> Returns {@link Chat Chat} </p>
     */
    public static class CreateNewSupergroupChat extends Function<Chat> {
        /**
         * Title of the new chat; 1-128 characters.
         */
        public String title;
        /**
         * Pass true to create a forum supergroup chat.
         */
        public boolean isForum;
        /**
         * Pass true to create a channel chat; ignored if a forum is created.
         */
        public boolean isChannel;
        /**
         * Chat description; 0-255 characters.
         */
        public String description;
        /**
         * Chat location if a location-based supergroup is being created; pass null to create an ordinary supergroup chat.
         */
        public ChatLocation location;
        /**
         * Message auto-delete time value, in seconds; must be from 0 up to 365 * 86400 and be divisible by 86400. If 0, then messages aren't deleted automatically.
         */
        public int messageAutoDeleteTime;
        /**
         * Pass true to create a supergroup for importing messages using importMessages.
         */
        public boolean forImport;

        /**
         * Default constructor for a function, which creates a new supergroup or channel and sends a corresponding messageSupergroupChatCreate. Returns the newly created chat.
         *
         * <p> Returns {@link Chat Chat} </p>
         */
        public CreateNewSupergroupChat() {
        }

        /**
         * Creates a function, which creates a new supergroup or channel and sends a corresponding messageSupergroupChatCreate. Returns the newly created chat.
         *
         * <p> Returns {@link Chat Chat} </p>
         *
         * @param title Title of the new chat; 1-128 characters.
         * @param isForum Pass true to create a forum supergroup chat.
         * @param isChannel Pass true to create a channel chat; ignored if a forum is created.
         * @param description Chat description; 0-255 characters.
         * @param location Chat location if a location-based supergroup is being created; pass null to create an ordinary supergroup chat.
         * @param messageAutoDeleteTime Message auto-delete time value, in seconds; must be from 0 up to 365 * 86400 and be divisible by 86400. If 0, then messages aren't deleted automatically.
         * @param forImport Pass true to create a supergroup for importing messages using importMessages.
         */
        public CreateNewSupergroupChat(String title, boolean isForum, boolean isChannel, String description, ChatLocation location, int messageAutoDeleteTime, boolean forImport) {
            this.title = title;
            this.isForum = isForum;
            this.isChannel = isChannel;
            this.description = description;
            this.location = location;
            this.messageAutoDeleteTime = messageAutoDeleteTime;
            this.forImport = forImport;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 804058822;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an existing chat corresponding to a given user.
     *
     * <p> Returns {@link Chat Chat} </p>
     */
    public static class CreatePrivateChat extends Function<Chat> {
        /**
         * User identifier.
         */
        public long userId;
        /**
         * Pass true to create the chat without a network request. In this case all information about the chat except its type, title and photo can be incorrect.
         */
        public boolean force;

        /**
         * Default constructor for a function, which returns an existing chat corresponding to a given user.
         *
         * <p> Returns {@link Chat Chat} </p>
         */
        public CreatePrivateChat() {
        }

        /**
         * Creates a function, which returns an existing chat corresponding to a given user.
         *
         * <p> Returns {@link Chat Chat} </p>
         *
         * @param userId User identifier.
         * @param force Pass true to create the chat without a network request. In this case all information about the chat except its type, title and photo can be incorrect.
         */
        public CreatePrivateChat(long userId, boolean force) {
            this.userId = userId;
            this.force = force;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -947758327;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an existing chat corresponding to a known secret chat.
     *
     * <p> Returns {@link Chat Chat} </p>
     */
    public static class CreateSecretChat extends Function<Chat> {
        /**
         * Secret chat identifier.
         */
        public int secretChatId;

        /**
         * Default constructor for a function, which returns an existing chat corresponding to a known secret chat.
         *
         * <p> Returns {@link Chat Chat} </p>
         */
        public CreateSecretChat() {
        }

        /**
         * Creates a function, which returns an existing chat corresponding to a known secret chat.
         *
         * <p> Returns {@link Chat Chat} </p>
         *
         * @param secretChatId Secret chat identifier.
         */
        public CreateSecretChat(int secretChatId) {
            this.secretChatId = secretChatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1930285615;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Creates an album of stories; requires canEditStories administrator right for supergroup and channel chats.
     *
     * <p> Returns {@link StoryAlbum StoryAlbum} </p>
     */
    public static class CreateStoryAlbum extends Function<StoryAlbum> {
        /**
         * Identifier of the chat that posted the stories.
         */
        public long storyPosterChatId;
        /**
         * Name of the album; 1-12 characters.
         */
        public String name;
        /**
         * Identifiers of stories to add to the album; 0-getOption(&quot;story_album_size_max&quot;) identifiers.
         */
        public int[] storyIds;

        /**
         * Default constructor for a function, which creates an album of stories; requires canEditStories administrator right for supergroup and channel chats.
         *
         * <p> Returns {@link StoryAlbum StoryAlbum} </p>
         */
        public CreateStoryAlbum() {
        }

        /**
         * Creates a function, which creates an album of stories; requires canEditStories administrator right for supergroup and channel chats.
         *
         * <p> Returns {@link StoryAlbum StoryAlbum} </p>
         *
         * @param storyPosterChatId Identifier of the chat that posted the stories.
         * @param name Name of the album; 1-12 characters.
         * @param storyIds Identifiers of stories to add to the album; 0-getOption(&quot;story_album_size_max&quot;) identifiers.
         */
        public CreateStoryAlbum(long storyPosterChatId, String name, int[] storyIds) {
            this.storyPosterChatId = storyPosterChatId;
            this.name = name;
            this.storyIds = storyIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -804362185;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an existing chat corresponding to a known supergroup or channel.
     *
     * <p> Returns {@link Chat Chat} </p>
     */
    public static class CreateSupergroupChat extends Function<Chat> {
        /**
         * Supergroup or channel identifier.
         */
        public long supergroupId;
        /**
         * Pass true to create the chat without a network request. In this case all information about the chat except its type, title and photo can be incorrect.
         */
        public boolean force;

        /**
         * Default constructor for a function, which returns an existing chat corresponding to a known supergroup or channel.
         *
         * <p> Returns {@link Chat Chat} </p>
         */
        public CreateSupergroupChat() {
        }

        /**
         * Creates a function, which returns an existing chat corresponding to a known supergroup or channel.
         *
         * <p> Returns {@link Chat Chat} </p>
         *
         * @param supergroupId Supergroup or channel identifier.
         * @param force Pass true to create the chat without a network request. In this case all information about the chat except its type, title and photo can be incorrect.
         */
        public CreateSupergroupChat(long supergroupId, boolean force) {
            this.supergroupId = supergroupId;
            this.force = force;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1187475691;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Creates a new temporary password for processing payments.
     *
     * <p> Returns {@link TemporaryPasswordState TemporaryPasswordState} </p>
     */
    public static class CreateTemporaryPassword extends Function<TemporaryPasswordState> {
        /**
         * The 2-step verification password of the current user.
         */
        public String password;
        /**
         * Time during which the temporary password will be valid, in seconds; must be between 60 and 86400.
         */
        public int validFor;

        /**
         * Default constructor for a function, which creates a new temporary password for processing payments.
         *
         * <p> Returns {@link TemporaryPasswordState TemporaryPasswordState} </p>
         */
        public CreateTemporaryPassword() {
        }

        /**
         * Creates a function, which creates a new temporary password for processing payments.
         *
         * <p> Returns {@link TemporaryPasswordState TemporaryPasswordState} </p>
         *
         * @param password The 2-step verification password of the current user.
         * @param validFor Time during which the temporary password will be valid, in seconds; must be between 60 and 86400.
         */
        public CreateTemporaryPassword(String password, int validFor) {
            this.password = password;
            this.validFor = validFor;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1626509434;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Creates a custom text composition style. May return an error with a message &quot;TONES_SAVED_TOO_MANY&quot; if the maximum number of added custom styles has been reached.
     *
     * <p> Returns {@link TextCompositionStyle TextCompositionStyle} </p>
     */
    public static class CreateTextCompositionStyle extends Function<TextCompositionStyle> {
        /**
         * Title of the style; 1-getOption(&quot;text_composition_style_title_length_max&quot;) characters.
         */
        public String title;
        /**
         * Identifier of the custom emoji corresponding to the style.
         */
        public long customEmojiId;
        /**
         * Prompt that will be used for text composition; 1-getOption(&quot;text_composition_style_prompt_length_max&quot;) characters.
         */
        public String prompt;
        /**
         * Pass true if the current user must be shown as the creator of the style.
         */
        public boolean showCreator;

        /**
         * Default constructor for a function, which creates a custom text composition style. May return an error with a message &quot;TONES_SAVED_TOO_MANY&quot; if the maximum number of added custom styles has been reached.
         *
         * <p> Returns {@link TextCompositionStyle TextCompositionStyle} </p>
         */
        public CreateTextCompositionStyle() {
        }

        /**
         * Creates a function, which creates a custom text composition style. May return an error with a message &quot;TONES_SAVED_TOO_MANY&quot; if the maximum number of added custom styles has been reached.
         *
         * <p> Returns {@link TextCompositionStyle TextCompositionStyle} </p>
         *
         * @param title Title of the style; 1-getOption(&quot;text_composition_style_title_length_max&quot;) characters.
         * @param customEmojiId Identifier of the custom emoji corresponding to the style.
         * @param prompt Prompt that will be used for text composition; 1-getOption(&quot;text_composition_style_prompt_length_max&quot;) characters.
         * @param showCreator Pass true if the current user must be shown as the creator of the style.
         */
        public CreateTextCompositionStyle(String title, long customEmojiId, String prompt, boolean showCreator) {
            this.title = title;
            this.customEmojiId = customEmojiId;
            this.prompt = prompt;
            this.showCreator = showCreator;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1549417869;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Creates a video chat (a group call bound to a chat); for basic groups, supergroups and channels only; requires canManageVideoChats administrator right.
     *
     * <p> Returns {@link GroupCallId GroupCallId} </p>
     */
    public static class CreateVideoChat extends Function<GroupCallId> {
        /**
         * Identifier of a chat in which the video chat will be created.
         */
        public long chatId;
        /**
         * Group call title; if empty, chat title will be used.
         */
        public String title;
        /**
         * Point in time (Unix timestamp) when the group call is expected to be started by an administrator; 0 to start the video chat immediately. The date must be at least 10 seconds and at most 8 days in the future.
         */
        public int startDate;
        /**
         * Pass true to create an RTMP stream instead of an ordinary video chat.
         */
        public boolean isRtmpStream;

        /**
         * Default constructor for a function, which creates a video chat (a group call bound to a chat); for basic groups, supergroups and channels only; requires canManageVideoChats administrator right.
         *
         * <p> Returns {@link GroupCallId GroupCallId} </p>
         */
        public CreateVideoChat() {
        }

        /**
         * Creates a function, which creates a video chat (a group call bound to a chat); for basic groups, supergroups and channels only; requires canManageVideoChats administrator right.
         *
         * <p> Returns {@link GroupCallId GroupCallId} </p>
         *
         * @param chatId Identifier of a chat in which the video chat will be created.
         * @param title Group call title; if empty, chat title will be used.
         * @param startDate Point in time (Unix timestamp) when the group call is expected to be started by an administrator; 0 to start the video chat immediately. The date must be at least 10 seconds and at most 8 days in the future.
         * @param isRtmpStream Pass true to create an RTMP stream instead of an ordinary video chat.
         */
        public CreateVideoChat(long chatId, String title, int startDate, boolean isRtmpStream) {
            this.chatId = chatId;
            this.title = title;
            this.startDate = startDate;
            this.isRtmpStream = isRtmpStream;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2124715405;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Declines an invitation to an active group call via messageGroupCall. Can be called both by the sender and the receiver of the invitation.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeclineGroupCallInvitation extends Function<Ok> {
        /**
         * Identifier of the chat with the message.
         */
        public long chatId;
        /**
         * Identifier of the message of the type messageGroupCall.
         */
        public long messageId;

        /**
         * Default constructor for a function, which declines an invitation to an active group call via messageGroupCall. Can be called both by the sender and the receiver of the invitation.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeclineGroupCallInvitation() {
        }

        /**
         * Creates a function, which declines an invitation to an active group call via messageGroupCall. Can be called both by the sender and the receiver of the invitation.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat with the message.
         * @param messageId Identifier of the message of the type messageGroupCall.
         */
        public DeclineGroupCallInvitation(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1843919377;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Declines an OAuth authorization request.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeclineOauthRequest extends Function<Ok> {
        /**
         * URL of the OAuth deep link.
         */
        public String url;

        /**
         * Default constructor for a function, which declines an OAuth authorization request.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeclineOauthRequest() {
        }

        /**
         * Creates a function, which declines an OAuth authorization request.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param url URL of the OAuth deep link.
         */
        public DeclineOauthRequest(String url) {
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 420650996;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Declines a suggested post in a channel direct messages chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeclineSuggestedPost extends Function<Ok> {
        /**
         * Chat identifier of the channel direct messages chat.
         */
        public long chatId;
        /**
         * Identifier of the message with the suggested post. Use messageProperties.canBeDeclined to check whether the suggested post can be declined.
         */
        public long messageId;
        /**
         * Comment for the creator of the suggested post; 0-128 characters.
         */
        public String comment;

        /**
         * Default constructor for a function, which declines a suggested post in a channel direct messages chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeclineSuggestedPost() {
        }

        /**
         * Creates a function, which declines a suggested post in a channel direct messages chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier of the channel direct messages chat.
         * @param messageId Identifier of the message with the suggested post. Use messageProperties.canBeDeclined to check whether the suggested post can be declined.
         * @param comment Comment for the creator of the suggested post; 0-128 characters.
         */
        public DeclineSuggestedPost(long chatId, long messageId, String comment) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.comment = comment;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1758260609;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Decrypts group call data received by tgcalls.
     *
     * <p> Returns {@link Data Data} </p>
     */
    public static class DecryptGroupCallData extends Function<Data> {
        /**
         * Group call identifier. The call must not be a video chat.
         */
        public int groupCallId;
        /**
         * Identifier of the group call participant, which sent the data.
         */
        public MessageSender participantId;
        /**
         * Data channel for which data was encrypted; pass null if unknown.
         */
        public GroupCallDataChannel dataChannel;
        /**
         * Data to decrypt.
         */
        public byte[] data;

        /**
         * Default constructor for a function, which decrypts group call data received by tgcalls.
         *
         * <p> Returns {@link Data Data} </p>
         */
        public DecryptGroupCallData() {
        }

        /**
         * Creates a function, which decrypts group call data received by tgcalls.
         *
         * <p> Returns {@link Data Data} </p>
         *
         * @param groupCallId Group call identifier. The call must not be a video chat.
         * @param participantId Identifier of the group call participant, which sent the data.
         * @param dataChannel Data channel for which data was encrypted; pass null if unknown.
         * @param data Data to decrypt.
         */
        public DecryptGroupCallData(int groupCallId, MessageSender participantId, GroupCallDataChannel dataChannel, byte[] data) {
            this.groupCallId = groupCallId;
            this.participantId = participantId;
            this.dataChannel = dataChannel;
            this.data = data;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1781743076;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes the account of the current user, deleting all information associated with the user from the server. The phone number of the account can be used to create a new account. Can be called before authorization when the current authorization state is authorizationStateWaitPassword.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteAccount extends Function<Ok> {
        /**
         * The reason why the account was deleted; optional.
         */
        public String reason;
        /**
         * The 2-step verification password of the current user. If the current user isn't authorized, then an empty string can be passed and account deletion can be canceled within one week.
         */
        public String password;

        /**
         * Default constructor for a function, which deletes the account of the current user, deleting all information associated with the user from the server. The phone number of the account can be used to create a new account. Can be called before authorization when the current authorization state is authorizationStateWaitPassword.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteAccount() {
        }

        /**
         * Creates a function, which deletes the account of the current user, deleting all information associated with the user from the server. The phone number of the account can be used to create a new account. Can be called before authorization when the current authorization state is authorizationStateWaitPassword.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param reason The reason why the account was deleted; optional.
         * @param password The 2-step verification password of the current user. If the current user isn't authorized, then an empty string can be passed and account deletion can be canceled within one week.
         */
        public DeleteAccount(String reason, String password) {
            this.reason = reason;
            this.password = password;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1395816134;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes all call messages.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteAllCallMessages extends Function<Ok> {
        /**
         * Pass true to delete the messages for all users.
         */
        public boolean revoke;

        /**
         * Default constructor for a function, which deletes all call messages.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteAllCallMessages() {
        }

        /**
         * Creates a function, which deletes all call messages.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param revoke Pass true to delete the messages for all users.
         */
        public DeleteAllCallMessages(boolean revoke) {
            this.revoke = revoke;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1466445325;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes all recent reactions added by the specified sender in a chat. Supported only for basic groups and supergroups; requires canDeleteMessages administrator right.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteAllRecentMessageReactionsFromSender extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifier of the sender of reactions to delete.
         */
        public MessageSender senderId;

        /**
         * Default constructor for a function, which deletes all recent reactions added by the specified sender in a chat. Supported only for basic groups and supergroups; requires canDeleteMessages administrator right.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteAllRecentMessageReactionsFromSender() {
        }

        /**
         * Creates a function, which deletes all recent reactions added by the specified sender in a chat. Supported only for basic groups and supergroups; requires canDeleteMessages administrator right.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param senderId Identifier of the sender of reactions to delete.
         */
        public DeleteAllRecentMessageReactionsFromSender(long chatId, MessageSender senderId) {
            this.chatId = chatId;
            this.senderId = senderId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -699051658;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes all revoked chat invite links created by a given chat administrator. Requires administrator privileges and canInviteUsers right in the chat for own links and owner privileges for other links.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteAllRevokedChatInviteLinks extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * User identifier of a chat administrator, which links will be deleted. Must be an identifier of the current user for non-owner.
         */
        public long creatorUserId;

        /**
         * Default constructor for a function, which deletes all revoked chat invite links created by a given chat administrator. Requires administrator privileges and canInviteUsers right in the chat for own links and owner privileges for other links.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteAllRevokedChatInviteLinks() {
        }

        /**
         * Creates a function, which deletes all revoked chat invite links created by a given chat administrator. Requires administrator privileges and canInviteUsers right in the chat for own links and owner privileges for other links.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param creatorUserId User identifier of a chat administrator, which links will be deleted. Must be an identifier of the current user for non-owner.
         */
        public DeleteAllRevokedChatInviteLinks(long chatId, long creatorUserId) {
            this.chatId = chatId;
            this.creatorUserId = creatorUserId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1112020698;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes media previews from the list of media previews of a bot.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteBotMediaPreviews extends Function<Ok> {
        /**
         * Identifier of the target bot. The bot must be owned and must have the main Web App.
         */
        public long botUserId;
        /**
         * Language code of the media previews to delete.
         */
        public String languageCode;
        /**
         * File identifiers of the media to delete.
         */
        public int[] fileIds;

        /**
         * Default constructor for a function, which deletes media previews from the list of media previews of a bot.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteBotMediaPreviews() {
        }

        /**
         * Creates a function, which deletes media previews from the list of media previews of a bot.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param botUserId Identifier of the target bot. The bot must be owned and must have the main Web App.
         * @param languageCode Language code of the media previews to delete.
         * @param fileIds File identifiers of the media to delete.
         */
        public DeleteBotMediaPreviews(long botUserId, String languageCode, int[] fileIds) {
            this.botUserId = botUserId;
            this.languageCode = languageCode;
            this.fileIds = fileIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1397512722;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes a business chat link of the current account.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteBusinessChatLink extends Function<Ok> {
        /**
         * The link to delete.
         */
        public String link;

        /**
         * Default constructor for a function, which deletes a business chat link of the current account.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteBusinessChatLink() {
        }

        /**
         * Creates a function, which deletes a business chat link of the current account.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param link The link to delete.
         */
        public DeleteBusinessChatLink(String link) {
            this.link = link;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1101895865;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes the business bot that is connected to the current user account.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteBusinessConnectedBot extends Function<Ok> {
        /**
         * Unique user identifier for the bot.
         */
        public long botUserId;

        /**
         * Default constructor for a function, which deletes the business bot that is connected to the current user account.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteBusinessConnectedBot() {
        }

        /**
         * Creates a function, which deletes the business bot that is connected to the current user account.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param botUserId Unique user identifier for the bot.
         */
        public DeleteBusinessConnectedBot(long botUserId) {
            this.botUserId = botUserId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1633976747;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes messages on behalf of a business account; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteBusinessMessages extends Function<Ok> {
        /**
         * Unique identifier of business connection through which the messages were received.
         */
        public String businessConnectionId;
        /**
         * Identifier of the messages.
         */
        public long[] messageIds;

        /**
         * Default constructor for a function, which deletes messages on behalf of a business account; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteBusinessMessages() {
        }

        /**
         * Creates a function, which deletes messages on behalf of a business account; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param businessConnectionId Unique identifier of business connection through which the messages were received.
         * @param messageIds Identifier of the messages.
         */
        public DeleteBusinessMessages(String businessConnectionId, long[] messageIds) {
            this.businessConnectionId = businessConnectionId;
            this.messageIds = messageIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1425721828;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes a story posted by the bot on behalf of a business account; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteBusinessStory extends Function<Ok> {
        /**
         * Unique identifier of business connection.
         */
        public String businessConnectionId;
        /**
         * Identifier of the story to delete.
         */
        public int storyId;

        /**
         * Default constructor for a function, which deletes a story posted by the bot on behalf of a business account; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteBusinessStory() {
        }

        /**
         * Creates a function, which deletes a story posted by the bot on behalf of a business account; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param businessConnectionId Unique identifier of business connection.
         * @param storyId Identifier of the story to delete.
         */
        public DeleteBusinessStory(String businessConnectionId, int storyId) {
            this.businessConnectionId = businessConnectionId;
            this.storyId = storyId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1024585042;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes a chat along with all messages in the corresponding chat for all chat members. For group chats this will release the usernames and remove all members. Use the field chat.canBeDeletedForAllUsers to find whether the method can be applied to the chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteChat extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which deletes a chat along with all messages in the corresponding chat for all chat members. For group chats this will release the usernames and remove all members. Use the field chat.canBeDeletedForAllUsers to find whether the method can be applied to the chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteChat() {
        }

        /**
         * Creates a function, which deletes a chat along with all messages in the corresponding chat for all chat members. For group chats this will release the usernames and remove all members. Use the field chat.canBeDeletedForAllUsers to find whether the method can be applied to the chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         */
        public DeleteChat(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -171253666;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes background in a specific chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteChatBackground extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Pass true to restore previously set background. Can be used only in private and secret chats with non-deleted users if userFullInfo.setChatBackground == true. Supposed to be used from messageChatSetBackground messages with the currently set background that was set for both sides by the other user.
         */
        public boolean restorePrevious;

        /**
         * Default constructor for a function, which deletes background in a specific chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteChatBackground() {
        }

        /**
         * Creates a function, which deletes background in a specific chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param restorePrevious Pass true to restore previously set background. Can be used only in private and secret chats with non-deleted users if userFullInfo.setChatBackground == true. Supposed to be used from messageChatSetBackground messages with the currently set background that was set for both sides by the other user.
         */
        public DeleteChatBackground(long chatId, boolean restorePrevious) {
            this.chatId = chatId;
            this.restorePrevious = restorePrevious;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 320267896;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes existing chat folder.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteChatFolder extends Function<Ok> {
        /**
         * Chat folder identifier.
         */
        public int chatFolderId;
        /**
         * Identifiers of the chats to leave. The chats must be pinned or always included in the folder.
         */
        public long[] leaveChatIds;

        /**
         * Default constructor for a function, which deletes existing chat folder.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteChatFolder() {
        }

        /**
         * Creates a function, which deletes existing chat folder.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatFolderId Chat folder identifier.
         * @param leaveChatIds Identifiers of the chats to leave. The chats must be pinned or always included in the folder.
         */
        public DeleteChatFolder(int chatFolderId, long[] leaveChatIds) {
            this.chatFolderId = chatFolderId;
            this.leaveChatIds = leaveChatIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1956364551;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes an invite link for a chat folder.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteChatFolderInviteLink extends Function<Ok> {
        /**
         * Chat folder identifier.
         */
        public int chatFolderId;
        /**
         * Invite link to be deleted.
         */
        public String inviteLink;

        /**
         * Default constructor for a function, which deletes an invite link for a chat folder.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteChatFolderInviteLink() {
        }

        /**
         * Creates a function, which deletes an invite link for a chat folder.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatFolderId Chat folder identifier.
         * @param inviteLink Invite link to be deleted.
         */
        public DeleteChatFolderInviteLink(int chatFolderId, String inviteLink) {
            this.chatFolderId = chatFolderId;
            this.inviteLink = inviteLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -930057858;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes all messages in the chat. Use chat.canBeDeletedOnlyForSelf and chat.canBeDeletedForAllUsers fields to find whether and how the method can be applied to the chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteChatHistory extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Pass true to remove the chat from all chat lists.
         */
        public boolean removeFromChatList;
        /**
         * Pass true to delete chat history for all users.
         */
        public boolean revoke;

        /**
         * Default constructor for a function, which deletes all messages in the chat. Use chat.canBeDeletedOnlyForSelf and chat.canBeDeletedForAllUsers fields to find whether and how the method can be applied to the chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteChatHistory() {
        }

        /**
         * Creates a function, which deletes all messages in the chat. Use chat.canBeDeletedOnlyForSelf and chat.canBeDeletedForAllUsers fields to find whether and how the method can be applied to the chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param removeFromChatList Pass true to remove the chat from all chat lists.
         * @param revoke Pass true to delete chat history for all users.
         */
        public DeleteChatHistory(long chatId, boolean removeFromChatList, boolean revoke) {
            this.chatId = chatId;
            this.removeFromChatList = removeFromChatList;
            this.revoke = revoke;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1472081761;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes all messages between the specified dates in a chat. Supported only for private chats and basic groups. Messages sent in the last 30 seconds will not be deleted.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteChatMessagesByDate extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The minimum date of the messages to delete.
         */
        public int minDate;
        /**
         * The maximum date of the messages to delete.
         */
        public int maxDate;
        /**
         * Pass true to delete chat messages for all users; private chats only.
         */
        public boolean revoke;

        /**
         * Default constructor for a function, which deletes all messages between the specified dates in a chat. Supported only for private chats and basic groups. Messages sent in the last 30 seconds will not be deleted.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteChatMessagesByDate() {
        }

        /**
         * Creates a function, which deletes all messages between the specified dates in a chat. Supported only for private chats and basic groups. Messages sent in the last 30 seconds will not be deleted.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param minDate The minimum date of the messages to delete.
         * @param maxDate The maximum date of the messages to delete.
         * @param revoke Pass true to delete chat messages for all users; private chats only.
         */
        public DeleteChatMessagesByDate(long chatId, int minDate, int maxDate, boolean revoke) {
            this.chatId = chatId;
            this.minDate = minDate;
            this.maxDate = maxDate;
            this.revoke = revoke;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1639653185;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes all messages sent by the specified message sender in a chat. Supported only for supergroups; requires canDeleteMessages administrator right.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteChatMessagesBySender extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifier of the sender of messages to delete.
         */
        public MessageSender senderId;

        /**
         * Default constructor for a function, which deletes all messages sent by the specified message sender in a chat. Supported only for supergroups; requires canDeleteMessages administrator right.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteChatMessagesBySender() {
        }

        /**
         * Creates a function, which deletes all messages sent by the specified message sender in a chat. Supported only for supergroups; requires canDeleteMessages administrator right.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param senderId Identifier of the sender of messages to delete.
         */
        public DeleteChatMessagesBySender(long chatId, MessageSender senderId) {
            this.chatId = chatId;
            this.senderId = senderId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1164235161;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes the default reply markup from a chat. Must be called after a one-time keyboard or a replyMarkupForceReply reply markup has been used or dismissed.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteChatReplyMarkup extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The message identifier of the used keyboard.
         */
        public long messageId;

        /**
         * Default constructor for a function, which deletes the default reply markup from a chat. Must be called after a one-time keyboard or a replyMarkupForceReply reply markup has been used or dismissed.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteChatReplyMarkup() {
        }

        /**
         * Creates a function, which deletes the default reply markup from a chat. Must be called after a one-time keyboard or a replyMarkupForceReply reply markup has been used or dismissed.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param messageId The message identifier of the used keyboard.
         */
        public DeleteChatReplyMarkup(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 100637531;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes commands supported by the bot for the given user scope and language; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteCommands extends Function<Ok> {
        /**
         * The scope to which the commands are relevant; pass null to delete commands in the default bot command scope.
         */
        public BotCommandScope scope;
        /**
         * A two-letter ISO 639-1 language code or an empty string.
         */
        public String languageCode;

        /**
         * Default constructor for a function, which deletes commands supported by the bot for the given user scope and language; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteCommands() {
        }

        /**
         * Creates a function, which deletes commands supported by the bot for the given user scope and language; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param scope The scope to which the commands are relevant; pass null to delete commands in the default bot command scope.
         * @param languageCode A two-letter ISO 639-1 language code or an empty string.
         */
        public DeleteCommands(BotCommandScope scope, String languageCode) {
            this.scope = scope;
            this.languageCode = languageCode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1002732586;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes default background for chats.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteDefaultBackground extends Function<Ok> {
        /**
         * Pass true if the background is deleted for a dark theme.
         */
        public boolean forDarkTheme;

        /**
         * Default constructor for a function, which deletes default background for chats.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteDefaultBackground() {
        }

        /**
         * Creates a function, which deletes default background for chats.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param forDarkTheme Pass true if the background is deleted for a dark theme.
         */
        public DeleteDefaultBackground(boolean forDarkTheme) {
            this.forDarkTheme = forDarkTheme;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1297814210;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes all messages in the topic in a channel direct messages chat administered by the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteDirectMessagesChatTopicHistory extends Function<Ok> {
        /**
         * Chat identifier of the channel direct messages chat.
         */
        public long chatId;
        /**
         * Identifier of the topic which messages will be deleted.
         */
        public long topicId;

        /**
         * Default constructor for a function, which deletes all messages in the topic in a channel direct messages chat administered by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteDirectMessagesChatTopicHistory() {
        }

        /**
         * Creates a function, which deletes all messages in the topic in a channel direct messages chat administered by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier of the channel direct messages chat.
         * @param topicId Identifier of the topic which messages will be deleted.
         */
        public DeleteDirectMessagesChatTopicHistory(long chatId, long topicId) {
            this.chatId = chatId;
            this.topicId = topicId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1906080196;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes all messages between the specified dates in the topic in a channel direct messages chat administered by the current user. Messages sent in the last 30 seconds will not be deleted.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteDirectMessagesChatTopicMessagesByDate extends Function<Ok> {
        /**
         * Chat identifier of the channel direct messages chat.
         */
        public long chatId;
        /**
         * Identifier of the topic which messages will be deleted.
         */
        public long topicId;
        /**
         * The minimum date of the messages to delete.
         */
        public int minDate;
        /**
         * The maximum date of the messages to delete.
         */
        public int maxDate;

        /**
         * Default constructor for a function, which deletes all messages between the specified dates in the topic in a channel direct messages chat administered by the current user. Messages sent in the last 30 seconds will not be deleted.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteDirectMessagesChatTopicMessagesByDate() {
        }

        /**
         * Creates a function, which deletes all messages between the specified dates in the topic in a channel direct messages chat administered by the current user. Messages sent in the last 30 seconds will not be deleted.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier of the channel direct messages chat.
         * @param topicId Identifier of the topic which messages will be deleted.
         * @param minDate The minimum date of the messages to delete.
         * @param maxDate The maximum date of the messages to delete.
         */
        public DeleteDirectMessagesChatTopicMessagesByDate(long chatId, long topicId, int minDate, int maxDate) {
            this.chatId = chatId;
            this.topicId = topicId;
            this.minDate = minDate;
            this.maxDate = maxDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 945080841;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes a file from the TDLib file cache.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteFile extends Function<Ok> {
        /**
         * Identifier of the file to delete.
         */
        public int fileId;

        /**
         * Default constructor for a function, which deletes a file from the TDLib file cache.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteFile() {
        }

        /**
         * Creates a function, which deletes a file from the TDLib file cache.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param fileId Identifier of the file to delete.
         */
        public DeleteFile(int fileId) {
            this.fileId = fileId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1807653676;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes all messages from a topic in a forum supergroup chat or a chat with a bot with topics; requires canDeleteMessages administrator right in the supergroup unless the user is creator of the topic, the topic has no messages from other users and has at most 11 messages.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteForumTopic extends Function<Ok> {
        /**
         * Identifier of the chat.
         */
        public long chatId;
        /**
         * Forum topic identifier.
         */
        public int forumTopicId;

        /**
         * Default constructor for a function, which deletes all messages from a topic in a forum supergroup chat or a chat with a bot with topics; requires canDeleteMessages administrator right in the supergroup unless the user is creator of the topic, the topic has no messages from other users and has at most 11 messages.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteForumTopic() {
        }

        /**
         * Creates a function, which deletes all messages from a topic in a forum supergroup chat or a chat with a bot with topics; requires canDeleteMessages administrator right in the supergroup unless the user is creator of the topic, the topic has no messages from other users and has at most 11 messages.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat.
         * @param forumTopicId Forum topic identifier.
         */
        public DeleteForumTopic(long chatId, int forumTopicId) {
            this.chatId = chatId;
            this.forumTopicId = forumTopicId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2121212039;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes a gift collection. If the collection is owned by a channel chat, then requires canPostMessages administrator right in the channel chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteGiftCollection extends Function<Ok> {
        /**
         * Identifier of the user or the channel chat that owns the collection.
         */
        public MessageSender ownerId;
        /**
         * Identifier of the gift collection.
         */
        public int collectionId;

        /**
         * Default constructor for a function, which deletes a gift collection. If the collection is owned by a channel chat, then requires canPostMessages administrator right in the channel chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteGiftCollection() {
        }

        /**
         * Creates a function, which deletes a gift collection. If the collection is owned by a channel chat, then requires canPostMessages administrator right in the channel chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param ownerId Identifier of the user or the channel chat that owns the collection.
         * @param collectionId Identifier of the gift collection.
         */
        public DeleteGiftCollection(MessageSender ownerId, int collectionId) {
            this.ownerId = ownerId;
            this.collectionId = collectionId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -183749499;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes messages in a group call; for live story calls only. Requires groupCallMessage.canBeDeleted right.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteGroupCallMessages extends Function<Ok> {
        /**
         * Group call identifier.
         */
        public int groupCallId;
        /**
         * Identifiers of the messages to be deleted.
         */
        public int[] messageIds;
        /**
         * Pass true to report the messages as spam.
         */
        public boolean reportSpam;

        /**
         * Default constructor for a function, which deletes messages in a group call; for live story calls only. Requires groupCallMessage.canBeDeleted right.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteGroupCallMessages() {
        }

        /**
         * Creates a function, which deletes messages in a group call; for live story calls only. Requires groupCallMessage.canBeDeleted right.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier.
         * @param messageIds Identifiers of the messages to be deleted.
         * @param reportSpam Pass true to report the messages as spam.
         */
        public DeleteGroupCallMessages(int groupCallId, int[] messageIds, boolean reportSpam) {
            this.groupCallId = groupCallId;
            this.messageIds = messageIds;
            this.reportSpam = reportSpam;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 339562398;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes all messages sent by the specified message sender in a group call; for live story calls only. Requires groupCall.canDeleteMessages right.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteGroupCallMessagesBySender extends Function<Ok> {
        /**
         * Group call identifier.
         */
        public int groupCallId;
        /**
         * Identifier of the sender of messages to delete.
         */
        public MessageSender senderId;
        /**
         * Pass true to report the messages as spam.
         */
        public boolean reportSpam;

        /**
         * Default constructor for a function, which deletes all messages sent by the specified message sender in a group call; for live story calls only. Requires groupCall.canDeleteMessages right.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteGroupCallMessagesBySender() {
        }

        /**
         * Creates a function, which deletes all messages sent by the specified message sender in a group call; for live story calls only. Requires groupCall.canDeleteMessages right.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier.
         * @param senderId Identifier of the sender of messages to delete.
         * @param reportSpam Pass true to report the messages as spam.
         */
        public DeleteGroupCallMessagesBySender(int groupCallId, MessageSender senderId, boolean reportSpam) {
            this.groupCallId = groupCallId;
            this.senderId = senderId;
            this.reportSpam = reportSpam;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1677247618;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes all information about a language pack in the current localization target. The language pack which is currently in use (including base language pack) or is being synchronized can't be deleted. Can be called before authorization.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteLanguagePack extends Function<Ok> {
        /**
         * Identifier of the language pack to delete.
         */
        public String languagePackId;

        /**
         * Default constructor for a function, which deletes all information about a language pack in the current localization target. The language pack which is currently in use (including base language pack) or is being synchronized can't be deleted. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteLanguagePack() {
        }

        /**
         * Creates a function, which deletes all information about a language pack in the current localization target. The language pack which is currently in use (including base language pack) or is being synchronized can't be deleted. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param languagePackId Identifier of the language pack to delete.
         */
        public DeleteLanguagePack(String languagePackId) {
            this.languagePackId = languagePackId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2108761026;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes all reactions added by the specified sender on a message.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteMessageReactionsFromSender extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifier of the message containing the reactions. Use messageProperties.canDeleteReactions to check whether the method can be used for a message.
         */
        public long messageId;
        /**
         * Identifier of the sender of reactions to delete.
         */
        public MessageSender senderId;

        /**
         * Default constructor for a function, which deletes all reactions added by the specified sender on a message.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteMessageReactionsFromSender() {
        }

        /**
         * Creates a function, which deletes all reactions added by the specified sender on a message.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param messageId Identifier of the message containing the reactions. Use messageProperties.canDeleteReactions to check whether the method can be used for a message.
         * @param senderId Identifier of the sender of reactions to delete.
         */
        public DeleteMessageReactionsFromSender(long chatId, long messageId, MessageSender senderId) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.senderId = senderId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 780354493;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes messages.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteMessages extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifiers of the messages to be deleted. Use messageProperties.canBeDeletedOnlyForSelf and messageProperties.canBeDeletedForAllUsers to get suitable messages.
         */
        public long[] messageIds;
        /**
         * Pass true to delete messages for all chat members. Always true for supergroups, channels and secret chats.
         */
        public boolean revoke;

        /**
         * Default constructor for a function, which deletes messages.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteMessages() {
        }

        /**
         * Creates a function, which deletes messages.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param messageIds Identifiers of the messages to be deleted. Use messageProperties.canBeDeletedOnlyForSelf and messageProperties.canBeDeletedForAllUsers to get suitable messages.
         * @param revoke Pass true to delete messages for all chat members. Always true for supergroups, channels and secret chats.
         */
        public DeleteMessages(long chatId, long[] messageIds, boolean revoke) {
            this.chatId = chatId;
            this.messageIds = messageIds;
            this.revoke = revoke;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1130090173;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes a Telegram Passport element.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeletePassportElement extends Function<Ok> {
        /**
         * Element type.
         */
        public PassportElementType type;

        /**
         * Default constructor for a function, which deletes a Telegram Passport element.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeletePassportElement() {
        }

        /**
         * Creates a function, which deletes a Telegram Passport element.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param type Element type.
         */
        public DeletePassportElement(PassportElementType type) {
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1719555468;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes an option from a poll.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeletePollOption extends Function<Ok> {
        /**
         * Identifier of the chat to which the poll belongs.
         */
        public long chatId;
        /**
         * Identifier of the message containing the poll.
         */
        public long messageId;
        /**
         * Unique identifier of the option. Use pollOptionProperties.canBeDeleted to check whether the option can be deleted by the user.
         */
        public String optionId;

        /**
         * Default constructor for a function, which deletes an option from a poll.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeletePollOption() {
        }

        /**
         * Creates a function, which deletes an option from a poll.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat to which the poll belongs.
         * @param messageId Identifier of the message containing the poll.
         * @param optionId Unique identifier of the option. Use pollOptionProperties.canBeDeleted to check whether the option can be deleted by the user.
         */
        public DeletePollOption(long chatId, long messageId, String optionId) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.optionId = optionId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1459634839;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes a profile photo.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteProfilePhoto extends Function<Ok> {
        /**
         * Identifier of the profile photo to delete.
         */
        public long profilePhotoId;

        /**
         * Default constructor for a function, which deletes a profile photo.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteProfilePhoto() {
        }

        /**
         * Creates a function, which deletes a profile photo.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param profilePhotoId Identifier of the profile photo to delete.
         */
        public DeleteProfilePhoto(long profilePhotoId) {
            this.profilePhotoId = profilePhotoId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1319794625;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes a quick reply shortcut.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteQuickReplyShortcut extends Function<Ok> {
        /**
         * Unique identifier of the quick reply shortcut.
         */
        public int shortcutId;

        /**
         * Default constructor for a function, which deletes a quick reply shortcut.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteQuickReplyShortcut() {
        }

        /**
         * Creates a function, which deletes a quick reply shortcut.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param shortcutId Unique identifier of the quick reply shortcut.
         */
        public DeleteQuickReplyShortcut(int shortcutId) {
            this.shortcutId = shortcutId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -246911978;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes specified quick reply messages.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteQuickReplyShortcutMessages extends Function<Ok> {
        /**
         * Unique identifier of the quick reply shortcut to which the messages belong.
         */
        public int shortcutId;
        /**
         * Unique identifiers of the messages.
         */
        public long[] messageIds;

        /**
         * Default constructor for a function, which deletes specified quick reply messages.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteQuickReplyShortcutMessages() {
        }

        /**
         * Creates a function, which deletes specified quick reply messages.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param shortcutId Unique identifier of the quick reply shortcut to which the messages belong.
         * @param messageIds Unique identifiers of the messages.
         */
        public DeleteQuickReplyShortcutMessages(int shortcutId, long[] messageIds) {
            this.shortcutId = shortcutId;
            this.messageIds = messageIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -40522947;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes revoked chat invite links. Requires administrator privileges and canInviteUsers right in the chat for own links and owner privileges for other links.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteRevokedChatInviteLink extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Invite link to revoke.
         */
        public String inviteLink;

        /**
         * Default constructor for a function, which deletes revoked chat invite links. Requires administrator privileges and canInviteUsers right in the chat for own links and owner privileges for other links.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteRevokedChatInviteLink() {
        }

        /**
         * Creates a function, which deletes revoked chat invite links. Requires administrator privileges and canInviteUsers right in the chat for own links and owner privileges for other links.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param inviteLink Invite link to revoke.
         */
        public DeleteRevokedChatInviteLink(long chatId, String inviteLink) {
            this.chatId = chatId;
            this.inviteLink = inviteLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1859711873;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes saved credentials for all payment provider bots.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteSavedCredentials extends Function<Ok> {

        /**
         * Default constructor for a function, which deletes saved credentials for all payment provider bots.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteSavedCredentials() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 826300114;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes all messages in a Saved Messages topic.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteSavedMessagesTopicHistory extends Function<Ok> {
        /**
         * Identifier of Saved Messages topic which messages will be deleted.
         */
        public long savedMessagesTopicId;

        /**
         * Default constructor for a function, which deletes all messages in a Saved Messages topic.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteSavedMessagesTopicHistory() {
        }

        /**
         * Creates a function, which deletes all messages in a Saved Messages topic.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param savedMessagesTopicId Identifier of Saved Messages topic which messages will be deleted.
         */
        public DeleteSavedMessagesTopicHistory(long savedMessagesTopicId) {
            this.savedMessagesTopicId = savedMessagesTopicId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1776237930;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes all messages between the specified dates in a Saved Messages topic. Messages sent in the last 30 seconds will not be deleted.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteSavedMessagesTopicMessagesByDate extends Function<Ok> {
        /**
         * Identifier of Saved Messages topic which messages will be deleted.
         */
        public long savedMessagesTopicId;
        /**
         * The minimum date of the messages to delete.
         */
        public int minDate;
        /**
         * The maximum date of the messages to delete.
         */
        public int maxDate;

        /**
         * Default constructor for a function, which deletes all messages between the specified dates in a Saved Messages topic. Messages sent in the last 30 seconds will not be deleted.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteSavedMessagesTopicMessagesByDate() {
        }

        /**
         * Creates a function, which deletes all messages between the specified dates in a Saved Messages topic. Messages sent in the last 30 seconds will not be deleted.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param savedMessagesTopicId Identifier of Saved Messages topic which messages will be deleted.
         * @param minDate The minimum date of the messages to delete.
         * @param maxDate The maximum date of the messages to delete.
         */
        public DeleteSavedMessagesTopicMessagesByDate(long savedMessagesTopicId, int minDate, int maxDate) {
            this.savedMessagesTopicId = savedMessagesTopicId;
            this.minDate = minDate;
            this.maxDate = maxDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1444389;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes saved order information.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteSavedOrderInfo extends Function<Ok> {

        /**
         * Default constructor for a function, which deletes saved order information.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteSavedOrderInfo() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1629058164;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Completely deletes a sticker set.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteStickerSet extends Function<Ok> {
        /**
         * Sticker set name. The sticker set must be owned by the current user.
         */
        public String name;

        /**
         * Default constructor for a function, which completely deletes a sticker set.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteStickerSet() {
        }

        /**
         * Creates a function, which completely deletes a sticker set.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param name Sticker set name. The sticker set must be owned by the current user.
         */
        public DeleteStickerSet(String name) {
            this.name = name;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1577745325;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes a previously posted story. Can be called only if story.canBeDeleted == true.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteStory extends Function<Ok> {
        /**
         * Identifier of the chat that posted the story.
         */
        public long storyPosterChatId;
        /**
         * Identifier of the story to delete.
         */
        public int storyId;

        /**
         * Default constructor for a function, which deletes a previously posted story. Can be called only if story.canBeDeleted == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteStory() {
        }

        /**
         * Creates a function, which deletes a previously posted story. Can be called only if story.canBeDeleted == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param storyPosterChatId Identifier of the chat that posted the story.
         * @param storyId Identifier of the story to delete.
         */
        public DeleteStory(long storyPosterChatId, int storyId) {
            this.storyPosterChatId = storyPosterChatId;
            this.storyId = storyId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2020144472;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes a story album. If the album is owned by a supergroup or a channel chat, then requires canEditStories administrator right in the chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteStoryAlbum extends Function<Ok> {
        /**
         * Identifier of the chat that owns the stories.
         */
        public long chatId;
        /**
         * Identifier of the story album.
         */
        public int storyAlbumId;

        /**
         * Default constructor for a function, which deletes a story album. If the album is owned by a supergroup or a channel chat, then requires canEditStories administrator right in the chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteStoryAlbum() {
        }

        /**
         * Creates a function, which deletes a story album. If the album is owned by a supergroup or a channel chat, then requires canEditStories administrator right in the chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat that owns the stories.
         * @param storyAlbumId Identifier of the story album.
         */
        public DeleteStoryAlbum(long chatId, int storyAlbumId) {
            this.chatId = chatId;
            this.storyAlbumId = storyAlbumId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -658327628;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Deletes a custom text composition style that was created by the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DeleteTextCompositionStyle extends Function<Ok> {
        /**
         * Name of the style.
         */
        public String name;

        /**
         * Default constructor for a function, which deletes a custom text composition style that was created by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DeleteTextCompositionStyle() {
        }

        /**
         * Creates a function, which deletes a custom text composition style that was created by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param name Name of the style.
         */
        public DeleteTextCompositionStyle(String name) {
            this.name = name;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1239832880;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Closes the TDLib instance, destroying all local data without a proper logout. The current user session will remain in the list of all active sessions. All local data will be destroyed. After the destruction completes updateAuthorizationState with authorizationStateClosed will be sent. Can be called before authorization.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class Destroy extends Function<Ok> {

        /**
         * Default constructor for a function, which closes the TDLib instance, destroying all local data without a proper logout. The current user session will remain in the list of all active sessions. All local data will be destroyed. After the destruction completes updateAuthorizationState with authorizationStateClosed will be sent. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public Destroy() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 685331274;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Disables all active non-editable usernames of a supergroup or channel, requires owner privileges in the supergroup or channel.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DisableAllSupergroupUsernames extends Function<Ok> {
        /**
         * Identifier of the supergroup or channel.
         */
        public long supergroupId;

        /**
         * Default constructor for a function, which disables all active non-editable usernames of a supergroup or channel, requires owner privileges in the supergroup or channel.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DisableAllSupergroupUsernames() {
        }

        /**
         * Creates a function, which disables all active non-editable usernames of a supergroup or channel, requires owner privileges in the supergroup or channel.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param supergroupId Identifier of the supergroup or channel.
         */
        public DisableAllSupergroupUsernames(long supergroupId) {
            this.supergroupId = supergroupId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 843511216;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Disables the currently enabled proxy. Can be called before authorization.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DisableProxy extends Function<Ok> {

        /**
         * Default constructor for a function, which disables the currently enabled proxy. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DisableProxy() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2100095102;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Discards a call.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DiscardCall extends Function<Ok> {
        /**
         * Call identifier.
         */
        public int callId;
        /**
         * Pass true if the user was disconnected.
         */
        public boolean isDisconnected;
        /**
         * If the call was upgraded to a group call, pass invite link to the group call.
         */
        public String inviteLink;
        /**
         * The call duration, in seconds.
         */
        public int duration;
        /**
         * Pass true if the call was a video call.
         */
        public boolean isVideo;
        /**
         * Identifier of the connection used during the call.
         */
        public long connectionId;

        /**
         * Default constructor for a function, which discards a call.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DiscardCall() {
        }

        /**
         * Creates a function, which discards a call.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param callId Call identifier.
         * @param isDisconnected Pass true if the user was disconnected.
         * @param inviteLink If the call was upgraded to a group call, pass invite link to the group call.
         * @param duration The call duration, in seconds.
         * @param isVideo Pass true if the call was a video call.
         * @param connectionId Identifier of the connection used during the call.
         */
        public DiscardCall(int callId, boolean isDisconnected, String inviteLink, int duration, boolean isVideo, long connectionId) {
            this.callId = callId;
            this.isDisconnected = isDisconnected;
            this.inviteLink = inviteLink;
            this.duration = duration;
            this.isVideo = isVideo;
            this.connectionId = connectionId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1545983346;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Disconnects an affiliate program from the given affiliate and immediately deactivates its referral link. Returns updated information about the disconnected affiliate program.
     *
     * <p> Returns {@link ConnectedAffiliateProgram ConnectedAffiliateProgram} </p>
     */
    public static class DisconnectAffiliateProgram extends Function<ConnectedAffiliateProgram> {
        /**
         * The affiliate to which the affiliate program is connected.
         */
        public AffiliateType affiliate;
        /**
         * The referral link of the affiliate program.
         */
        public String url;

        /**
         * Default constructor for a function, which disconnects an affiliate program from the given affiliate and immediately deactivates its referral link. Returns updated information about the disconnected affiliate program.
         *
         * <p> Returns {@link ConnectedAffiliateProgram ConnectedAffiliateProgram} </p>
         */
        public DisconnectAffiliateProgram() {
        }

        /**
         * Creates a function, which disconnects an affiliate program from the given affiliate and immediately deactivates its referral link. Returns updated information about the disconnected affiliate program.
         *
         * <p> Returns {@link ConnectedAffiliateProgram ConnectedAffiliateProgram} </p>
         *
         * @param affiliate The affiliate to which the affiliate program is connected.
         * @param url The referral link of the affiliate program.
         */
        public DisconnectAffiliateProgram(AffiliateType affiliate, String url) {
            this.affiliate = affiliate;
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -105831172;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Disconnects all websites from the current user's Telegram account.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DisconnectAllWebsites extends Function<Ok> {

        /**
         * Default constructor for a function, which disconnects all websites from the current user's Telegram account.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DisconnectAllWebsites() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1082985981;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Disconnects website from the current user's Telegram account.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DisconnectWebsite extends Function<Ok> {
        /**
         * Website identifier.
         */
        public long websiteId;

        /**
         * Default constructor for a function, which disconnects website from the current user's Telegram account.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DisconnectWebsite() {
        }

        /**
         * Creates a function, which disconnects website from the current user's Telegram account.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param websiteId Website identifier.
         */
        public DisconnectWebsite(long websiteId) {
            this.websiteId = websiteId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -778767395;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Downloads a file from the cloud. Download progress and completion of the download will be notified through updateFile updates.
     *
     * <p> Returns {@link File File} </p>
     */
    public static class DownloadFile extends Function<File> {
        /**
         * Identifier of the file to download.
         */
        public int fileId;
        /**
         * Priority of the download (1-32). The higher the priority, the earlier the file will be downloaded. If the priorities of two files are equal, then the last one for which downloadFile/addFileToDownloads was called will be downloaded first.
         */
        public int priority;
        /**
         * The starting position from which the file needs to be downloaded.
         */
        public long offset;
        /**
         * Number of bytes which need to be downloaded starting from the &quot;offset&quot; position before the download will automatically be canceled; use 0 to download without a limit.
         */
        public long limit;
        /**
         * Pass true to return response only after the file download has succeeded, has failed, has been canceled, or a new downloadFile request with different offset/limit parameters was sent; pass false to return file state immediately, just after the download has been started.
         */
        public boolean synchronous;

        /**
         * Default constructor for a function, which downloads a file from the cloud. Download progress and completion of the download will be notified through updateFile updates.
         *
         * <p> Returns {@link File File} </p>
         */
        public DownloadFile() {
        }

        /**
         * Creates a function, which downloads a file from the cloud. Download progress and completion of the download will be notified through updateFile updates.
         *
         * <p> Returns {@link File File} </p>
         *
         * @param fileId Identifier of the file to download.
         * @param priority Priority of the download (1-32). The higher the priority, the earlier the file will be downloaded. If the priorities of two files are equal, then the last one for which downloadFile/addFileToDownloads was called will be downloaded first.
         * @param offset The starting position from which the file needs to be downloaded.
         * @param limit Number of bytes which need to be downloaded starting from the &quot;offset&quot; position before the download will automatically be canceled; use 0 to download without a limit.
         * @param synchronous Pass true to return response only after the file download has succeeded, has failed, has been canceled, or a new downloadFile request with different offset/limit parameters was sent; pass false to return file state immediately, just after the download has been started.
         */
        public DownloadFile(int fileId, int priority, long offset, long limit, boolean synchronous) {
            this.fileId = fileId;
            this.priority = priority;
            this.offset = offset;
            this.limit = limit;
            this.synchronous = synchronous;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1059402292;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Drops original details for an upgraded gift.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class DropGiftOriginalDetails extends Function<Ok> {
        /**
         * Identifier of the gift.
         */
        public String receivedGiftId;
        /**
         * The Telegram Star amount required to pay for the operation.
         */
        public long starCount;

        /**
         * Default constructor for a function, which drops original details for an upgraded gift.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public DropGiftOriginalDetails() {
        }

        /**
         * Creates a function, which drops original details for an upgraded gift.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param receivedGiftId Identifier of the gift.
         * @param starCount The Telegram Star amount required to pay for the operation.
         */
        public DropGiftOriginalDetails(String receivedGiftId, long starCount) {
            this.receivedGiftId = receivedGiftId;
            this.starCount = starCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1394445843;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Replaces media preview in the list of media previews of a bot. Returns the new preview after edit is completed server-side.
     *
     * <p> Returns {@link BotMediaPreview BotMediaPreview} </p>
     */
    public static class EditBotMediaPreview extends Function<BotMediaPreview> {
        /**
         * Identifier of the target bot. The bot must be owned and must have the main Web App.
         */
        public long botUserId;
        /**
         * Language code of the media preview to edit.
         */
        public String languageCode;
        /**
         * File identifier of the media to replace.
         */
        public int fileId;
        /**
         * Content of the new preview.
         */
        public InputStoryContent content;

        /**
         * Default constructor for a function, which replaces media preview in the list of media previews of a bot. Returns the new preview after edit is completed server-side.
         *
         * <p> Returns {@link BotMediaPreview BotMediaPreview} </p>
         */
        public EditBotMediaPreview() {
        }

        /**
         * Creates a function, which replaces media preview in the list of media previews of a bot. Returns the new preview after edit is completed server-side.
         *
         * <p> Returns {@link BotMediaPreview BotMediaPreview} </p>
         *
         * @param botUserId Identifier of the target bot. The bot must be owned and must have the main Web App.
         * @param languageCode Language code of the media preview to edit.
         * @param fileId File identifier of the media to replace.
         * @param content Content of the new preview.
         */
        public EditBotMediaPreview(long botUserId, String languageCode, int fileId, InputStoryContent content) {
            this.botUserId = botUserId;
            this.languageCode = languageCode;
            this.fileId = fileId;
            this.content = content;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2037031582;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits a business chat link of the current account. Requires Telegram Business subscription. Returns the edited link.
     *
     * <p> Returns {@link BusinessChatLink BusinessChatLink} </p>
     */
    public static class EditBusinessChatLink extends Function<BusinessChatLink> {
        /**
         * The link to edit.
         */
        public String link;
        /**
         * New description of the link.
         */
        public InputBusinessChatLink linkInfo;

        /**
         * Default constructor for a function, which edits a business chat link of the current account. Requires Telegram Business subscription. Returns the edited link.
         *
         * <p> Returns {@link BusinessChatLink BusinessChatLink} </p>
         */
        public EditBusinessChatLink() {
        }

        /**
         * Creates a function, which edits a business chat link of the current account. Requires Telegram Business subscription. Returns the edited link.
         *
         * <p> Returns {@link BusinessChatLink BusinessChatLink} </p>
         *
         * @param link The link to edit.
         * @param linkInfo New description of the link.
         */
        public EditBusinessChatLink(String link, InputBusinessChatLink linkInfo) {
            this.link = link;
            this.linkInfo = linkInfo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1594947110;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits the caption of a message sent on behalf of a business account; for bots only.
     *
     * <p> Returns {@link BusinessMessage BusinessMessage} </p>
     */
    public static class EditBusinessMessageCaption extends Function<BusinessMessage> {
        /**
         * Unique identifier of business connection on behalf of which the message was sent.
         */
        public String businessConnectionId;
        /**
         * The chat the message belongs to.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * The new message reply markup; pass null if none.
         */
        public ReplyMarkup replyMarkup;
        /**
         * New message content caption; pass null to remove caption; 0-getOption(&quot;message_caption_length_max&quot;) characters.
         */
        public FormattedText caption;
        /**
         * Pass true to show the caption above the media; otherwise, the caption will be shown below the media. May be true only for animation, photo, and video messages.
         */
        public boolean showCaptionAboveMedia;

        /**
         * Default constructor for a function, which edits the caption of a message sent on behalf of a business account; for bots only.
         *
         * <p> Returns {@link BusinessMessage BusinessMessage} </p>
         */
        public EditBusinessMessageCaption() {
        }

        /**
         * Creates a function, which edits the caption of a message sent on behalf of a business account; for bots only.
         *
         * <p> Returns {@link BusinessMessage BusinessMessage} </p>
         *
         * @param businessConnectionId Unique identifier of business connection on behalf of which the message was sent.
         * @param chatId The chat the message belongs to.
         * @param messageId Identifier of the message.
         * @param replyMarkup The new message reply markup; pass null if none.
         * @param caption New message content caption; pass null to remove caption; 0-getOption(&quot;message_caption_length_max&quot;) characters.
         * @param showCaptionAboveMedia Pass true to show the caption above the media; otherwise, the caption will be shown below the media. May be true only for animation, photo, and video messages.
         */
        public EditBusinessMessageCaption(String businessConnectionId, long chatId, long messageId, ReplyMarkup replyMarkup, FormattedText caption, boolean showCaptionAboveMedia) {
            this.businessConnectionId = businessConnectionId;
            this.chatId = chatId;
            this.messageId = messageId;
            this.replyMarkup = replyMarkup;
            this.caption = caption;
            this.showCaptionAboveMedia = showCaptionAboveMedia;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1071562045;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits the content of a checklist in a message sent on behalf of a business account; for bots only.
     *
     * <p> Returns {@link BusinessMessage BusinessMessage} </p>
     */
    public static class EditBusinessMessageChecklist extends Function<BusinessMessage> {
        /**
         * Unique identifier of business connection on behalf of which the message was sent.
         */
        public String businessConnectionId;
        /**
         * The chat the message belongs to.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * The new message reply markup; pass null if none.
         */
        public ReplyMarkup replyMarkup;
        /**
         * The new checklist. If some tasks were completed, this information will be kept.
         */
        public InputChecklist checklist;

        /**
         * Default constructor for a function, which edits the content of a checklist in a message sent on behalf of a business account; for bots only.
         *
         * <p> Returns {@link BusinessMessage BusinessMessage} </p>
         */
        public EditBusinessMessageChecklist() {
        }

        /**
         * Creates a function, which edits the content of a checklist in a message sent on behalf of a business account; for bots only.
         *
         * <p> Returns {@link BusinessMessage BusinessMessage} </p>
         *
         * @param businessConnectionId Unique identifier of business connection on behalf of which the message was sent.
         * @param chatId The chat the message belongs to.
         * @param messageId Identifier of the message.
         * @param replyMarkup The new message reply markup; pass null if none.
         * @param checklist The new checklist. If some tasks were completed, this information will be kept.
         */
        public EditBusinessMessageChecklist(String businessConnectionId, long chatId, long messageId, ReplyMarkup replyMarkup, InputChecklist checklist) {
            this.businessConnectionId = businessConnectionId;
            this.chatId = chatId;
            this.messageId = messageId;
            this.replyMarkup = replyMarkup;
            this.checklist = checklist;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -445013904;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits the content of a live location in a message sent on behalf of a business account; for bots only.
     *
     * <p> Returns {@link BusinessMessage BusinessMessage} </p>
     */
    public static class EditBusinessMessageLiveLocation extends Function<BusinessMessage> {
        /**
         * Unique identifier of business connection on behalf of which the message was sent.
         */
        public String businessConnectionId;
        /**
         * The chat the message belongs to.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * The new message reply markup; pass null if none.
         */
        public ReplyMarkup replyMarkup;
        /**
         * New location content of the message; pass null to stop sharing the live location.
         */
        public Location location;
        /**
         * New time relative to the message send date, for which the location can be updated, in seconds. If 0x7FFFFFFF specified, then the location can be updated forever. Otherwise, must not exceed the current livePeriod by more than a day, and the live location expiration date must remain in the next 90 days. Pass 0 to keep the current livePeriod.
         */
        public int livePeriod;
        /**
         * The new direction in which the location moves, in degrees; 1-360. Pass 0 if unknown.
         */
        public int heading;
        /**
         * The new maximum distance for proximity alerts, in meters (0-100000). Pass 0 if the notification is disabled.
         */
        public int proximityAlertRadius;

        /**
         * Default constructor for a function, which edits the content of a live location in a message sent on behalf of a business account; for bots only.
         *
         * <p> Returns {@link BusinessMessage BusinessMessage} </p>
         */
        public EditBusinessMessageLiveLocation() {
        }

        /**
         * Creates a function, which edits the content of a live location in a message sent on behalf of a business account; for bots only.
         *
         * <p> Returns {@link BusinessMessage BusinessMessage} </p>
         *
         * @param businessConnectionId Unique identifier of business connection on behalf of which the message was sent.
         * @param chatId The chat the message belongs to.
         * @param messageId Identifier of the message.
         * @param replyMarkup The new message reply markup; pass null if none.
         * @param location New location content of the message; pass null to stop sharing the live location.
         * @param livePeriod New time relative to the message send date, for which the location can be updated, in seconds. If 0x7FFFFFFF specified, then the location can be updated forever. Otherwise, must not exceed the current livePeriod by more than a day, and the live location expiration date must remain in the next 90 days. Pass 0 to keep the current livePeriod.
         * @param heading The new direction in which the location moves, in degrees; 1-360. Pass 0 if unknown.
         * @param proximityAlertRadius The new maximum distance for proximity alerts, in meters (0-100000). Pass 0 if the notification is disabled.
         */
        public EditBusinessMessageLiveLocation(String businessConnectionId, long chatId, long messageId, ReplyMarkup replyMarkup, Location location, int livePeriod, int heading, int proximityAlertRadius) {
            this.businessConnectionId = businessConnectionId;
            this.chatId = chatId;
            this.messageId = messageId;
            this.replyMarkup = replyMarkup;
            this.location = location;
            this.livePeriod = livePeriod;
            this.heading = heading;
            this.proximityAlertRadius = proximityAlertRadius;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 494972447;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits the media content of a message with a text, an animation, an audio, a document, a photo or a video in a message sent on behalf of a business account; for bots only.
     *
     * <p> Returns {@link BusinessMessage BusinessMessage} </p>
     */
    public static class EditBusinessMessageMedia extends Function<BusinessMessage> {
        /**
         * Unique identifier of business connection on behalf of which the message was sent.
         */
        public String businessConnectionId;
        /**
         * The chat the message belongs to.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * The new message reply markup; pass null if none; for bots only.
         */
        public ReplyMarkup replyMarkup;
        /**
         * New content of the message. Must be one of the following types: inputMessageAnimation, inputMessageAudio, inputMessageDocument, inputMessagePhoto or inputMessageVideo.
         */
        public InputMessageContent inputMessageContent;

        /**
         * Default constructor for a function, which edits the media content of a message with a text, an animation, an audio, a document, a photo or a video in a message sent on behalf of a business account; for bots only.
         *
         * <p> Returns {@link BusinessMessage BusinessMessage} </p>
         */
        public EditBusinessMessageMedia() {
        }

        /**
         * Creates a function, which edits the media content of a message with a text, an animation, an audio, a document, a photo or a video in a message sent on behalf of a business account; for bots only.
         *
         * <p> Returns {@link BusinessMessage BusinessMessage} </p>
         *
         * @param businessConnectionId Unique identifier of business connection on behalf of which the message was sent.
         * @param chatId The chat the message belongs to.
         * @param messageId Identifier of the message.
         * @param replyMarkup The new message reply markup; pass null if none; for bots only.
         * @param inputMessageContent New content of the message. Must be one of the following types: inputMessageAnimation, inputMessageAudio, inputMessageDocument, inputMessagePhoto or inputMessageVideo.
         */
        public EditBusinessMessageMedia(String businessConnectionId, long chatId, long messageId, ReplyMarkup replyMarkup, InputMessageContent inputMessageContent) {
            this.businessConnectionId = businessConnectionId;
            this.chatId = chatId;
            this.messageId = messageId;
            this.replyMarkup = replyMarkup;
            this.inputMessageContent = inputMessageContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -60733576;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits the reply markup of a message sent on behalf of a business account; for bots only.
     *
     * <p> Returns {@link BusinessMessage BusinessMessage} </p>
     */
    public static class EditBusinessMessageReplyMarkup extends Function<BusinessMessage> {
        /**
         * Unique identifier of business connection on behalf of which the message was sent.
         */
        public String businessConnectionId;
        /**
         * The chat the message belongs to.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * The new message reply markup; pass null if none.
         */
        public ReplyMarkup replyMarkup;

        /**
         * Default constructor for a function, which edits the reply markup of a message sent on behalf of a business account; for bots only.
         *
         * <p> Returns {@link BusinessMessage BusinessMessage} </p>
         */
        public EditBusinessMessageReplyMarkup() {
        }

        /**
         * Creates a function, which edits the reply markup of a message sent on behalf of a business account; for bots only.
         *
         * <p> Returns {@link BusinessMessage BusinessMessage} </p>
         *
         * @param businessConnectionId Unique identifier of business connection on behalf of which the message was sent.
         * @param chatId The chat the message belongs to.
         * @param messageId Identifier of the message.
         * @param replyMarkup The new message reply markup; pass null if none.
         */
        public EditBusinessMessageReplyMarkup(String businessConnectionId, long chatId, long messageId, ReplyMarkup replyMarkup) {
            this.businessConnectionId = businessConnectionId;
            this.chatId = chatId;
            this.messageId = messageId;
            this.replyMarkup = replyMarkup;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 701787159;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits the text of a text or game message sent on behalf of a business account; for bots only.
     *
     * <p> Returns {@link BusinessMessage BusinessMessage} </p>
     */
    public static class EditBusinessMessageText extends Function<BusinessMessage> {
        /**
         * Unique identifier of business connection on behalf of which the message was sent.
         */
        public String businessConnectionId;
        /**
         * The chat the message belongs to.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * The new message reply markup; pass null if none.
         */
        public ReplyMarkup replyMarkup;
        /**
         * New text content of the message. Must be of type inputMessageText.
         */
        public InputMessageContent inputMessageContent;

        /**
         * Default constructor for a function, which edits the text of a text or game message sent on behalf of a business account; for bots only.
         *
         * <p> Returns {@link BusinessMessage BusinessMessage} </p>
         */
        public EditBusinessMessageText() {
        }

        /**
         * Creates a function, which edits the text of a text or game message sent on behalf of a business account; for bots only.
         *
         * <p> Returns {@link BusinessMessage BusinessMessage} </p>
         *
         * @param businessConnectionId Unique identifier of business connection on behalf of which the message was sent.
         * @param chatId The chat the message belongs to.
         * @param messageId Identifier of the message.
         * @param replyMarkup The new message reply markup; pass null if none.
         * @param inputMessageContent New text content of the message. Must be of type inputMessageText.
         */
        public EditBusinessMessageText(String businessConnectionId, long chatId, long messageId, ReplyMarkup replyMarkup, InputMessageContent inputMessageContent) {
            this.businessConnectionId = businessConnectionId;
            this.chatId = chatId;
            this.messageId = messageId;
            this.replyMarkup = replyMarkup;
            this.inputMessageContent = inputMessageContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1149169252;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes a story posted by the bot on behalf of a business account; for bots only.
     *
     * <p> Returns {@link Story Story} </p>
     */
    public static class EditBusinessStory extends Function<Story> {
        /**
         * Identifier of the chat that posted the story.
         */
        public long storyPosterChatId;
        /**
         * Identifier of the story to edit.
         */
        public int storyId;
        /**
         * New content of the story.
         */
        public InputStoryContent content;
        /**
         * New clickable rectangle areas to be shown on the story media.
         */
        public InputStoryAreas areas;
        /**
         * New story caption.
         */
        public FormattedText caption;
        /**
         * The new privacy settings for the story.
         */
        public StoryPrivacySettings privacySettings;

        /**
         * Default constructor for a function, which changes a story posted by the bot on behalf of a business account; for bots only.
         *
         * <p> Returns {@link Story Story} </p>
         */
        public EditBusinessStory() {
        }

        /**
         * Creates a function, which changes a story posted by the bot on behalf of a business account; for bots only.
         *
         * <p> Returns {@link Story Story} </p>
         *
         * @param storyPosterChatId Identifier of the chat that posted the story.
         * @param storyId Identifier of the story to edit.
         * @param content New content of the story.
         * @param areas New clickable rectangle areas to be shown on the story media.
         * @param caption New story caption.
         * @param privacySettings The new privacy settings for the story.
         */
        public EditBusinessStory(long storyPosterChatId, int storyId, InputStoryContent content, InputStoryAreas areas, FormattedText caption, StoryPrivacySettings privacySettings) {
            this.storyPosterChatId = storyPosterChatId;
            this.storyId = storyId;
            this.content = content;
            this.areas = areas;
            this.caption = caption;
            this.privacySettings = privacySettings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 472538940;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits existing chat folder. Returns information about the edited chat folder.
     *
     * <p> Returns {@link ChatFolderInfo ChatFolderInfo} </p>
     */
    public static class EditChatFolder extends Function<ChatFolderInfo> {
        /**
         * Chat folder identifier.
         */
        public int chatFolderId;
        /**
         * The edited chat folder.
         */
        public ChatFolder folder;

        /**
         * Default constructor for a function, which edits existing chat folder. Returns information about the edited chat folder.
         *
         * <p> Returns {@link ChatFolderInfo ChatFolderInfo} </p>
         */
        public EditChatFolder() {
        }

        /**
         * Creates a function, which edits existing chat folder. Returns information about the edited chat folder.
         *
         * <p> Returns {@link ChatFolderInfo ChatFolderInfo} </p>
         *
         * @param chatFolderId Chat folder identifier.
         * @param folder The edited chat folder.
         */
        public EditChatFolder(int chatFolderId, ChatFolder folder) {
            this.chatFolderId = chatFolderId;
            this.folder = folder;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 53672754;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits an invite link for a chat folder.
     *
     * <p> Returns {@link ChatFolderInviteLink ChatFolderInviteLink} </p>
     */
    public static class EditChatFolderInviteLink extends Function<ChatFolderInviteLink> {
        /**
         * Chat folder identifier.
         */
        public int chatFolderId;
        /**
         * Invite link to be edited.
         */
        public String inviteLink;
        /**
         * New name of the link; 0-32 characters.
         */
        public String name;
        /**
         * New identifiers of chats to be accessible by the invite link. Use getChatsForChatFolderInviteLink to get suitable chats. Basic groups will be automatically converted to supergroups before link editing.
         */
        public long[] chatIds;

        /**
         * Default constructor for a function, which edits an invite link for a chat folder.
         *
         * <p> Returns {@link ChatFolderInviteLink ChatFolderInviteLink} </p>
         */
        public EditChatFolderInviteLink() {
        }

        /**
         * Creates a function, which edits an invite link for a chat folder.
         *
         * <p> Returns {@link ChatFolderInviteLink ChatFolderInviteLink} </p>
         *
         * @param chatFolderId Chat folder identifier.
         * @param inviteLink Invite link to be edited.
         * @param name New name of the link; 0-32 characters.
         * @param chatIds New identifiers of chats to be accessible by the invite link. Use getChatsForChatFolderInviteLink to get suitable chats. Basic groups will be automatically converted to supergroups before link editing.
         */
        public EditChatFolderInviteLink(int chatFolderId, String inviteLink, String name, long[] chatIds) {
            this.chatFolderId = chatFolderId;
            this.inviteLink = inviteLink;
            this.name = name;
            this.chatIds = chatIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2141872095;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits a non-primary invite link for a chat. Available for basic groups, supergroups, and channels. If the link creates a subscription, then expirationDate, memberLimit and createsJoinRequest must not be used. Requires administrator privileges and canInviteUsers right in the chat for own links and owner privileges for other links.
     *
     * <p> Returns {@link ChatInviteLink ChatInviteLink} </p>
     */
    public static class EditChatInviteLink extends Function<ChatInviteLink> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Invite link to be edited.
         */
        public String inviteLink;
        /**
         * Invite link name; 0-32 characters.
         */
        public String name;
        /**
         * Point in time (Unix timestamp) when the link will expire; pass 0 if never.
         */
        public int expirationDate;
        /**
         * The maximum number of chat members that can join the chat via the link simultaneously; 0-99999; pass 0 if not limited.
         */
        public int memberLimit;
        /**
         * Pass true if users joining the chat via the link need to be approved by chat administrators. In this case, memberLimit must be 0.
         */
        public boolean createsJoinRequest;

        /**
         * Default constructor for a function, which edits a non-primary invite link for a chat. Available for basic groups, supergroups, and channels. If the link creates a subscription, then expirationDate, memberLimit and createsJoinRequest must not be used. Requires administrator privileges and canInviteUsers right in the chat for own links and owner privileges for other links.
         *
         * <p> Returns {@link ChatInviteLink ChatInviteLink} </p>
         */
        public EditChatInviteLink() {
        }

        /**
         * Creates a function, which edits a non-primary invite link for a chat. Available for basic groups, supergroups, and channels. If the link creates a subscription, then expirationDate, memberLimit and createsJoinRequest must not be used. Requires administrator privileges and canInviteUsers right in the chat for own links and owner privileges for other links.
         *
         * <p> Returns {@link ChatInviteLink ChatInviteLink} </p>
         *
         * @param chatId Chat identifier.
         * @param inviteLink Invite link to be edited.
         * @param name Invite link name; 0-32 characters.
         * @param expirationDate Point in time (Unix timestamp) when the link will expire; pass 0 if never.
         * @param memberLimit The maximum number of chat members that can join the chat via the link simultaneously; 0-99999; pass 0 if not limited.
         * @param createsJoinRequest Pass true if users joining the chat via the link need to be approved by chat administrators. In this case, memberLimit must be 0.
         */
        public EditChatInviteLink(long chatId, String inviteLink, String name, int expirationDate, int memberLimit, boolean createsJoinRequest) {
            this.chatId = chatId;
            this.inviteLink = inviteLink;
            this.name = name;
            this.expirationDate = expirationDate;
            this.memberLimit = memberLimit;
            this.createsJoinRequest = createsJoinRequest;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1320303996;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits a subscription invite link for a channel chat. Requires canInviteUsers right in the chat for own links and owner privileges for other links.
     *
     * <p> Returns {@link ChatInviteLink ChatInviteLink} </p>
     */
    public static class EditChatSubscriptionInviteLink extends Function<ChatInviteLink> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Invite link to be edited.
         */
        public String inviteLink;
        /**
         * Invite link name; 0-32 characters.
         */
        public String name;

        /**
         * Default constructor for a function, which edits a subscription invite link for a channel chat. Requires canInviteUsers right in the chat for own links and owner privileges for other links.
         *
         * <p> Returns {@link ChatInviteLink ChatInviteLink} </p>
         */
        public EditChatSubscriptionInviteLink() {
        }

        /**
         * Creates a function, which edits a subscription invite link for a channel chat. Requires canInviteUsers right in the chat for own links and owner privileges for other links.
         *
         * <p> Returns {@link ChatInviteLink ChatInviteLink} </p>
         *
         * @param chatId Chat identifier.
         * @param inviteLink Invite link to be edited.
         * @param name Invite link name; 0-32 characters.
         */
        public EditChatSubscriptionInviteLink(long chatId, String inviteLink, String name) {
            this.chatId = chatId;
            this.inviteLink = inviteLink;
            this.name = name;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -951826989;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits information about a custom local language pack in the current localization target. Can be called before authorization.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class EditCustomLanguagePackInfo extends Function<Ok> {
        /**
         * New information about the custom local language pack.
         */
        public LanguagePackInfo info;

        /**
         * Default constructor for a function, which edits information about a custom local language pack in the current localization target. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public EditCustomLanguagePackInfo() {
        }

        /**
         * Creates a function, which edits information about a custom local language pack in the current localization target. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param info New information about the custom local language pack.
         */
        public EditCustomLanguagePackInfo(LanguagePackInfo info) {
            this.info = info;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1320751257;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits title and icon of a topic in a forum supergroup chat or a chat with a bot with topics; for supergroup chats requires canManageTopics administrator right unless the user is creator of the topic.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class EditForumTopic extends Function<Ok> {
        /**
         * Identifier of the chat.
         */
        public long chatId;
        /**
         * Forum topic identifier.
         */
        public int forumTopicId;
        /**
         * New name of the topic; 0-128 characters. If empty, the previous topic name is kept.
         */
        public String name;
        /**
         * Pass true to edit the icon of the topic. Icon of the General topic can't be edited.
         */
        public boolean editIconCustomEmoji;
        /**
         * Identifier of the new custom emoji for topic icon; pass 0 to remove the custom emoji. Ignored if editIconCustomEmoji is false. Telegram Premium users can use any custom emoji, other users can use only a custom emoji returned by getForumTopicDefaultIcons.
         */
        public long iconCustomEmojiId;

        /**
         * Default constructor for a function, which edits title and icon of a topic in a forum supergroup chat or a chat with a bot with topics; for supergroup chats requires canManageTopics administrator right unless the user is creator of the topic.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public EditForumTopic() {
        }

        /**
         * Creates a function, which edits title and icon of a topic in a forum supergroup chat or a chat with a bot with topics; for supergroup chats requires canManageTopics administrator right unless the user is creator of the topic.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat.
         * @param forumTopicId Forum topic identifier.
         * @param name New name of the topic; 0-128 characters. If empty, the previous topic name is kept.
         * @param editIconCustomEmoji Pass true to edit the icon of the topic. Icon of the General topic can't be edited.
         * @param iconCustomEmojiId Identifier of the new custom emoji for topic icon; pass 0 to remove the custom emoji. Ignored if editIconCustomEmoji is false. Telegram Premium users can use any custom emoji, other users can use only a custom emoji returned by getForumTopicDefaultIcons.
         */
        public EditForumTopic(long chatId, int forumTopicId, String name, boolean editIconCustomEmoji, long iconCustomEmojiId) {
            this.chatId = chatId;
            this.forumTopicId = forumTopicId;
            this.name = name;
            this.editIconCustomEmoji = editIconCustomEmoji;
            this.iconCustomEmojiId = iconCustomEmojiId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1112389547;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits the caption of an inline message sent via a bot; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class EditInlineMessageCaption extends Function<Ok> {
        /**
         * Inline message identifier.
         */
        public String inlineMessageId;
        /**
         * The new message reply markup; pass null if none.
         */
        public ReplyMarkup replyMarkup;
        /**
         * New message content caption; pass null to remove caption; 0-getOption(&quot;message_caption_length_max&quot;) characters.
         */
        public FormattedText caption;
        /**
         * Pass true to show the caption above the media; otherwise, the caption will be shown below the media. May be true only for animation, photo, and video messages.
         */
        public boolean showCaptionAboveMedia;

        /**
         * Default constructor for a function, which edits the caption of an inline message sent via a bot; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public EditInlineMessageCaption() {
        }

        /**
         * Creates a function, which edits the caption of an inline message sent via a bot; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param inlineMessageId Inline message identifier.
         * @param replyMarkup The new message reply markup; pass null if none.
         * @param caption New message content caption; pass null to remove caption; 0-getOption(&quot;message_caption_length_max&quot;) characters.
         * @param showCaptionAboveMedia Pass true to show the caption above the media; otherwise, the caption will be shown below the media. May be true only for animation, photo, and video messages.
         */
        public EditInlineMessageCaption(String inlineMessageId, ReplyMarkup replyMarkup, FormattedText caption, boolean showCaptionAboveMedia) {
            this.inlineMessageId = inlineMessageId;
            this.replyMarkup = replyMarkup;
            this.caption = caption;
            this.showCaptionAboveMedia = showCaptionAboveMedia;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1409762552;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits the content of a live location in an inline message sent via a bot; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class EditInlineMessageLiveLocation extends Function<Ok> {
        /**
         * Inline message identifier.
         */
        public String inlineMessageId;
        /**
         * The new message reply markup; pass null if none.
         */
        public ReplyMarkup replyMarkup;
        /**
         * New location content of the message; pass null to stop sharing the live location.
         */
        public Location location;
        /**
         * New time relative to the message send date, for which the location can be updated, in seconds. If 0x7FFFFFFF specified, then the location can be updated forever. Otherwise, must not exceed the current livePeriod by more than a day, and the live location expiration date must remain in the next 90 days. Pass 0 to keep the current livePeriod.
         */
        public int livePeriod;
        /**
         * The new direction in which the location moves, in degrees; 1-360. Pass 0 if unknown.
         */
        public int heading;
        /**
         * The new maximum distance for proximity alerts, in meters (0-100000). Pass 0 if the notification is disabled.
         */
        public int proximityAlertRadius;

        /**
         * Default constructor for a function, which edits the content of a live location in an inline message sent via a bot; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public EditInlineMessageLiveLocation() {
        }

        /**
         * Creates a function, which edits the content of a live location in an inline message sent via a bot; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param inlineMessageId Inline message identifier.
         * @param replyMarkup The new message reply markup; pass null if none.
         * @param location New location content of the message; pass null to stop sharing the live location.
         * @param livePeriod New time relative to the message send date, for which the location can be updated, in seconds. If 0x7FFFFFFF specified, then the location can be updated forever. Otherwise, must not exceed the current livePeriod by more than a day, and the live location expiration date must remain in the next 90 days. Pass 0 to keep the current livePeriod.
         * @param heading The new direction in which the location moves, in degrees; 1-360. Pass 0 if unknown.
         * @param proximityAlertRadius The new maximum distance for proximity alerts, in meters (0-100000). Pass 0 if the notification is disabled.
         */
        public EditInlineMessageLiveLocation(String inlineMessageId, ReplyMarkup replyMarkup, Location location, int livePeriod, int heading, int proximityAlertRadius) {
            this.inlineMessageId = inlineMessageId;
            this.replyMarkup = replyMarkup;
            this.location = location;
            this.livePeriod = livePeriod;
            this.heading = heading;
            this.proximityAlertRadius = proximityAlertRadius;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2134352044;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits the media content of a message with a text, an animation, an audio, a document, a photo or a video in an inline message sent via a bot; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class EditInlineMessageMedia extends Function<Ok> {
        /**
         * Inline message identifier.
         */
        public String inlineMessageId;
        /**
         * The new message reply markup; pass null if none; for bots only.
         */
        public ReplyMarkup replyMarkup;
        /**
         * New content of the message. Must be one of the following types: inputMessageAnimation, inputMessageAudio, inputMessageDocument, inputMessagePhoto or inputMessageVideo.
         */
        public InputMessageContent inputMessageContent;

        /**
         * Default constructor for a function, which edits the media content of a message with a text, an animation, an audio, a document, a photo or a video in an inline message sent via a bot; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public EditInlineMessageMedia() {
        }

        /**
         * Creates a function, which edits the media content of a message with a text, an animation, an audio, a document, a photo or a video in an inline message sent via a bot; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param inlineMessageId Inline message identifier.
         * @param replyMarkup The new message reply markup; pass null if none; for bots only.
         * @param inputMessageContent New content of the message. Must be one of the following types: inputMessageAnimation, inputMessageAudio, inputMessageDocument, inputMessagePhoto or inputMessageVideo.
         */
        public EditInlineMessageMedia(String inlineMessageId, ReplyMarkup replyMarkup, InputMessageContent inputMessageContent) {
            this.inlineMessageId = inlineMessageId;
            this.replyMarkup = replyMarkup;
            this.inputMessageContent = inputMessageContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 23553921;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits the reply markup of an inline message sent via a bot; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class EditInlineMessageReplyMarkup extends Function<Ok> {
        /**
         * Inline message identifier.
         */
        public String inlineMessageId;
        /**
         * The new message reply markup; pass null if none.
         */
        public ReplyMarkup replyMarkup;

        /**
         * Default constructor for a function, which edits the reply markup of an inline message sent via a bot; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public EditInlineMessageReplyMarkup() {
        }

        /**
         * Creates a function, which edits the reply markup of an inline message sent via a bot; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param inlineMessageId Inline message identifier.
         * @param replyMarkup The new message reply markup; pass null if none.
         */
        public EditInlineMessageReplyMarkup(String inlineMessageId, ReplyMarkup replyMarkup) {
            this.inlineMessageId = inlineMessageId;
            this.replyMarkup = replyMarkup;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -67565858;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits the text of an inline text or game message sent via a bot; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class EditInlineMessageText extends Function<Ok> {
        /**
         * Inline message identifier.
         */
        public String inlineMessageId;
        /**
         * The new message reply markup; pass null if none.
         */
        public ReplyMarkup replyMarkup;
        /**
         * New text content of the message. Must be of type inputMessageText.
         */
        public InputMessageContent inputMessageContent;

        /**
         * Default constructor for a function, which edits the text of an inline text or game message sent via a bot; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public EditInlineMessageText() {
        }

        /**
         * Creates a function, which edits the text of an inline text or game message sent via a bot; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param inlineMessageId Inline message identifier.
         * @param replyMarkup The new message reply markup; pass null if none.
         * @param inputMessageContent New text content of the message. Must be of type inputMessageText.
         */
        public EditInlineMessageText(String inlineMessageId, ReplyMarkup replyMarkup, InputMessageContent inputMessageContent) {
            this.inlineMessageId = inlineMessageId;
            this.replyMarkup = replyMarkup;
            this.inputMessageContent = inputMessageContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -855457307;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits the message content caption. Returns the edited message after the edit is completed on the server side.
     *
     * <p> Returns {@link Message Message} </p>
     */
    public static class EditMessageCaption extends Function<Message> {
        /**
         * The chat the message belongs to.
         */
        public long chatId;
        /**
         * Identifier of the message. Use messageProperties.canBeEdited to check whether the message can be edited.
         */
        public long messageId;
        /**
         * The new message reply markup; pass null if none; for bots only.
         */
        public ReplyMarkup replyMarkup;
        /**
         * New message content caption; 0-getOption(&quot;message_caption_length_max&quot;) characters; pass null to remove caption.
         */
        public FormattedText caption;
        /**
         * Pass true to show the caption above the media; otherwise, the caption will be shown below the media. May be true only for animation, photo, and video messages.
         */
        public boolean showCaptionAboveMedia;

        /**
         * Default constructor for a function, which edits the message content caption. Returns the edited message after the edit is completed on the server side.
         *
         * <p> Returns {@link Message Message} </p>
         */
        public EditMessageCaption() {
        }

        /**
         * Creates a function, which edits the message content caption. Returns the edited message after the edit is completed on the server side.
         *
         * <p> Returns {@link Message Message} </p>
         *
         * @param chatId The chat the message belongs to.
         * @param messageId Identifier of the message. Use messageProperties.canBeEdited to check whether the message can be edited.
         * @param replyMarkup The new message reply markup; pass null if none; for bots only.
         * @param caption New message content caption; 0-getOption(&quot;message_caption_length_max&quot;) characters; pass null to remove caption.
         * @param showCaptionAboveMedia Pass true to show the caption above the media; otherwise, the caption will be shown below the media. May be true only for animation, photo, and video messages.
         */
        public EditMessageCaption(long chatId, long messageId, ReplyMarkup replyMarkup, FormattedText caption, boolean showCaptionAboveMedia) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.replyMarkup = replyMarkup;
            this.caption = caption;
            this.showCaptionAboveMedia = showCaptionAboveMedia;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2020117951;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits the message content of a checklist. Returns the edited message after the edit is completed on the server side.
     *
     * <p> Returns {@link Message Message} </p>
     */
    public static class EditMessageChecklist extends Function<Message> {
        /**
         * The chat the message belongs to.
         */
        public long chatId;
        /**
         * Identifier of the message. Use messageProperties.canBeEdited to check whether the message can be edited.
         */
        public long messageId;
        /**
         * The new message reply markup; pass null if none; for bots only.
         */
        public ReplyMarkup replyMarkup;
        /**
         * The new checklist. If some tasks were completed, this information will be kept.
         */
        public InputChecklist checklist;

        /**
         * Default constructor for a function, which edits the message content of a checklist. Returns the edited message after the edit is completed on the server side.
         *
         * <p> Returns {@link Message Message} </p>
         */
        public EditMessageChecklist() {
        }

        /**
         * Creates a function, which edits the message content of a checklist. Returns the edited message after the edit is completed on the server side.
         *
         * <p> Returns {@link Message Message} </p>
         *
         * @param chatId The chat the message belongs to.
         * @param messageId Identifier of the message. Use messageProperties.canBeEdited to check whether the message can be edited.
         * @param replyMarkup The new message reply markup; pass null if none; for bots only.
         * @param checklist The new checklist. If some tasks were completed, this information will be kept.
         */
        public EditMessageChecklist(long chatId, long messageId, ReplyMarkup replyMarkup, InputChecklist checklist) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.replyMarkup = replyMarkup;
            this.checklist = checklist;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1497856700;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits the message content of a live location. Messages can be edited for a limited period of time specified in the live location. Returns the edited message after the edit is completed on the server side.
     *
     * <p> Returns {@link Message Message} </p>
     */
    public static class EditMessageLiveLocation extends Function<Message> {
        /**
         * The chat the message belongs to.
         */
        public long chatId;
        /**
         * Identifier of the message. Use messageProperties.canBeEdited to check whether the message can be edited.
         */
        public long messageId;
        /**
         * The new message reply markup; pass null if none; for bots only.
         */
        public ReplyMarkup replyMarkup;
        /**
         * New location content of the message; pass null to stop sharing the live location.
         */
        public Location location;
        /**
         * New time relative to the message send date, for which the location can be updated, in seconds. If 0x7FFFFFFF specified, then the location can be updated forever. Otherwise, must not exceed the current livePeriod by more than a day, and the live location expiration date must remain in the next 90 days. Pass 0 to keep the current livePeriod.
         */
        public int livePeriod;
        /**
         * The new direction in which the location moves, in degrees; 1-360. Pass 0 if unknown.
         */
        public int heading;
        /**
         * The new maximum distance for proximity alerts, in meters (0-100000). Pass 0 if the notification is disabled.
         */
        public int proximityAlertRadius;

        /**
         * Default constructor for a function, which edits the message content of a live location. Messages can be edited for a limited period of time specified in the live location. Returns the edited message after the edit is completed on the server side.
         *
         * <p> Returns {@link Message Message} </p>
         */
        public EditMessageLiveLocation() {
        }

        /**
         * Creates a function, which edits the message content of a live location. Messages can be edited for a limited period of time specified in the live location. Returns the edited message after the edit is completed on the server side.
         *
         * <p> Returns {@link Message Message} </p>
         *
         * @param chatId The chat the message belongs to.
         * @param messageId Identifier of the message. Use messageProperties.canBeEdited to check whether the message can be edited.
         * @param replyMarkup The new message reply markup; pass null if none; for bots only.
         * @param location New location content of the message; pass null to stop sharing the live location.
         * @param livePeriod New time relative to the message send date, for which the location can be updated, in seconds. If 0x7FFFFFFF specified, then the location can be updated forever. Otherwise, must not exceed the current livePeriod by more than a day, and the live location expiration date must remain in the next 90 days. Pass 0 to keep the current livePeriod.
         * @param heading The new direction in which the location moves, in degrees; 1-360. Pass 0 if unknown.
         * @param proximityAlertRadius The new maximum distance for proximity alerts, in meters (0-100000). Pass 0 if the notification is disabled.
         */
        public EditMessageLiveLocation(long chatId, long messageId, ReplyMarkup replyMarkup, Location location, int livePeriod, int heading, int proximityAlertRadius) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.replyMarkup = replyMarkup;
            this.location = location;
            this.livePeriod = livePeriod;
            this.heading = heading;
            this.proximityAlertRadius = proximityAlertRadius;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1890511980;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits the media content of a message, including message caption. If only the caption needs to be edited, use editMessageCaption instead. The type of message content in an album can't be changed with exception of replacing a photo with a video or vice versa. Returns the edited message after the edit is completed on the server side.
     *
     * <p> Returns {@link Message Message} </p>
     */
    public static class EditMessageMedia extends Function<Message> {
        /**
         * The chat the message belongs to.
         */
        public long chatId;
        /**
         * Identifier of the message. Use messageProperties.canEditMedia to check whether the message can be edited.
         */
        public long messageId;
        /**
         * The new message reply markup; pass null if none; for bots only.
         */
        public ReplyMarkup replyMarkup;
        /**
         * New content of the message. Must be one of the following types: inputMessageAnimation, inputMessageAudio, inputMessageDocument, inputMessagePhoto or inputMessageVideo.
         */
        public InputMessageContent inputMessageContent;

        /**
         * Default constructor for a function, which edits the media content of a message, including message caption. If only the caption needs to be edited, use editMessageCaption instead. The type of message content in an album can't be changed with exception of replacing a photo with a video or vice versa. Returns the edited message after the edit is completed on the server side.
         *
         * <p> Returns {@link Message Message} </p>
         */
        public EditMessageMedia() {
        }

        /**
         * Creates a function, which edits the media content of a message, including message caption. If only the caption needs to be edited, use editMessageCaption instead. The type of message content in an album can't be changed with exception of replacing a photo with a video or vice versa. Returns the edited message after the edit is completed on the server side.
         *
         * <p> Returns {@link Message Message} </p>
         *
         * @param chatId The chat the message belongs to.
         * @param messageId Identifier of the message. Use messageProperties.canEditMedia to check whether the message can be edited.
         * @param replyMarkup The new message reply markup; pass null if none; for bots only.
         * @param inputMessageContent New content of the message. Must be one of the following types: inputMessageAnimation, inputMessageAudio, inputMessageDocument, inputMessagePhoto or inputMessageVideo.
         */
        public EditMessageMedia(long chatId, long messageId, ReplyMarkup replyMarkup, InputMessageContent inputMessageContent) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.replyMarkup = replyMarkup;
            this.inputMessageContent = inputMessageContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1152678125;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits the message reply markup; for bots only. Returns the edited message after the edit is completed on the server side.
     *
     * <p> Returns {@link Message Message} </p>
     */
    public static class EditMessageReplyMarkup extends Function<Message> {
        /**
         * The chat the message belongs to.
         */
        public long chatId;
        /**
         * Identifier of the message. Use messageProperties.canBeEdited to check whether the message can be edited.
         */
        public long messageId;
        /**
         * The new message reply markup; pass null if none.
         */
        public ReplyMarkup replyMarkup;

        /**
         * Default constructor for a function, which edits the message reply markup; for bots only. Returns the edited message after the edit is completed on the server side.
         *
         * <p> Returns {@link Message Message} </p>
         */
        public EditMessageReplyMarkup() {
        }

        /**
         * Creates a function, which edits the message reply markup; for bots only. Returns the edited message after the edit is completed on the server side.
         *
         * <p> Returns {@link Message Message} </p>
         *
         * @param chatId The chat the message belongs to.
         * @param messageId Identifier of the message. Use messageProperties.canBeEdited to check whether the message can be edited.
         * @param replyMarkup The new message reply markup; pass null if none.
         */
        public EditMessageReplyMarkup(long chatId, long messageId, ReplyMarkup replyMarkup) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.replyMarkup = replyMarkup;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 332127881;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits the time when a scheduled message will be sent. Scheduling state of all messages in the same album or forwarded together with the message will be also changed.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class EditMessageSchedulingState extends Function<Ok> {
        /**
         * The chat the message belongs to.
         */
        public long chatId;
        /**
         * Identifier of the message. Use messageProperties.canEditSchedulingState to check whether the message is suitable.
         */
        public long messageId;
        /**
         * The new message scheduling state; pass null to send the message immediately. Must be null for messages in the state messageSchedulingStateSendWhenVideoProcessed.
         */
        public MessageSchedulingState schedulingState;

        /**
         * Default constructor for a function, which edits the time when a scheduled message will be sent. Scheduling state of all messages in the same album or forwarded together with the message will be also changed.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public EditMessageSchedulingState() {
        }

        /**
         * Creates a function, which edits the time when a scheduled message will be sent. Scheduling state of all messages in the same album or forwarded together with the message will be also changed.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId The chat the message belongs to.
         * @param messageId Identifier of the message. Use messageProperties.canEditSchedulingState to check whether the message is suitable.
         * @param schedulingState The new message scheduling state; pass null to send the message immediately. Must be null for messages in the state messageSchedulingStateSendWhenVideoProcessed.
         */
        public EditMessageSchedulingState(long chatId, long messageId, MessageSchedulingState schedulingState) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.schedulingState = schedulingState;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1372976192;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits the text of a message (or a text of a game message). Returns the edited message after the edit is completed on the server side.
     *
     * <p> Returns {@link Message Message} </p>
     */
    public static class EditMessageText extends Function<Message> {
        /**
         * The chat the message belongs to.
         */
        public long chatId;
        /**
         * Identifier of the message. Use messageProperties.canBeEdited to check whether the message can be edited.
         */
        public long messageId;
        /**
         * The new message reply markup; pass null if none; for bots only.
         */
        public ReplyMarkup replyMarkup;
        /**
         * New text content of the message. Must be of type inputMessageText.
         */
        public InputMessageContent inputMessageContent;

        /**
         * Default constructor for a function, which edits the text of a message (or a text of a game message). Returns the edited message after the edit is completed on the server side.
         *
         * <p> Returns {@link Message Message} </p>
         */
        public EditMessageText() {
        }

        /**
         * Creates a function, which edits the text of a message (or a text of a game message). Returns the edited message after the edit is completed on the server side.
         *
         * <p> Returns {@link Message Message} </p>
         *
         * @param chatId The chat the message belongs to.
         * @param messageId Identifier of the message. Use messageProperties.canBeEdited to check whether the message can be edited.
         * @param replyMarkup The new message reply markup; pass null if none; for bots only.
         * @param inputMessageContent New text content of the message. Must be of type inputMessageText.
         */
        public EditMessageText(long chatId, long messageId, ReplyMarkup replyMarkup, InputMessageContent inputMessageContent) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.replyMarkup = replyMarkup;
            this.inputMessageContent = inputMessageContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 196272567;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits an existing proxy server for network requests. Can be called before authorization.
     *
     * <p> Returns {@link AddedProxy AddedProxy} </p>
     */
    public static class EditProxy extends Function<AddedProxy> {
        /**
         * Proxy identifier.
         */
        public int proxyId;
        /**
         * The new information about the proxy.
         */
        public Proxy proxy;
        /**
         * Pass true to immediately enable the proxy.
         */
        public boolean enable;
        /**
         * New comment for the proxy.
         */
        public String comment;

        /**
         * Default constructor for a function, which edits an existing proxy server for network requests. Can be called before authorization.
         *
         * <p> Returns {@link AddedProxy AddedProxy} </p>
         */
        public EditProxy() {
        }

        /**
         * Creates a function, which edits an existing proxy server for network requests. Can be called before authorization.
         *
         * <p> Returns {@link AddedProxy AddedProxy} </p>
         *
         * @param proxyId Proxy identifier.
         * @param proxy The new information about the proxy.
         * @param enable Pass true to immediately enable the proxy.
         * @param comment New comment for the proxy.
         */
        public EditProxy(int proxyId, Proxy proxy, boolean enable, String comment) {
            this.proxyId = proxyId;
            this.proxy = proxy;
            this.enable = enable;
            this.comment = comment;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 349913011;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Asynchronously edits the text, media or caption of a quick reply message. Use quickReplyMessage.canBeEdited to check whether a message can be edited. Media message can be edited only to a media message. Checklist messages can be edited only to a checklist message. The type of message content in an album can't be changed with exception of replacing a photo with a video or vice versa.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class EditQuickReplyMessage extends Function<Ok> {
        /**
         * Unique identifier of the quick reply shortcut with the message.
         */
        public int shortcutId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * New content of the message. Must be one of the following types: inputMessageAnimation, inputMessageAudio, inputMessageChecklist, inputMessageDocument, inputMessagePhoto, inputMessageText, or inputMessageVideo.
         */
        public InputMessageContent inputMessageContent;

        /**
         * Default constructor for a function, which asynchronously edits the text, media or caption of a quick reply message. Use quickReplyMessage.canBeEdited to check whether a message can be edited. Media message can be edited only to a media message. Checklist messages can be edited only to a checklist message. The type of message content in an album can't be changed with exception of replacing a photo with a video or vice versa.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public EditQuickReplyMessage() {
        }

        /**
         * Creates a function, which asynchronously edits the text, media or caption of a quick reply message. Use quickReplyMessage.canBeEdited to check whether a message can be edited. Media message can be edited only to a media message. Checklist messages can be edited only to a checklist message. The type of message content in an album can't be changed with exception of replacing a photo with a video or vice versa.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param shortcutId Unique identifier of the quick reply shortcut with the message.
         * @param messageId Identifier of the message.
         * @param inputMessageContent New content of the message. Must be one of the following types: inputMessageAnimation, inputMessageAudio, inputMessageChecklist, inputMessageDocument, inputMessagePhoto, inputMessageText, or inputMessageVideo.
         */
        public EditQuickReplyMessage(int shortcutId, long messageId, InputMessageContent inputMessageContent) {
            this.shortcutId = shortcutId;
            this.messageId = messageId;
            this.inputMessageContent = inputMessageContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 80517006;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Cancels or re-enables Telegram Star subscription.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class EditStarSubscription extends Function<Ok> {
        /**
         * Identifier of the subscription to change.
         */
        public String subscriptionId;
        /**
         * New value of isCanceled.
         */
        public boolean isCanceled;

        /**
         * Default constructor for a function, which cancels or re-enables Telegram Star subscription.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public EditStarSubscription() {
        }

        /**
         * Creates a function, which cancels or re-enables Telegram Star subscription.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param subscriptionId Identifier of the subscription to change.
         * @param isCanceled New value of isCanceled.
         */
        public EditStarSubscription(String subscriptionId, boolean isCanceled) {
            this.subscriptionId = subscriptionId;
            this.isCanceled = isCanceled;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2048538904;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes content and caption of a story. Can be called only if story.canBeEdited == true.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class EditStory extends Function<Ok> {
        /**
         * Identifier of the chat that posted the story.
         */
        public long storyPosterChatId;
        /**
         * Identifier of the story to edit.
         */
        public int storyId;
        /**
         * New content of the story; pass null to keep the current content.
         */
        public InputStoryContent content;
        /**
         * New clickable rectangle areas to be shown on the story media; pass null to keep the current areas. Areas can't be edited if story content isn't changed.
         */
        public InputStoryAreas areas;
        /**
         * New story caption; pass null to keep the current caption.
         */
        public FormattedText caption;

        /**
         * Default constructor for a function, which changes content and caption of a story. Can be called only if story.canBeEdited == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public EditStory() {
        }

        /**
         * Creates a function, which changes content and caption of a story. Can be called only if story.canBeEdited == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param storyPosterChatId Identifier of the chat that posted the story.
         * @param storyId Identifier of the story to edit.
         * @param content New content of the story; pass null to keep the current content.
         * @param areas New clickable rectangle areas to be shown on the story media; pass null to keep the current areas. Areas can't be edited if story content isn't changed.
         * @param caption New story caption; pass null to keep the current caption.
         */
        public EditStory(long storyPosterChatId, int storyId, InputStoryContent content, InputStoryAreas areas, FormattedText caption) {
            this.storyPosterChatId = storyPosterChatId;
            this.storyId = storyId;
            this.content = content;
            this.areas = areas;
            this.caption = caption;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 355296788;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes cover of a video story. Can be called only if story.canBeEdited == true and the story isn't being edited now.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class EditStoryCover extends Function<Ok> {
        /**
         * Identifier of the chat that posted the story.
         */
        public long storyPosterChatId;
        /**
         * Identifier of the story to edit.
         */
        public int storyId;
        /**
         * New timestamp of the frame, which will be used as video thumbnail.
         */
        public double coverFrameTimestamp;

        /**
         * Default constructor for a function, which changes cover of a video story. Can be called only if story.canBeEdited == true and the story isn't being edited now.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public EditStoryCover() {
        }

        /**
         * Creates a function, which changes cover of a video story. Can be called only if story.canBeEdited == true and the story isn't being edited now.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param storyPosterChatId Identifier of the chat that posted the story.
         * @param storyId Identifier of the story to edit.
         * @param coverFrameTimestamp New timestamp of the frame, which will be used as video thumbnail.
         */
        public EditStoryCover(long storyPosterChatId, int storyId, double coverFrameTimestamp) {
            this.storyPosterChatId = storyPosterChatId;
            this.storyId = storyId;
            this.coverFrameTimestamp = coverFrameTimestamp;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1035823266;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Edits a custom text composition style that was created by the current user.
     *
     * <p> Returns {@link TextCompositionStyle TextCompositionStyle} </p>
     */
    public static class EditTextCompositionStyle extends Function<TextCompositionStyle> {
        /**
         * Name of the style.
         */
        public String name;
        /**
         * Title of the style; 1-getOption(&quot;text_composition_style_title_length_max&quot;) characters.
         */
        public String title;
        /**
         * Identifier of the custom emoji corresponding to the style.
         */
        public long customEmojiId;
        /**
         * Prompt that will be used for text composition; 1-getOption(&quot;text_composition_style_prompt_length_max&quot;) characters.
         */
        public String prompt;
        /**
         * Pass true if the current user must be shown as the creator of the style.
         */
        public boolean showCreator;

        /**
         * Default constructor for a function, which edits a custom text composition style that was created by the current user.
         *
         * <p> Returns {@link TextCompositionStyle TextCompositionStyle} </p>
         */
        public EditTextCompositionStyle() {
        }

        /**
         * Creates a function, which edits a custom text composition style that was created by the current user.
         *
         * <p> Returns {@link TextCompositionStyle TextCompositionStyle} </p>
         *
         * @param name Name of the style.
         * @param title Title of the style; 1-getOption(&quot;text_composition_style_title_length_max&quot;) characters.
         * @param customEmojiId Identifier of the custom emoji corresponding to the style.
         * @param prompt Prompt that will be used for text composition; 1-getOption(&quot;text_composition_style_prompt_length_max&quot;) characters.
         * @param showCreator Pass true if the current user must be shown as the creator of the style.
         */
        public EditTextCompositionStyle(String name, String title, long customEmojiId, String prompt, boolean showCreator) {
            this.name = name;
            this.title = title;
            this.customEmojiId = customEmojiId;
            this.prompt = prompt;
            this.showCreator = showCreator;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1251035657;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Cancels or re-enables Telegram Star subscription for a user; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class EditUserStarSubscription extends Function<Ok> {
        /**
         * User identifier.
         */
        public long userId;
        /**
         * Telegram payment identifier of the subscription.
         */
        public String telegramPaymentChargeId;
        /**
         * Pass true to cancel the subscription; pass false to allow the user to enable it.
         */
        public boolean isCanceled;

        /**
         * Default constructor for a function, which cancels or re-enables Telegram Star subscription for a user; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public EditUserStarSubscription() {
        }

        /**
         * Creates a function, which cancels or re-enables Telegram Star subscription for a user; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param userId User identifier.
         * @param telegramPaymentChargeId Telegram payment identifier of the subscription.
         * @param isCanceled Pass true to cancel the subscription; pass false to allow the user to enable it.
         */
        public EditUserStarSubscription(long userId, String telegramPaymentChargeId, boolean isCanceled) {
            this.userId = userId;
            this.telegramPaymentChargeId = telegramPaymentChargeId;
            this.isCanceled = isCanceled;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1370582665;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Enables a proxy. Only one proxy can be enabled at a time. Can be called before authorization.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class EnableProxy extends Function<Ok> {
        /**
         * Proxy identifier.
         */
        public int proxyId;

        /**
         * Default constructor for a function, which enables a proxy. Only one proxy can be enabled at a time. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public EnableProxy() {
        }

        /**
         * Creates a function, which enables a proxy. Only one proxy can be enabled at a time. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param proxyId Proxy identifier.
         */
        public EnableProxy(int proxyId) {
            this.proxyId = proxyId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1494450838;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Encrypts group call data before sending them over network using tgcalls.
     *
     * <p> Returns {@link Data Data} </p>
     */
    public static class EncryptGroupCallData extends Function<Data> {
        /**
         * Group call identifier. The call must not be a video chat.
         */
        public int groupCallId;
        /**
         * Data channel for which data is encrypted.
         */
        public GroupCallDataChannel dataChannel;
        /**
         * Data to encrypt.
         */
        public byte[] data;
        /**
         * Size of data prefix that must be kept unencrypted.
         */
        public int unencryptedPrefixSize;

        /**
         * Default constructor for a function, which encrypts group call data before sending them over network using tgcalls.
         *
         * <p> Returns {@link Data Data} </p>
         */
        public EncryptGroupCallData() {
        }

        /**
         * Creates a function, which encrypts group call data before sending them over network using tgcalls.
         *
         * <p> Returns {@link Data Data} </p>
         *
         * @param groupCallId Group call identifier. The call must not be a video chat.
         * @param dataChannel Data channel for which data is encrypted.
         * @param data Data to encrypt.
         * @param unencryptedPrefixSize Size of data prefix that must be kept unencrypted.
         */
        public EncryptGroupCallData(int groupCallId, GroupCallDataChannel dataChannel, byte[] data, int unencryptedPrefixSize) {
            this.groupCallId = groupCallId;
            this.dataChannel = dataChannel;
            this.data = data;
            this.unencryptedPrefixSize = unencryptedPrefixSize;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -377997690;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Ends a group call. Requires groupCall.canBeManaged right for video chats and live stories or groupCall.isOwned otherwise.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class EndGroupCall extends Function<Ok> {
        /**
         * Group call identifier.
         */
        public int groupCallId;

        /**
         * Default constructor for a function, which ends a group call. Requires groupCall.canBeManaged right for video chats and live stories or groupCall.isOwned otherwise.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public EndGroupCall() {
        }

        /**
         * Creates a function, which ends a group call. Requires groupCall.canBeManaged right for video chats and live stories or groupCall.isOwned otherwise.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier.
         */
        public EndGroupCall(int groupCallId) {
            this.groupCallId = groupCallId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 573131959;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Ends recording of an active group call; for video chats only. Requires groupCall.canBeManaged right.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class EndGroupCallRecording extends Function<Ok> {
        /**
         * Group call identifier.
         */
        public int groupCallId;

        /**
         * Default constructor for a function, which ends recording of an active group call; for video chats only. Requires groupCall.canBeManaged right.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public EndGroupCallRecording() {
        }

        /**
         * Creates a function, which ends recording of an active group call; for video chats only. Requires groupCall.canBeManaged right.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier.
         */
        public EndGroupCallRecording(int groupCallId) {
            this.groupCallId = groupCallId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -75799927;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Ends screen sharing in a joined group call; not supported in live stories.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class EndGroupCallScreenSharing extends Function<Ok> {
        /**
         * Group call identifier.
         */
        public int groupCallId;

        /**
         * Default constructor for a function, which ends screen sharing in a joined group call; not supported in live stories.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public EndGroupCallScreenSharing() {
        }

        /**
         * Creates a function, which ends screen sharing in a joined group call; not supported in live stories.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier.
         */
        public EndGroupCallScreenSharing(int groupCallId) {
            this.groupCallId = groupCallId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2047599540;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Finishes the file generation.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class FinishFileGeneration extends Function<Ok> {
        /**
         * The identifier of the generation process.
         */
        public long generationId;
        /**
         * If passed, the file generation has failed and must be terminated; pass null if the file generation succeeded.
         */
        public Error error;

        /**
         * Default constructor for a function, which finishes the file generation.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public FinishFileGeneration() {
        }

        /**
         * Creates a function, which finishes the file generation.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param generationId The identifier of the generation process.
         * @param error If passed, the file generation has failed and must be terminated; pass null if the file generation succeeded.
         */
        public FinishFileGeneration(long generationId, Error error) {
            this.generationId = generationId;
            this.error = error;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1055060835;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Fixes text using an AI model; must not be used in secret chats. May return an error with a message &quot;AICOMPOSE_FLOOD_PREMIUM&quot; if Telegram Premium is required to send further requests.
     *
     * <p> Returns {@link FixedText FixedText} </p>
     */
    public static class FixTextWithAi extends Function<FixedText> {
        /**
         * The original text.
         */
        public FormattedText text;

        /**
         * Default constructor for a function, which fixes text using an AI model; must not be used in secret chats. May return an error with a message &quot;AICOMPOSE_FLOOD_PREMIUM&quot; if Telegram Premium is required to send further requests.
         *
         * <p> Returns {@link FixedText FixedText} </p>
         */
        public FixTextWithAi() {
        }

        /**
         * Creates a function, which fixes text using an AI model; must not be used in secret chats. May return an error with a message &quot;AICOMPOSE_FLOOD_PREMIUM&quot; if Telegram Premium is required to send further requests.
         *
         * <p> Returns {@link FixedText FixedText} </p>
         *
         * @param text The original text.
         */
        public FixTextWithAi(FormattedText text) {
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2139647563;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Forwards previously sent messages. Returns the forwarded messages in the same order as the message identifiers passed in messageIds. If a message can't be forwarded, null will be returned instead of the message.
     *
     * <p> Returns {@link Messages Messages} </p>
     */
    public static class ForwardMessages extends Function<Messages> {
        /**
         * Identifier of the chat to which to forward messages.
         */
        public long chatId;
        /**
         * Topic in which the messages will be forwarded; message threads aren't supported; pass null if none.
         */
        public MessageTopic topicId;
        /**
         * Identifier of the chat from which to forward messages.
         */
        public long fromChatId;
        /**
         * Identifiers of the messages to forward. Message identifiers must be in a strictly increasing order. At most 100 messages can be forwarded simultaneously. A message can be forwarded only if messageProperties.canBeForwarded.
         */
        public long[] messageIds;
        /**
         * Options to be used to send the messages; pass null to use default options.
         */
        public MessageSendOptions options;
        /**
         * Pass true to copy content of the messages without reference to the original sender. Always true if the messages are forwarded to a secret chat or are local. Use messageProperties.canBeCopied and messageProperties.canBeCopiedToSecretChat to check whether the message is suitable.
         */
        public boolean sendCopy;
        /**
         * Pass true to remove media captions of message copies. Ignored if sendCopy is false.
         */
        public boolean removeCaption;

        /**
         * Default constructor for a function, which forwards previously sent messages. Returns the forwarded messages in the same order as the message identifiers passed in messageIds. If a message can't be forwarded, null will be returned instead of the message.
         *
         * <p> Returns {@link Messages Messages} </p>
         */
        public ForwardMessages() {
        }

        /**
         * Creates a function, which forwards previously sent messages. Returns the forwarded messages in the same order as the message identifiers passed in messageIds. If a message can't be forwarded, null will be returned instead of the message.
         *
         * <p> Returns {@link Messages Messages} </p>
         *
         * @param chatId Identifier of the chat to which to forward messages.
         * @param topicId Topic in which the messages will be forwarded; message threads aren't supported; pass null if none.
         * @param fromChatId Identifier of the chat from which to forward messages.
         * @param messageIds Identifiers of the messages to forward. Message identifiers must be in a strictly increasing order. At most 100 messages can be forwarded simultaneously. A message can be forwarded only if messageProperties.canBeForwarded.
         * @param options Options to be used to send the messages; pass null to use default options.
         * @param sendCopy Pass true to copy content of the messages without reference to the original sender. Always true if the messages are forwarded to a secret chat or are local. Use messageProperties.canBeCopied and messageProperties.canBeCopiedToSecretChat to check whether the message is suitable.
         * @param removeCaption Pass true to remove media captions of message copies. Ignored if sendCopy is false.
         */
        public ForwardMessages(long chatId, MessageTopic topicId, long fromChatId, long[] messageIds, MessageSendOptions options, boolean sendCopy, boolean removeCaption) {
            this.chatId = chatId;
            this.topicId = topicId;
            this.fromChatId = fromChatId;
            this.messageIds = messageIds;
            this.options = options;
            this.sendCopy = sendCopy;
            this.removeCaption = removeCaption;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -247889118;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the period of inactivity after which the account of the current user will automatically be deleted.
     *
     * <p> Returns {@link AccountTtl AccountTtl} </p>
     */
    public static class GetAccountTtl extends Function<AccountTtl> {

        /**
         * Default constructor for a function, which returns the period of inactivity after which the account of the current user will automatically be deleted.
         *
         * <p> Returns {@link AccountTtl AccountTtl} </p>
         */
        public GetAccountTtl() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -443905161;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns all active sessions of the current user.
     *
     * <p> Returns {@link Sessions Sessions} </p>
     */
    public static class GetActiveSessions extends Function<Sessions> {

        /**
         * Default constructor for a function, which returns all active sessions of the current user.
         *
         * <p> Returns {@link Sessions Sessions} </p>
         */
        public GetActiveSessions() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1119710526;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns all available Telegram Passport elements.
     *
     * <p> Returns {@link PassportElements PassportElements} </p>
     */
    public static class GetAllPassportElements extends Function<PassportElements> {
        /**
         * The 2-step verification password of the current user.
         */
        public String password;

        /**
         * Default constructor for a function, which returns all available Telegram Passport elements.
         *
         * <p> Returns {@link PassportElements PassportElements} </p>
         */
        public GetAllPassportElements() {
        }

        /**
         * Creates a function, which returns all available Telegram Passport elements.
         *
         * <p> Returns {@link PassportElements PassportElements} </p>
         *
         * @param password The 2-step verification password of the current user.
         */
        public GetAllPassportElements(String password) {
            this.password = password;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2038945045;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns unique emoji that correspond to stickers to be found by the getStickers(stickerType, query, 1000000, chatId).
     *
     * <p> Returns {@link Emojis Emojis} </p>
     */
    public static class GetAllStickerEmojis extends Function<Emojis> {
        /**
         * Type of the stickers to search for.
         */
        public StickerType stickerType;
        /**
         * Search query.
         */
        public String query;
        /**
         * Chat identifier for which to find stickers.
         */
        public long chatId;
        /**
         * Pass true if only main emoji for each found sticker must be included in the result.
         */
        public boolean returnOnlyMainEmoji;

        /**
         * Default constructor for a function, which returns unique emoji that correspond to stickers to be found by the getStickers(stickerType, query, 1000000, chatId).
         *
         * <p> Returns {@link Emojis Emojis} </p>
         */
        public GetAllStickerEmojis() {
        }

        /**
         * Creates a function, which returns unique emoji that correspond to stickers to be found by the getStickers(stickerType, query, 1000000, chatId).
         *
         * <p> Returns {@link Emojis Emojis} </p>
         *
         * @param stickerType Type of the stickers to search for.
         * @param query Search query.
         * @param chatId Chat identifier for which to find stickers.
         * @param returnOnlyMainEmoji Pass true if only main emoji for each found sticker must be included in the result.
         */
        public GetAllStickerEmojis(StickerType stickerType, String query, long chatId, boolean returnOnlyMainEmoji) {
            this.stickerType = stickerType;
            this.query = query;
            this.chatId = chatId;
            this.returnOnlyMainEmoji = returnOnlyMainEmoji;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 296562224;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an animated emoji corresponding to a given emoji. Returns a 404 error if the emoji has no animated emoji.
     *
     * <p> Returns {@link AnimatedEmoji AnimatedEmoji} </p>
     */
    public static class GetAnimatedEmoji extends Function<AnimatedEmoji> {
        /**
         * The emoji.
         */
        public String emoji;

        /**
         * Default constructor for a function, which returns an animated emoji corresponding to a given emoji. Returns a 404 error if the emoji has no animated emoji.
         *
         * <p> Returns {@link AnimatedEmoji AnimatedEmoji} </p>
         */
        public GetAnimatedEmoji() {
        }

        /**
         * Creates a function, which returns an animated emoji corresponding to a given emoji. Returns a 404 error if the emoji has no animated emoji.
         *
         * <p> Returns {@link AnimatedEmoji AnimatedEmoji} </p>
         *
         * @param emoji The emoji.
         */
        public GetAnimatedEmoji(String emoji) {
            this.emoji = emoji;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1065635702;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns application config, provided by the server. Can be called before authorization.
     *
     * <p> Returns {@link JsonValue JsonValue} </p>
     */
    public static class GetApplicationConfig extends Function<JsonValue> {

        /**
         * Default constructor for a function, which returns application config, provided by the server. Can be called before authorization.
         *
         * <p> Returns {@link JsonValue JsonValue} </p>
         */
        public GetApplicationConfig() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1823144318;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the link for downloading official Telegram application to be used when the current user invites friends to Telegram.
     *
     * <p> Returns {@link HttpUrl HttpUrl} </p>
     */
    public static class GetApplicationDownloadLink extends Function<HttpUrl> {

        /**
         * Default constructor for a function, which returns the link for downloading official Telegram application to be used when the current user invites friends to Telegram.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         */
        public GetApplicationDownloadLink() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 112013252;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns settings for automatic moving of chats to and from the Archive chat lists.
     *
     * <p> Returns {@link ArchiveChatListSettings ArchiveChatListSettings} </p>
     */
    public static class GetArchiveChatListSettings extends Function<ArchiveChatListSettings> {

        /**
         * Default constructor for a function, which returns settings for automatic moving of chats to and from the Archive chat lists.
         *
         * <p> Returns {@link ArchiveChatListSettings ArchiveChatListSettings} </p>
         */
        public GetArchiveChatListSettings() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2087874976;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a list of archived sticker sets.
     *
     * <p> Returns {@link StickerSets StickerSets} </p>
     */
    public static class GetArchivedStickerSets extends Function<StickerSets> {
        /**
         * Type of the sticker sets to return.
         */
        public StickerType stickerType;
        /**
         * Identifier of the sticker set from which to return the result; use 0 to get results from the beginning.
         */
        public long offsetStickerSetId;
        /**
         * The maximum number of sticker sets to return; up to 100.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns a list of archived sticker sets.
         *
         * <p> Returns {@link StickerSets StickerSets} </p>
         */
        public GetArchivedStickerSets() {
        }

        /**
         * Creates a function, which returns a list of archived sticker sets.
         *
         * <p> Returns {@link StickerSets StickerSets} </p>
         *
         * @param stickerType Type of the sticker sets to return.
         * @param offsetStickerSetId Identifier of the sticker set from which to return the result; use 0 to get results from the beginning.
         * @param limit The maximum number of sticker sets to return; up to 100.
         */
        public GetArchivedStickerSets(StickerType stickerType, long offsetStickerSetId, int limit) {
            this.stickerType = stickerType;
            this.offsetStickerSetId = offsetStickerSetId;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1001931341;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a list of sticker sets attached to a file, including regular, mask, and emoji sticker sets. Currently, only animations, photos, and videos can have attached sticker sets.
     *
     * <p> Returns {@link StickerSets StickerSets} </p>
     */
    public static class GetAttachedStickerSets extends Function<StickerSets> {
        /**
         * File identifier.
         */
        public int fileId;

        /**
         * Default constructor for a function, which returns a list of sticker sets attached to a file, including regular, mask, and emoji sticker sets. Currently, only animations, photos, and videos can have attached sticker sets.
         *
         * <p> Returns {@link StickerSets StickerSets} </p>
         */
        public GetAttachedStickerSets() {
        }

        /**
         * Creates a function, which returns a list of sticker sets attached to a file, including regular, mask, and emoji sticker sets. Currently, only animations, photos, and videos can have attached sticker sets.
         *
         * <p> Returns {@link StickerSets StickerSets} </p>
         *
         * @param fileId File identifier.
         */
        public GetAttachedStickerSets(int fileId) {
            this.fileId = fileId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1302172429;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a bot that can be added to attachment or side menu.
     *
     * <p> Returns {@link AttachmentMenuBot AttachmentMenuBot} </p>
     */
    public static class GetAttachmentMenuBot extends Function<AttachmentMenuBot> {
        /**
         * Bot's user identifier.
         */
        public long botUserId;

        /**
         * Default constructor for a function, which returns information about a bot that can be added to attachment or side menu.
         *
         * <p> Returns {@link AttachmentMenuBot AttachmentMenuBot} </p>
         */
        public GetAttachmentMenuBot() {
        }

        /**
         * Creates a function, which returns information about a bot that can be added to attachment or side menu.
         *
         * <p> Returns {@link AttachmentMenuBot AttachmentMenuBot} </p>
         *
         * @param botUserId Bot's user identifier.
         */
        public GetAttachmentMenuBot(long botUserId) {
            this.botUserId = botUserId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1034248699;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns parameters for authentication using a passkey as JSON-serialized string.
     *
     * <p> Returns {@link Text Text} </p>
     */
    public static class GetAuthenticationPasskeyParameters extends Function<Text> {

        /**
         * Default constructor for a function, which returns parameters for authentication using a passkey as JSON-serialized string.
         *
         * <p> Returns {@link Text Text} </p>
         */
        public GetAuthenticationPasskeyParameters() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -686037865;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the current authorization state. This is an offline method. For informational purposes only. Use updateAuthorizationState instead to maintain the current authorization state. Can be called before initialization.
     *
     * <p> Returns {@link AuthorizationState AuthorizationState} </p>
     */
    public static class GetAuthorizationState extends Function<AuthorizationState> {

        /**
         * Default constructor for a function, which returns the current authorization state. This is an offline method. For informational purposes only. Use updateAuthorizationState instead to maintain the current authorization state. Can be called before initialization.
         *
         * <p> Returns {@link AuthorizationState AuthorizationState} </p>
         */
        public GetAuthorizationState() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1949154877;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns auto-download settings presets for the current user.
     *
     * <p> Returns {@link AutoDownloadSettingsPresets AutoDownloadSettingsPresets} </p>
     */
    public static class GetAutoDownloadSettingsPresets extends Function<AutoDownloadSettingsPresets> {

        /**
         * Default constructor for a function, which returns auto-download settings presets for the current user.
         *
         * <p> Returns {@link AutoDownloadSettingsPresets AutoDownloadSettingsPresets} </p>
         */
        public GetAutoDownloadSettingsPresets() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1721088201;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns autosave settings for the current user.
     *
     * <p> Returns {@link AutosaveSettings AutosaveSettings} </p>
     */
    public static class GetAutosaveSettings extends Function<AutosaveSettings> {

        /**
         * Default constructor for a function, which returns autosave settings for the current user.
         *
         * <p> Returns {@link AutosaveSettings AutosaveSettings} </p>
         */
        public GetAutosaveSettings() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2136207914;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of available chat boost slots for the current user.
     *
     * <p> Returns {@link ChatBoostSlots ChatBoostSlots} </p>
     */
    public static class GetAvailableChatBoostSlots extends Function<ChatBoostSlots> {

        /**
         * Default constructor for a function, which returns the list of available chat boost slots for the current user.
         *
         * <p> Returns {@link ChatBoostSlots ChatBoostSlots} </p>
         */
        public GetAvailableChatBoostSlots() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1929898965;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns gifts that can be sent to other users and channel chats.
     *
     * <p> Returns {@link AvailableGifts AvailableGifts} </p>
     */
    public static class GetAvailableGifts extends Function<AvailableGifts> {

        /**
         * Default constructor for a function, which returns gifts that can be sent to other users and channel chats.
         *
         * <p> Returns {@link AvailableGifts AvailableGifts} </p>
         */
        public GetAvailableGifts() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -4559695;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Constructs a persistent HTTP URL for a background.
     *
     * <p> Returns {@link HttpUrl HttpUrl} </p>
     */
    public static class GetBackgroundUrl extends Function<HttpUrl> {
        /**
         * Background name.
         */
        public String name;
        /**
         * Background type; backgroundTypeChatTheme isn't supported.
         */
        public BackgroundType type;

        /**
         * Default constructor for a function, which constructs a persistent HTTP URL for a background.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         */
        public GetBackgroundUrl() {
        }

        /**
         * Creates a function, which constructs a persistent HTTP URL for a background.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         *
         * @param name Background name.
         * @param type Background type; backgroundTypeChatTheme isn't supported.
         */
        public GetBackgroundUrl(String name, BackgroundType type) {
            this.name = name;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 733769682;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a bank card.
     *
     * <p> Returns {@link BankCardInfo BankCardInfo} </p>
     */
    public static class GetBankCardInfo extends Function<BankCardInfo> {
        /**
         * The bank card number.
         */
        public String bankCardNumber;

        /**
         * Default constructor for a function, which returns information about a bank card.
         *
         * <p> Returns {@link BankCardInfo BankCardInfo} </p>
         */
        public GetBankCardInfo() {
        }

        /**
         * Creates a function, which returns information about a bank card.
         *
         * <p> Returns {@link BankCardInfo BankCardInfo} </p>
         *
         * @param bankCardNumber The bank card number.
         */
        public GetBankCardInfo(String bankCardNumber) {
            this.bankCardNumber = bankCardNumber;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1310515792;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a basic group by its identifier. This is an offline method if the current user is not a bot.
     *
     * <p> Returns {@link BasicGroup BasicGroup} </p>
     */
    public static class GetBasicGroup extends Function<BasicGroup> {
        /**
         * Basic group identifier.
         */
        public long basicGroupId;

        /**
         * Default constructor for a function, which returns information about a basic group by its identifier. This is an offline method if the current user is not a bot.
         *
         * <p> Returns {@link BasicGroup BasicGroup} </p>
         */
        public GetBasicGroup() {
        }

        /**
         * Creates a function, which returns information about a basic group by its identifier. This is an offline method if the current user is not a bot.
         *
         * <p> Returns {@link BasicGroup BasicGroup} </p>
         *
         * @param basicGroupId Basic group identifier.
         */
        public GetBasicGroup(long basicGroupId) {
            this.basicGroupId = basicGroupId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1635174828;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns full information about a basic group by its identifier.
     *
     * <p> Returns {@link BasicGroupFullInfo BasicGroupFullInfo} </p>
     */
    public static class GetBasicGroupFullInfo extends Function<BasicGroupFullInfo> {
        /**
         * Basic group identifier.
         */
        public long basicGroupId;

        /**
         * Default constructor for a function, which returns full information about a basic group by its identifier.
         *
         * <p> Returns {@link BasicGroupFullInfo BasicGroupFullInfo} </p>
         */
        public GetBasicGroupFullInfo() {
        }

        /**
         * Creates a function, which returns full information about a basic group by its identifier.
         *
         * <p> Returns {@link BasicGroupFullInfo BasicGroupFullInfo} </p>
         *
         * @param basicGroupId Basic group identifier.
         */
        public GetBasicGroupFullInfo(long basicGroupId) {
            this.basicGroupId = basicGroupId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1822039253;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns users and chats that were blocked by the current user.
     *
     * <p> Returns {@link MessageSenders MessageSenders} </p>
     */
    public static class GetBlockedMessageSenders extends Function<MessageSenders> {
        /**
         * Block list from which to return users.
         */
        public BlockList blockList;
        /**
         * Number of users and chats to skip in the result; must be non-negative.
         */
        public int offset;
        /**
         * The maximum number of users and chats to return; up to 100.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns users and chats that were blocked by the current user.
         *
         * <p> Returns {@link MessageSenders MessageSenders} </p>
         */
        public GetBlockedMessageSenders() {
        }

        /**
         * Creates a function, which returns users and chats that were blocked by the current user.
         *
         * <p> Returns {@link MessageSenders MessageSenders} </p>
         *
         * @param blockList Block list from which to return users.
         * @param offset Number of users and chats to skip in the result; must be non-negative.
         * @param limit The maximum number of users and chats to return; up to 100.
         */
        public GetBlockedMessageSenders(BlockList blockList, int offset, int limit) {
            this.blockList = blockList;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1931137258;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the text shown in the chat with a bot if the chat is empty in the given language. Can be called only if userTypeBot.canBeEdited == true.
     *
     * <p> Returns {@link Text Text} </p>
     */
    public static class GetBotInfoDescription extends Function<Text> {
        /**
         * Identifier of the target bot.
         */
        public long botUserId;
        /**
         * A two-letter ISO 639-1 language code or an empty string.
         */
        public String languageCode;

        /**
         * Default constructor for a function, which returns the text shown in the chat with a bot if the chat is empty in the given language. Can be called only if userTypeBot.canBeEdited == true.
         *
         * <p> Returns {@link Text Text} </p>
         */
        public GetBotInfoDescription() {
        }

        /**
         * Creates a function, which returns the text shown in the chat with a bot if the chat is empty in the given language. Can be called only if userTypeBot.canBeEdited == true.
         *
         * <p> Returns {@link Text Text} </p>
         *
         * @param botUserId Identifier of the target bot.
         * @param languageCode A two-letter ISO 639-1 language code or an empty string.
         */
        public GetBotInfoDescription(long botUserId, String languageCode) {
            this.botUserId = botUserId;
            this.languageCode = languageCode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -762841035;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the text shown on a bot's profile page and sent together with the link when users share the bot in the given language. Can be called only if userTypeBot.canBeEdited == true.
     *
     * <p> Returns {@link Text Text} </p>
     */
    public static class GetBotInfoShortDescription extends Function<Text> {
        /**
         * Identifier of the target bot.
         */
        public long botUserId;
        /**
         * A two-letter ISO 639-1 language code or an empty string.
         */
        public String languageCode;

        /**
         * Default constructor for a function, which returns the text shown on a bot's profile page and sent together with the link when users share the bot in the given language. Can be called only if userTypeBot.canBeEdited == true.
         *
         * <p> Returns {@link Text Text} </p>
         */
        public GetBotInfoShortDescription() {
        }

        /**
         * Creates a function, which returns the text shown on a bot's profile page and sent together with the link when users share the bot in the given language. Can be called only if userTypeBot.canBeEdited == true.
         *
         * <p> Returns {@link Text Text} </p>
         *
         * @param botUserId Identifier of the target bot.
         * @param languageCode A two-letter ISO 639-1 language code or an empty string.
         */
        public GetBotInfoShortDescription(long botUserId, String languageCode) {
            this.botUserId = botUserId;
            this.languageCode = languageCode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1243358740;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of media previews for the given language and the list of languages for which the bot has dedicated previews.
     *
     * <p> Returns {@link BotMediaPreviewInfo BotMediaPreviewInfo} </p>
     */
    public static class GetBotMediaPreviewInfo extends Function<BotMediaPreviewInfo> {
        /**
         * Identifier of the target bot. The bot must be owned and must have the main Web App.
         */
        public long botUserId;
        /**
         * A two-letter ISO 639-1 language code for which to get previews. If empty, then default previews are returned.
         */
        public String languageCode;

        /**
         * Default constructor for a function, which returns the list of media previews for the given language and the list of languages for which the bot has dedicated previews.
         *
         * <p> Returns {@link BotMediaPreviewInfo BotMediaPreviewInfo} </p>
         */
        public GetBotMediaPreviewInfo() {
        }

        /**
         * Creates a function, which returns the list of media previews for the given language and the list of languages for which the bot has dedicated previews.
         *
         * <p> Returns {@link BotMediaPreviewInfo BotMediaPreviewInfo} </p>
         *
         * @param botUserId Identifier of the target bot. The bot must be owned and must have the main Web App.
         * @param languageCode A two-letter ISO 639-1 language code for which to get previews. If empty, then default previews are returned.
         */
        public GetBotMediaPreviewInfo(long botUserId, String languageCode) {
            this.botUserId = botUserId;
            this.languageCode = languageCode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1358299446;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of media previews of a bot.
     *
     * <p> Returns {@link BotMediaPreviews BotMediaPreviews} </p>
     */
    public static class GetBotMediaPreviews extends Function<BotMediaPreviews> {
        /**
         * Identifier of the target bot. The bot must have the main Web App.
         */
        public long botUserId;

        /**
         * Default constructor for a function, which returns the list of media previews of a bot.
         *
         * <p> Returns {@link BotMediaPreviews BotMediaPreviews} </p>
         */
        public GetBotMediaPreviews() {
        }

        /**
         * Creates a function, which returns the list of media previews of a bot.
         *
         * <p> Returns {@link BotMediaPreviews BotMediaPreviews} </p>
         *
         * @param botUserId Identifier of the target bot. The bot must have the main Web App.
         */
        public GetBotMediaPreviews(long botUserId) {
            this.botUserId = botUserId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 577131608;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the name of a bot in the given language. Can be called only if userTypeBot.canBeEdited == true.
     *
     * <p> Returns {@link Text Text} </p>
     */
    public static class GetBotName extends Function<Text> {
        /**
         * Identifier of the target bot.
         */
        public long botUserId;
        /**
         * A two-letter ISO 639-1 language code or an empty string.
         */
        public String languageCode;

        /**
         * Default constructor for a function, which returns the name of a bot in the given language. Can be called only if userTypeBot.canBeEdited == true.
         *
         * <p> Returns {@link Text Text} </p>
         */
        public GetBotName() {
        }

        /**
         * Creates a function, which returns the name of a bot in the given language. Can be called only if userTypeBot.canBeEdited == true.
         *
         * <p> Returns {@link Text Text} </p>
         *
         * @param botUserId Identifier of the target bot.
         * @param languageCode A two-letter ISO 639-1 language code or an empty string.
         */
        public GetBotName(long botUserId, String languageCode) {
            this.botUserId = botUserId;
            this.languageCode = languageCode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1707118036;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns approximate number of bots similar to the given bot.
     *
     * <p> Returns {@link Count Count} </p>
     */
    public static class GetBotSimilarBotCount extends Function<Count> {
        /**
         * User identifier of the target bot.
         */
        public long botUserId;
        /**
         * Pass true to get the number of bots without sending network requests, or -1 if the number of bots is unknown locally.
         */
        public boolean returnLocal;

        /**
         * Default constructor for a function, which returns approximate number of bots similar to the given bot.
         *
         * <p> Returns {@link Count Count} </p>
         */
        public GetBotSimilarBotCount() {
        }

        /**
         * Creates a function, which returns approximate number of bots similar to the given bot.
         *
         * <p> Returns {@link Count Count} </p>
         *
         * @param botUserId User identifier of the target bot.
         * @param returnLocal Pass true to get the number of bots without sending network requests, or -1 if the number of bots is unknown locally.
         */
        public GetBotSimilarBotCount(long botUserId, boolean returnLocal) {
            this.botUserId = botUserId;
            this.returnLocal = returnLocal;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1271545369;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a list of bots similar to the given bot.
     *
     * <p> Returns {@link Users Users} </p>
     */
    public static class GetBotSimilarBots extends Function<Users> {
        /**
         * User identifier of the target bot.
         */
        public long botUserId;

        /**
         * Default constructor for a function, which returns a list of bots similar to the given bot.
         *
         * <p> Returns {@link Users Users} </p>
         */
        public GetBotSimilarBots() {
        }

        /**
         * Creates a function, which returns a list of bots similar to the given bot.
         *
         * <p> Returns {@link Users Users} </p>
         *
         * @param botUserId User identifier of the target bot.
         */
        public GetBotSimilarBots(long botUserId) {
            this.botUserId = botUserId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -825139275;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the Telegram Star amount owned by a business account; for bots only.
     *
     * <p> Returns {@link StarAmount StarAmount} </p>
     */
    public static class GetBusinessAccountStarAmount extends Function<StarAmount> {
        /**
         * Unique identifier of business connection.
         */
        public String businessConnectionId;

        /**
         * Default constructor for a function, which returns the Telegram Star amount owned by a business account; for bots only.
         *
         * <p> Returns {@link StarAmount StarAmount} </p>
         */
        public GetBusinessAccountStarAmount() {
        }

        /**
         * Creates a function, which returns the Telegram Star amount owned by a business account; for bots only.
         *
         * <p> Returns {@link StarAmount StarAmount} </p>
         *
         * @param businessConnectionId Unique identifier of business connection.
         */
        public GetBusinessAccountStarAmount(String businessConnectionId) {
            this.businessConnectionId = businessConnectionId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1817136693;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a business chat link.
     *
     * <p> Returns {@link BusinessChatLinkInfo BusinessChatLinkInfo} </p>
     */
    public static class GetBusinessChatLinkInfo extends Function<BusinessChatLinkInfo> {
        /**
         * Name of the link.
         */
        public String linkName;

        /**
         * Default constructor for a function, which returns information about a business chat link.
         *
         * <p> Returns {@link BusinessChatLinkInfo BusinessChatLinkInfo} </p>
         */
        public GetBusinessChatLinkInfo() {
        }

        /**
         * Creates a function, which returns information about a business chat link.
         *
         * <p> Returns {@link BusinessChatLinkInfo BusinessChatLinkInfo} </p>
         *
         * @param linkName Name of the link.
         */
        public GetBusinessChatLinkInfo(String linkName) {
            this.linkName = linkName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 797670986;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns business chat links created for the current account.
     *
     * <p> Returns {@link BusinessChatLinks BusinessChatLinks} </p>
     */
    public static class GetBusinessChatLinks extends Function<BusinessChatLinks> {

        /**
         * Default constructor for a function, which returns business chat links created for the current account.
         *
         * <p> Returns {@link BusinessChatLinks BusinessChatLinks} </p>
         */
        public GetBusinessChatLinks() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 710287703;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the business bot that is connected to the current user account. Returns a 404 error if there is no connected bot.
     *
     * <p> Returns {@link BusinessConnectedBot BusinessConnectedBot} </p>
     */
    public static class GetBusinessConnectedBot extends Function<BusinessConnectedBot> {

        /**
         * Default constructor for a function, which returns the business bot that is connected to the current user account. Returns a 404 error if there is no connected bot.
         *
         * <p> Returns {@link BusinessConnectedBot BusinessConnectedBot} </p>
         */
        public GetBusinessConnectedBot() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 911058883;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a business connection by its identifier; for bots only.
     *
     * <p> Returns {@link BusinessConnection BusinessConnection} </p>
     */
    public static class GetBusinessConnection extends Function<BusinessConnection> {
        /**
         * Identifier of the business connection to return.
         */
        public String connectionId;

        /**
         * Default constructor for a function, which returns information about a business connection by its identifier; for bots only.
         *
         * <p> Returns {@link BusinessConnection BusinessConnection} </p>
         */
        public GetBusinessConnection() {
        }

        /**
         * Creates a function, which returns information about a business connection by its identifier; for bots only.
         *
         * <p> Returns {@link BusinessConnection BusinessConnection} </p>
         *
         * @param connectionId Identifier of the business connection to return.
         */
        public GetBusinessConnection(String connectionId) {
            this.connectionId = connectionId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2114706400;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about features, available to Business users.
     *
     * <p> Returns {@link BusinessFeatures BusinessFeatures} </p>
     */
    public static class GetBusinessFeatures extends Function<BusinessFeatures> {
        /**
         * Source of the request; pass null if the method is called from settings or some non-standard source.
         */
        public BusinessFeature source;

        /**
         * Default constructor for a function, which returns information about features, available to Business users.
         *
         * <p> Returns {@link BusinessFeatures BusinessFeatures} </p>
         */
        public GetBusinessFeatures() {
        }

        /**
         * Creates a function, which returns information about features, available to Business users.
         *
         * <p> Returns {@link BusinessFeatures BusinessFeatures} </p>
         *
         * @param source Source of the request; pass null if the method is called from settings or some non-standard source.
         */
        public GetBusinessFeatures(BusinessFeature source) {
            this.source = source;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -997171199;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends a callback query to a bot and returns an answer. Returns an error with code 502 if the bot fails to answer the query before the query timeout expires.
     *
     * <p> Returns {@link CallbackQueryAnswer CallbackQueryAnswer} </p>
     */
    public static class GetCallbackQueryAnswer extends Function<CallbackQueryAnswer> {
        /**
         * Identifier of the chat with the message.
         */
        public long chatId;
        /**
         * Identifier of the message from which the query originated. The message must not be scheduled.
         */
        public long messageId;
        /**
         * Query payload.
         */
        public CallbackQueryPayload payload;

        /**
         * Default constructor for a function, which sends a callback query to a bot and returns an answer. Returns an error with code 502 if the bot fails to answer the query before the query timeout expires.
         *
         * <p> Returns {@link CallbackQueryAnswer CallbackQueryAnswer} </p>
         */
        public GetCallbackQueryAnswer() {
        }

        /**
         * Creates a function, which sends a callback query to a bot and returns an answer. Returns an error with code 502 if the bot fails to answer the query before the query timeout expires.
         *
         * <p> Returns {@link CallbackQueryAnswer CallbackQueryAnswer} </p>
         *
         * @param chatId Identifier of the chat with the message.
         * @param messageId Identifier of the message from which the query originated. The message must not be scheduled.
         * @param payload Query payload.
         */
        public GetCallbackQueryAnswer(long chatId, long messageId, CallbackQueryPayload payload) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.payload = payload;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 116357727;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a message with the callback button that originated a callback query; for bots only.
     *
     * <p> Returns {@link Message Message} </p>
     */
    public static class GetCallbackQueryMessage extends Function<Message> {
        /**
         * Identifier of the chat the message belongs to.
         */
        public long chatId;
        /**
         * Message identifier.
         */
        public long messageId;
        /**
         * Identifier of the callback query.
         */
        public long callbackQueryId;

        /**
         * Default constructor for a function, which returns information about a message with the callback button that originated a callback query; for bots only.
         *
         * <p> Returns {@link Message Message} </p>
         */
        public GetCallbackQueryMessage() {
        }

        /**
         * Creates a function, which returns information about a message with the callback button that originated a callback query; for bots only.
         *
         * <p> Returns {@link Message Message} </p>
         *
         * @param chatId Identifier of the chat the message belongs to.
         * @param messageId Message identifier.
         * @param callbackQueryId Identifier of the callback query.
         */
        public GetCallbackQueryMessage(long chatId, long messageId, long callbackQueryId) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.callbackQueryId = callbackQueryId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1121939086;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a chat by its identifier. This is an offline method if the current user is not a bot.
     *
     * <p> Returns {@link Chat Chat} </p>
     */
    public static class GetChat extends Function<Chat> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which returns information about a chat by its identifier. This is an offline method if the current user is not a bot.
         *
         * <p> Returns {@link Chat Chat} </p>
         */
        public GetChat() {
        }

        /**
         * Creates a function, which returns information about a chat by its identifier. This is an offline method if the current user is not a bot.
         *
         * <p> Returns {@link Chat Chat} </p>
         *
         * @param chatId Chat identifier.
         */
        public GetChat(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1866601536;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of active stories posted by the given chat.
     *
     * <p> Returns {@link ChatActiveStories ChatActiveStories} </p>
     */
    public static class GetChatActiveStories extends Function<ChatActiveStories> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which returns the list of active stories posted by the given chat.
         *
         * <p> Returns {@link ChatActiveStories ChatActiveStories} </p>
         */
        public GetChatActiveStories() {
        }

        /**
         * Creates a function, which returns the list of active stories posted by the given chat.
         *
         * <p> Returns {@link ChatActiveStories ChatActiveStories} </p>
         *
         * @param chatId Chat identifier.
         */
        public GetChatActiveStories(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 776993781;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a list of administrators of the chat with their custom titles.
     *
     * <p> Returns {@link ChatAdministrators ChatAdministrators} </p>
     */
    public static class GetChatAdministrators extends Function<ChatAdministrators> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which returns a list of administrators of the chat with their custom titles.
         *
         * <p> Returns {@link ChatAdministrators ChatAdministrators} </p>
         */
        public GetChatAdministrators() {
        }

        /**
         * Creates a function, which returns a list of administrators of the chat with their custom titles.
         *
         * <p> Returns {@link ChatAdministrators ChatAdministrators} </p>
         *
         * @param chatId Chat identifier.
         */
        public GetChatAdministrators(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1544468155;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of all stories posted by the given chat; requires canEditStories administrator right in the chat. The stories are returned in reverse chronological order (i.e., in order of decreasing storyId). For optimal performance, the number of returned stories is chosen by TDLib.
     *
     * <p> Returns {@link Stories Stories} </p>
     */
    public static class GetChatArchivedStories extends Function<Stories> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifier of the story starting from which stories must be returned; use 0 to get results from the last story.
         */
        public int fromStoryId;
        /**
         * The maximum number of stories to be returned. For optimal performance, the number of returned stories is chosen by TDLib and can be smaller than the specified limit.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns the list of all stories posted by the given chat; requires canEditStories administrator right in the chat. The stories are returned in reverse chronological order (i.e., in order of decreasing storyId). For optimal performance, the number of returned stories is chosen by TDLib.
         *
         * <p> Returns {@link Stories Stories} </p>
         */
        public GetChatArchivedStories() {
        }

        /**
         * Creates a function, which returns the list of all stories posted by the given chat; requires canEditStories administrator right in the chat. The stories are returned in reverse chronological order (i.e., in order of decreasing storyId). For optimal performance, the number of returned stories is chosen by TDLib.
         *
         * <p> Returns {@link Stories Stories} </p>
         *
         * @param chatId Chat identifier.
         * @param fromStoryId Identifier of the story starting from which stories must be returned; use 0 to get results from the last story.
         * @param limit The maximum number of stories to be returned. For optimal performance, the number of returned stories is chosen by TDLib and can be smaller than the specified limit.
         */
        public GetChatArchivedStories(long chatId, int fromStoryId, int limit) {
            this.chatId = chatId;
            this.fromStoryId = fromStoryId;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1356950392;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of message sender identifiers, which can be used to send messages in a chat.
     *
     * <p> Returns {@link ChatMessageSenders ChatMessageSenders} </p>
     */
    public static class GetChatAvailableMessageSenders extends Function<ChatMessageSenders> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which returns the list of message sender identifiers, which can be used to send messages in a chat.
         *
         * <p> Returns {@link ChatMessageSenders ChatMessageSenders} </p>
         */
        public GetChatAvailableMessageSenders() {
        }

        /**
         * Creates a function, which returns the list of message sender identifiers, which can be used to send messages in a chat.
         *
         * <p> Returns {@link ChatMessageSenders ChatMessageSenders} </p>
         *
         * @param chatId Chat identifier.
         */
        public GetChatAvailableMessageSenders(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1158670635;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of message sender identifiers, which can be used to send a paid reaction in a chat.
     *
     * <p> Returns {@link MessageSenders MessageSenders} </p>
     */
    public static class GetChatAvailablePaidMessageReactionSenders extends Function<MessageSenders> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which returns the list of message sender identifiers, which can be used to send a paid reaction in a chat.
         *
         * <p> Returns {@link MessageSenders MessageSenders} </p>
         */
        public GetChatAvailablePaidMessageReactionSenders() {
        }

        /**
         * Creates a function, which returns the list of message sender identifiers, which can be used to send a paid reaction in a chat.
         *
         * <p> Returns {@link MessageSenders MessageSenders} </p>
         *
         * @param chatId Chat identifier.
         */
        public GetChatAvailablePaidMessageReactionSenders(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1244619639;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of features available for different chat boost levels. This is an offline method.
     *
     * <p> Returns {@link ChatBoostFeatures ChatBoostFeatures} </p>
     */
    public static class GetChatBoostFeatures extends Function<ChatBoostFeatures> {
        /**
         * Pass true to get the list of features for channels; pass false to get the list of features for supergroups.
         */
        public boolean isChannel;

        /**
         * Default constructor for a function, which returns the list of features available for different chat boost levels. This is an offline method.
         *
         * <p> Returns {@link ChatBoostFeatures ChatBoostFeatures} </p>
         */
        public GetChatBoostFeatures() {
        }

        /**
         * Creates a function, which returns the list of features available for different chat boost levels. This is an offline method.
         *
         * <p> Returns {@link ChatBoostFeatures ChatBoostFeatures} </p>
         *
         * @param isChannel Pass true to get the list of features for channels; pass false to get the list of features for supergroups.
         */
        public GetChatBoostFeatures(boolean isChannel) {
            this.isChannel = isChannel;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -389994336;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of features available on the specific chat boost level. This is an offline method.
     *
     * <p> Returns {@link ChatBoostLevelFeatures ChatBoostLevelFeatures} </p>
     */
    public static class GetChatBoostLevelFeatures extends Function<ChatBoostLevelFeatures> {
        /**
         * Pass true to get the list of features for channels; pass false to get the list of features for supergroups.
         */
        public boolean isChannel;
        /**
         * Chat boost level.
         */
        public int level;

        /**
         * Default constructor for a function, which returns the list of features available on the specific chat boost level. This is an offline method.
         *
         * <p> Returns {@link ChatBoostLevelFeatures ChatBoostLevelFeatures} </p>
         */
        public GetChatBoostLevelFeatures() {
        }

        /**
         * Creates a function, which returns the list of features available on the specific chat boost level. This is an offline method.
         *
         * <p> Returns {@link ChatBoostLevelFeatures ChatBoostLevelFeatures} </p>
         *
         * @param isChannel Pass true to get the list of features for channels; pass false to get the list of features for supergroups.
         * @param level Chat boost level.
         */
        public GetChatBoostLevelFeatures(boolean isChannel, int level) {
            this.isChannel = isChannel;
            this.level = level;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1172717195;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an HTTPS link to boost the specified supergroup or channel chat.
     *
     * <p> Returns {@link ChatBoostLink ChatBoostLink} </p>
     */
    public static class GetChatBoostLink extends Function<ChatBoostLink> {
        /**
         * Identifier of the chat.
         */
        public long chatId;

        /**
         * Default constructor for a function, which returns an HTTPS link to boost the specified supergroup or channel chat.
         *
         * <p> Returns {@link ChatBoostLink ChatBoostLink} </p>
         */
        public GetChatBoostLink() {
        }

        /**
         * Creates a function, which returns an HTTPS link to boost the specified supergroup or channel chat.
         *
         * <p> Returns {@link ChatBoostLink ChatBoostLink} </p>
         *
         * @param chatId Identifier of the chat.
         */
        public GetChatBoostLink(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1458662533;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a link to boost a chat. Can be called for any internal link of the type internalLinkTypeChatBoost.
     *
     * <p> Returns {@link ChatBoostLinkInfo ChatBoostLinkInfo} </p>
     */
    public static class GetChatBoostLinkInfo extends Function<ChatBoostLinkInfo> {
        /**
         * The link to boost a chat.
         */
        public String url;

        /**
         * Default constructor for a function, which returns information about a link to boost a chat. Can be called for any internal link of the type internalLinkTypeChatBoost.
         *
         * <p> Returns {@link ChatBoostLinkInfo ChatBoostLinkInfo} </p>
         */
        public GetChatBoostLinkInfo() {
        }

        /**
         * Creates a function, which returns information about a link to boost a chat. Can be called for any internal link of the type internalLinkTypeChatBoost.
         *
         * <p> Returns {@link ChatBoostLinkInfo ChatBoostLinkInfo} </p>
         *
         * @param url The link to boost a chat.
         */
        public GetChatBoostLinkInfo(String url) {
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 654068572;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the current boost status for a supergroup or a channel chat.
     *
     * <p> Returns {@link ChatBoostStatus ChatBoostStatus} </p>
     */
    public static class GetChatBoostStatus extends Function<ChatBoostStatus> {
        /**
         * Identifier of the chat.
         */
        public long chatId;

        /**
         * Default constructor for a function, which returns the current boost status for a supergroup or a channel chat.
         *
         * <p> Returns {@link ChatBoostStatus ChatBoostStatus} </p>
         */
        public GetChatBoostStatus() {
        }

        /**
         * Creates a function, which returns the current boost status for a supergroup or a channel chat.
         *
         * <p> Returns {@link ChatBoostStatus ChatBoostStatus} </p>
         *
         * @param chatId Identifier of the chat.
         */
        public GetChatBoostStatus(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -810775857;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of boosts applied to a chat; requires administrator rights in the chat.
     *
     * <p> Returns {@link FoundChatBoosts FoundChatBoosts} </p>
     */
    public static class GetChatBoosts extends Function<FoundChatBoosts> {
        /**
         * Identifier of the chat.
         */
        public long chatId;
        /**
         * Pass true to receive only boosts received from gift codes and giveaways created by the chat.
         */
        public boolean onlyGiftCodes;
        /**
         * Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         */
        public String offset;
        /**
         * The maximum number of boosts to be returned; up to 100. For optimal performance, the number of returned boosts can be smaller than the specified limit.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns the list of boosts applied to a chat; requires administrator rights in the chat.
         *
         * <p> Returns {@link FoundChatBoosts FoundChatBoosts} </p>
         */
        public GetChatBoosts() {
        }

        /**
         * Creates a function, which returns the list of boosts applied to a chat; requires administrator rights in the chat.
         *
         * <p> Returns {@link FoundChatBoosts FoundChatBoosts} </p>
         *
         * @param chatId Identifier of the chat.
         * @param onlyGiftCodes Pass true to receive only boosts received from gift codes and giveaways created by the chat.
         * @param offset Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         * @param limit The maximum number of boosts to be returned; up to 100. For optimal performance, the number of returned boosts can be smaller than the specified limit.
         */
        public GetChatBoosts(long chatId, boolean onlyGiftCodes, String offset, int limit) {
            this.chatId = chatId;
            this.onlyGiftCodes = onlyGiftCodes;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1419859400;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a list of service actions taken by chat members and administrators in the last 48 hours. Available only for supergroups and channels. Requires administrator rights. Returns results in reverse chronological order (i.e., in order of decreasing eventId).
     *
     * <p> Returns {@link ChatEvents ChatEvents} </p>
     */
    public static class GetChatEventLog extends Function<ChatEvents> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Search query by which to filter events.
         */
        public String query;
        /**
         * Identifier of an event from which to return results. Use 0 to get results from the latest events.
         */
        public long fromEventId;
        /**
         * The maximum number of events to return; up to 100.
         */
        public int limit;
        /**
         * The types of events to return; pass null to get chat events of all types.
         */
        public ChatEventLogFilters filters;
        /**
         * User identifiers by which to filter events. By default, events relating to all users will be returned.
         */
        public long[] userIds;

        /**
         * Default constructor for a function, which returns a list of service actions taken by chat members and administrators in the last 48 hours. Available only for supergroups and channels. Requires administrator rights. Returns results in reverse chronological order (i.e., in order of decreasing eventId).
         *
         * <p> Returns {@link ChatEvents ChatEvents} </p>
         */
        public GetChatEventLog() {
        }

        /**
         * Creates a function, which returns a list of service actions taken by chat members and administrators in the last 48 hours. Available only for supergroups and channels. Requires administrator rights. Returns results in reverse chronological order (i.e., in order of decreasing eventId).
         *
         * <p> Returns {@link ChatEvents ChatEvents} </p>
         *
         * @param chatId Chat identifier.
         * @param query Search query by which to filter events.
         * @param fromEventId Identifier of an event from which to return results. Use 0 to get results from the latest events.
         * @param limit The maximum number of events to return; up to 100.
         * @param filters The types of events to return; pass null to get chat events of all types.
         * @param userIds User identifiers by which to filter events. By default, events relating to all users will be returned.
         */
        public GetChatEventLog(long chatId, String query, long fromEventId, int limit, ChatEventLogFilters filters, long[] userIds) {
            this.chatId = chatId;
            this.query = query;
            this.fromEventId = fromEventId;
            this.limit = limit;
            this.filters = filters;
            this.userIds = userIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1281344669;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a chat folder by its identifier.
     *
     * <p> Returns {@link ChatFolder ChatFolder} </p>
     */
    public static class GetChatFolder extends Function<ChatFolder> {
        /**
         * Chat folder identifier.
         */
        public int chatFolderId;

        /**
         * Default constructor for a function, which returns information about a chat folder by its identifier.
         *
         * <p> Returns {@link ChatFolder ChatFolder} </p>
         */
        public GetChatFolder() {
        }

        /**
         * Creates a function, which returns information about a chat folder by its identifier.
         *
         * <p> Returns {@link ChatFolder ChatFolder} </p>
         *
         * @param chatFolderId Chat folder identifier.
         */
        public GetChatFolder(int chatFolderId) {
            this.chatFolderId = chatFolderId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 92809880;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns approximate number of chats in a being created chat folder. Main and archive chat lists must be fully preloaded for this function to work correctly.
     *
     * <p> Returns {@link Count Count} </p>
     */
    public static class GetChatFolderChatCount extends Function<Count> {
        /**
         * The new chat folder.
         */
        public ChatFolder folder;

        /**
         * Default constructor for a function, which returns approximate number of chats in a being created chat folder. Main and archive chat lists must be fully preloaded for this function to work correctly.
         *
         * <p> Returns {@link Count Count} </p>
         */
        public GetChatFolderChatCount() {
        }

        /**
         * Creates a function, which returns approximate number of chats in a being created chat folder. Main and archive chat lists must be fully preloaded for this function to work correctly.
         *
         * <p> Returns {@link Count Count} </p>
         *
         * @param folder The new chat folder.
         */
        public GetChatFolderChatCount(ChatFolder folder) {
            this.folder = folder;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2111097790;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns identifiers of pinned or always included chats from a chat folder, which are suggested to be left when the chat folder is deleted.
     *
     * <p> Returns {@link Chats Chats} </p>
     */
    public static class GetChatFolderChatsToLeave extends Function<Chats> {
        /**
         * Chat folder identifier.
         */
        public int chatFolderId;

        /**
         * Default constructor for a function, which returns identifiers of pinned or always included chats from a chat folder, which are suggested to be left when the chat folder is deleted.
         *
         * <p> Returns {@link Chats Chats} </p>
         */
        public GetChatFolderChatsToLeave() {
        }

        /**
         * Creates a function, which returns identifiers of pinned or always included chats from a chat folder, which are suggested to be left when the chat folder is deleted.
         *
         * <p> Returns {@link Chats Chats} </p>
         *
         * @param chatFolderId Chat folder identifier.
         */
        public GetChatFolderChatsToLeave(int chatFolderId) {
            this.chatFolderId = chatFolderId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1916672337;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns default icon name for a folder. Can be called synchronously.
     *
     * <p> Returns {@link ChatFolderIcon ChatFolderIcon} </p>
     */
    public static class GetChatFolderDefaultIconName extends Function<ChatFolderIcon> {
        /**
         * Chat folder.
         */
        public ChatFolder folder;

        /**
         * Default constructor for a function, which returns default icon name for a folder. Can be called synchronously.
         *
         * <p> Returns {@link ChatFolderIcon ChatFolderIcon} </p>
         */
        public GetChatFolderDefaultIconName() {
        }

        /**
         * Creates a function, which returns default icon name for a folder. Can be called synchronously.
         *
         * <p> Returns {@link ChatFolderIcon ChatFolderIcon} </p>
         *
         * @param folder Chat folder.
         */
        public GetChatFolderDefaultIconName(ChatFolder folder) {
            this.folder = folder;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 754425959;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns invite links created by the current user for a shareable chat folder.
     *
     * <p> Returns {@link ChatFolderInviteLinks ChatFolderInviteLinks} </p>
     */
    public static class GetChatFolderInviteLinks extends Function<ChatFolderInviteLinks> {
        /**
         * Chat folder identifier.
         */
        public int chatFolderId;

        /**
         * Default constructor for a function, which returns invite links created by the current user for a shareable chat folder.
         *
         * <p> Returns {@link ChatFolderInviteLinks ChatFolderInviteLinks} </p>
         */
        public GetChatFolderInviteLinks() {
        }

        /**
         * Creates a function, which returns invite links created by the current user for a shareable chat folder.
         *
         * <p> Returns {@link ChatFolderInviteLinks ChatFolderInviteLinks} </p>
         *
         * @param chatFolderId Chat folder identifier.
         */
        public GetChatFolderInviteLinks(int chatFolderId) {
            this.chatFolderId = chatFolderId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 329079776;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns new chats added to a shareable chat folder by its owner. The method must be called at most once in getOption(&quot;chat_folder_new_chats_update_period&quot;) for the given chat folder.
     *
     * <p> Returns {@link Chats Chats} </p>
     */
    public static class GetChatFolderNewChats extends Function<Chats> {
        /**
         * Chat folder identifier.
         */
        public int chatFolderId;

        /**
         * Default constructor for a function, which returns new chats added to a shareable chat folder by its owner. The method must be called at most once in getOption(&quot;chat_folder_new_chats_update_period&quot;) for the given chat folder.
         *
         * <p> Returns {@link Chats Chats} </p>
         */
        public GetChatFolderNewChats() {
        }

        /**
         * Creates a function, which returns new chats added to a shareable chat folder by its owner. The method must be called at most once in getOption(&quot;chat_folder_new_chats_update_period&quot;) for the given chat folder.
         *
         * <p> Returns {@link Chats Chats} </p>
         *
         * @param chatFolderId Chat folder identifier.
         */
        public GetChatFolderNewChats(int chatFolderId) {
            this.chatFolderId = chatFolderId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2123181260;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns messages in a chat. The messages are returned in reverse chronological order (i.e., in order of decreasing messageId). For optimal performance, the number of returned messages is chosen by TDLib. This is an offline method if onlyLocal is true.
     *
     * <p> Returns {@link Messages Messages} </p>
     */
    public static class GetChatHistory extends Function<Messages> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifier of the message starting from which history must be fetched; use 0 to get results from the last message.
         */
        public long fromMessageId;
        /**
         * Specify 0 to get results from exactly the message fromMessageId or a negative number from -99 to -1 to get additionally -offset newer messages.
         */
        public int offset;
        /**
         * The maximum number of messages to be returned; must be positive and can't be greater than 100. If the offset is negative, then the limit must be greater than or equal to -offset. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         */
        public int limit;
        /**
         * Pass true to get only messages that are available without sending network requests.
         */
        public boolean onlyLocal;

        /**
         * Default constructor for a function, which returns messages in a chat. The messages are returned in reverse chronological order (i.e., in order of decreasing messageId). For optimal performance, the number of returned messages is chosen by TDLib. This is an offline method if onlyLocal is true.
         *
         * <p> Returns {@link Messages Messages} </p>
         */
        public GetChatHistory() {
        }

        /**
         * Creates a function, which returns messages in a chat. The messages are returned in reverse chronological order (i.e., in order of decreasing messageId). For optimal performance, the number of returned messages is chosen by TDLib. This is an offline method if onlyLocal is true.
         *
         * <p> Returns {@link Messages Messages} </p>
         *
         * @param chatId Chat identifier.
         * @param fromMessageId Identifier of the message starting from which history must be fetched; use 0 to get results from the last message.
         * @param offset Specify 0 to get results from exactly the message fromMessageId or a negative number from -99 to -1 to get additionally -offset newer messages.
         * @param limit The maximum number of messages to be returned; must be positive and can't be greater than 100. If the offset is negative, then the limit must be greater than or equal to -offset. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         * @param onlyLocal Pass true to get only messages that are available without sending network requests.
         */
        public GetChatHistory(long chatId, long fromMessageId, int offset, int limit, boolean onlyLocal) {
            this.chatId = chatId;
            this.fromMessageId = fromMessageId;
            this.offset = offset;
            this.limit = limit;
            this.onlyLocal = onlyLocal;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -799960451;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about an invite link. Requires administrator privileges and canInviteUsers right in the chat to get own links and owner privileges to get other links.
     *
     * <p> Returns {@link ChatInviteLink ChatInviteLink} </p>
     */
    public static class GetChatInviteLink extends Function<ChatInviteLink> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Invite link to get.
         */
        public String inviteLink;

        /**
         * Default constructor for a function, which returns information about an invite link. Requires administrator privileges and canInviteUsers right in the chat to get own links and owner privileges to get other links.
         *
         * <p> Returns {@link ChatInviteLink ChatInviteLink} </p>
         */
        public GetChatInviteLink() {
        }

        /**
         * Creates a function, which returns information about an invite link. Requires administrator privileges and canInviteUsers right in the chat to get own links and owner privileges to get other links.
         *
         * <p> Returns {@link ChatInviteLink ChatInviteLink} </p>
         *
         * @param chatId Chat identifier.
         * @param inviteLink Invite link to get.
         */
        public GetChatInviteLink(long chatId, String inviteLink) {
            this.chatId = chatId;
            this.inviteLink = inviteLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -479575555;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of chat administrators with number of their invite links. Requires owner privileges in the chat.
     *
     * <p> Returns {@link ChatInviteLinkCounts ChatInviteLinkCounts} </p>
     */
    public static class GetChatInviteLinkCounts extends Function<ChatInviteLinkCounts> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which returns the list of chat administrators with number of their invite links. Requires owner privileges in the chat.
         *
         * <p> Returns {@link ChatInviteLinkCounts ChatInviteLinkCounts} </p>
         */
        public GetChatInviteLinkCounts() {
        }

        /**
         * Creates a function, which returns the list of chat administrators with number of their invite links. Requires owner privileges in the chat.
         *
         * <p> Returns {@link ChatInviteLinkCounts ChatInviteLinkCounts} </p>
         *
         * @param chatId Chat identifier.
         */
        public GetChatInviteLinkCounts(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 890299025;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns chat members joined a chat via an invite link. Requires administrator privileges and canInviteUsers right in the chat for own links and owner privileges for other links.
     *
     * <p> Returns {@link ChatInviteLinkMembers ChatInviteLinkMembers} </p>
     */
    public static class GetChatInviteLinkMembers extends Function<ChatInviteLinkMembers> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Invite link for which to return chat members.
         */
        public String inviteLink;
        /**
         * Pass true if the link is a subscription link and only members with expired subscription must be returned.
         */
        public boolean onlyWithExpiredSubscription;
        /**
         * A chat member from which to return next chat members; pass null to get results from the beginning.
         */
        public ChatInviteLinkMember offsetMember;
        /**
         * The maximum number of chat members to return; up to 100.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns chat members joined a chat via an invite link. Requires administrator privileges and canInviteUsers right in the chat for own links and owner privileges for other links.
         *
         * <p> Returns {@link ChatInviteLinkMembers ChatInviteLinkMembers} </p>
         */
        public GetChatInviteLinkMembers() {
        }

        /**
         * Creates a function, which returns chat members joined a chat via an invite link. Requires administrator privileges and canInviteUsers right in the chat for own links and owner privileges for other links.
         *
         * <p> Returns {@link ChatInviteLinkMembers ChatInviteLinkMembers} </p>
         *
         * @param chatId Chat identifier.
         * @param inviteLink Invite link for which to return chat members.
         * @param onlyWithExpiredSubscription Pass true if the link is a subscription link and only members with expired subscription must be returned.
         * @param offsetMember A chat member from which to return next chat members; pass null to get results from the beginning.
         * @param limit The maximum number of chat members to return; up to 100.
         */
        public GetChatInviteLinkMembers(long chatId, String inviteLink, boolean onlyWithExpiredSubscription, ChatInviteLinkMember offsetMember, int limit) {
            this.chatId = chatId;
            this.inviteLink = inviteLink;
            this.onlyWithExpiredSubscription = onlyWithExpiredSubscription;
            this.offsetMember = offsetMember;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1728376124;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns invite links for a chat created by specified administrator. Requires administrator privileges and canInviteUsers right in the chat to get own links and owner privileges to get other links.
     *
     * <p> Returns {@link ChatInviteLinks ChatInviteLinks} </p>
     */
    public static class GetChatInviteLinks extends Function<ChatInviteLinks> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * User identifier of a chat administrator. Must be an identifier of the current user for non-owner.
         */
        public long creatorUserId;
        /**
         * Pass true if revoked links needs to be returned instead of active or expired.
         */
        public boolean isRevoked;
        /**
         * Creation date of an invite link starting after which to return invite links; use 0 to get results from the beginning.
         */
        public int offsetDate;
        /**
         * Invite link starting after which to return invite links; use empty string to get results from the beginning.
         */
        public String offsetInviteLink;
        /**
         * The maximum number of invite links to return; up to 100.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns invite links for a chat created by specified administrator. Requires administrator privileges and canInviteUsers right in the chat to get own links and owner privileges to get other links.
         *
         * <p> Returns {@link ChatInviteLinks ChatInviteLinks} </p>
         */
        public GetChatInviteLinks() {
        }

        /**
         * Creates a function, which returns invite links for a chat created by specified administrator. Requires administrator privileges and canInviteUsers right in the chat to get own links and owner privileges to get other links.
         *
         * <p> Returns {@link ChatInviteLinks ChatInviteLinks} </p>
         *
         * @param chatId Chat identifier.
         * @param creatorUserId User identifier of a chat administrator. Must be an identifier of the current user for non-owner.
         * @param isRevoked Pass true if revoked links needs to be returned instead of active or expired.
         * @param offsetDate Creation date of an invite link starting after which to return invite links; use 0 to get results from the beginning.
         * @param offsetInviteLink Invite link starting after which to return invite links; use empty string to get results from the beginning.
         * @param limit The maximum number of invite links to return; up to 100.
         */
        public GetChatInviteLinks(long chatId, long creatorUserId, boolean isRevoked, int offsetDate, String offsetInviteLink, int limit) {
            this.chatId = chatId;
            this.creatorUserId = creatorUserId;
            this.isRevoked = isRevoked;
            this.offsetDate = offsetDate;
            this.offsetInviteLink = offsetInviteLink;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 883252396;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns pending join requests in a chat.
     *
     * <p> Returns {@link ChatJoinRequests ChatJoinRequests} </p>
     */
    public static class GetChatJoinRequests extends Function<ChatJoinRequests> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Invite link for which to return join requests. If empty, all join requests will be returned. Requires administrator privileges and canInviteUsers right in the chat for own links and owner privileges for other links.
         */
        public String inviteLink;
        /**
         * A query to search for in the first names, last names and usernames of the users to return.
         */
        public String query;
        /**
         * A chat join request from which to return next requests; pass null to get results from the beginning.
         */
        public ChatJoinRequest offsetRequest;
        /**
         * The maximum number of requests to join the chat to return.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns pending join requests in a chat.
         *
         * <p> Returns {@link ChatJoinRequests ChatJoinRequests} </p>
         */
        public GetChatJoinRequests() {
        }

        /**
         * Creates a function, which returns pending join requests in a chat.
         *
         * <p> Returns {@link ChatJoinRequests ChatJoinRequests} </p>
         *
         * @param chatId Chat identifier.
         * @param inviteLink Invite link for which to return join requests. If empty, all join requests will be returned. Requires administrator privileges and canInviteUsers right in the chat for own links and owner privileges for other links.
         * @param query A query to search for in the first names, last names and usernames of the users to return.
         * @param offsetRequest A chat join request from which to return next requests; pass null to get results from the beginning.
         * @param limit The maximum number of requests to join the chat to return.
         */
        public GetChatJoinRequests(long chatId, String inviteLink, String query, ChatJoinRequest offsetRequest, int limit) {
            this.chatId = chatId;
            this.inviteLink = inviteLink;
            this.query = query;
            this.offsetRequest = offsetRequest;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -388428126;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns chat lists to which the chat can be added. This is an offline method.
     *
     * <p> Returns {@link ChatLists ChatLists} </p>
     */
    public static class GetChatListsToAddChat extends Function<ChatLists> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which returns chat lists to which the chat can be added. This is an offline method.
         *
         * <p> Returns {@link ChatLists ChatLists} </p>
         */
        public GetChatListsToAddChat() {
        }

        /**
         * Creates a function, which returns chat lists to which the chat can be added. This is an offline method.
         *
         * <p> Returns {@link ChatLists ChatLists} </p>
         *
         * @param chatId Chat identifier.
         */
        public GetChatListsToAddChat(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 654956193;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a single member of a chat.
     *
     * <p> Returns {@link ChatMember ChatMember} </p>
     */
    public static class GetChatMember extends Function<ChatMember> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Member identifier.
         */
        public MessageSender memberId;

        /**
         * Default constructor for a function, which returns information about a single member of a chat.
         *
         * <p> Returns {@link ChatMember ChatMember} </p>
         */
        public GetChatMember() {
        }

        /**
         * Creates a function, which returns information about a single member of a chat.
         *
         * <p> Returns {@link ChatMember ChatMember} </p>
         *
         * @param chatId Chat identifier.
         * @param memberId Member identifier.
         */
        public GetChatMember(long chatId, MessageSender memberId) {
            this.chatId = chatId;
            this.memberId = memberId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -792636814;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the last message sent in a chat no later than the specified date. Returns a 404 error if such message doesn't exist.
     *
     * <p> Returns {@link Message Message} </p>
     */
    public static class GetChatMessageByDate extends Function<Message> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Point in time (Unix timestamp) relative to which to search for messages.
         */
        public int date;

        /**
         * Default constructor for a function, which returns the last message sent in a chat no later than the specified date. Returns a 404 error if such message doesn't exist.
         *
         * <p> Returns {@link Message Message} </p>
         */
        public GetChatMessageByDate() {
        }

        /**
         * Creates a function, which returns the last message sent in a chat no later than the specified date. Returns a 404 error if such message doesn't exist.
         *
         * <p> Returns {@link Message Message} </p>
         *
         * @param chatId Chat identifier.
         * @param date Point in time (Unix timestamp) relative to which to search for messages.
         */
        public GetChatMessageByDate(long chatId, int date) {
            this.chatId = chatId;
            this.date = date;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1062564150;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about the next messages of the specified type in the chat split by days. Returns the results in reverse chronological order. Can return partial result for the last returned day. Behavior of this method depends on the value of the option &quot;utc_time_offset&quot;.
     *
     * <p> Returns {@link MessageCalendar MessageCalendar} </p>
     */
    public static class GetChatMessageCalendar extends Function<MessageCalendar> {
        /**
         * Identifier of the chat in which to return information about messages.
         */
        public long chatId;
        /**
         * Pass topic identifier to get the result only in specific topic; pass null to get the result in all topics; forum topics and message threads aren't supported.
         */
        public MessageTopic topicId;
        /**
         * Filter for message content. Filters searchMessagesFilterEmpty, searchMessagesFilterMention, searchMessagesFilterUnreadMention, searchMessagesFilterUnreadReaction, and searchMessagesFilterUnreadPollVote are unsupported in this function.
         */
        public SearchMessagesFilter filter;
        /**
         * The message identifier from which to return information about messages; use 0 to get results from the last message.
         */
        public long fromMessageId;

        /**
         * Default constructor for a function, which returns information about the next messages of the specified type in the chat split by days. Returns the results in reverse chronological order. Can return partial result for the last returned day. Behavior of this method depends on the value of the option &quot;utc_time_offset&quot;.
         *
         * <p> Returns {@link MessageCalendar MessageCalendar} </p>
         */
        public GetChatMessageCalendar() {
        }

        /**
         * Creates a function, which returns information about the next messages of the specified type in the chat split by days. Returns the results in reverse chronological order. Can return partial result for the last returned day. Behavior of this method depends on the value of the option &quot;utc_time_offset&quot;.
         *
         * <p> Returns {@link MessageCalendar MessageCalendar} </p>
         *
         * @param chatId Identifier of the chat in which to return information about messages.
         * @param topicId Pass topic identifier to get the result only in specific topic; pass null to get the result in all topics; forum topics and message threads aren't supported.
         * @param filter Filter for message content. Filters searchMessagesFilterEmpty, searchMessagesFilterMention, searchMessagesFilterUnreadMention, searchMessagesFilterUnreadReaction, and searchMessagesFilterUnreadPollVote are unsupported in this function.
         * @param fromMessageId The message identifier from which to return information about messages; use 0 to get results from the last message.
         */
        public GetChatMessageCalendar(long chatId, MessageTopic topicId, SearchMessagesFilter filter, long fromMessageId) {
            this.chatId = chatId;
            this.topicId = topicId;
            this.filter = filter;
            this.fromMessageId = fromMessageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1644001372;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns approximate number of messages of the specified type in the chat or its topic.
     *
     * <p> Returns {@link Count Count} </p>
     */
    public static class GetChatMessageCount extends Function<Count> {
        /**
         * Identifier of the chat in which to count messages.
         */
        public long chatId;
        /**
         * Pass topic identifier to get number of messages only in specific topic; pass null to get number of messages in all topics; message threads aren't supported.
         */
        public MessageTopic topicId;
        /**
         * Filter for message content; searchMessagesFilterEmpty is unsupported in this function.
         */
        public SearchMessagesFilter filter;
        /**
         * Pass true to get the number of messages without sending network requests, or -1 if the number of messages is unknown locally.
         */
        public boolean returnLocal;

        /**
         * Default constructor for a function, which returns approximate number of messages of the specified type in the chat or its topic.
         *
         * <p> Returns {@link Count Count} </p>
         */
        public GetChatMessageCount() {
        }

        /**
         * Creates a function, which returns approximate number of messages of the specified type in the chat or its topic.
         *
         * <p> Returns {@link Count Count} </p>
         *
         * @param chatId Identifier of the chat in which to count messages.
         * @param topicId Pass topic identifier to get number of messages only in specific topic; pass null to get number of messages in all topics; message threads aren't supported.
         * @param filter Filter for message content; searchMessagesFilterEmpty is unsupported in this function.
         * @param returnLocal Pass true to get the number of messages without sending network requests, or -1 if the number of messages is unknown locally.
         */
        public GetChatMessageCount(long chatId, MessageTopic topicId, SearchMessagesFilter filter, boolean returnLocal) {
            this.chatId = chatId;
            this.topicId = topicId;
            this.filter = filter;
            this.returnLocal = returnLocal;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1641001101;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns approximate 1-based position of a message among messages, which can be found by the specified filter in the chat and topic. Cannot be used in secret chats.
     *
     * <p> Returns {@link Count Count} </p>
     */
    public static class GetChatMessagePosition extends Function<Count> {
        /**
         * Identifier of the chat in which to find message position.
         */
        public long chatId;
        /**
         * Pass topic identifier to get position among messages only in specific topic; pass null to get position among all chat messages; message threads aren't supported.
         */
        public MessageTopic topicId;
        /**
         * Filter for message content; searchMessagesFilterEmpty, searchMessagesFilterUnreadMention, searchMessagesFilterUnreadReaction, searchMessagesFilterUnreadPollVote, and searchMessagesFilterFailedToSend are unsupported in this function.
         */
        public SearchMessagesFilter filter;
        /**
         * Message identifier.
         */
        public long messageId;

        /**
         * Default constructor for a function, which returns approximate 1-based position of a message among messages, which can be found by the specified filter in the chat and topic. Cannot be used in secret chats.
         *
         * <p> Returns {@link Count Count} </p>
         */
        public GetChatMessagePosition() {
        }

        /**
         * Creates a function, which returns approximate 1-based position of a message among messages, which can be found by the specified filter in the chat and topic. Cannot be used in secret chats.
         *
         * <p> Returns {@link Count Count} </p>
         *
         * @param chatId Identifier of the chat in which to find message position.
         * @param topicId Pass topic identifier to get position among messages only in specific topic; pass null to get position among all chat messages; message threads aren't supported.
         * @param filter Filter for message content; searchMessagesFilterEmpty, searchMessagesFilterUnreadMention, searchMessagesFilterUnreadReaction, searchMessagesFilterUnreadPollVote, and searchMessagesFilterFailedToSend are unsupported in this function.
         * @param messageId Message identifier.
         */
        public GetChatMessagePosition(long chatId, MessageTopic topicId, SearchMessagesFilter filter, long messageId) {
            this.chatId = chatId;
            this.topicId = topicId;
            this.filter = filter;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1468174577;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of chats with non-default notification settings for new messages.
     *
     * <p> Returns {@link Chats Chats} </p>
     */
    public static class GetChatNotificationSettingsExceptions extends Function<Chats> {
        /**
         * If specified, only chats from the scope will be returned; pass null to return chats from all scopes.
         */
        public NotificationSettingsScope scope;
        /**
         * Pass true to include in the response chats with only non-default sound.
         */
        public boolean compareSound;

        /**
         * Default constructor for a function, which returns the list of chats with non-default notification settings for new messages.
         *
         * <p> Returns {@link Chats Chats} </p>
         */
        public GetChatNotificationSettingsExceptions() {
        }

        /**
         * Creates a function, which returns the list of chats with non-default notification settings for new messages.
         *
         * <p> Returns {@link Chats Chats} </p>
         *
         * @param scope If specified, only chats from the scope will be returned; pass null to return chats from all scopes.
         * @param compareSound Pass true to include in the response chats with only non-default sound.
         */
        public GetChatNotificationSettingsExceptions(NotificationSettingsScope scope, boolean compareSound) {
            this.scope = scope;
            this.compareSound = compareSound;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 201199121;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the user who will become the owner of the chat after 7 days if the current user does not return to the supergroup or channel during that period or immediately for basic groups; requires owner privileges in the chat. Available only for basic groups, supergroups, and channel chats.
     *
     * <p> Returns {@link User User} </p>
     */
    public static class GetChatOwnerAfterLeaving extends Function<User> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which returns the user who will become the owner of the chat after 7 days if the current user does not return to the supergroup or channel during that period or immediately for basic groups; requires owner privileges in the chat. Available only for basic groups, supergroups, and channel chats.
         *
         * <p> Returns {@link User User} </p>
         */
        public GetChatOwnerAfterLeaving() {
        }

        /**
         * Creates a function, which returns the user who will become the owner of the chat after 7 days if the current user does not return to the supergroup or channel during that period or immediately for basic groups; requires owner privileges in the chat. Available only for basic groups, supergroups, and channel chats.
         *
         * <p> Returns {@link User User} </p>
         *
         * @param chatId Chat identifier.
         */
        public GetChatOwnerAfterLeaving(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1637776102;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a newest pinned message in the chat. Returns a 404 error if the message doesn't exist.
     *
     * <p> Returns {@link Message Message} </p>
     */
    public static class GetChatPinnedMessage extends Function<Message> {
        /**
         * Identifier of the chat the message belongs to.
         */
        public long chatId;

        /**
         * Default constructor for a function, which returns information about a newest pinned message in the chat. Returns a 404 error if the message doesn't exist.
         *
         * <p> Returns {@link Message Message} </p>
         */
        public GetChatPinnedMessage() {
        }

        /**
         * Creates a function, which returns information about a newest pinned message in the chat. Returns a 404 error if the message doesn't exist.
         *
         * <p> Returns {@link Message Message} </p>
         *
         * @param chatId Identifier of the chat the message belongs to.
         */
        public GetChatPinnedMessage(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 359865008;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of stories that posted by the given chat to its chat page. If fromStoryId == 0, then pinned stories are returned first. Then, stories are returned in reverse chronological order (i.e., in order of decreasing storyId). For optimal performance, the number of returned stories is chosen by TDLib.
     *
     * <p> Returns {@link Stories Stories} </p>
     */
    public static class GetChatPostedToChatPageStories extends Function<Stories> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifier of the story starting from which stories must be returned; use 0 to get results from pinned and the newest story.
         */
        public int fromStoryId;
        /**
         * The maximum number of stories to be returned. For optimal performance, the number of returned stories is chosen by TDLib and can be smaller than the specified limit.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns the list of stories that posted by the given chat to its chat page. If fromStoryId == 0, then pinned stories are returned first. Then, stories are returned in reverse chronological order (i.e., in order of decreasing storyId). For optimal performance, the number of returned stories is chosen by TDLib.
         *
         * <p> Returns {@link Stories Stories} </p>
         */
        public GetChatPostedToChatPageStories() {
        }

        /**
         * Creates a function, which returns the list of stories that posted by the given chat to its chat page. If fromStoryId == 0, then pinned stories are returned first. Then, stories are returned in reverse chronological order (i.e., in order of decreasing storyId). For optimal performance, the number of returned stories is chosen by TDLib.
         *
         * <p> Returns {@link Stories Stories} </p>
         *
         * @param chatId Chat identifier.
         * @param fromStoryId Identifier of the story starting from which stories must be returned; use 0 to get results from pinned and the newest story.
         * @param limit The maximum number of stories to be returned. For optimal performance, the number of returned stories is chosen by TDLib and can be smaller than the specified limit.
         */
        public GetChatPostedToChatPageStories(long chatId, int fromStoryId, int limit) {
            this.chatId = chatId;
            this.fromStoryId = fromStoryId;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -46414037;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns detailed revenue statistics about a chat. Currently, this method can be used only for channels if supergroupFullInfo.canGetRevenueStatistics == true or bots if userFullInfo.botInfo.canGetRevenueStatistics == true.
     *
     * <p> Returns {@link ChatRevenueStatistics ChatRevenueStatistics} </p>
     */
    public static class GetChatRevenueStatistics extends Function<ChatRevenueStatistics> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Pass true if a dark theme is used by the application.
         */
        public boolean isDark;

        /**
         * Default constructor for a function, which returns detailed revenue statistics about a chat. Currently, this method can be used only for channels if supergroupFullInfo.canGetRevenueStatistics == true or bots if userFullInfo.botInfo.canGetRevenueStatistics == true.
         *
         * <p> Returns {@link ChatRevenueStatistics ChatRevenueStatistics} </p>
         */
        public GetChatRevenueStatistics() {
        }

        /**
         * Creates a function, which returns detailed revenue statistics about a chat. Currently, this method can be used only for channels if supergroupFullInfo.canGetRevenueStatistics == true or bots if userFullInfo.botInfo.canGetRevenueStatistics == true.
         *
         * <p> Returns {@link ChatRevenueStatistics ChatRevenueStatistics} </p>
         *
         * @param chatId Chat identifier.
         * @param isDark Pass true if a dark theme is used by the application.
         */
        public GetChatRevenueStatistics(long chatId, boolean isDark) {
            this.chatId = chatId;
            this.isDark = isDark;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 701995836;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of revenue transactions for a chat. Currently, this method can be used only for channels if supergroupFullInfo.canGetRevenueStatistics == true or bots if userFullInfo.botInfo.canGetRevenueStatistics == true.
     *
     * <p> Returns {@link ChatRevenueTransactions ChatRevenueTransactions} </p>
     */
    public static class GetChatRevenueTransactions extends Function<ChatRevenueTransactions> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Offset of the first transaction to return as received from the previous request; use empty string to get the first chunk of results.
         */
        public String offset;
        /**
         * The maximum number of transactions to be returned; up to 100.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns the list of revenue transactions for a chat. Currently, this method can be used only for channels if supergroupFullInfo.canGetRevenueStatistics == true or bots if userFullInfo.botInfo.canGetRevenueStatistics == true.
         *
         * <p> Returns {@link ChatRevenueTransactions ChatRevenueTransactions} </p>
         */
        public GetChatRevenueTransactions() {
        }

        /**
         * Creates a function, which returns the list of revenue transactions for a chat. Currently, this method can be used only for channels if supergroupFullInfo.canGetRevenueStatistics == true or bots if userFullInfo.botInfo.canGetRevenueStatistics == true.
         *
         * <p> Returns {@link ChatRevenueTransactions ChatRevenueTransactions} </p>
         *
         * @param chatId Chat identifier.
         * @param offset Offset of the first transaction to return as received from the previous request; use empty string to get the first chunk of results.
         * @param limit The maximum number of transactions to be returned; up to 100.
         */
        public GetChatRevenueTransactions(long chatId, String offset, int limit) {
            this.chatId = chatId;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1120110117;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a URL for chat revenue withdrawal; requires owner privileges in the channel chat or the bot. Currently, this method can be used only if getOption(&quot;can_withdraw_chat_revenue&quot;) for channels with supergroupFullInfo.canGetRevenueStatistics == true or bots with userFullInfo.botInfo.canGetRevenueStatistics == true.
     *
     * <p> Returns {@link HttpUrl HttpUrl} </p>
     */
    public static class GetChatRevenueWithdrawalUrl extends Function<HttpUrl> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The 2-step verification password of the current user.
         */
        public String password;

        /**
         * Default constructor for a function, which returns a URL for chat revenue withdrawal; requires owner privileges in the channel chat or the bot. Currently, this method can be used only if getOption(&quot;can_withdraw_chat_revenue&quot;) for channels with supergroupFullInfo.canGetRevenueStatistics == true or bots with userFullInfo.botInfo.canGetRevenueStatistics == true.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         */
        public GetChatRevenueWithdrawalUrl() {
        }

        /**
         * Creates a function, which returns a URL for chat revenue withdrawal; requires owner privileges in the channel chat or the bot. Currently, this method can be used only if getOption(&quot;can_withdraw_chat_revenue&quot;) for channels with supergroupFullInfo.canGetRevenueStatistics == true or bots with userFullInfo.botInfo.canGetRevenueStatistics == true.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         *
         * @param chatId Chat identifier.
         * @param password The 2-step verification password of the current user.
         */
        public GetChatRevenueWithdrawalUrl(long chatId, String password) {
            this.chatId = chatId;
            this.password = password;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 506595104;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns all scheduled messages in a chat. The messages are returned in reverse chronological order (i.e., in order of decreasing messageId).
     *
     * <p> Returns {@link Messages Messages} </p>
     */
    public static class GetChatScheduledMessages extends Function<Messages> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which returns all scheduled messages in a chat. The messages are returned in reverse chronological order (i.e., in order of decreasing messageId).
         *
         * <p> Returns {@link Messages Messages} </p>
         */
        public GetChatScheduledMessages() {
        }

        /**
         * Creates a function, which returns all scheduled messages in a chat. The messages are returned in reverse chronological order (i.e., in order of decreasing messageId).
         *
         * <p> Returns {@link Messages Messages} </p>
         *
         * @param chatId Chat identifier.
         */
        public GetChatScheduledMessages(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -549638149;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns approximate number of chats similar to the given chat.
     *
     * <p> Returns {@link Count Count} </p>
     */
    public static class GetChatSimilarChatCount extends Function<Count> {
        /**
         * Identifier of the target chat; must be an identifier of a channel chat.
         */
        public long chatId;
        /**
         * Pass true to get the number of chats without sending network requests, or -1 if the number of chats is unknown locally.
         */
        public boolean returnLocal;

        /**
         * Default constructor for a function, which returns approximate number of chats similar to the given chat.
         *
         * <p> Returns {@link Count Count} </p>
         */
        public GetChatSimilarChatCount() {
        }

        /**
         * Creates a function, which returns approximate number of chats similar to the given chat.
         *
         * <p> Returns {@link Count Count} </p>
         *
         * @param chatId Identifier of the target chat; must be an identifier of a channel chat.
         * @param returnLocal Pass true to get the number of chats without sending network requests, or -1 if the number of chats is unknown locally.
         */
        public GetChatSimilarChatCount(long chatId, boolean returnLocal) {
            this.chatId = chatId;
            this.returnLocal = returnLocal;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1178506894;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a list of chats similar to the given chat.
     *
     * <p> Returns {@link Chats Chats} </p>
     */
    public static class GetChatSimilarChats extends Function<Chats> {
        /**
         * Identifier of the target chat; must be an identifier of a channel chat.
         */
        public long chatId;

        /**
         * Default constructor for a function, which returns a list of chats similar to the given chat.
         *
         * <p> Returns {@link Chats Chats} </p>
         */
        public GetChatSimilarChats() {
        }

        /**
         * Creates a function, which returns a list of chats similar to the given chat.
         *
         * <p> Returns {@link Chats Chats} </p>
         *
         * @param chatId Identifier of the target chat; must be an identifier of a channel chat.
         */
        public GetChatSimilarChats(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1152348285;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns sparse positions of messages of the specified type in the chat to be used for shared media scroll implementation. Returns the results in reverse chronological order (i.e., in order of decreasing messageId). Cannot be used in secret chats or with searchMessagesFilterFailedToSend filter without an enabled message database.
     *
     * <p> Returns {@link MessagePositions MessagePositions} </p>
     */
    public static class GetChatSparseMessagePositions extends Function<MessagePositions> {
        /**
         * Identifier of the chat in which to return information about message positions.
         */
        public long chatId;
        /**
         * Filter for message content. Filters searchMessagesFilterEmpty, searchMessagesFilterMention, searchMessagesFilterUnreadMention, searchMessagesFilterUnreadReaction, and searchMessagesFilterUnreadPollVote are unsupported in this function.
         */
        public SearchMessagesFilter filter;
        /**
         * The message identifier from which to return information about message positions.
         */
        public long fromMessageId;
        /**
         * The expected number of message positions to be returned; 50-2000. A smaller number of positions can be returned, if there are not enough appropriate messages.
         */
        public int limit;
        /**
         * If not 0, only messages in the specified Saved Messages topic will be considered; pass 0 to consider all messages, or for chats other than Saved Messages.
         */
        public long savedMessagesTopicId;

        /**
         * Default constructor for a function, which returns sparse positions of messages of the specified type in the chat to be used for shared media scroll implementation. Returns the results in reverse chronological order (i.e., in order of decreasing messageId). Cannot be used in secret chats or with searchMessagesFilterFailedToSend filter without an enabled message database.
         *
         * <p> Returns {@link MessagePositions MessagePositions} </p>
         */
        public GetChatSparseMessagePositions() {
        }

        /**
         * Creates a function, which returns sparse positions of messages of the specified type in the chat to be used for shared media scroll implementation. Returns the results in reverse chronological order (i.e., in order of decreasing messageId). Cannot be used in secret chats or with searchMessagesFilterFailedToSend filter without an enabled message database.
         *
         * <p> Returns {@link MessagePositions MessagePositions} </p>
         *
         * @param chatId Identifier of the chat in which to return information about message positions.
         * @param filter Filter for message content. Filters searchMessagesFilterEmpty, searchMessagesFilterMention, searchMessagesFilterUnreadMention, searchMessagesFilterUnreadReaction, and searchMessagesFilterUnreadPollVote are unsupported in this function.
         * @param fromMessageId The message identifier from which to return information about message positions.
         * @param limit The expected number of message positions to be returned; 50-2000. A smaller number of positions can be returned, if there are not enough appropriate messages.
         * @param savedMessagesTopicId If not 0, only messages in the specified Saved Messages topic will be considered; pass 0 to consider all messages, or for chats other than Saved Messages.
         */
        public GetChatSparseMessagePositions(long chatId, SearchMessagesFilter filter, long fromMessageId, int limit, long savedMessagesTopicId) {
            this.chatId = chatId;
            this.filter = filter;
            this.fromMessageId = fromMessageId;
            this.limit = limit;
            this.savedMessagesTopicId = savedMessagesTopicId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 994389757;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns sponsored messages to be shown in a chat; for channel chats and chats with bots only.
     *
     * <p> Returns {@link SponsoredMessages SponsoredMessages} </p>
     */
    public static class GetChatSponsoredMessages extends Function<SponsoredMessages> {
        /**
         * Identifier of the chat.
         */
        public long chatId;

        /**
         * Default constructor for a function, which returns sponsored messages to be shown in a chat; for channel chats and chats with bots only.
         *
         * <p> Returns {@link SponsoredMessages SponsoredMessages} </p>
         */
        public GetChatSponsoredMessages() {
        }

        /**
         * Creates a function, which returns sponsored messages to be shown in a chat; for channel chats and chats with bots only.
         *
         * <p> Returns {@link SponsoredMessages SponsoredMessages} </p>
         *
         * @param chatId Identifier of the chat.
         */
        public GetChatSponsoredMessages(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1353203864;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns detailed statistics about a chat. Currently, this method can be used only for supergroups and channels. Can be used only if supergroupFullInfo.canGetStatistics == true.
     *
     * <p> Returns {@link ChatStatistics ChatStatistics} </p>
     */
    public static class GetChatStatistics extends Function<ChatStatistics> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Pass true if a dark theme is used by the application.
         */
        public boolean isDark;

        /**
         * Default constructor for a function, which returns detailed statistics about a chat. Currently, this method can be used only for supergroups and channels. Can be used only if supergroupFullInfo.canGetStatistics == true.
         *
         * <p> Returns {@link ChatStatistics ChatStatistics} </p>
         */
        public GetChatStatistics() {
        }

        /**
         * Creates a function, which returns detailed statistics about a chat. Currently, this method can be used only for supergroups and channels. Can be used only if supergroupFullInfo.canGetStatistics == true.
         *
         * <p> Returns {@link ChatStatistics ChatStatistics} </p>
         *
         * @param chatId Chat identifier.
         * @param isDark Pass true if a dark theme is used by the application.
         */
        public GetChatStatistics(long chatId, boolean isDark) {
            this.chatId = chatId;
            this.isDark = isDark;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 327057816;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of story albums owned by the given chat.
     *
     * <p> Returns {@link StoryAlbums StoryAlbums} </p>
     */
    public static class GetChatStoryAlbums extends Function<StoryAlbums> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which returns the list of story albums owned by the given chat.
         *
         * <p> Returns {@link StoryAlbums StoryAlbums} </p>
         */
        public GetChatStoryAlbums() {
        }

        /**
         * Creates a function, which returns the list of story albums owned by the given chat.
         *
         * <p> Returns {@link StoryAlbums StoryAlbums} </p>
         *
         * @param chatId Chat identifier.
         */
        public GetChatStoryAlbums(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1559582892;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns interactions with a story posted in a chat. Can be used only if story is posted on behalf of a chat and the user is an administrator in the chat.
     *
     * <p> Returns {@link StoryInteractions StoryInteractions} </p>
     */
    public static class GetChatStoryInteractions extends Function<StoryInteractions> {
        /**
         * The identifier of the poster of the story.
         */
        public long storyPosterChatId;
        /**
         * Story identifier.
         */
        public int storyId;
        /**
         * Pass the default heart reaction or a suggested reaction type to receive only interactions with the specified reaction type; pass null to receive all interactions; reactionTypePaid isn't supported.
         */
        public ReactionType reactionType;
        /**
         * Pass true to get forwards and reposts first, then reactions, then other views; pass false to get interactions sorted just by interaction date.
         */
        public boolean preferForwards;
        /**
         * Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         */
        public String offset;
        /**
         * The maximum number of story interactions to return.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns interactions with a story posted in a chat. Can be used only if story is posted on behalf of a chat and the user is an administrator in the chat.
         *
         * <p> Returns {@link StoryInteractions StoryInteractions} </p>
         */
        public GetChatStoryInteractions() {
        }

        /**
         * Creates a function, which returns interactions with a story posted in a chat. Can be used only if story is posted on behalf of a chat and the user is an administrator in the chat.
         *
         * <p> Returns {@link StoryInteractions StoryInteractions} </p>
         *
         * @param storyPosterChatId The identifier of the poster of the story.
         * @param storyId Story identifier.
         * @param reactionType Pass the default heart reaction or a suggested reaction type to receive only interactions with the specified reaction type; pass null to receive all interactions; reactionTypePaid isn't supported.
         * @param preferForwards Pass true to get forwards and reposts first, then reactions, then other views; pass false to get interactions sorted just by interaction date.
         * @param offset Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         * @param limit The maximum number of story interactions to return.
         */
        public GetChatStoryInteractions(long storyPosterChatId, int storyId, ReactionType reactionType, boolean preferForwards, String offset, int limit) {
            this.storyPosterChatId = storyPosterChatId;
            this.storyId = storyId;
            this.reactionType = reactionType;
            this.preferForwards = preferForwards;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 354545268;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an ordered list of chats from the beginning of a chat list. For informational purposes only. Use loadChats and updates processing instead to maintain chat lists in a consistent state.
     *
     * <p> Returns {@link Chats Chats} </p>
     */
    public static class GetChats extends Function<Chats> {
        /**
         * The chat list in which to return chats; pass null to get chats from the main chat list.
         */
        public ChatList chatList;
        /**
         * The maximum number of chats to be returned.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns an ordered list of chats from the beginning of a chat list. For informational purposes only. Use loadChats and updates processing instead to maintain chat lists in a consistent state.
         *
         * <p> Returns {@link Chats Chats} </p>
         */
        public GetChats() {
        }

        /**
         * Creates a function, which returns an ordered list of chats from the beginning of a chat list. For informational purposes only. Use loadChats and updates processing instead to maintain chat lists in a consistent state.
         *
         * <p> Returns {@link Chats Chats} </p>
         *
         * @param chatList The chat list in which to return chats; pass null to get chats from the main chat list.
         * @param limit The maximum number of chats to be returned.
         */
        public GetChats(ChatList chatList, int limit) {
            this.chatList = chatList;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -972768574;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns identifiers of chats from a chat folder, suitable for adding to a chat folder invite link.
     *
     * <p> Returns {@link Chats Chats} </p>
     */
    public static class GetChatsForChatFolderInviteLink extends Function<Chats> {
        /**
         * Chat folder identifier.
         */
        public int chatFolderId;

        /**
         * Default constructor for a function, which returns identifiers of chats from a chat folder, suitable for adding to a chat folder invite link.
         *
         * <p> Returns {@link Chats Chats} </p>
         */
        public GetChatsForChatFolderInviteLink() {
        }

        /**
         * Creates a function, which returns identifiers of chats from a chat folder, suitable for adding to a chat folder invite link.
         *
         * <p> Returns {@link Chats Chats} </p>
         *
         * @param chatFolderId Chat folder identifier.
         */
        public GetChatsForChatFolderInviteLink(int chatFolderId) {
            this.chatFolderId = chatFolderId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1873561929;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns supergroup and channel chats in which the current user has the right to post stories. The chats must be rechecked with canPostStory before actually trying to post a story there.
     *
     * <p> Returns {@link Chats Chats} </p>
     */
    public static class GetChatsToPostStories extends Function<Chats> {

        /**
         * Default constructor for a function, which returns supergroup and channel chats in which the current user has the right to post stories. The chats must be rechecked with canPostStory before actually trying to post a story there.
         *
         * <p> Returns {@link Chats Chats} </p>
         */
        public GetChatsToPostStories() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1893901427;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns all close friends of the current user.
     *
     * <p> Returns {@link Users Users} </p>
     */
    public static class GetCloseFriends extends Function<Users> {

        /**
         * Default constructor for a function, which returns all close friends of the current user.
         *
         * <p> Returns {@link Users Users} </p>
         */
        public GetCloseFriends() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1445628722;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a given collectible item that was purchased at https://fragment.com.
     *
     * <p> Returns {@link CollectibleItemInfo CollectibleItemInfo} </p>
     */
    public static class GetCollectibleItemInfo extends Function<CollectibleItemInfo> {
        /**
         * Type of the collectible item. The item must be used by a user and must be visible to the current user.
         */
        public CollectibleItemType type;

        /**
         * Default constructor for a function, which returns information about a given collectible item that was purchased at https://fragment.com.
         *
         * <p> Returns {@link CollectibleItemInfo CollectibleItemInfo} </p>
         */
        public GetCollectibleItemInfo() {
        }

        /**
         * Creates a function, which returns information about a given collectible item that was purchased at https://fragment.com.
         *
         * <p> Returns {@link CollectibleItemInfo CollectibleItemInfo} </p>
         *
         * @param type Type of the collectible item. The item must be used by a user and must be visible to the current user.
         */
        public GetCollectibleItemInfo(CollectibleItemType type) {
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -217797238;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of commands supported by the bot for the given user scope and language; for bots only.
     *
     * <p> Returns {@link BotCommands BotCommands} </p>
     */
    public static class GetCommands extends Function<BotCommands> {
        /**
         * The scope to which the commands are relevant; pass null to get commands in the default bot command scope.
         */
        public BotCommandScope scope;
        /**
         * A two-letter ISO 639-1 language code or an empty string.
         */
        public String languageCode;

        /**
         * Default constructor for a function, which returns the list of commands supported by the bot for the given user scope and language; for bots only.
         *
         * <p> Returns {@link BotCommands BotCommands} </p>
         */
        public GetCommands() {
        }

        /**
         * Creates a function, which returns the list of commands supported by the bot for the given user scope and language; for bots only.
         *
         * <p> Returns {@link BotCommands BotCommands} </p>
         *
         * @param scope The scope to which the commands are relevant; pass null to get commands in the default bot command scope.
         * @param languageCode A two-letter ISO 639-1 language code or an empty string.
         */
        public GetCommands(BotCommandScope scope, String languageCode) {
            this.scope = scope;
            this.languageCode = languageCode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1488621559;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an affiliate program that was connected to the given affiliate by identifier of the bot that created the program.
     *
     * <p> Returns {@link ConnectedAffiliateProgram ConnectedAffiliateProgram} </p>
     */
    public static class GetConnectedAffiliateProgram extends Function<ConnectedAffiliateProgram> {
        /**
         * The affiliate to which the affiliate program will be connected.
         */
        public AffiliateType affiliate;
        /**
         * Identifier of the bot that created the program.
         */
        public long botUserId;

        /**
         * Default constructor for a function, which returns an affiliate program that was connected to the given affiliate by identifier of the bot that created the program.
         *
         * <p> Returns {@link ConnectedAffiliateProgram ConnectedAffiliateProgram} </p>
         */
        public GetConnectedAffiliateProgram() {
        }

        /**
         * Creates a function, which returns an affiliate program that was connected to the given affiliate by identifier of the bot that created the program.
         *
         * <p> Returns {@link ConnectedAffiliateProgram ConnectedAffiliateProgram} </p>
         *
         * @param affiliate The affiliate to which the affiliate program will be connected.
         * @param botUserId Identifier of the bot that created the program.
         */
        public GetConnectedAffiliateProgram(AffiliateType affiliate, long botUserId) {
            this.affiliate = affiliate;
            this.botUserId = botUserId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1755191440;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns affiliate programs that were connected to the given affiliate.
     *
     * <p> Returns {@link ConnectedAffiliatePrograms ConnectedAffiliatePrograms} </p>
     */
    public static class GetConnectedAffiliatePrograms extends Function<ConnectedAffiliatePrograms> {
        /**
         * The affiliate to which the affiliate program were connected.
         */
        public AffiliateType affiliate;
        /**
         * Offset of the first affiliate program to return as received from the previous request; use empty string to get the first chunk of results.
         */
        public String offset;
        /**
         * The maximum number of affiliate programs to return.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns affiliate programs that were connected to the given affiliate.
         *
         * <p> Returns {@link ConnectedAffiliatePrograms ConnectedAffiliatePrograms} </p>
         */
        public GetConnectedAffiliatePrograms() {
        }

        /**
         * Creates a function, which returns affiliate programs that were connected to the given affiliate.
         *
         * <p> Returns {@link ConnectedAffiliatePrograms ConnectedAffiliatePrograms} </p>
         *
         * @param affiliate The affiliate to which the affiliate program were connected.
         * @param offset Offset of the first affiliate program to return as received from the previous request; use empty string to get the first chunk of results.
         * @param limit The maximum number of affiliate programs to return.
         */
        public GetConnectedAffiliatePrograms(AffiliateType affiliate, String offset, int limit) {
            this.affiliate = affiliate;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1960029582;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns all website where the current user used Telegram to log in.
     *
     * <p> Returns {@link ConnectedWebsites ConnectedWebsites} </p>
     */
    public static class GetConnectedWebsites extends Function<ConnectedWebsites> {

        /**
         * Default constructor for a function, which returns all website where the current user used Telegram to log in.
         *
         * <p> Returns {@link ConnectedWebsites ConnectedWebsites} </p>
         */
        public GetConnectedWebsites() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -170536110;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns all contacts of the user.
     *
     * <p> Returns {@link Users Users} </p>
     */
    public static class GetContacts extends Function<Users> {

        /**
         * Default constructor for a function, which returns all contacts of the user.
         *
         * <p> Returns {@link Users Users} </p>
         */
        public GetContacts() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1417722768;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about existing countries. Can be called before authorization.
     *
     * <p> Returns {@link Countries Countries} </p>
     */
    public static class GetCountries extends Function<Countries> {

        /**
         * Default constructor for a function, which returns information about existing countries. Can be called before authorization.
         *
         * <p> Returns {@link Countries Countries} </p>
         */
        public GetCountries() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -51902050;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Uses the current IP address to find the current country. Returns two-letter ISO 3166-1 alpha-2 country code. Can be called before authorization.
     *
     * <p> Returns {@link Text Text} </p>
     */
    public static class GetCountryCode extends Function<Text> {

        /**
         * Default constructor for a function, which uses the current IP address to find the current country. Returns two-letter ISO 3166-1 alpha-2 country code. Can be called before authorization.
         *
         * <p> Returns {@link Text Text} </p>
         */
        public GetCountryCode() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1540593906;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an emoji for the given country. Returns an empty string on failure. Can be called synchronously.
     *
     * <p> Returns {@link Text Text} </p>
     */
    public static class GetCountryFlagEmoji extends Function<Text> {
        /**
         * A two-letter ISO 3166-1 alpha-2 country code as received from getCountries.
         */
        public String countryCode;

        /**
         * Default constructor for a function, which returns an emoji for the given country. Returns an empty string on failure. Can be called synchronously.
         *
         * <p> Returns {@link Text Text} </p>
         */
        public GetCountryFlagEmoji() {
        }

        /**
         * Creates a function, which returns an emoji for the given country. Returns an empty string on failure. Can be called synchronously.
         *
         * <p> Returns {@link Text Text} </p>
         *
         * @param countryCode A two-letter ISO 3166-1 alpha-2 country code as received from getCountries.
         */
        public GetCountryFlagEmoji(String countryCode) {
            this.countryCode = countryCode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 981871098;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a list of public chats of the specified type, owned by the user.
     *
     * <p> Returns {@link Chats Chats} </p>
     */
    public static class GetCreatedPublicChats extends Function<Chats> {
        /**
         * Type of the public chats to return.
         */
        public PublicChatType type;

        /**
         * Default constructor for a function, which returns a list of public chats of the specified type, owned by the user.
         *
         * <p> Returns {@link Chats Chats} </p>
         */
        public GetCreatedPublicChats() {
        }

        /**
         * Creates a function, which returns a list of public chats of the specified type, owned by the user.
         *
         * <p> Returns {@link Chats Chats} </p>
         *
         * @param type Type of the public chats to return.
         */
        public GetCreatedPublicChats(PublicChatType type) {
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 710354415;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns all updates needed to restore current TDLib state, i.e. all actual updateAuthorizationState/updateUser/updateNewChat and others. This is especially useful if TDLib is run in a separate process. Can be called before initialization.
     *
     * <p> Returns {@link Updates Updates} </p>
     */
    public static class GetCurrentState extends Function<Updates> {

        /**
         * Default constructor for a function, which returns all updates needed to restore current TDLib state, i.e. all actual updateAuthorizationState/updateUser/updateNewChat and others. This is especially useful if TDLib is run in a separate process. Can be called before initialization.
         *
         * <p> Returns {@link Updates Updates} </p>
         */
        public GetCurrentState() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1191417719;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the current weather in the given location.
     *
     * <p> Returns {@link CurrentWeather CurrentWeather} </p>
     */
    public static class GetCurrentWeather extends Function<CurrentWeather> {
        /**
         * The location.
         */
        public Location location;

        /**
         * Default constructor for a function, which returns the current weather in the given location.
         *
         * <p> Returns {@link CurrentWeather CurrentWeather} </p>
         */
        public GetCurrentWeather() {
        }

        /**
         * Creates a function, which returns the current weather in the given location.
         *
         * <p> Returns {@link CurrentWeather CurrentWeather} </p>
         *
         * @param location The location.
         */
        public GetCurrentWeather(Location location) {
            this.location = location;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1965384759;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns TGS stickers with generic animations for custom emoji reactions.
     *
     * <p> Returns {@link Stickers Stickers} </p>
     */
    public static class GetCustomEmojiReactionAnimations extends Function<Stickers> {

        /**
         * Default constructor for a function, which returns TGS stickers with generic animations for custom emoji reactions.
         *
         * <p> Returns {@link Stickers Stickers} </p>
         */
        public GetCustomEmojiReactionAnimations() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1232375250;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of custom emoji stickers by their identifiers. Stickers are returned in arbitrary order. Only found stickers are returned.
     *
     * <p> Returns {@link Stickers Stickers} </p>
     */
    public static class GetCustomEmojiStickers extends Function<Stickers> {
        /**
         * Identifiers of custom emoji stickers. At most 200 custom emoji stickers can be received simultaneously.
         */
        public long[] customEmojiIds;

        /**
         * Default constructor for a function, which returns the list of custom emoji stickers by their identifiers. Stickers are returned in arbitrary order. Only found stickers are returned.
         *
         * <p> Returns {@link Stickers Stickers} </p>
         */
        public GetCustomEmojiStickers() {
        }

        /**
         * Creates a function, which returns the list of custom emoji stickers by their identifiers. Stickers are returned in arbitrary order. Only found stickers are returned.
         *
         * <p> Returns {@link Stickers Stickers} </p>
         *
         * @param customEmojiIds Identifiers of custom emoji stickers. At most 200 custom emoji stickers can be received simultaneously.
         */
        public GetCustomEmojiStickers(long[] customEmojiIds) {
            this.customEmojiIds = customEmojiIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2127427955;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns database statistics.
     *
     * <p> Returns {@link DatabaseStatistics DatabaseStatistics} </p>
     */
    public static class GetDatabaseStatistics extends Function<DatabaseStatistics> {

        /**
         * Default constructor for a function, which returns database statistics.
         *
         * <p> Returns {@link DatabaseStatistics DatabaseStatistics} </p>
         */
        public GetDatabaseStatistics() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1942760263;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a tg:// deep link. Use &quot;tg://need_update_for_some_feature&quot; or &quot;tg:someUnsupportedFeature&quot; for testing. Returns a 404 error for unknown links. Can be called before authorization.
     *
     * <p> Returns {@link DeepLinkInfo DeepLinkInfo} </p>
     */
    public static class GetDeepLinkInfo extends Function<DeepLinkInfo> {
        /**
         * The link.
         */
        public String link;

        /**
         * Default constructor for a function, which returns information about a tg:// deep link. Use &quot;tg://need_update_for_some_feature&quot; or &quot;tg:someUnsupportedFeature&quot; for testing. Returns a 404 error for unknown links. Can be called before authorization.
         *
         * <p> Returns {@link DeepLinkInfo DeepLinkInfo} </p>
         */
        public GetDeepLinkInfo() {
        }

        /**
         * Creates a function, which returns information about a tg:// deep link. Use &quot;tg://need_update_for_some_feature&quot; or &quot;tg:someUnsupportedFeature&quot; for testing. Returns a 404 error for unknown links. Can be called before authorization.
         *
         * <p> Returns {@link DeepLinkInfo DeepLinkInfo} </p>
         *
         * @param link The link.
         */
        public GetDeepLinkInfo(String link) {
            this.link = link;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 680673150;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns default list of custom emoji stickers for reply background.
     *
     * <p> Returns {@link Stickers Stickers} </p>
     */
    public static class GetDefaultBackgroundCustomEmojiStickers extends Function<Stickers> {

        /**
         * Default constructor for a function, which returns default list of custom emoji stickers for reply background.
         *
         * <p> Returns {@link Stickers Stickers} </p>
         */
        public GetDefaultBackgroundCustomEmojiStickers() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 485910542;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns default emoji statuses for chats.
     *
     * <p> Returns {@link EmojiStatusCustomEmojis EmojiStatusCustomEmojis} </p>
     */
    public static class GetDefaultChatEmojiStatuses extends Function<EmojiStatusCustomEmojis> {

        /**
         * Default constructor for a function, which returns default emoji statuses for chats.
         *
         * <p> Returns {@link EmojiStatusCustomEmojis EmojiStatusCustomEmojis} </p>
         */
        public GetDefaultChatEmojiStatuses() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1553698018;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns default list of custom emoji stickers for placing on a chat photo.
     *
     * <p> Returns {@link Stickers Stickers} </p>
     */
    public static class GetDefaultChatPhotoCustomEmojiStickers extends Function<Stickers> {

        /**
         * Default constructor for a function, which returns default list of custom emoji stickers for placing on a chat photo.
         *
         * <p> Returns {@link Stickers Stickers} </p>
         */
        public GetDefaultChatPhotoCustomEmojiStickers() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -376342683;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns default emoji statuses for self status.
     *
     * <p> Returns {@link EmojiStatusCustomEmojis EmojiStatusCustomEmojis} </p>
     */
    public static class GetDefaultEmojiStatuses extends Function<EmojiStatusCustomEmojis> {

        /**
         * Default constructor for a function, which returns default emoji statuses for self status.
         *
         * <p> Returns {@link EmojiStatusCustomEmojis EmojiStatusCustomEmojis} </p>
         */
        public GetDefaultEmojiStatuses() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -539392025;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns default message auto-delete time setting for new chats.
     *
     * <p> Returns {@link MessageAutoDeleteTime MessageAutoDeleteTime} </p>
     */
    public static class GetDefaultMessageAutoDeleteTime extends Function<MessageAutoDeleteTime> {

        /**
         * Default constructor for a function, which returns default message auto-delete time setting for new chats.
         *
         * <p> Returns {@link MessageAutoDeleteTime MessageAutoDeleteTime} </p>
         */
        public GetDefaultMessageAutoDeleteTime() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -450857574;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns default list of custom emoji stickers for placing on a profile photo.
     *
     * <p> Returns {@link Stickers Stickers} </p>
     */
    public static class GetDefaultProfilePhotoCustomEmojiStickers extends Function<Stickers> {

        /**
         * Default constructor for a function, which returns default list of custom emoji stickers for placing on a profile photo.
         *
         * <p> Returns {@link Stickers Stickers} </p>
         */
        public GetDefaultProfilePhotoCustomEmojiStickers() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1280041655;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about the topic in a channel direct messages chat administered by the current user.
     *
     * <p> Returns {@link DirectMessagesChatTopic DirectMessagesChatTopic} </p>
     */
    public static class GetDirectMessagesChatTopic extends Function<DirectMessagesChatTopic> {
        /**
         * Chat identifier of the channel direct messages chat.
         */
        public long chatId;
        /**
         * Identifier of the topic to get.
         */
        public long topicId;

        /**
         * Default constructor for a function, which returns information about the topic in a channel direct messages chat administered by the current user.
         *
         * <p> Returns {@link DirectMessagesChatTopic DirectMessagesChatTopic} </p>
         */
        public GetDirectMessagesChatTopic() {
        }

        /**
         * Creates a function, which returns information about the topic in a channel direct messages chat administered by the current user.
         *
         * <p> Returns {@link DirectMessagesChatTopic DirectMessagesChatTopic} </p>
         *
         * @param chatId Chat identifier of the channel direct messages chat.
         * @param topicId Identifier of the topic to get.
         */
        public GetDirectMessagesChatTopic(long chatId, long topicId) {
            this.chatId = chatId;
            this.topicId = topicId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1990530052;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns messages in the topic in a channel direct messages chat administered by the current user. The messages are returned in reverse chronological order (i.e., in order of decreasing messageId).
     *
     * <p> Returns {@link Messages Messages} </p>
     */
    public static class GetDirectMessagesChatTopicHistory extends Function<Messages> {
        /**
         * Chat identifier of the channel direct messages chat.
         */
        public long chatId;
        /**
         * Identifier of the topic which messages will be fetched.
         */
        public long topicId;
        /**
         * Identifier of the message starting from which messages must be fetched; use 0 to get results from the last message.
         */
        public long fromMessageId;
        /**
         * Specify 0 to get results from exactly the message fromMessageId or a negative number from -99 to -1 to get additionally -offset newer messages.
         */
        public int offset;
        /**
         * The maximum number of messages to be returned; must be positive and can't be greater than 100. If the offset is negative, then the limit must be greater than or equal to -offset. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns messages in the topic in a channel direct messages chat administered by the current user. The messages are returned in reverse chronological order (i.e., in order of decreasing messageId).
         *
         * <p> Returns {@link Messages Messages} </p>
         */
        public GetDirectMessagesChatTopicHistory() {
        }

        /**
         * Creates a function, which returns messages in the topic in a channel direct messages chat administered by the current user. The messages are returned in reverse chronological order (i.e., in order of decreasing messageId).
         *
         * <p> Returns {@link Messages Messages} </p>
         *
         * @param chatId Chat identifier of the channel direct messages chat.
         * @param topicId Identifier of the topic which messages will be fetched.
         * @param fromMessageId Identifier of the message starting from which messages must be fetched; use 0 to get results from the last message.
         * @param offset Specify 0 to get results from exactly the message fromMessageId or a negative number from -99 to -1 to get additionally -offset newer messages.
         * @param limit The maximum number of messages to be returned; must be positive and can't be greater than 100. If the offset is negative, then the limit must be greater than or equal to -offset. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         */
        public GetDirectMessagesChatTopicHistory(long chatId, long topicId, long fromMessageId, int offset, int limit) {
            this.chatId = chatId;
            this.topicId = topicId;
            this.fromMessageId = fromMessageId;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1035221188;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the last message sent in the topic in a channel direct messages chat administered by the current user no later than the specified date.
     *
     * <p> Returns {@link Message Message} </p>
     */
    public static class GetDirectMessagesChatTopicMessageByDate extends Function<Message> {
        /**
         * Chat identifier of the channel direct messages chat.
         */
        public long chatId;
        /**
         * Identifier of the topic which messages will be fetched.
         */
        public long topicId;
        /**
         * Point in time (Unix timestamp) relative to which to search for messages.
         */
        public int date;

        /**
         * Default constructor for a function, which returns the last message sent in the topic in a channel direct messages chat administered by the current user no later than the specified date.
         *
         * <p> Returns {@link Message Message} </p>
         */
        public GetDirectMessagesChatTopicMessageByDate() {
        }

        /**
         * Creates a function, which returns the last message sent in the topic in a channel direct messages chat administered by the current user no later than the specified date.
         *
         * <p> Returns {@link Message Message} </p>
         *
         * @param chatId Chat identifier of the channel direct messages chat.
         * @param topicId Identifier of the topic which messages will be fetched.
         * @param date Point in time (Unix timestamp) relative to which to search for messages.
         */
        public GetDirectMessagesChatTopicMessageByDate(long chatId, long topicId, int date) {
            this.chatId = chatId;
            this.topicId = topicId;
            this.date = date;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1837500879;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the total number of Telegram Stars received by the channel chat for direct messages from the given topic.
     *
     * <p> Returns {@link StarCount StarCount} </p>
     */
    public static class GetDirectMessagesChatTopicRevenue extends Function<StarCount> {
        /**
         * Chat identifier of the channel direct messages chat administered by the current user.
         */
        public long chatId;
        /**
         * Identifier of the topic.
         */
        public long topicId;

        /**
         * Default constructor for a function, which returns the total number of Telegram Stars received by the channel chat for direct messages from the given topic.
         *
         * <p> Returns {@link StarCount StarCount} </p>
         */
        public GetDirectMessagesChatTopicRevenue() {
        }

        /**
         * Creates a function, which returns the total number of Telegram Stars received by the channel chat for direct messages from the given topic.
         *
         * <p> Returns {@link StarCount StarCount} </p>
         *
         * @param chatId Chat identifier of the channel direct messages chat administered by the current user.
         * @param topicId Identifier of the topic.
         */
        public GetDirectMessagesChatTopicRevenue(long chatId, long topicId) {
            this.chatId = chatId;
            this.topicId = topicId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -792382961;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of emoji statuses, which can't be used as chat emoji status, even if they are from a sticker set with isAllowedAsChatEmojiStatus == true.
     *
     * <p> Returns {@link EmojiStatusCustomEmojis EmojiStatusCustomEmojis} </p>
     */
    public static class GetDisallowedChatEmojiStatuses extends Function<EmojiStatusCustomEmojis> {

        /**
         * Default constructor for a function, which returns the list of emoji statuses, which can't be used as chat emoji status, even if they are from a sticker set with isAllowedAsChatEmojiStatus == true.
         *
         * <p> Returns {@link EmojiStatusCustomEmojis EmojiStatusCustomEmojis} </p>
         */
        public GetDisallowedChatEmojiStatuses() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2004787831;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns available emoji categories.
     *
     * <p> Returns {@link EmojiCategories EmojiCategories} </p>
     */
    public static class GetEmojiCategories extends Function<EmojiCategories> {
        /**
         * Type of emoji categories to return; pass null to get default emoji categories.
         */
        public EmojiCategoryType type;

        /**
         * Default constructor for a function, which returns available emoji categories.
         *
         * <p> Returns {@link EmojiCategories EmojiCategories} </p>
         */
        public GetEmojiCategories() {
        }

        /**
         * Creates a function, which returns available emoji categories.
         *
         * <p> Returns {@link EmojiCategories EmojiCategories} </p>
         *
         * @param type Type of emoji categories to return; pass null to get default emoji categories.
         */
        public GetEmojiCategories(EmojiCategoryType type) {
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2139537774;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about an emoji reaction. Returns a 404 error if the reaction is not found.
     *
     * <p> Returns {@link EmojiReaction EmojiReaction} </p>
     */
    public static class GetEmojiReaction extends Function<EmojiReaction> {
        /**
         * Text representation of the reaction.
         */
        public String emoji;

        /**
         * Default constructor for a function, which returns information about an emoji reaction. Returns a 404 error if the reaction is not found.
         *
         * <p> Returns {@link EmojiReaction EmojiReaction} </p>
         */
        public GetEmojiReaction() {
        }

        /**
         * Creates a function, which returns information about an emoji reaction. Returns a 404 error if the reaction is not found.
         *
         * <p> Returns {@link EmojiReaction EmojiReaction} </p>
         *
         * @param emoji Text representation of the reaction.
         */
        public GetEmojiReaction(String emoji) {
            this.emoji = emoji;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -449572388;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an HTTP URL which can be used to automatically log in to the translation platform and suggest new emoji replacements. The URL will be valid for 30 seconds after generation.
     *
     * <p> Returns {@link HttpUrl HttpUrl} </p>
     */
    public static class GetEmojiSuggestionsUrl extends Function<HttpUrl> {
        /**
         * Language code for which the emoji replacements will be suggested.
         */
        public String languageCode;

        /**
         * Default constructor for a function, which returns an HTTP URL which can be used to automatically log in to the translation platform and suggest new emoji replacements. The URL will be valid for 30 seconds after generation.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         */
        public GetEmojiSuggestionsUrl() {
        }

        /**
         * Creates a function, which returns an HTTP URL which can be used to automatically log in to the translation platform and suggest new emoji replacements. The URL will be valid for 30 seconds after generation.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         *
         * @param languageCode Language code for which the emoji replacements will be suggested.
         */
        public GetEmojiSuggestionsUrl(String languageCode) {
            this.languageCode = languageCode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1404101841;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an HTTP URL which can be used to automatically authorize the current user on a website after clicking an HTTP link. Use the method getExternalLinkInfo to find whether a prior user confirmation is needed. May return an empty link if just a toast about successful login has to be shown.
     *
     * <p> Returns {@link HttpUrl HttpUrl} </p>
     */
    public static class GetExternalLink extends Function<HttpUrl> {
        /**
         * The HTTP link.
         */
        public String link;
        /**
         * Pass true if the current user allowed the bot that was returned in getExternalLinkInfo, to send them messages.
         */
        public boolean allowWriteAccess;

        /**
         * Default constructor for a function, which returns an HTTP URL which can be used to automatically authorize the current user on a website after clicking an HTTP link. Use the method getExternalLinkInfo to find whether a prior user confirmation is needed. May return an empty link if just a toast about successful login has to be shown.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         */
        public GetExternalLink() {
        }

        /**
         * Creates a function, which returns an HTTP URL which can be used to automatically authorize the current user on a website after clicking an HTTP link. Use the method getExternalLinkInfo to find whether a prior user confirmation is needed. May return an empty link if just a toast about successful login has to be shown.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         *
         * @param link The HTTP link.
         * @param allowWriteAccess Pass true if the current user allowed the bot that was returned in getExternalLinkInfo, to send them messages.
         */
        public GetExternalLink(String link, boolean allowWriteAccess) {
            this.link = link;
            this.allowWriteAccess = allowWriteAccess;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1586688235;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about an action to be done when the current user clicks an external link. Don't use this method for links from secret chats if link preview is disabled in secret chats.
     *
     * <p> Returns {@link LoginUrlInfo LoginUrlInfo} </p>
     */
    public static class GetExternalLinkInfo extends Function<LoginUrlInfo> {
        /**
         * The link.
         */
        public String link;

        /**
         * Default constructor for a function, which returns information about an action to be done when the current user clicks an external link. Don't use this method for links from secret chats if link preview is disabled in secret chats.
         *
         * <p> Returns {@link LoginUrlInfo LoginUrlInfo} </p>
         */
        public GetExternalLinkInfo() {
        }

        /**
         * Creates a function, which returns information about an action to be done when the current user clicks an external link. Don't use this method for links from secret chats if link preview is disabled in secret chats.
         *
         * <p> Returns {@link LoginUrlInfo LoginUrlInfo} </p>
         *
         * @param link The link.
         */
        public GetExternalLinkInfo(String link) {
            this.link = link;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1175288383;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns favorite stickers.
     *
     * <p> Returns {@link Stickers Stickers} </p>
     */
    public static class GetFavoriteStickers extends Function<Stickers> {

        /**
         * Default constructor for a function, which returns favorite stickers.
         *
         * <p> Returns {@link Stickers Stickers} </p>
         */
        public GetFavoriteStickers() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -338964672;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a file. This is an offline method.
     *
     * <p> Returns {@link File File} </p>
     */
    public static class GetFile extends Function<File> {
        /**
         * Identifier of the file to get.
         */
        public int fileId;

        /**
         * Default constructor for a function, which returns information about a file. This is an offline method.
         *
         * <p> Returns {@link File File} </p>
         */
        public GetFile() {
        }

        /**
         * Creates a function, which returns information about a file. This is an offline method.
         *
         * <p> Returns {@link File File} </p>
         *
         * @param fileId Identifier of the file to get.
         */
        public GetFile(int fileId) {
            this.fileId = fileId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1553923406;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns file downloaded prefix size from a given offset, in bytes.
     *
     * <p> Returns {@link FileDownloadedPrefixSize FileDownloadedPrefixSize} </p>
     */
    public static class GetFileDownloadedPrefixSize extends Function<FileDownloadedPrefixSize> {
        /**
         * Identifier of the file.
         */
        public int fileId;
        /**
         * Offset from which downloaded prefix size needs to be calculated.
         */
        public long offset;

        /**
         * Default constructor for a function, which returns file downloaded prefix size from a given offset, in bytes.
         *
         * <p> Returns {@link FileDownloadedPrefixSize FileDownloadedPrefixSize} </p>
         */
        public GetFileDownloadedPrefixSize() {
        }

        /**
         * Creates a function, which returns file downloaded prefix size from a given offset, in bytes.
         *
         * <p> Returns {@link FileDownloadedPrefixSize FileDownloadedPrefixSize} </p>
         *
         * @param fileId Identifier of the file.
         * @param offset Offset from which downloaded prefix size needs to be calculated.
         */
        public GetFileDownloadedPrefixSize(int fileId, long offset) {
            this.fileId = fileId;
            this.offset = offset;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 855948589;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the extension of a file, guessed by its MIME type. Returns an empty string on failure. Can be called synchronously.
     *
     * <p> Returns {@link Text Text} </p>
     */
    public static class GetFileExtension extends Function<Text> {
        /**
         * The MIME type of the file.
         */
        public String mimeType;

        /**
         * Default constructor for a function, which returns the extension of a file, guessed by its MIME type. Returns an empty string on failure. Can be called synchronously.
         *
         * <p> Returns {@link Text Text} </p>
         */
        public GetFileExtension() {
        }

        /**
         * Creates a function, which returns the extension of a file, guessed by its MIME type. Returns an empty string on failure. Can be called synchronously.
         *
         * <p> Returns {@link Text Text} </p>
         *
         * @param mimeType The MIME type of the file.
         */
        public GetFileExtension(String mimeType) {
            this.mimeType = mimeType;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -106055372;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the MIME type of a file, guessed by its extension. Returns an empty string on failure. Can be called synchronously.
     *
     * <p> Returns {@link Text Text} </p>
     */
    public static class GetFileMimeType extends Function<Text> {
        /**
         * The name of the file or path to the file.
         */
        public String fileName;

        /**
         * Default constructor for a function, which returns the MIME type of a file, guessed by its extension. Returns an empty string on failure. Can be called synchronously.
         *
         * <p> Returns {@link Text Text} </p>
         */
        public GetFileMimeType() {
        }

        /**
         * Creates a function, which returns the MIME type of a file, guessed by its extension. Returns an empty string on failure. Can be called synchronously.
         *
         * <p> Returns {@link Text Text} </p>
         *
         * @param fileName The name of the file or path to the file.
         */
        public GetFileMimeType(String fileName) {
            this.fileName = fileName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2073879671;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a topic in a forum supergroup chat or a chat with a bot with topics.
     *
     * <p> Returns {@link ForumTopic ForumTopic} </p>
     */
    public static class GetForumTopic extends Function<ForumTopic> {
        /**
         * Identifier of the chat.
         */
        public long chatId;
        /**
         * Forum topic identifier.
         */
        public int forumTopicId;

        /**
         * Default constructor for a function, which returns information about a topic in a forum supergroup chat or a chat with a bot with topics.
         *
         * <p> Returns {@link ForumTopic ForumTopic} </p>
         */
        public GetForumTopic() {
        }

        /**
         * Creates a function, which returns information about a topic in a forum supergroup chat or a chat with a bot with topics.
         *
         * <p> Returns {@link ForumTopic ForumTopic} </p>
         *
         * @param chatId Identifier of the chat.
         * @param forumTopicId Forum topic identifier.
         */
        public GetForumTopic(long chatId, int forumTopicId) {
            this.chatId = chatId;
            this.forumTopicId = forumTopicId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1931459984;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of custom emoji, which can be used as forum topic icon by all users.
     *
     * <p> Returns {@link Stickers Stickers} </p>
     */
    public static class GetForumTopicDefaultIcons extends Function<Stickers> {

        /**
         * Default constructor for a function, which returns the list of custom emoji, which can be used as forum topic icon by all users.
         *
         * <p> Returns {@link Stickers Stickers} </p>
         */
        public GetForumTopicDefaultIcons() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1479898332;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns messages in a topic in a forum supergroup chat or a chat with a bot with topics. The messages are returned in reverse chronological order (i.e., in order of decreasing messageId). For optimal performance, the number of returned messages is chosen by TDLib.
     *
     * <p> Returns {@link Messages Messages} </p>
     */
    public static class GetForumTopicHistory extends Function<Messages> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Forum topic identifier.
         */
        public int forumTopicId;
        /**
         * Identifier of the message starting from which history must be fetched; use 0 to get results from the last message.
         */
        public long fromMessageId;
        /**
         * Specify 0 to get results from exactly the message fromMessageId or a negative number from -99 to -1 to get additionally -offset newer messages.
         */
        public int offset;
        /**
         * The maximum number of messages to be returned; must be positive and can't be greater than 100. If the offset is negative, then the limit must be greater than or equal to -offset. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns messages in a topic in a forum supergroup chat or a chat with a bot with topics. The messages are returned in reverse chronological order (i.e., in order of decreasing messageId). For optimal performance, the number of returned messages is chosen by TDLib.
         *
         * <p> Returns {@link Messages Messages} </p>
         */
        public GetForumTopicHistory() {
        }

        /**
         * Creates a function, which returns messages in a topic in a forum supergroup chat or a chat with a bot with topics. The messages are returned in reverse chronological order (i.e., in order of decreasing messageId). For optimal performance, the number of returned messages is chosen by TDLib.
         *
         * <p> Returns {@link Messages Messages} </p>
         *
         * @param chatId Chat identifier.
         * @param forumTopicId Forum topic identifier.
         * @param fromMessageId Identifier of the message starting from which history must be fetched; use 0 to get results from the last message.
         * @param offset Specify 0 to get results from exactly the message fromMessageId or a negative number from -99 to -1 to get additionally -offset newer messages.
         * @param limit The maximum number of messages to be returned; must be positive and can't be greater than 100. If the offset is negative, then the limit must be greater than or equal to -offset. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         */
        public GetForumTopicHistory(long chatId, int forumTopicId, long fromMessageId, int offset, int limit) {
            this.chatId = chatId;
            this.forumTopicId = forumTopicId;
            this.fromMessageId = fromMessageId;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -339129791;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an HTTPS link to a topic in a forum supergroup chat. This is an offline method.
     *
     * <p> Returns {@link MessageLink MessageLink} </p>
     */
    public static class GetForumTopicLink extends Function<MessageLink> {
        /**
         * Identifier of the chat.
         */
        public long chatId;
        /**
         * Forum topic identifier.
         */
        public int forumTopicId;

        /**
         * Default constructor for a function, which returns an HTTPS link to a topic in a forum supergroup chat. This is an offline method.
         *
         * <p> Returns {@link MessageLink MessageLink} </p>
         */
        public GetForumTopicLink() {
        }

        /**
         * Creates a function, which returns an HTTPS link to a topic in a forum supergroup chat. This is an offline method.
         *
         * <p> Returns {@link MessageLink MessageLink} </p>
         *
         * @param chatId Identifier of the chat.
         * @param forumTopicId Forum topic identifier.
         */
        public GetForumTopicLink(long chatId, int forumTopicId) {
            this.chatId = chatId;
            this.forumTopicId = forumTopicId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 330405972;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns found forum topics in a forum supergroup chat or a chat with a bot with topics. This is a temporary method for getting information about topic list from the server.
     *
     * <p> Returns {@link ForumTopics ForumTopics} </p>
     */
    public static class GetForumTopics extends Function<ForumTopics> {
        /**
         * Identifier of the chat.
         */
        public long chatId;
        /**
         * Query to search for in the forum topic's name.
         */
        public String query;
        /**
         * The date starting from which the results need to be fetched. Use 0 or any date in the future to get results from the last topic.
         */
        public int offsetDate;
        /**
         * The message identifier of the last message in the last found topic, or 0 for the first request.
         */
        public long offsetMessageId;
        /**
         * The forum topic identifier of the last found topic, or 0 for the first request.
         */
        public int offsetForumTopicId;
        /**
         * The maximum number of forum topics to be returned; up to 100. For optimal performance, the number of returned forum topics is chosen by TDLib and can be smaller than the specified limit.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns found forum topics in a forum supergroup chat or a chat with a bot with topics. This is a temporary method for getting information about topic list from the server.
         *
         * <p> Returns {@link ForumTopics ForumTopics} </p>
         */
        public GetForumTopics() {
        }

        /**
         * Creates a function, which returns found forum topics in a forum supergroup chat or a chat with a bot with topics. This is a temporary method for getting information about topic list from the server.
         *
         * <p> Returns {@link ForumTopics ForumTopics} </p>
         *
         * @param chatId Identifier of the chat.
         * @param query Query to search for in the forum topic's name.
         * @param offsetDate The date starting from which the results need to be fetched. Use 0 or any date in the future to get results from the last topic.
         * @param offsetMessageId The message identifier of the last message in the last found topic, or 0 for the first request.
         * @param offsetForumTopicId The forum topic identifier of the last found topic, or 0 for the first request.
         * @param limit The maximum number of forum topics to be returned; up to 100. For optimal performance, the number of returned forum topics is chosen by TDLib and can be smaller than the specified limit.
         */
        public GetForumTopics(long chatId, String query, int offsetDate, long offsetMessageId, int offsetForumTopicId, int limit) {
            this.chatId = chatId;
            this.query = query;
            this.offsetDate = offsetDate;
            this.offsetMessageId = offsetMessageId;
            this.offsetForumTopicId = offsetForumTopicId;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1368275676;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the high scores for a game and some part of the high score table in the range of the specified user; for bots only.
     *
     * <p> Returns {@link GameHighScores GameHighScores} </p>
     */
    public static class GetGameHighScores extends Function<GameHighScores> {
        /**
         * The chat that contains the message with the game.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * User identifier.
         */
        public long userId;

        /**
         * Default constructor for a function, which returns the high scores for a game and some part of the high score table in the range of the specified user; for bots only.
         *
         * <p> Returns {@link GameHighScores GameHighScores} </p>
         */
        public GetGameHighScores() {
        }

        /**
         * Creates a function, which returns the high scores for a game and some part of the high score table in the range of the specified user; for bots only.
         *
         * <p> Returns {@link GameHighScores GameHighScores} </p>
         *
         * @param chatId The chat that contains the message with the game.
         * @param messageId Identifier of the message.
         * @param userId User identifier.
         */
        public GetGameHighScores(long chatId, long messageId, long userId) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 15746459;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the gifts that were acquired by the current user on a gift auction.
     *
     * <p> Returns {@link GiftAuctionAcquiredGifts GiftAuctionAcquiredGifts} </p>
     */
    public static class GetGiftAuctionAcquiredGifts extends Function<GiftAuctionAcquiredGifts> {
        /**
         * Identifier of the auctioned gift.
         */
        public long giftId;

        /**
         * Default constructor for a function, which returns the gifts that were acquired by the current user on a gift auction.
         *
         * <p> Returns {@link GiftAuctionAcquiredGifts GiftAuctionAcquiredGifts} </p>
         */
        public GetGiftAuctionAcquiredGifts() {
        }

        /**
         * Creates a function, which returns the gifts that were acquired by the current user on a gift auction.
         *
         * <p> Returns {@link GiftAuctionAcquiredGifts GiftAuctionAcquiredGifts} </p>
         *
         * @param giftId Identifier of the auctioned gift.
         */
        public GetGiftAuctionAcquiredGifts(long giftId) {
            this.giftId = giftId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -937975215;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns auction state for a gift.
     *
     * <p> Returns {@link GiftAuctionState GiftAuctionState} </p>
     */
    public static class GetGiftAuctionState extends Function<GiftAuctionState> {
        /**
         * Unique identifier of the auction.
         */
        public String auctionId;

        /**
         * Default constructor for a function, which returns auction state for a gift.
         *
         * <p> Returns {@link GiftAuctionState GiftAuctionState} </p>
         */
        public GetGiftAuctionState() {
        }

        /**
         * Creates a function, which returns auction state for a gift.
         *
         * <p> Returns {@link GiftAuctionState GiftAuctionState} </p>
         *
         * @param auctionId Unique identifier of the auction.
         */
        public GetGiftAuctionState(String auctionId) {
            this.auctionId = auctionId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 989210247;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns available to the current user gift chat themes.
     *
     * <p> Returns {@link GiftChatThemes GiftChatThemes} </p>
     */
    public static class GetGiftChatThemes extends Function<GiftChatThemes> {
        /**
         * Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         */
        public String offset;
        /**
         * The maximum number of chat themes to return.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns available to the current user gift chat themes.
         *
         * <p> Returns {@link GiftChatThemes GiftChatThemes} </p>
         */
        public GetGiftChatThemes() {
        }

        /**
         * Creates a function, which returns available to the current user gift chat themes.
         *
         * <p> Returns {@link GiftChatThemes GiftChatThemes} </p>
         *
         * @param offset Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         * @param limit The maximum number of chat themes to return.
         */
        public GetGiftChatThemes(String offset, int limit) {
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1051327876;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns collections of gifts owned by the given user or chat.
     *
     * <p> Returns {@link GiftCollections GiftCollections} </p>
     */
    public static class GetGiftCollections extends Function<GiftCollections> {
        /**
         * Identifier of the user or the channel chat that received the gifts.
         */
        public MessageSender ownerId;

        /**
         * Default constructor for a function, which returns collections of gifts owned by the given user or chat.
         *
         * <p> Returns {@link GiftCollections GiftCollections} </p>
         */
        public GetGiftCollections() {
        }

        /**
         * Creates a function, which returns collections of gifts owned by the given user or chat.
         *
         * <p> Returns {@link GiftCollections GiftCollections} </p>
         *
         * @param ownerId Identifier of the user or the channel chat that received the gifts.
         */
        public GetGiftCollections(MessageSender ownerId) {
            this.ownerId = ownerId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1533138835;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns examples of possible upgraded gifts for a regular gift.
     *
     * <p> Returns {@link GiftUpgradePreview GiftUpgradePreview} </p>
     */
    public static class GetGiftUpgradePreview extends Function<GiftUpgradePreview> {
        /**
         * Identifier of the regular gift.
         */
        public long regularGiftId;

        /**
         * Default constructor for a function, which returns examples of possible upgraded gifts for a regular gift.
         *
         * <p> Returns {@link GiftUpgradePreview GiftUpgradePreview} </p>
         */
        public GetGiftUpgradePreview() {
        }

        /**
         * Creates a function, which returns examples of possible upgraded gifts for a regular gift.
         *
         * <p> Returns {@link GiftUpgradePreview GiftUpgradePreview} </p>
         *
         * @param regularGiftId Identifier of the regular gift.
         */
        public GetGiftUpgradePreview(long regularGiftId) {
            this.regularGiftId = regularGiftId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1303475628;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns upgraded gifts of the current user who can be used to craft another gifts.
     *
     * <p> Returns {@link GiftsForCrafting GiftsForCrafting} </p>
     */
    public static class GetGiftsForCrafting extends Function<GiftsForCrafting> {
        /**
         * Identifier of the regular gift that will be used for crafting.
         */
        public long regularGiftId;
        /**
         * Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         */
        public String offset;
        /**
         * The maximum number of gifts to be returned; must be positive and can't be greater than 100. For optimal performance, the number of returned objects is chosen by TDLib and can be smaller than the specified limit.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns upgraded gifts of the current user who can be used to craft another gifts.
         *
         * <p> Returns {@link GiftsForCrafting GiftsForCrafting} </p>
         */
        public GetGiftsForCrafting() {
        }

        /**
         * Creates a function, which returns upgraded gifts of the current user who can be used to craft another gifts.
         *
         * <p> Returns {@link GiftsForCrafting GiftsForCrafting} </p>
         *
         * @param regularGiftId Identifier of the regular gift that will be used for crafting.
         * @param offset Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         * @param limit The maximum number of gifts to be returned; must be positive and can't be greater than 100. For optimal performance, the number of returned objects is chosen by TDLib and can be smaller than the specified limit.
         */
        public GetGiftsForCrafting(long regularGiftId, String offset, int limit) {
            this.regularGiftId = regularGiftId;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1571822730;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a giveaway.
     *
     * <p> Returns {@link GiveawayInfo GiveawayInfo} </p>
     */
    public static class GetGiveawayInfo extends Function<GiveawayInfo> {
        /**
         * Identifier of the channel chat which started the giveaway.
         */
        public long chatId;
        /**
         * Identifier of the giveaway or a giveaway winners message in the chat.
         */
        public long messageId;

        /**
         * Default constructor for a function, which returns information about a giveaway.
         *
         * <p> Returns {@link GiveawayInfo GiveawayInfo} </p>
         */
        public GetGiveawayInfo() {
        }

        /**
         * Creates a function, which returns information about a giveaway.
         *
         * <p> Returns {@link GiveawayInfo GiveawayInfo} </p>
         *
         * @param chatId Identifier of the channel chat which started the giveaway.
         * @param messageId Identifier of the giveaway or a giveaway winners message in the chat.
         */
        public GetGiveawayInfo(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1215852357;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns greeting stickers from regular sticker sets that can be used for the start page of other users.
     *
     * <p> Returns {@link Stickers Stickers} </p>
     */
    public static class GetGreetingStickers extends Function<Stickers> {

        /**
         * Default constructor for a function, which returns greeting stickers from regular sticker sets that can be used for the start page of other users.
         *
         * <p> Returns {@link Stickers Stickers} </p>
         */
        public GetGreetingStickers() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 374873372;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the most grossing Web App bots.
     *
     * <p> Returns {@link FoundUsers FoundUsers} </p>
     */
    public static class GetGrossingWebAppBots extends Function<FoundUsers> {
        /**
         * Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         */
        public String offset;
        /**
         * The maximum number of bots to be returned; up to 100.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns the most grossing Web App bots.
         *
         * <p> Returns {@link FoundUsers FoundUsers} </p>
         */
        public GetGrossingWebAppBots() {
        }

        /**
         * Creates a function, which returns the most grossing Web App bots.
         *
         * <p> Returns {@link FoundUsers FoundUsers} </p>
         *
         * @param offset Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         * @param limit The maximum number of bots to be returned; up to 100.
         */
        public GetGrossingWebAppBots(String offset, int limit) {
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1696779802;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a group call.
     *
     * <p> Returns {@link GroupCall GroupCall} </p>
     */
    public static class GetGroupCall extends Function<GroupCall> {
        /**
         * Group call identifier.
         */
        public int groupCallId;

        /**
         * Default constructor for a function, which returns information about a group call.
         *
         * <p> Returns {@link GroupCall GroupCall} </p>
         */
        public GetGroupCall() {
        }

        /**
         * Creates a function, which returns information about a group call.
         *
         * <p> Returns {@link GroupCall GroupCall} </p>
         *
         * @param groupCallId Group call identifier.
         */
        public GetGroupCall(int groupCallId) {
            this.groupCallId = groupCallId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1468491406;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about participants of a non-joined group call that is not bound to a chat.
     *
     * <p> Returns {@link GroupCallParticipants GroupCallParticipants} </p>
     */
    public static class GetGroupCallParticipants extends Function<GroupCallParticipants> {
        /**
         * The group call which participants will be returned.
         */
        public InputGroupCall inputGroupCall;
        /**
         * The maximum number of participants to return; must be positive.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns information about participants of a non-joined group call that is not bound to a chat.
         *
         * <p> Returns {@link GroupCallParticipants GroupCallParticipants} </p>
         */
        public GetGroupCallParticipants() {
        }

        /**
         * Creates a function, which returns information about participants of a non-joined group call that is not bound to a chat.
         *
         * <p> Returns {@link GroupCallParticipants GroupCallParticipants} </p>
         *
         * @param inputGroupCall The group call which participants will be returned.
         * @param limit The maximum number of participants to return; must be positive.
         */
        public GetGroupCallParticipants(InputGroupCall inputGroupCall, int limit) {
            this.inputGroupCall = inputGroupCall;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1986739394;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a file with a segment of a video chat or live story in a modified OGG format for audio or MPEG-4 format for video.
     *
     * <p> Returns {@link Data Data} </p>
     */
    public static class GetGroupCallStreamSegment extends Function<Data> {
        /**
         * Group call identifier.
         */
        public int groupCallId;
        /**
         * Point in time when the stream segment begins; Unix timestamp in milliseconds.
         */
        public long timeOffset;
        /**
         * Segment duration scale; 0-1. Segment's duration is 1000/(2**scale) milliseconds.
         */
        public int scale;
        /**
         * Identifier of an audio/video channel to get as received from tgcalls.
         */
        public int channelId;
        /**
         * Video quality as received from tgcalls; pass null to get the worst available quality.
         */
        public GroupCallVideoQuality videoQuality;

        /**
         * Default constructor for a function, which returns a file with a segment of a video chat or live story in a modified OGG format for audio or MPEG-4 format for video.
         *
         * <p> Returns {@link Data Data} </p>
         */
        public GetGroupCallStreamSegment() {
        }

        /**
         * Creates a function, which returns a file with a segment of a video chat or live story in a modified OGG format for audio or MPEG-4 format for video.
         *
         * <p> Returns {@link Data Data} </p>
         *
         * @param groupCallId Group call identifier.
         * @param timeOffset Point in time when the stream segment begins; Unix timestamp in milliseconds.
         * @param scale Segment duration scale; 0-1. Segment's duration is 1000/(2**scale) milliseconds.
         * @param channelId Identifier of an audio/video channel to get as received from tgcalls.
         * @param videoQuality Video quality as received from tgcalls; pass null to get the worst available quality.
         */
        public GetGroupCallStreamSegment(int groupCallId, long timeOffset, int scale, int channelId, GroupCallVideoQuality videoQuality) {
            this.groupCallId = groupCallId;
            this.timeOffset = timeOffset;
            this.scale = scale;
            this.channelId = channelId;
            this.videoQuality = videoQuality;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -502273424;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about available streams in a video chat or a live story.
     *
     * <p> Returns {@link GroupCallStreams GroupCallStreams} </p>
     */
    public static class GetGroupCallStreams extends Function<GroupCallStreams> {
        /**
         * Group call identifier.
         */
        public int groupCallId;

        /**
         * Default constructor for a function, which returns information about available streams in a video chat or a live story.
         *
         * <p> Returns {@link GroupCallStreams GroupCallStreams} </p>
         */
        public GetGroupCallStreams() {
        }

        /**
         * Creates a function, which returns information about available streams in a video chat or a live story.
         *
         * <p> Returns {@link GroupCallStreams GroupCallStreams} </p>
         *
         * @param groupCallId Group call identifier.
         */
        public GetGroupCallStreams(int groupCallId) {
            this.groupCallId = groupCallId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1619226268;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a list of common group chats with a given user. Chats are sorted by their type and creation date.
     *
     * <p> Returns {@link Chats Chats} </p>
     */
    public static class GetGroupsInCommon extends Function<Chats> {
        /**
         * User identifier.
         */
        public long userId;
        /**
         * Chat identifier starting from which to return chats; use 0 for the first request.
         */
        public long offsetChatId;
        /**
         * The maximum number of chats to be returned; up to 100.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns a list of common group chats with a given user. Chats are sorted by their type and creation date.
         *
         * <p> Returns {@link Chats Chats} </p>
         */
        public GetGroupsInCommon() {
        }

        /**
         * Creates a function, which returns a list of common group chats with a given user. Chats are sorted by their type and creation date.
         *
         * <p> Returns {@link Chats Chats} </p>
         *
         * @param userId User identifier.
         * @param offsetChatId Chat identifier starting from which to return chats; use 0 for the first request.
         * @param limit The maximum number of chats to be returned; up to 100.
         */
        public GetGroupsInCommon(long userId, long offsetChatId, int limit) {
            this.userId = userId;
            this.offsetChatId = offsetChatId;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 381539178;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the total number of imported contacts.
     *
     * <p> Returns {@link Count Count} </p>
     */
    public static class GetImportedContactCount extends Function<Count> {

        /**
         * Default constructor for a function, which returns the total number of imported contacts.
         *
         * <p> Returns {@link Count Count} </p>
         */
        public GetImportedContactCount() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -656336346;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a list of recently inactive supergroups and channels. Can be used when user reaches limit on the number of joined supergroups and channels and receives the error &quot;CHANNELS_TOO_MUCH&quot;. Also, the limit can be increased with Telegram Premium.
     *
     * <p> Returns {@link Chats Chats} </p>
     */
    public static class GetInactiveSupergroupChats extends Function<Chats> {

        /**
         * Default constructor for a function, which returns a list of recently inactive supergroups and channels. Can be used when user reaches limit on the number of joined supergroups and channels and receives the error &quot;CHANNELS_TOO_MUCH&quot;. Also, the limit can be increased with Telegram Premium.
         *
         * <p> Returns {@link Chats Chats} </p>
         */
        public GetInactiveSupergroupChats() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -657720907;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns game high scores and some part of the high score table in the range of the specified user; for bots only.
     *
     * <p> Returns {@link GameHighScores GameHighScores} </p>
     */
    public static class GetInlineGameHighScores extends Function<GameHighScores> {
        /**
         * Inline message identifier.
         */
        public String inlineMessageId;
        /**
         * User identifier.
         */
        public long userId;

        /**
         * Default constructor for a function, which returns game high scores and some part of the high score table in the range of the specified user; for bots only.
         *
         * <p> Returns {@link GameHighScores GameHighScores} </p>
         */
        public GetInlineGameHighScores() {
        }

        /**
         * Creates a function, which returns game high scores and some part of the high score table in the range of the specified user; for bots only.
         *
         * <p> Returns {@link GameHighScores GameHighScores} </p>
         *
         * @param inlineMessageId Inline message identifier.
         * @param userId User identifier.
         */
        public GetInlineGameHighScores(String inlineMessageId, long userId) {
            this.inlineMessageId = inlineMessageId;
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -533107798;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends an inline query to a bot and returns its results. Returns an error with code 502 if the bot fails to answer the query before the query timeout expires.
     *
     * <p> Returns {@link InlineQueryResults InlineQueryResults} </p>
     */
    public static class GetInlineQueryResults extends Function<InlineQueryResults> {
        /**
         * Identifier of the target bot.
         */
        public long botUserId;
        /**
         * Identifier of the chat where the query was sent.
         */
        public long chatId;
        /**
         * Location of the user; pass null if unknown or the bot doesn't need user's location.
         */
        public Location userLocation;
        /**
         * Text of the query.
         */
        public String query;
        /**
         * Offset of the first entry to return; use empty string to get the first chunk of results.
         */
        public String offset;

        /**
         * Default constructor for a function, which sends an inline query to a bot and returns its results. Returns an error with code 502 if the bot fails to answer the query before the query timeout expires.
         *
         * <p> Returns {@link InlineQueryResults InlineQueryResults} </p>
         */
        public GetInlineQueryResults() {
        }

        /**
         * Creates a function, which sends an inline query to a bot and returns its results. Returns an error with code 502 if the bot fails to answer the query before the query timeout expires.
         *
         * <p> Returns {@link InlineQueryResults InlineQueryResults} </p>
         *
         * @param botUserId Identifier of the target bot.
         * @param chatId Identifier of the chat where the query was sent.
         * @param userLocation Location of the user; pass null if unknown or the bot doesn't need user's location.
         * @param query Text of the query.
         * @param offset Offset of the first entry to return; use empty string to get the first chunk of results.
         */
        public GetInlineQueryResults(long botUserId, long chatId, Location userLocation, String query, String offset) {
            this.botUserId = botUserId;
            this.chatId = chatId;
            this.userLocation = userLocation;
            this.query = query;
            this.offset = offset;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2044524652;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns backgrounds installed by the user.
     *
     * <p> Returns {@link Backgrounds Backgrounds} </p>
     */
    public static class GetInstalledBackgrounds extends Function<Backgrounds> {
        /**
         * Pass true to order returned backgrounds for a dark theme.
         */
        public boolean forDarkTheme;

        /**
         * Default constructor for a function, which returns backgrounds installed by the user.
         *
         * <p> Returns {@link Backgrounds Backgrounds} </p>
         */
        public GetInstalledBackgrounds() {
        }

        /**
         * Creates a function, which returns backgrounds installed by the user.
         *
         * <p> Returns {@link Backgrounds Backgrounds} </p>
         *
         * @param forDarkTheme Pass true to order returned backgrounds for a dark theme.
         */
        public GetInstalledBackgrounds(boolean forDarkTheme) {
            this.forDarkTheme = forDarkTheme;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1051406241;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a list of installed sticker sets.
     *
     * <p> Returns {@link StickerSets StickerSets} </p>
     */
    public static class GetInstalledStickerSets extends Function<StickerSets> {
        /**
         * Type of the sticker sets to return.
         */
        public StickerType stickerType;

        /**
         * Default constructor for a function, which returns a list of installed sticker sets.
         *
         * <p> Returns {@link StickerSets StickerSets} </p>
         */
        public GetInstalledStickerSets() {
        }

        /**
         * Creates a function, which returns a list of installed sticker sets.
         *
         * <p> Returns {@link StickerSets StickerSets} </p>
         *
         * @param stickerType Type of the sticker sets to return.
         */
        public GetInstalledStickerSets(StickerType stickerType) {
            this.stickerType = stickerType;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1630467830;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an HTTPS or a tg: link with the given type. Can be called before authorization.
     *
     * <p> Returns {@link HttpUrl HttpUrl} </p>
     */
    public static class GetInternalLink extends Function<HttpUrl> {
        /**
         * Expected type of the link.
         */
        public InternalLinkType type;
        /**
         * Pass true to create an HTTPS link (only available for some link types); pass false to create a tg: link.
         */
        public boolean isHttp;

        /**
         * Default constructor for a function, which returns an HTTPS or a tg: link with the given type. Can be called before authorization.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         */
        public GetInternalLink() {
        }

        /**
         * Creates a function, which returns an HTTPS or a tg: link with the given type. Can be called before authorization.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         *
         * @param type Expected type of the link.
         * @param isHttp Pass true to create an HTTPS link (only available for some link types); pass false to create a tg: link.
         */
        public GetInternalLink(InternalLinkType type, boolean isHttp) {
            this.type = type;
            this.isHttp = isHttp;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 962654640;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about the type of internal link. Returns a 404 error if the link is not internal. Can be called before authorization.
     *
     * <p> Returns {@link InternalLinkType InternalLinkType} </p>
     */
    public static class GetInternalLinkType extends Function<InternalLinkType> {
        /**
         * The link.
         */
        public String link;

        /**
         * Default constructor for a function, which returns information about the type of internal link. Returns a 404 error if the link is not internal. Can be called before authorization.
         *
         * <p> Returns {@link InternalLinkType InternalLinkType} </p>
         */
        public GetInternalLinkType() {
        }

        /**
         * Creates a function, which returns information about the type of internal link. Returns a 404 error if the link is not internal. Can be called before authorization.
         *
         * <p> Returns {@link InternalLinkType InternalLinkType} </p>
         *
         * @param link The link.
         */
        public GetInternalLinkType(String link) {
            this.link = link;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1948428535;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Converts a JsonValue object to corresponding JSON-serialized string. Can be called synchronously.
     *
     * <p> Returns {@link Text Text} </p>
     */
    public static class GetJsonString extends Function<Text> {
        /**
         * The JsonValue object.
         */
        public JsonValue jsonValue;

        /**
         * Default constructor for a function, which converts a JsonValue object to corresponding JSON-serialized string. Can be called synchronously.
         *
         * <p> Returns {@link Text Text} </p>
         */
        public GetJsonString() {
        }

        /**
         * Creates a function, which converts a JsonValue object to corresponding JSON-serialized string. Can be called synchronously.
         *
         * <p> Returns {@link Text Text} </p>
         *
         * @param jsonValue The JsonValue object.
         */
        public GetJsonString(JsonValue jsonValue) {
            this.jsonValue = jsonValue;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 663458849;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Converts a JSON-serialized string to corresponding JsonValue object. Can be called synchronously.
     *
     * <p> Returns {@link JsonValue JsonValue} </p>
     */
    public static class GetJsonValue extends Function<JsonValue> {
        /**
         * The JSON-serialized string.
         */
        public String json;

        /**
         * Default constructor for a function, which converts a JSON-serialized string to corresponding JsonValue object. Can be called synchronously.
         *
         * <p> Returns {@link JsonValue JsonValue} </p>
         */
        public GetJsonValue() {
        }

        /**
         * Creates a function, which converts a JSON-serialized string to corresponding JsonValue object. Can be called synchronously.
         *
         * <p> Returns {@link JsonValue JsonValue} </p>
         *
         * @param json The JSON-serialized string.
         */
        public GetJsonValue(String json) {
            this.json = json;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1829086715;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns emojis matching the keyword. Supported only if the file database is enabled. Order of results is unspecified.
     *
     * <p> Returns {@link Emojis Emojis} </p>
     */
    public static class GetKeywordEmojis extends Function<Emojis> {
        /**
         * Text to search for.
         */
        public String text;
        /**
         * List of possible IETF language tags of the user's input language; may be empty if unknown.
         */
        public String[] inputLanguageCodes;

        /**
         * Default constructor for a function, which returns emojis matching the keyword. Supported only if the file database is enabled. Order of results is unspecified.
         *
         * <p> Returns {@link Emojis Emojis} </p>
         */
        public GetKeywordEmojis() {
        }

        /**
         * Creates a function, which returns emojis matching the keyword. Supported only if the file database is enabled. Order of results is unspecified.
         *
         * <p> Returns {@link Emojis Emojis} </p>
         *
         * @param text Text to search for.
         * @param inputLanguageCodes List of possible IETF language tags of the user's input language; may be empty if unknown.
         */
        public GetKeywordEmojis(String text, String[] inputLanguageCodes) {
            this.text = text;
            this.inputLanguageCodes = inputLanguageCodes;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1969795990;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a language pack. Returned language pack identifier may be different from a provided one. Can be called before authorization.
     *
     * <p> Returns {@link LanguagePackInfo LanguagePackInfo} </p>
     */
    public static class GetLanguagePackInfo extends Function<LanguagePackInfo> {
        /**
         * Language pack identifier.
         */
        public String languagePackId;

        /**
         * Default constructor for a function, which returns information about a language pack. Returned language pack identifier may be different from a provided one. Can be called before authorization.
         *
         * <p> Returns {@link LanguagePackInfo LanguagePackInfo} </p>
         */
        public GetLanguagePackInfo() {
        }

        /**
         * Creates a function, which returns information about a language pack. Returned language pack identifier may be different from a provided one. Can be called before authorization.
         *
         * <p> Returns {@link LanguagePackInfo LanguagePackInfo} </p>
         *
         * @param languagePackId Language pack identifier.
         */
        public GetLanguagePackInfo(String languagePackId) {
            this.languagePackId = languagePackId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2077809320;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a string stored in the local database from the specified localization target and language pack by its key. Returns a 404 error if the string is not found. Can be called synchronously.
     *
     * <p> Returns {@link LanguagePackStringValue LanguagePackStringValue} </p>
     */
    public static class GetLanguagePackString extends Function<LanguagePackStringValue> {
        /**
         * Path to the language pack database in which strings are stored.
         */
        public String languagePackDatabasePath;
        /**
         * Localization target to which the language pack belongs.
         */
        public String localizationTarget;
        /**
         * Language pack identifier.
         */
        public String languagePackId;
        /**
         * Language pack key of the string to be returned.
         */
        public String key;

        /**
         * Default constructor for a function, which returns a string stored in the local database from the specified localization target and language pack by its key. Returns a 404 error if the string is not found. Can be called synchronously.
         *
         * <p> Returns {@link LanguagePackStringValue LanguagePackStringValue} </p>
         */
        public GetLanguagePackString() {
        }

        /**
         * Creates a function, which returns a string stored in the local database from the specified localization target and language pack by its key. Returns a 404 error if the string is not found. Can be called synchronously.
         *
         * <p> Returns {@link LanguagePackStringValue LanguagePackStringValue} </p>
         *
         * @param languagePackDatabasePath Path to the language pack database in which strings are stored.
         * @param localizationTarget Localization target to which the language pack belongs.
         * @param languagePackId Language pack identifier.
         * @param key Language pack key of the string to be returned.
         */
        public GetLanguagePackString(String languagePackDatabasePath, String localizationTarget, String languagePackId, String key) {
            this.languagePackDatabasePath = languagePackDatabasePath;
            this.localizationTarget = localizationTarget;
            this.languagePackId = languagePackId;
            this.key = key;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 150789747;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns strings from a language pack in the current localization target by their keys. Can be called before authorization.
     *
     * <p> Returns {@link LanguagePackStrings LanguagePackStrings} </p>
     */
    public static class GetLanguagePackStrings extends Function<LanguagePackStrings> {
        /**
         * Language pack identifier of the strings to be returned.
         */
        public String languagePackId;
        /**
         * Language pack keys of the strings to be returned; leave empty to request all available strings.
         */
        public String[] keys;

        /**
         * Default constructor for a function, which returns strings from a language pack in the current localization target by their keys. Can be called before authorization.
         *
         * <p> Returns {@link LanguagePackStrings LanguagePackStrings} </p>
         */
        public GetLanguagePackStrings() {
        }

        /**
         * Creates a function, which returns strings from a language pack in the current localization target by their keys. Can be called before authorization.
         *
         * <p> Returns {@link LanguagePackStrings LanguagePackStrings} </p>
         *
         * @param languagePackId Language pack identifier of the strings to be returned.
         * @param keys Language pack keys of the strings to be returned; leave empty to request all available strings.
         */
        public GetLanguagePackStrings(String languagePackId, String[] keys) {
            this.languagePackId = languagePackId;
            this.keys = keys;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1246259088;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a link preview by the text of a message. Do not call this function too often. Returns a 404 error if the text has no link preview.
     *
     * <p> Returns {@link LinkPreview LinkPreview} </p>
     */
    public static class GetLinkPreview extends Function<LinkPreview> {
        /**
         * Message text with formatting.
         */
        public FormattedText text;
        /**
         * Options to be used for generation of the link preview; pass null to use default link preview options.
         */
        public LinkPreviewOptions linkPreviewOptions;

        /**
         * Default constructor for a function, which returns a link preview by the text of a message. Do not call this function too often. Returns a 404 error if the text has no link preview.
         *
         * <p> Returns {@link LinkPreview LinkPreview} </p>
         */
        public GetLinkPreview() {
        }

        /**
         * Creates a function, which returns a link preview by the text of a message. Do not call this function too often. Returns a 404 error if the text has no link preview.
         *
         * <p> Returns {@link LinkPreview LinkPreview} </p>
         *
         * @param text Message text with formatting.
         * @param linkPreviewOptions Options to be used for generation of the link preview; pass null to use default link preview options.
         */
        public GetLinkPreview(FormattedText text, LinkPreviewOptions linkPreviewOptions) {
            this.text = text;
            this.linkPreviewOptions = linkPreviewOptions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1039572191;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of message sender identifiers, on whose behalf messages can be sent to a live story.
     *
     * <p> Returns {@link ChatMessageSenders ChatMessageSenders} </p>
     */
    public static class GetLiveStoryAvailableMessageSenders extends Function<ChatMessageSenders> {
        /**
         * Group call identifier.
         */
        public int groupCallId;

        /**
         * Default constructor for a function, which returns the list of message sender identifiers, on whose behalf messages can be sent to a live story.
         *
         * <p> Returns {@link ChatMessageSenders ChatMessageSenders} </p>
         */
        public GetLiveStoryAvailableMessageSenders() {
        }

        /**
         * Creates a function, which returns the list of message sender identifiers, on whose behalf messages can be sent to a live story.
         *
         * <p> Returns {@link ChatMessageSenders ChatMessageSenders} </p>
         *
         * @param groupCallId Group call identifier.
         */
        public GetLiveStoryAvailableMessageSenders(int groupCallId) {
            this.groupCallId = groupCallId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1252390532;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns RTMP URL for streaming to a live story; requires canPostStories administrator right for channel chats.
     *
     * <p> Returns {@link RtmpUrl RtmpUrl} </p>
     */
    public static class GetLiveStoryRtmpUrl extends Function<RtmpUrl> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which returns RTMP URL for streaming to a live story; requires canPostStories administrator right for channel chats.
         *
         * <p> Returns {@link RtmpUrl RtmpUrl} </p>
         */
        public GetLiveStoryRtmpUrl() {
        }

        /**
         * Creates a function, which returns RTMP URL for streaming to a live story; requires canPostStories administrator right for channel chats.
         *
         * <p> Returns {@link RtmpUrl RtmpUrl} </p>
         *
         * @param chatId Chat identifier.
         */
        public GetLiveStoryRtmpUrl(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1267168178;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about the user or the chat that streams to a live story; for live stories that aren't an RTMP stream only.
     *
     * <p> Returns {@link GroupCallParticipant GroupCallParticipant} </p>
     */
    public static class GetLiveStoryStreamer extends Function<GroupCallParticipant> {
        /**
         * Group call identifier.
         */
        public int groupCallId;

        /**
         * Default constructor for a function, which returns information about the user or the chat that streams to a live story; for live stories that aren't an RTMP stream only.
         *
         * <p> Returns {@link GroupCallParticipant GroupCallParticipant} </p>
         */
        public GetLiveStoryStreamer() {
        }

        /**
         * Creates a function, which returns information about the user or the chat that streams to a live story; for live stories that aren't an RTMP stream only.
         *
         * <p> Returns {@link GroupCallParticipant GroupCallParticipant} </p>
         *
         * @param groupCallId Group call identifier.
         */
        public GetLiveStoryStreamer(int groupCallId) {
            this.groupCallId = groupCallId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -718164721;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of top live story donors.
     *
     * <p> Returns {@link LiveStoryDonors LiveStoryDonors} </p>
     */
    public static class GetLiveStoryTopDonors extends Function<LiveStoryDonors> {
        /**
         * Group call identifier of the live story.
         */
        public int groupCallId;

        /**
         * Default constructor for a function, which returns the list of top live story donors.
         *
         * <p> Returns {@link LiveStoryDonors LiveStoryDonors} </p>
         */
        public GetLiveStoryTopDonors() {
        }

        /**
         * Creates a function, which returns the list of top live story donors.
         *
         * <p> Returns {@link LiveStoryDonors LiveStoryDonors} </p>
         *
         * @param groupCallId Group call identifier of the live story.
         */
        public GetLiveStoryTopDonors(int groupCallId) {
            this.groupCallId = groupCallId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -700264064;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about the current localization target. This is an offline method if onlyLocal is true. Can be called before authorization.
     *
     * <p> Returns {@link LocalizationTargetInfo LocalizationTargetInfo} </p>
     */
    public static class GetLocalizationTargetInfo extends Function<LocalizationTargetInfo> {
        /**
         * Pass true to get only locally available information without sending network requests.
         */
        public boolean onlyLocal;

        /**
         * Default constructor for a function, which returns information about the current localization target. This is an offline method if onlyLocal is true. Can be called before authorization.
         *
         * <p> Returns {@link LocalizationTargetInfo LocalizationTargetInfo} </p>
         */
        public GetLocalizationTargetInfo() {
        }

        /**
         * Creates a function, which returns information about the current localization target. This is an offline method if onlyLocal is true. Can be called before authorization.
         *
         * <p> Returns {@link LocalizationTargetInfo LocalizationTargetInfo} </p>
         *
         * @param onlyLocal Pass true to get only locally available information without sending network requests.
         */
        public GetLocalizationTargetInfo(boolean onlyLocal) {
            this.onlyLocal = onlyLocal;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1849499526;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about currently used log stream for internal logging of TDLib. Can be called synchronously.
     *
     * <p> Returns {@link LogStream LogStream} </p>
     */
    public static class GetLogStream extends Function<LogStream> {

        /**
         * Default constructor for a function, which returns information about currently used log stream for internal logging of TDLib. Can be called synchronously.
         *
         * <p> Returns {@link LogStream LogStream} </p>
         */
        public GetLogStream() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1167608667;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns current verbosity level for a specified TDLib internal log tag. Can be called synchronously.
     *
     * <p> Returns {@link LogVerbosityLevel LogVerbosityLevel} </p>
     */
    public static class GetLogTagVerbosityLevel extends Function<LogVerbosityLevel> {
        /**
         * Logging tag to change verbosity level.
         */
        public String tag;

        /**
         * Default constructor for a function, which returns current verbosity level for a specified TDLib internal log tag. Can be called synchronously.
         *
         * <p> Returns {@link LogVerbosityLevel LogVerbosityLevel} </p>
         */
        public GetLogTagVerbosityLevel() {
        }

        /**
         * Creates a function, which returns current verbosity level for a specified TDLib internal log tag. Can be called synchronously.
         *
         * <p> Returns {@link LogVerbosityLevel LogVerbosityLevel} </p>
         *
         * @param tag Logging tag to change verbosity level.
         */
        public GetLogTagVerbosityLevel(String tag) {
            this.tag = tag;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 951004547;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of available TDLib internal log tags, for example, [&quot;actor&quot;, &quot;binlog&quot;, &quot;connections&quot;, &quot;notifications&quot;, &quot;proxy&quot;]. Can be called synchronously.
     *
     * <p> Returns {@link LogTags LogTags} </p>
     */
    public static class GetLogTags extends Function<LogTags> {

        /**
         * Default constructor for a function, which returns the list of available TDLib internal log tags, for example, [&quot;actor&quot;, &quot;binlog&quot;, &quot;connections&quot;, &quot;notifications&quot;, &quot;proxy&quot;]. Can be called synchronously.
         *
         * <p> Returns {@link LogTags LogTags} </p>
         */
        public GetLogTags() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -254449190;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns current verbosity level of the internal logging of TDLib. Can be called synchronously.
     *
     * <p> Returns {@link LogVerbosityLevel LogVerbosityLevel} </p>
     */
    public static class GetLogVerbosityLevel extends Function<LogVerbosityLevel> {

        /**
         * Default constructor for a function, which returns current verbosity level of the internal logging of TDLib. Can be called synchronously.
         *
         * <p> Returns {@link LogVerbosityLevel LogVerbosityLevel} </p>
         */
        public GetLogVerbosityLevel() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 594057956;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of passkeys allowed to be used for the login by the current user.
     *
     * <p> Returns {@link Passkeys Passkeys} </p>
     */
    public static class GetLoginPasskeys extends Function<Passkeys> {

        /**
         * Default constructor for a function, which returns the list of passkeys allowed to be used for the login by the current user.
         *
         * <p> Returns {@link Passkeys Passkeys} </p>
         */
        public GetLoginPasskeys() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -165927873;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an HTTP URL which can be used to automatically authorize the user on a website after clicking an inline button of type inlineKeyboardButtonTypeLoginUrl. Use the method getLoginUrlInfo to find whether a prior user confirmation is needed. If an error is returned, then the button must be handled as an ordinary URL button.
     *
     * <p> Returns {@link HttpUrl HttpUrl} </p>
     */
    public static class GetLoginUrl extends Function<HttpUrl> {
        /**
         * Chat identifier of the message with the button.
         */
        public long chatId;
        /**
         * Message identifier of the message with the button.
         */
        public long messageId;
        /**
         * Button identifier.
         */
        public long buttonId;
        /**
         * Pass true to allow the bot to send messages to the current user. Phone number access can't be requested using the button.
         */
        public boolean allowWriteAccess;

        /**
         * Default constructor for a function, which returns an HTTP URL which can be used to automatically authorize the user on a website after clicking an inline button of type inlineKeyboardButtonTypeLoginUrl. Use the method getLoginUrlInfo to find whether a prior user confirmation is needed. If an error is returned, then the button must be handled as an ordinary URL button.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         */
        public GetLoginUrl() {
        }

        /**
         * Creates a function, which returns an HTTP URL which can be used to automatically authorize the user on a website after clicking an inline button of type inlineKeyboardButtonTypeLoginUrl. Use the method getLoginUrlInfo to find whether a prior user confirmation is needed. If an error is returned, then the button must be handled as an ordinary URL button.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         *
         * @param chatId Chat identifier of the message with the button.
         * @param messageId Message identifier of the message with the button.
         * @param buttonId Button identifier.
         * @param allowWriteAccess Pass true to allow the bot to send messages to the current user. Phone number access can't be requested using the button.
         */
        public GetLoginUrl(long chatId, long messageId, long buttonId, boolean allowWriteAccess) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.buttonId = buttonId;
            this.allowWriteAccess = allowWriteAccess;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 791844305;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a button of type inlineKeyboardButtonTypeLoginUrl. The method needs to be called when the user presses the button.
     *
     * <p> Returns {@link LoginUrlInfo LoginUrlInfo} </p>
     */
    public static class GetLoginUrlInfo extends Function<LoginUrlInfo> {
        /**
         * Chat identifier of the message with the button.
         */
        public long chatId;
        /**
         * Message identifier of the message with the button. The message must not be scheduled.
         */
        public long messageId;
        /**
         * Button identifier.
         */
        public long buttonId;

        /**
         * Default constructor for a function, which returns information about a button of type inlineKeyboardButtonTypeLoginUrl. The method needs to be called when the user presses the button.
         *
         * <p> Returns {@link LoginUrlInfo LoginUrlInfo} </p>
         */
        public GetLoginUrlInfo() {
        }

        /**
         * Creates a function, which returns information about a button of type inlineKeyboardButtonTypeLoginUrl. The method needs to be called when the user presses the button.
         *
         * <p> Returns {@link LoginUrlInfo LoginUrlInfo} </p>
         *
         * @param chatId Chat identifier of the message with the button.
         * @param messageId Message identifier of the message with the button. The message must not be scheduled.
         * @param buttonId Button identifier.
         */
        public GetLoginUrlInfo(long chatId, long messageId, long buttonId) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.buttonId = buttonId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -859202125;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information needed to open the main Web App of a bot.
     *
     * <p> Returns {@link MainWebApp MainWebApp} </p>
     */
    public static class GetMainWebApp extends Function<MainWebApp> {
        /**
         * Identifier of the chat in which the Web App is opened; pass 0 if none.
         */
        public long chatId;
        /**
         * Identifier of the target bot. If the bot is restricted for the current user, then show an error instead of calling the method.
         */
        public long botUserId;
        /**
         * Start parameter from internalLinkTypeMainWebApp.
         */
        public String startParameter;
        /**
         * Parameters to use to open the Web App.
         */
        public WebAppOpenParameters parameters;

        /**
         * Default constructor for a function, which returns information needed to open the main Web App of a bot.
         *
         * <p> Returns {@link MainWebApp MainWebApp} </p>
         */
        public GetMainWebApp() {
        }

        /**
         * Creates a function, which returns information needed to open the main Web App of a bot.
         *
         * <p> Returns {@link MainWebApp MainWebApp} </p>
         *
         * @param chatId Identifier of the chat in which the Web App is opened; pass 0 if none.
         * @param botUserId Identifier of the target bot. If the bot is restricted for the current user, then show an error instead of calling the method.
         * @param startParameter Start parameter from internalLinkTypeMainWebApp.
         * @param parameters Parameters to use to open the Web App.
         */
        public GetMainWebApp(long chatId, long botUserId, String startParameter, WebAppOpenParameters parameters) {
            this.chatId = chatId;
            this.botUserId = botUserId;
            this.startParameter = startParameter;
            this.parameters = parameters;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 594050214;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns access settings of a managed bot; for bots only.
     *
     * <p> Returns {@link BotAccessSettings BotAccessSettings} </p>
     */
    public static class GetManagedBotAccessSettings extends Function<BotAccessSettings> {
        /**
         * Identifier of the managed bot.
         */
        public long botUserId;

        /**
         * Default constructor for a function, which returns access settings of a managed bot; for bots only.
         *
         * <p> Returns {@link BotAccessSettings BotAccessSettings} </p>
         */
        public GetManagedBotAccessSettings() {
        }

        /**
         * Creates a function, which returns access settings of a managed bot; for bots only.
         *
         * <p> Returns {@link BotAccessSettings BotAccessSettings} </p>
         *
         * @param botUserId Identifier of the managed bot.
         */
        public GetManagedBotAccessSettings(long botUserId) {
            this.botUserId = botUserId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -867390575;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns token of a managed bot; for bots only.
     *
     * <p> Returns {@link Text Text} </p>
     */
    public static class GetManagedBotToken extends Function<Text> {
        /**
         * Identifier of the managed bot.
         */
        public long botUserId;
        /**
         * Pass true to revoke the current token and create a new one.
         */
        public boolean revoke;

        /**
         * Default constructor for a function, which returns token of a managed bot; for bots only.
         *
         * <p> Returns {@link Text Text} </p>
         */
        public GetManagedBotToken() {
        }

        /**
         * Creates a function, which returns token of a managed bot; for bots only.
         *
         * <p> Returns {@link Text Text} </p>
         *
         * @param botUserId Identifier of the managed bot.
         * @param revoke Pass true to revoke the current token and create a new one.
         */
        public GetManagedBotToken(long botUserId, boolean revoke) {
            this.botUserId = botUserId;
            this.revoke = revoke;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -938215629;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a file with a map thumbnail in PNG format. Only map thumbnail files with size less than 1MB can be downloaded.
     *
     * <p> Returns {@link File File} </p>
     */
    public static class GetMapThumbnailFile extends Function<File> {
        /**
         * Location of the map center.
         */
        public Location location;
        /**
         * Map zoom level; 13-20.
         */
        public int zoom;
        /**
         * Map width in pixels before applying scale; 16-1024.
         */
        public int width;
        /**
         * Map height in pixels before applying scale; 16-1024.
         */
        public int height;
        /**
         * Map scale; 1-3.
         */
        public int scale;
        /**
         * Identifier of a chat in which the thumbnail will be shown. Use 0 if unknown.
         */
        public long chatId;

        /**
         * Default constructor for a function, which returns information about a file with a map thumbnail in PNG format. Only map thumbnail files with size less than 1MB can be downloaded.
         *
         * <p> Returns {@link File File} </p>
         */
        public GetMapThumbnailFile() {
        }

        /**
         * Creates a function, which returns information about a file with a map thumbnail in PNG format. Only map thumbnail files with size less than 1MB can be downloaded.
         *
         * <p> Returns {@link File File} </p>
         *
         * @param location Location of the map center.
         * @param zoom Map zoom level; 13-20.
         * @param width Map width in pixels before applying scale; 16-1024.
         * @param height Map height in pixels before applying scale; 16-1024.
         * @param scale Map scale; 1-3.
         * @param chatId Identifier of a chat in which the thumbnail will be shown. Use 0 if unknown.
         */
        public GetMapThumbnailFile(Location location, int zoom, int width, int height, int scale, long chatId) {
            this.location = location;
            this.zoom = zoom;
            this.width = width;
            this.height = height;
            this.scale = scale;
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -152660070;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Replaces text entities with Markdown formatting in a human-friendly format. Entities that can't be represented in Markdown unambiguously are kept as is. Can be called synchronously.
     *
     * <p> Returns {@link FormattedText FormattedText} </p>
     */
    public static class GetMarkdownText extends Function<FormattedText> {
        /**
         * The text.
         */
        public FormattedText text;

        /**
         * Default constructor for a function, which replaces text entities with Markdown formatting in a human-friendly format. Entities that can't be represented in Markdown unambiguously are kept as is. Can be called synchronously.
         *
         * <p> Returns {@link FormattedText FormattedText} </p>
         */
        public GetMarkdownText() {
        }

        /**
         * Creates a function, which replaces text entities with Markdown formatting in a human-friendly format. Entities that can't be represented in Markdown unambiguously are kept as is. Can be called synchronously.
         *
         * <p> Returns {@link FormattedText FormattedText} </p>
         *
         * @param text The text.
         */
        public GetMarkdownText(FormattedText text) {
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 164524584;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the current user.
     *
     * <p> Returns {@link User User} </p>
     */
    public static class GetMe extends Function<User> {

        /**
         * Default constructor for a function, which returns the current user.
         *
         * <p> Returns {@link User User} </p>
         */
        public GetMe() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -191516033;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns menu button set by the bot for the given user; for bots only.
     *
     * <p> Returns {@link BotMenuButton BotMenuButton} </p>
     */
    public static class GetMenuButton extends Function<BotMenuButton> {
        /**
         * Identifier of the user or 0 to get the default menu button.
         */
        public long userId;

        /**
         * Default constructor for a function, which returns menu button set by the bot for the given user; for bots only.
         *
         * <p> Returns {@link BotMenuButton BotMenuButton} </p>
         */
        public GetMenuButton() {
        }

        /**
         * Creates a function, which returns menu button set by the bot for the given user; for bots only.
         *
         * <p> Returns {@link BotMenuButton BotMenuButton} </p>
         *
         * @param userId Identifier of the user or 0 to get the default menu button.
         */
        public GetMenuButton(long userId) {
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -437324736;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a message. Returns a 404 error if the message doesn't exist.
     *
     * <p> Returns {@link Message Message} </p>
     */
    public static class GetMessage extends Function<Message> {
        /**
         * Identifier of the chat the message belongs to.
         */
        public long chatId;
        /**
         * Identifier of the message to get.
         */
        public long messageId;

        /**
         * Default constructor for a function, which returns information about a message. Returns a 404 error if the message doesn't exist.
         *
         * <p> Returns {@link Message Message} </p>
         */
        public GetMessage() {
        }

        /**
         * Creates a function, which returns information about a message. Returns a 404 error if the message doesn't exist.
         *
         * <p> Returns {@link Message Message} </p>
         *
         * @param chatId Identifier of the chat the message belongs to.
         * @param messageId Identifier of the message to get.
         */
        public GetMessage(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1821196160;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns reactions added for a message, along with their sender.
     *
     * <p> Returns {@link AddedReactions AddedReactions} </p>
     */
    public static class GetMessageAddedReactions extends Function<AddedReactions> {
        /**
         * Identifier of the chat to which the message belongs.
         */
        public long chatId;
        /**
         * Identifier of the message. Use message.interactionInfo.reactions.canGetAddedReactions to check whether added reactions can be received for the message.
         */
        public long messageId;
        /**
         * Type of the reactions to return; pass null to return all added reactions; reactionTypePaid isn't supported.
         */
        public ReactionType reactionType;
        /**
         * Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         */
        public String offset;
        /**
         * The maximum number of reactions to be returned; must be positive and can't be greater than 100.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns reactions added for a message, along with their sender.
         *
         * <p> Returns {@link AddedReactions AddedReactions} </p>
         */
        public GetMessageAddedReactions() {
        }

        /**
         * Creates a function, which returns reactions added for a message, along with their sender.
         *
         * <p> Returns {@link AddedReactions AddedReactions} </p>
         *
         * @param chatId Identifier of the chat to which the message belongs.
         * @param messageId Identifier of the message. Use message.interactionInfo.reactions.canGetAddedReactions to check whether added reactions can be received for the message.
         * @param reactionType Type of the reactions to return; pass null to return all added reactions; reactionTypePaid isn't supported.
         * @param offset Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         * @param limit The maximum number of reactions to be returned; must be positive and can't be greater than 100.
         */
        public GetMessageAddedReactions(long chatId, long messageId, ReactionType reactionType, String offset, int limit) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.reactionType = reactionType;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2110172754;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about actual author of a message sent on behalf of a channel. The method can be called if messageProperties.canGetAuthor == true.
     *
     * <p> Returns {@link User User} </p>
     */
    public static class GetMessageAuthor extends Function<User> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;

        /**
         * Default constructor for a function, which returns information about actual author of a message sent on behalf of a channel. The method can be called if messageProperties.canGetAuthor == true.
         *
         * <p> Returns {@link User User} </p>
         */
        public GetMessageAuthor() {
        }

        /**
         * Creates a function, which returns information about actual author of a message sent on behalf of a channel. The method can be called if messageProperties.canGetAuthor == true.
         *
         * <p> Returns {@link User User} </p>
         *
         * @param chatId Chat identifier.
         * @param messageId Identifier of the message.
         */
        public GetMessageAuthor(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1890166449;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns reactions, which can be added to a message. The list can change after updateActiveEmojiReactions, updateChatAvailableReactions for the chat, or updateMessageInteractionInfo for the message.
     *
     * <p> Returns {@link AvailableReactions AvailableReactions} </p>
     */
    public static class GetMessageAvailableReactions extends Function<AvailableReactions> {
        /**
         * Identifier of the chat to which the message belongs.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * Number of reaction per row, 5-25.
         */
        public int rowSize;

        /**
         * Default constructor for a function, which returns reactions, which can be added to a message. The list can change after updateActiveEmojiReactions, updateChatAvailableReactions for the chat, or updateMessageInteractionInfo for the message.
         *
         * <p> Returns {@link AvailableReactions AvailableReactions} </p>
         */
        public GetMessageAvailableReactions() {
        }

        /**
         * Creates a function, which returns reactions, which can be added to a message. The list can change after updateActiveEmojiReactions, updateChatAvailableReactions for the chat, or updateMessageInteractionInfo for the message.
         *
         * <p> Returns {@link AvailableReactions AvailableReactions} </p>
         *
         * @param chatId Identifier of the chat to which the message belongs.
         * @param messageId Identifier of the message.
         * @param rowSize Number of reaction per row, 5-25.
         */
        public GetMessageAvailableReactions(long chatId, long messageId, int rowSize) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.rowSize = rowSize;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1994098354;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a message effect. Returns a 404 error if the effect is not found.
     *
     * <p> Returns {@link MessageEffect MessageEffect} </p>
     */
    public static class GetMessageEffect extends Function<MessageEffect> {
        /**
         * Unique identifier of the effect.
         */
        public long effectId;

        /**
         * Default constructor for a function, which returns information about a message effect. Returns a 404 error if the effect is not found.
         *
         * <p> Returns {@link MessageEffect MessageEffect} </p>
         */
        public GetMessageEffect() {
        }

        /**
         * Creates a function, which returns information about a message effect. Returns a 404 error if the effect is not found.
         *
         * <p> Returns {@link MessageEffect MessageEffect} </p>
         *
         * @param effectId Unique identifier of the effect.
         */
        public GetMessageEffect(long effectId) {
            this.effectId = effectId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1638843116;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an HTML code for embedding the message. Available only if messageProperties.canGetEmbeddingCode.
     *
     * <p> Returns {@link Text Text} </p>
     */
    public static class GetMessageEmbeddingCode extends Function<Text> {
        /**
         * Identifier of the chat to which the message belongs.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * Pass true to return an HTML code for embedding of the whole media album.
         */
        public boolean forAlbum;

        /**
         * Default constructor for a function, which returns an HTML code for embedding the message. Available only if messageProperties.canGetEmbeddingCode.
         *
         * <p> Returns {@link Text Text} </p>
         */
        public GetMessageEmbeddingCode() {
        }

        /**
         * Creates a function, which returns an HTML code for embedding the message. Available only if messageProperties.canGetEmbeddingCode.
         *
         * <p> Returns {@link Text Text} </p>
         *
         * @param chatId Identifier of the chat to which the message belongs.
         * @param messageId Identifier of the message.
         * @param forAlbum Pass true to return an HTML code for embedding of the whole media album.
         */
        public GetMessageEmbeddingCode(long chatId, long messageId, boolean forAlbum) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.forAlbum = forAlbum;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1654967561;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a file with messages exported from another application.
     *
     * <p> Returns {@link MessageFileType MessageFileType} </p>
     */
    public static class GetMessageFileType extends Function<MessageFileType> {
        /**
         * Beginning of the message file; up to 100 first lines.
         */
        public String messageFileHead;

        /**
         * Default constructor for a function, which returns information about a file with messages exported from another application.
         *
         * <p> Returns {@link MessageFileType MessageFileType} </p>
         */
        public GetMessageFileType() {
        }

        /**
         * Creates a function, which returns information about a file with messages exported from another application.
         *
         * <p> Returns {@link MessageFileType MessageFileType} </p>
         *
         * @param messageFileHead Beginning of the message file; up to 100 first lines.
         */
        public GetMessageFileType(String messageFileHead) {
            this.messageFileHead = messageFileHead;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -490270764;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a confirmation text to be shown to the user before starting message import.
     *
     * <p> Returns {@link Text Text} </p>
     */
    public static class GetMessageImportConfirmationText extends Function<Text> {
        /**
         * Identifier of a chat to which the messages will be imported. It must be an identifier of a private chat with a mutual contact or an identifier of a supergroup chat with canChangeInfo member right.
         */
        public long chatId;

        /**
         * Default constructor for a function, which returns a confirmation text to be shown to the user before starting message import.
         *
         * <p> Returns {@link Text Text} </p>
         */
        public GetMessageImportConfirmationText() {
        }

        /**
         * Creates a function, which returns a confirmation text to be shown to the user before starting message import.
         *
         * <p> Returns {@link Text Text} </p>
         *
         * @param chatId Identifier of a chat to which the messages will be imported. It must be an identifier of a private chat with a mutual contact or an identifier of a supergroup chat with canChangeInfo member right.
         */
        public GetMessageImportConfirmationText(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 390627752;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an HTTPS link to a message in a chat. Available only if messageProperties.canGetLink, or if messageProperties.canGetMediaTimestampLinks and a media timestamp link is generated. This is an offline method.
     *
     * <p> Returns {@link MessageLink MessageLink} </p>
     */
    public static class GetMessageLink extends Function<MessageLink> {
        /**
         * Identifier of the chat to which the message belongs.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * If not 0, timestamp from which the video/audio/video note/voice note/story playing must start, in seconds. The media can be in the message content or in its link preview.
         */
        public int mediaTimestamp;
        /**
         * If not 0, identifier of the checklist task in the message to be linked.
         */
        public int checklistTaskId;
        /**
         * If not empty, identifier of the poll option in the message to be linked.
         */
        public String pollOptionId;
        /**
         * Pass true to create a link for the whole media album.
         */
        public boolean forAlbum;
        /**
         * Pass true to create a link to the message as a channel post comment, in a message thread, or a forum topic.
         */
        public boolean inMessageThread;

        /**
         * Default constructor for a function, which returns an HTTPS link to a message in a chat. Available only if messageProperties.canGetLink, or if messageProperties.canGetMediaTimestampLinks and a media timestamp link is generated. This is an offline method.
         *
         * <p> Returns {@link MessageLink MessageLink} </p>
         */
        public GetMessageLink() {
        }

        /**
         * Creates a function, which returns an HTTPS link to a message in a chat. Available only if messageProperties.canGetLink, or if messageProperties.canGetMediaTimestampLinks and a media timestamp link is generated. This is an offline method.
         *
         * <p> Returns {@link MessageLink MessageLink} </p>
         *
         * @param chatId Identifier of the chat to which the message belongs.
         * @param messageId Identifier of the message.
         * @param mediaTimestamp If not 0, timestamp from which the video/audio/video note/voice note/story playing must start, in seconds. The media can be in the message content or in its link preview.
         * @param checklistTaskId If not 0, identifier of the checklist task in the message to be linked.
         * @param pollOptionId If not empty, identifier of the poll option in the message to be linked.
         * @param forAlbum Pass true to create a link for the whole media album.
         * @param inMessageThread Pass true to create a link to the message as a channel post comment, in a message thread, or a forum topic.
         */
        public GetMessageLink(long chatId, long messageId, int mediaTimestamp, int checklistTaskId, String pollOptionId, boolean forAlbum, boolean inMessageThread) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.mediaTimestamp = mediaTimestamp;
            this.checklistTaskId = checklistTaskId;
            this.pollOptionId = pollOptionId;
            this.forAlbum = forAlbum;
            this.inMessageThread = inMessageThread;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -498469915;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a public or private message link. Can be called for any internal link of the type internalLinkTypeMessage.
     *
     * <p> Returns {@link MessageLinkInfo MessageLinkInfo} </p>
     */
    public static class GetMessageLinkInfo extends Function<MessageLinkInfo> {
        /**
         * The message link.
         */
        public String url;

        /**
         * Default constructor for a function, which returns information about a public or private message link. Can be called for any internal link of the type internalLinkTypeMessage.
         *
         * <p> Returns {@link MessageLinkInfo MessageLinkInfo} </p>
         */
        public GetMessageLinkInfo() {
        }

        /**
         * Creates a function, which returns information about a public or private message link. Can be called for any internal link of the type internalLinkTypeMessage.
         *
         * <p> Returns {@link MessageLinkInfo MessageLinkInfo} </p>
         *
         * @param url The message link.
         */
        public GetMessageLinkInfo(String url) {
            this.url = url;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -700533672;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a message, if it is available without sending network request. Returns a 404 error if message isn't available locally. This is an offline method.
     *
     * <p> Returns {@link Message Message} </p>
     */
    public static class GetMessageLocally extends Function<Message> {
        /**
         * Identifier of the chat the message belongs to.
         */
        public long chatId;
        /**
         * Identifier of the message to get.
         */
        public long messageId;

        /**
         * Default constructor for a function, which returns information about a message, if it is available without sending network request. Returns a 404 error if message isn't available locally. This is an offline method.
         *
         * <p> Returns {@link Message Message} </p>
         */
        public GetMessageLocally() {
        }

        /**
         * Creates a function, which returns information about a message, if it is available without sending network request. Returns a 404 error if message isn't available locally. This is an offline method.
         *
         * <p> Returns {@link Message Message} </p>
         *
         * @param chatId Identifier of the chat the message belongs to.
         * @param messageId Identifier of the message to get.
         */
        public GetMessageLocally(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -603575444;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns properties of a message. This is an offline method.
     *
     * <p> Returns {@link MessageProperties MessageProperties} </p>
     */
    public static class GetMessageProperties extends Function<MessageProperties> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;

        /**
         * Default constructor for a function, which returns properties of a message. This is an offline method.
         *
         * <p> Returns {@link MessageProperties MessageProperties} </p>
         */
        public GetMessageProperties() {
        }

        /**
         * Creates a function, which returns properties of a message. This is an offline method.
         *
         * <p> Returns {@link MessageProperties MessageProperties} </p>
         *
         * @param chatId Chat identifier.
         * @param messageId Identifier of the message.
         */
        public GetMessageProperties(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 773382571;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns forwarded copies of a channel message to different public channels and public reposts as a story. Can be used only if messageProperties.canGetStatistics == true. For optimal performance, the number of returned messages and stories is chosen by TDLib.
     *
     * <p> Returns {@link PublicForwards PublicForwards} </p>
     */
    public static class GetMessagePublicForwards extends Function<PublicForwards> {
        /**
         * Chat identifier of the message.
         */
        public long chatId;
        /**
         * Message identifier.
         */
        public long messageId;
        /**
         * Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         */
        public String offset;
        /**
         * The maximum number of messages and stories to be returned; must be positive and can't be greater than 100. For optimal performance, the number of returned objects is chosen by TDLib and can be smaller than the specified limit.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns forwarded copies of a channel message to different public channels and public reposts as a story. Can be used only if messageProperties.canGetStatistics == true. For optimal performance, the number of returned messages and stories is chosen by TDLib.
         *
         * <p> Returns {@link PublicForwards PublicForwards} </p>
         */
        public GetMessagePublicForwards() {
        }

        /**
         * Creates a function, which returns forwarded copies of a channel message to different public channels and public reposts as a story. Can be used only if messageProperties.canGetStatistics == true. For optimal performance, the number of returned messages and stories is chosen by TDLib.
         *
         * <p> Returns {@link PublicForwards PublicForwards} </p>
         *
         * @param chatId Chat identifier of the message.
         * @param messageId Message identifier.
         * @param offset Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         * @param limit The maximum number of messages and stories to be returned; must be positive and can't be greater than 100. For optimal performance, the number of returned objects is chosen by TDLib and can be smaller than the specified limit.
         */
        public GetMessagePublicForwards(long chatId, long messageId, String offset, int limit) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1369285812;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns read date of a recent outgoing message in a private chat. The method can be called if messageProperties.canGetReadDate == true.
     *
     * <p> Returns {@link MessageReadDate MessageReadDate} </p>
     */
    public static class GetMessageReadDate extends Function<MessageReadDate> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;

        /**
         * Default constructor for a function, which returns read date of a recent outgoing message in a private chat. The method can be called if messageProperties.canGetReadDate == true.
         *
         * <p> Returns {@link MessageReadDate MessageReadDate} </p>
         */
        public GetMessageReadDate() {
        }

        /**
         * Creates a function, which returns read date of a recent outgoing message in a private chat. The method can be called if messageProperties.canGetReadDate == true.
         *
         * <p> Returns {@link MessageReadDate MessageReadDate} </p>
         *
         * @param chatId Chat identifier.
         * @param messageId Identifier of the message.
         */
        public GetMessageReadDate(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1484455101;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns detailed statistics about a message. Can be used only if messageProperties.canGetStatistics == true.
     *
     * <p> Returns {@link MessageStatistics MessageStatistics} </p>
     */
    public static class GetMessageStatistics extends Function<MessageStatistics> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Message identifier.
         */
        public long messageId;
        /**
         * Pass true if a dark theme is used by the application.
         */
        public boolean isDark;

        /**
         * Default constructor for a function, which returns detailed statistics about a message. Can be used only if messageProperties.canGetStatistics == true.
         *
         * <p> Returns {@link MessageStatistics MessageStatistics} </p>
         */
        public GetMessageStatistics() {
        }

        /**
         * Creates a function, which returns detailed statistics about a message. Can be used only if messageProperties.canGetStatistics == true.
         *
         * <p> Returns {@link MessageStatistics MessageStatistics} </p>
         *
         * @param chatId Chat identifier.
         * @param messageId Message identifier.
         * @param isDark Pass true if a dark theme is used by the application.
         */
        public GetMessageStatistics(long chatId, long messageId, boolean isDark) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.isDark = isDark;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1270194648;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a message thread. Can be used only if messageProperties.canGetMessageThread == true.
     *
     * <p> Returns {@link MessageThreadInfo MessageThreadInfo} </p>
     */
    public static class GetMessageThread extends Function<MessageThreadInfo> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;

        /**
         * Default constructor for a function, which returns information about a message thread. Can be used only if messageProperties.canGetMessageThread == true.
         *
         * <p> Returns {@link MessageThreadInfo MessageThreadInfo} </p>
         */
        public GetMessageThread() {
        }

        /**
         * Creates a function, which returns information about a message thread. Can be used only if messageProperties.canGetMessageThread == true.
         *
         * <p> Returns {@link MessageThreadInfo MessageThreadInfo} </p>
         *
         * @param chatId Chat identifier.
         * @param messageId Identifier of the message.
         */
        public GetMessageThread(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2062695998;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns messages in a message thread of a message. Can be used only if messageProperties.canGetMessageThread == true. Message thread of a channel message is in the channel's linked supergroup. The messages are returned in reverse chronological order (i.e., in order of decreasing messageId). For optimal performance, the number of returned messages is chosen by TDLib.
     *
     * <p> Returns {@link Messages Messages} </p>
     */
    public static class GetMessageThreadHistory extends Function<Messages> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Message identifier, which thread history needs to be returned.
         */
        public long messageId;
        /**
         * Identifier of the message starting from which history must be fetched; use 0 to get results from the last message.
         */
        public long fromMessageId;
        /**
         * Specify 0 to get results from exactly the message fromMessageId or a negative number from -99 to -1 to get additionally -offset newer messages.
         */
        public int offset;
        /**
         * The maximum number of messages to be returned; must be positive and can't be greater than 100. If the offset is negative, then the limit must be greater than or equal to -offset. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns messages in a message thread of a message. Can be used only if messageProperties.canGetMessageThread == true. Message thread of a channel message is in the channel's linked supergroup. The messages are returned in reverse chronological order (i.e., in order of decreasing messageId). For optimal performance, the number of returned messages is chosen by TDLib.
         *
         * <p> Returns {@link Messages Messages} </p>
         */
        public GetMessageThreadHistory() {
        }

        /**
         * Creates a function, which returns messages in a message thread of a message. Can be used only if messageProperties.canGetMessageThread == true. Message thread of a channel message is in the channel's linked supergroup. The messages are returned in reverse chronological order (i.e., in order of decreasing messageId). For optimal performance, the number of returned messages is chosen by TDLib.
         *
         * <p> Returns {@link Messages Messages} </p>
         *
         * @param chatId Chat identifier.
         * @param messageId Message identifier, which thread history needs to be returned.
         * @param fromMessageId Identifier of the message starting from which history must be fetched; use 0 to get results from the last message.
         * @param offset Specify 0 to get results from exactly the message fromMessageId or a negative number from -99 to -1 to get additionally -offset newer messages.
         * @param limit The maximum number of messages to be returned; must be positive and can't be greater than 100. If the offset is negative, then the limit must be greater than or equal to -offset. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         */
        public GetMessageThreadHistory(long chatId, long messageId, long fromMessageId, int offset, int limit) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.fromMessageId = fromMessageId;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1808411608;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns viewers of a recent outgoing message in a basic group or a supergroup chat. For video notes and voice notes only users, opened content of the message, are returned. The method can be called if messageProperties.canGetViewers == true.
     *
     * <p> Returns {@link MessageViewers MessageViewers} </p>
     */
    public static class GetMessageViewers extends Function<MessageViewers> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;

        /**
         * Default constructor for a function, which returns viewers of a recent outgoing message in a basic group or a supergroup chat. For video notes and voice notes only users, opened content of the message, are returned. The method can be called if messageProperties.canGetViewers == true.
         *
         * <p> Returns {@link MessageViewers MessageViewers} </p>
         */
        public GetMessageViewers() {
        }

        /**
         * Creates a function, which returns viewers of a recent outgoing message in a basic group or a supergroup chat. For video notes and voice notes only users, opened content of the message, are returned. The method can be called if messageProperties.canGetViewers == true.
         *
         * <p> Returns {@link MessageViewers MessageViewers} </p>
         *
         * @param chatId Chat identifier.
         * @param messageId Identifier of the message.
         */
        public GetMessageViewers(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1584457010;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about messages. If a message is not found, returns null on the corresponding position of the result.
     *
     * <p> Returns {@link Messages Messages} </p>
     */
    public static class GetMessages extends Function<Messages> {
        /**
         * Identifier of the chat the messages belong to.
         */
        public long chatId;
        /**
         * Identifiers of the messages to get.
         */
        public long[] messageIds;

        /**
         * Default constructor for a function, which returns information about messages. If a message is not found, returns null on the corresponding position of the result.
         *
         * <p> Returns {@link Messages Messages} </p>
         */
        public GetMessages() {
        }

        /**
         * Creates a function, which returns information about messages. If a message is not found, returns null on the corresponding position of the result.
         *
         * <p> Returns {@link Messages Messages} </p>
         *
         * @param chatId Identifier of the chat the messages belong to.
         * @param messageIds Identifiers of the messages to get.
         */
        public GetMessages(long chatId, long[] messageIds) {
            this.chatId = chatId;
            this.messageIds = messageIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 425299338;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns network data usage statistics. Can be called before authorization.
     *
     * <p> Returns {@link NetworkStatistics NetworkStatistics} </p>
     */
    public static class GetNetworkStatistics extends Function<NetworkStatistics> {
        /**
         * Pass true to get statistics only for the current library launch.
         */
        public boolean onlyCurrent;

        /**
         * Default constructor for a function, which returns network data usage statistics. Can be called before authorization.
         *
         * <p> Returns {@link NetworkStatistics NetworkStatistics} </p>
         */
        public GetNetworkStatistics() {
        }

        /**
         * Creates a function, which returns network data usage statistics. Can be called before authorization.
         *
         * <p> Returns {@link NetworkStatistics NetworkStatistics} </p>
         *
         * @param onlyCurrent Pass true to get statistics only for the current library launch.
         */
        public GetNetworkStatistics(boolean onlyCurrent) {
            this.onlyCurrent = onlyCurrent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -986228706;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns privacy settings for new chat creation.
     *
     * <p> Returns {@link NewChatPrivacySettings NewChatPrivacySettings} </p>
     */
    public static class GetNewChatPrivacySettings extends Function<NewChatPrivacySettings> {

        /**
         * Default constructor for a function, which returns privacy settings for new chat creation.
         *
         * <p> Returns {@link NewChatPrivacySettings NewChatPrivacySettings} </p>
         */
        public GetNewChatPrivacySettings() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1295299657;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about an OAuth deep link. Use checkOauthRequestMatchCode, acceptOauthRequest or declineOauthRequest to process the link.
     *
     * <p> Returns {@link OauthLinkInfo OauthLinkInfo} </p>
     */
    public static class GetOauthLinkInfo extends Function<OauthLinkInfo> {
        /**
         * URL of the link.
         */
        public String url;
        /**
         * Origin of the OAuth request if the request was received from the in-app browser; pass an empty string otherwise.
         */
        public String inAppOrigin;

        /**
         * Default constructor for a function, which returns information about an OAuth deep link. Use checkOauthRequestMatchCode, acceptOauthRequest or declineOauthRequest to process the link.
         *
         * <p> Returns {@link OauthLinkInfo OauthLinkInfo} </p>
         */
        public GetOauthLinkInfo() {
        }

        /**
         * Creates a function, which returns information about an OAuth deep link. Use checkOauthRequestMatchCode, acceptOauthRequest or declineOauthRequest to process the link.
         *
         * <p> Returns {@link OauthLinkInfo OauthLinkInfo} </p>
         *
         * @param url URL of the link.
         * @param inAppOrigin Origin of the OAuth request if the request was received from the in-app browser; pass an empty string otherwise.
         */
        public GetOauthLinkInfo(String url, String inAppOrigin) {
            this.url = url;
            this.inAppOrigin = inAppOrigin;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1235634833;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the value of an option by its name. (Check the list of available options on https://core.telegram.org/tdlib/options.) Can be called before authorization. Can be called synchronously for options &quot;version&quot; and &quot;commit_hash&quot;.
     *
     * <p> Returns {@link OptionValue OptionValue} </p>
     */
    public static class GetOption extends Function<OptionValue> {
        /**
         * The name of the option.
         */
        public String name;

        /**
         * Default constructor for a function, which returns the value of an option by its name. (Check the list of available options on https://core.telegram.org/tdlib/options.) Can be called before authorization. Can be called synchronously for options &quot;version&quot; and &quot;commit_hash&quot;.
         *
         * <p> Returns {@link OptionValue OptionValue} </p>
         */
        public GetOption() {
        }

        /**
         * Creates a function, which returns the value of an option by its name. (Check the list of available options on https://core.telegram.org/tdlib/options.) Can be called before authorization. Can be called synchronously for options &quot;version&quot; and &quot;commit_hash&quot;.
         *
         * <p> Returns {@link OptionValue OptionValue} </p>
         *
         * @param name The name of the option.
         */
        public GetOption(String name) {
            this.name = name;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1572495746;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of bots owned by the current user.
     *
     * <p> Returns {@link Users Users} </p>
     */
    public static class GetOwnedBots extends Function<Users> {

        /**
         * Default constructor for a function, which returns the list of bots owned by the current user.
         *
         * <p> Returns {@link Users Users} </p>
         */
        public GetOwnedBots() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1954035715;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns sticker sets owned by the current user.
     *
     * <p> Returns {@link StickerSets StickerSets} </p>
     */
    public static class GetOwnedStickerSets extends Function<StickerSets> {
        /**
         * Identifier of the sticker set from which to return owned sticker sets; use 0 to get results from the beginning.
         */
        public long offsetStickerSetId;
        /**
         * The maximum number of sticker sets to be returned; must be positive and can't be greater than 100. For optimal performance, the number of returned objects is chosen by TDLib and can be smaller than the specified limit.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns sticker sets owned by the current user.
         *
         * <p> Returns {@link StickerSets StickerSets} </p>
         */
        public GetOwnedStickerSets() {
        }

        /**
         * Creates a function, which returns sticker sets owned by the current user.
         *
         * <p> Returns {@link StickerSets StickerSets} </p>
         *
         * @param offsetStickerSetId Identifier of the sticker set from which to return owned sticker sets; use 0 to get results from the beginning.
         * @param limit The maximum number of sticker sets to be returned; must be positive and can't be greater than 100. For optimal performance, the number of returned objects is chosen by TDLib and can be smaller than the specified limit.
         */
        public GetOwnedStickerSets(long offsetStickerSetId, int limit) {
            this.offsetStickerSetId = offsetStickerSetId;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1493074208;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the total number of Telegram Stars received by the current user for paid messages from the given user.
     *
     * <p> Returns {@link StarCount StarCount} </p>
     */
    public static class GetPaidMessageRevenue extends Function<StarCount> {
        /**
         * Identifier of the user.
         */
        public long userId;

        /**
         * Default constructor for a function, which returns the total number of Telegram Stars received by the current user for paid messages from the given user.
         *
         * <p> Returns {@link StarCount StarCount} </p>
         */
        public GetPaidMessageRevenue() {
        }

        /**
         * Creates a function, which returns the total number of Telegram Stars received by the current user for paid messages from the given user.
         *
         * <p> Returns {@link StarCount StarCount} </p>
         *
         * @param userId Identifier of the user.
         */
        public GetPaidMessageRevenue(long userId) {
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1976589102;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns parameters for creating of a new passkey as JSON-serialized string.
     *
     * <p> Returns {@link Text Text} </p>
     */
    public static class GetPasskeyParameters extends Function<Text> {

        /**
         * Default constructor for a function, which returns parameters for creating of a new passkey as JSON-serialized string.
         *
         * <p> Returns {@link Text Text} </p>
         */
        public GetPasskeyParameters() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -680161058;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a Telegram Passport authorization form for sharing data with a service.
     *
     * <p> Returns {@link PassportAuthorizationForm PassportAuthorizationForm} </p>
     */
    public static class GetPassportAuthorizationForm extends Function<PassportAuthorizationForm> {
        /**
         * User identifier of the service's bot.
         */
        public long botUserId;
        /**
         * Telegram Passport element types requested by the service.
         */
        public String scope;
        /**
         * Service's public key.
         */
        public String publicKey;
        /**
         * Unique request identifier provided by the service.
         */
        public String nonce;

        /**
         * Default constructor for a function, which returns a Telegram Passport authorization form for sharing data with a service.
         *
         * <p> Returns {@link PassportAuthorizationForm PassportAuthorizationForm} </p>
         */
        public GetPassportAuthorizationForm() {
        }

        /**
         * Creates a function, which returns a Telegram Passport authorization form for sharing data with a service.
         *
         * <p> Returns {@link PassportAuthorizationForm PassportAuthorizationForm} </p>
         *
         * @param botUserId User identifier of the service's bot.
         * @param scope Telegram Passport element types requested by the service.
         * @param publicKey Service's public key.
         * @param nonce Unique request identifier provided by the service.
         */
        public GetPassportAuthorizationForm(long botUserId, String scope, String publicKey, String nonce) {
            this.botUserId = botUserId;
            this.scope = scope;
            this.publicKey = publicKey;
            this.nonce = nonce;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1636107398;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns already available Telegram Passport elements suitable for completing a Telegram Passport authorization form. Result can be received only once for each authorization form.
     *
     * <p> Returns {@link PassportElementsWithErrors PassportElementsWithErrors} </p>
     */
    public static class GetPassportAuthorizationFormAvailableElements extends Function<PassportElementsWithErrors> {
        /**
         * Authorization form identifier.
         */
        public int authorizationFormId;
        /**
         * The 2-step verification password of the current user.
         */
        public String password;

        /**
         * Default constructor for a function, which returns already available Telegram Passport elements suitable for completing a Telegram Passport authorization form. Result can be received only once for each authorization form.
         *
         * <p> Returns {@link PassportElementsWithErrors PassportElementsWithErrors} </p>
         */
        public GetPassportAuthorizationFormAvailableElements() {
        }

        /**
         * Creates a function, which returns already available Telegram Passport elements suitable for completing a Telegram Passport authorization form. Result can be received only once for each authorization form.
         *
         * <p> Returns {@link PassportElementsWithErrors PassportElementsWithErrors} </p>
         *
         * @param authorizationFormId Authorization form identifier.
         * @param password The 2-step verification password of the current user.
         */
        public GetPassportAuthorizationFormAvailableElements(int authorizationFormId, String password) {
            this.authorizationFormId = authorizationFormId;
            this.password = password;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1068700924;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns one of the available Telegram Passport elements.
     *
     * <p> Returns {@link PassportElement PassportElement} </p>
     */
    public static class GetPassportElement extends Function<PassportElement> {
        /**
         * Telegram Passport element type.
         */
        public PassportElementType type;
        /**
         * The 2-step verification password of the current user.
         */
        public String password;

        /**
         * Default constructor for a function, which returns one of the available Telegram Passport elements.
         *
         * <p> Returns {@link PassportElement PassportElement} </p>
         */
        public GetPassportElement() {
        }

        /**
         * Creates a function, which returns one of the available Telegram Passport elements.
         *
         * <p> Returns {@link PassportElement PassportElement} </p>
         *
         * @param type Telegram Passport element type.
         * @param password The 2-step verification password of the current user.
         */
        public GetPassportElement(PassportElementType type, String password) {
            this.type = type;
            this.password = password;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1882398342;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the current state of 2-step verification.
     *
     * <p> Returns {@link PasswordState PasswordState} </p>
     */
    public static class GetPasswordState extends Function<PasswordState> {

        /**
         * Default constructor for a function, which returns the current state of 2-step verification.
         *
         * <p> Returns {@link PasswordState PasswordState} </p>
         */
        public GetPasswordState() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -174752904;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an invoice payment form. This method must be called when the user presses inline button of the type inlineKeyboardButtonTypeBuy, or wants to buy access to media in a messagePaidMedia message.
     *
     * <p> Returns {@link PaymentForm PaymentForm} </p>
     */
    public static class GetPaymentForm extends Function<PaymentForm> {
        /**
         * The invoice.
         */
        public InputInvoice inputInvoice;
        /**
         * Preferred payment form theme; pass null to use the default theme.
         */
        public ThemeParameters theme;

        /**
         * Default constructor for a function, which returns an invoice payment form. This method must be called when the user presses inline button of the type inlineKeyboardButtonTypeBuy, or wants to buy access to media in a messagePaidMedia message.
         *
         * <p> Returns {@link PaymentForm PaymentForm} </p>
         */
        public GetPaymentForm() {
        }

        /**
         * Creates a function, which returns an invoice payment form. This method must be called when the user presses inline button of the type inlineKeyboardButtonTypeBuy, or wants to buy access to media in a messagePaidMedia message.
         *
         * <p> Returns {@link PaymentForm PaymentForm} </p>
         *
         * @param inputInvoice The invoice.
         * @param theme Preferred payment form theme; pass null to use the default theme.
         */
        public GetPaymentForm(InputInvoice inputInvoice, ThemeParameters theme) {
            this.inputInvoice = inputInvoice;
            this.theme = theme;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1924172076;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a successful payment.
     *
     * <p> Returns {@link PaymentReceipt PaymentReceipt} </p>
     */
    public static class GetPaymentReceipt extends Function<PaymentReceipt> {
        /**
         * Chat identifier of the messagePaymentSuccessful message.
         */
        public long chatId;
        /**
         * Message identifier.
         */
        public long messageId;

        /**
         * Default constructor for a function, which returns information about a successful payment.
         *
         * <p> Returns {@link PaymentReceipt PaymentReceipt} </p>
         */
        public GetPaymentReceipt() {
        }

        /**
         * Creates a function, which returns information about a successful payment.
         *
         * <p> Returns {@link PaymentReceipt PaymentReceipt} </p>
         *
         * @param chatId Chat identifier of the messagePaymentSuccessful message.
         * @param messageId Message identifier.
         */
        public GetPaymentReceipt(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1013758294;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns messages in the personal chat of a given user; for bots only.
     *
     * <p> Returns {@link Messages Messages} </p>
     */
    public static class GetPersonalChatHistory extends Function<Messages> {
        /**
         * User identifier.
         */
        public long userId;
        /**
         * The maximum number of messages to be returned; 1-20.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns messages in the personal chat of a given user; for bots only.
         *
         * <p> Returns {@link Messages Messages} </p>
         */
        public GetPersonalChatHistory() {
        }

        /**
         * Creates a function, which returns messages in the personal chat of a given user; for bots only.
         *
         * <p> Returns {@link Messages Messages} </p>
         *
         * @param userId User identifier.
         * @param limit The maximum number of messages to be returned; 1-20.
         */
        public GetPersonalChatHistory(long userId, int limit) {
            this.userId = userId;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1727554525;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a phone number by its prefix. Can be called before authorization.
     *
     * <p> Returns {@link PhoneNumberInfo PhoneNumberInfo} </p>
     */
    public static class GetPhoneNumberInfo extends Function<PhoneNumberInfo> {
        /**
         * The phone number prefix.
         */
        public String phoneNumberPrefix;

        /**
         * Default constructor for a function, which returns information about a phone number by its prefix. Can be called before authorization.
         *
         * <p> Returns {@link PhoneNumberInfo PhoneNumberInfo} </p>
         */
        public GetPhoneNumberInfo() {
        }

        /**
         * Creates a function, which returns information about a phone number by its prefix. Can be called before authorization.
         *
         * <p> Returns {@link PhoneNumberInfo PhoneNumberInfo} </p>
         *
         * @param phoneNumberPrefix The phone number prefix.
         */
        public GetPhoneNumberInfo(String phoneNumberPrefix) {
            this.phoneNumberPrefix = phoneNumberPrefix;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1608344583;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a phone number by its prefix synchronously. getCountries must be called at least once after changing localization to the specified language if properly localized country information is expected. Can be called synchronously.
     *
     * <p> Returns {@link PhoneNumberInfo PhoneNumberInfo} </p>
     */
    public static class GetPhoneNumberInfoSync extends Function<PhoneNumberInfo> {
        /**
         * A two-letter ISO 639-1 language code for country information localization.
         */
        public String languageCode;
        /**
         * The phone number prefix.
         */
        public String phoneNumberPrefix;

        /**
         * Default constructor for a function, which returns information about a phone number by its prefix synchronously. getCountries must be called at least once after changing localization to the specified language if properly localized country information is expected. Can be called synchronously.
         *
         * <p> Returns {@link PhoneNumberInfo PhoneNumberInfo} </p>
         */
        public GetPhoneNumberInfoSync() {
        }

        /**
         * Creates a function, which returns information about a phone number by its prefix synchronously. getCountries must be called at least once after changing localization to the specified language if properly localized country information is expected. Can be called synchronously.
         *
         * <p> Returns {@link PhoneNumberInfo PhoneNumberInfo} </p>
         *
         * @param languageCode A two-letter ISO 639-1 language code for country information localization.
         * @param phoneNumberPrefix The phone number prefix.
         */
        public GetPhoneNumberInfoSync(String languageCode, String phoneNumberPrefix) {
            this.languageCode = languageCode;
            this.phoneNumberPrefix = phoneNumberPrefix;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 547061048;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns properties of a poll option. This is an offline method.
     *
     * <p> Returns {@link PollOptionProperties PollOptionProperties} </p>
     */
    public static class GetPollOptionProperties extends Function<PollOptionProperties> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * Unique identifier of the answer option, which properties will be returned.
         */
        public String pollOptionId;

        /**
         * Default constructor for a function, which returns properties of a poll option. This is an offline method.
         *
         * <p> Returns {@link PollOptionProperties PollOptionProperties} </p>
         */
        public GetPollOptionProperties() {
        }

        /**
         * Creates a function, which returns properties of a poll option. This is an offline method.
         *
         * <p> Returns {@link PollOptionProperties PollOptionProperties} </p>
         *
         * @param chatId Chat identifier.
         * @param messageId Identifier of the message.
         * @param pollOptionId Unique identifier of the answer option, which properties will be returned.
         */
        public GetPollOptionProperties(long chatId, long messageId, String pollOptionId) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.pollOptionId = pollOptionId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1191094872;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns statistics of poll votes in a poll.
     *
     * <p> Returns {@link PollVoteStatistics PollVoteStatistics} </p>
     */
    public static class GetPollVoteStatistics extends Function<PollVoteStatistics> {
        /**
         * Identifier of the chat to which the poll belongs.
         */
        public long chatId;
        /**
         * Identifier of the message containing the poll. Use messageProperties.canGetPollVoteStatistics to check whether the method can be used for a message.
         */
        public long messageId;
        /**
         * Pass true if a dark theme is used by the application.
         */
        public boolean isDark;

        /**
         * Default constructor for a function, which returns statistics of poll votes in a poll.
         *
         * <p> Returns {@link PollVoteStatistics PollVoteStatistics} </p>
         */
        public GetPollVoteStatistics() {
        }

        /**
         * Creates a function, which returns statistics of poll votes in a poll.
         *
         * <p> Returns {@link PollVoteStatistics PollVoteStatistics} </p>
         *
         * @param chatId Identifier of the chat to which the poll belongs.
         * @param messageId Identifier of the message containing the poll. Use messageProperties.canGetPollVoteStatistics to check whether the method can be used for a message.
         * @param isDark Pass true if a dark theme is used by the application.
         */
        public GetPollVoteStatistics(long chatId, long messageId, boolean isDark) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.isDark = isDark;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -379637947;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns message senders voted for the specified option in a poll; use poll.canGetVoters to check whether the method can be used. For optimal performance, the number of returned users is chosen by TDLib.
     *
     * <p> Returns {@link PollVoters PollVoters} </p>
     */
    public static class GetPollVoters extends Function<PollVoters> {
        /**
         * Identifier of the chat to which the poll belongs.
         */
        public long chatId;
        /**
         * Identifier of the message containing the poll.
         */
        public long messageId;
        /**
         * 0-based identifier of the answer option.
         */
        public int optionId;
        /**
         * Number of voters to skip in the result; must be non-negative.
         */
        public int offset;
        /**
         * The maximum number of voters to be returned; must be positive and can't be greater than 50. For optimal performance, the number of returned voters is chosen by TDLib and can be smaller than the specified limit, even if the end of the voter list has not been reached.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns message senders voted for the specified option in a poll; use poll.canGetVoters to check whether the method can be used. For optimal performance, the number of returned users is chosen by TDLib.
         *
         * <p> Returns {@link PollVoters PollVoters} </p>
         */
        public GetPollVoters() {
        }

        /**
         * Creates a function, which returns message senders voted for the specified option in a poll; use poll.canGetVoters to check whether the method can be used. For optimal performance, the number of returned users is chosen by TDLib.
         *
         * <p> Returns {@link PollVoters PollVoters} </p>
         *
         * @param chatId Identifier of the chat to which the poll belongs.
         * @param messageId Identifier of the message containing the poll.
         * @param optionId 0-based identifier of the answer option.
         * @param offset Number of voters to skip in the result; must be non-negative.
         * @param limit The maximum number of voters to be returned; must be positive and can't be greater than 50. For optimal performance, the number of returned voters is chosen by TDLib and can be smaller than the specified limit, even if the end of the voter list has not been reached.
         */
        public GetPollVoters(long chatId, long messageId, int optionId, int offset, int limit) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.optionId = optionId;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1602915575;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an IETF language tag of the language preferred in the country, which must be used to fill native fields in Telegram Passport personal details. Returns a 404 error if unknown.
     *
     * <p> Returns {@link Text Text} </p>
     */
    public static class GetPreferredCountryLanguage extends Function<Text> {
        /**
         * A two-letter ISO 3166-1 alpha-2 country code.
         */
        public String countryCode;

        /**
         * Default constructor for a function, which returns an IETF language tag of the language preferred in the country, which must be used to fill native fields in Telegram Passport personal details. Returns a 404 error if unknown.
         *
         * <p> Returns {@link Text Text} </p>
         */
        public GetPreferredCountryLanguage() {
        }

        /**
         * Creates a function, which returns an IETF language tag of the language preferred in the country, which must be used to fill native fields in Telegram Passport personal details. Returns a 404 error if unknown.
         *
         * <p> Returns {@link Text Text} </p>
         *
         * @param countryCode A two-letter ISO 3166-1 alpha-2 country code.
         */
        public GetPreferredCountryLanguage(String countryCode) {
            this.countryCode = countryCode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -933049386;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about features, available to Premium users.
     *
     * <p> Returns {@link PremiumFeatures PremiumFeatures} </p>
     */
    public static class GetPremiumFeatures extends Function<PremiumFeatures> {
        /**
         * Source of the request; pass null if the method is called from some non-standard source.
         */
        public PremiumSource source;

        /**
         * Default constructor for a function, which returns information about features, available to Premium users.
         *
         * <p> Returns {@link PremiumFeatures PremiumFeatures} </p>
         */
        public GetPremiumFeatures() {
        }

        /**
         * Creates a function, which returns information about features, available to Premium users.
         *
         * <p> Returns {@link PremiumFeatures PremiumFeatures} </p>
         *
         * @param source Source of the request; pass null if the method is called from some non-standard source.
         */
        public GetPremiumFeatures(PremiumSource source) {
            this.source = source;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1260640695;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns available options for gifting Telegram Premium to a user.
     *
     * <p> Returns {@link PremiumGiftPaymentOptions PremiumGiftPaymentOptions} </p>
     */
    public static class GetPremiumGiftPaymentOptions extends Function<PremiumGiftPaymentOptions> {

        /**
         * Default constructor for a function, which returns available options for gifting Telegram Premium to a user.
         *
         * <p> Returns {@link PremiumGiftPaymentOptions PremiumGiftPaymentOptions} </p>
         */
        public GetPremiumGiftPaymentOptions() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -480334244;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns available options for creating of Telegram Premium giveaway or manual distribution of Telegram Premium among chat members.
     *
     * <p> Returns {@link PremiumGiveawayPaymentOptions PremiumGiveawayPaymentOptions} </p>
     */
    public static class GetPremiumGiveawayPaymentOptions extends Function<PremiumGiveawayPaymentOptions> {
        /**
         * Identifier of the supergroup or channel chat, which will be automatically boosted by receivers of the gift codes and which is administered by the user.
         */
        public long boostedChatId;

        /**
         * Default constructor for a function, which returns available options for creating of Telegram Premium giveaway or manual distribution of Telegram Premium among chat members.
         *
         * <p> Returns {@link PremiumGiveawayPaymentOptions PremiumGiveawayPaymentOptions} </p>
         */
        public GetPremiumGiveawayPaymentOptions() {
        }

        /**
         * Creates a function, which returns available options for creating of Telegram Premium giveaway or manual distribution of Telegram Premium among chat members.
         *
         * <p> Returns {@link PremiumGiveawayPaymentOptions PremiumGiveawayPaymentOptions} </p>
         *
         * @param boostedChatId Identifier of the supergroup or channel chat, which will be automatically boosted by receivers of the gift codes and which is administered by the user.
         */
        public GetPremiumGiveawayPaymentOptions(long boostedChatId) {
            this.boostedChatId = boostedChatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1222168073;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the sticker to be used as representation of the Telegram Premium subscription.
     *
     * <p> Returns {@link Sticker Sticker} </p>
     */
    public static class GetPremiumInfoSticker extends Function<Sticker> {
        /**
         * Number of months the Telegram Premium subscription will be active.
         */
        public int monthCount;

        /**
         * Default constructor for a function, which returns the sticker to be used as representation of the Telegram Premium subscription.
         *
         * <p> Returns {@link Sticker Sticker} </p>
         */
        public GetPremiumInfoSticker() {
        }

        /**
         * Creates a function, which returns the sticker to be used as representation of the Telegram Premium subscription.
         *
         * <p> Returns {@link Sticker Sticker} </p>
         *
         * @param monthCount Number of months the Telegram Premium subscription will be active.
         */
        public GetPremiumInfoSticker(int monthCount) {
            this.monthCount = monthCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2043562651;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a limit, increased for Premium users. Returns a 404 error if the limit is unknown.
     *
     * <p> Returns {@link PremiumLimit PremiumLimit} </p>
     */
    public static class GetPremiumLimit extends Function<PremiumLimit> {
        /**
         * Type of the limit.
         */
        public PremiumLimitType limitType;

        /**
         * Default constructor for a function, which returns information about a limit, increased for Premium users. Returns a 404 error if the limit is unknown.
         *
         * <p> Returns {@link PremiumLimit PremiumLimit} </p>
         */
        public GetPremiumLimit() {
        }

        /**
         * Creates a function, which returns information about a limit, increased for Premium users. Returns a 404 error if the limit is unknown.
         *
         * <p> Returns {@link PremiumLimit PremiumLimit} </p>
         *
         * @param limitType Type of the limit.
         */
        public GetPremiumLimit(PremiumLimitType limitType) {
            this.limitType = limitType;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1075313898;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns state of Telegram Premium subscription and promotion videos for Premium features.
     *
     * <p> Returns {@link PremiumState PremiumState} </p>
     */
    public static class GetPremiumState extends Function<PremiumState> {

        /**
         * Default constructor for a function, which returns state of Telegram Premium subscription and promotion videos for Premium features.
         *
         * <p> Returns {@link PremiumState PremiumState} </p>
         */
        public GetPremiumState() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 663632610;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns examples of premium stickers for demonstration purposes.
     *
     * <p> Returns {@link Stickers Stickers} </p>
     */
    public static class GetPremiumStickerExamples extends Function<Stickers> {

        /**
         * Default constructor for a function, which returns examples of premium stickers for demonstration purposes.
         *
         * <p> Returns {@link Stickers Stickers} </p>
         */
        public GetPremiumStickerExamples() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1399442328;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns premium stickers from regular sticker sets.
     *
     * <p> Returns {@link Stickers Stickers} </p>
     */
    public static class GetPremiumStickers extends Function<Stickers> {
        /**
         * The maximum number of stickers to be returned; 0-100.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns premium stickers from regular sticker sets.
         *
         * <p> Returns {@link Stickers Stickers} </p>
         */
        public GetPremiumStickers() {
        }

        /**
         * Creates a function, which returns premium stickers from regular sticker sets.
         *
         * <p> Returns {@link Stickers Stickers} </p>
         *
         * @param limit The maximum number of stickers to be returned; 0-100.
         */
        public GetPremiumStickers(int limit) {
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -280950192;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Saves an inline message to be sent by the given user.
     *
     * <p> Returns {@link PreparedInlineMessage PreparedInlineMessage} </p>
     */
    public static class GetPreparedInlineMessage extends Function<PreparedInlineMessage> {
        /**
         * Identifier of the bot that created the message.
         */
        public long botUserId;
        /**
         * Identifier of the prepared message.
         */
        public String preparedMessageId;

        /**
         * Default constructor for a function, which saves an inline message to be sent by the given user.
         *
         * <p> Returns {@link PreparedInlineMessage PreparedInlineMessage} </p>
         */
        public GetPreparedInlineMessage() {
        }

        /**
         * Creates a function, which saves an inline message to be sent by the given user.
         *
         * <p> Returns {@link PreparedInlineMessage PreparedInlineMessage} </p>
         *
         * @param botUserId Identifier of the bot that created the message.
         * @param preparedMessageId Identifier of the prepared message.
         */
        public GetPreparedInlineMessage(long botUserId, String preparedMessageId) {
            this.botUserId = botUserId;
            this.preparedMessageId = preparedMessageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -83179701;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a keyboard button prepared by the bot for the user. The button will be of the type keyboardButtonTypeRequestUsers, keyboardButtonTypeRequestChat, or keyboardButtonTypeRequestManagedBot.
     *
     * <p> Returns {@link KeyboardButton KeyboardButton} </p>
     */
    public static class GetPreparedKeyboardButton extends Function<KeyboardButton> {
        /**
         * Identifier of the bot that created the button.
         */
        public long botUserId;
        /**
         * Identifier of the prepared button.
         */
        public String preparedButtonId;

        /**
         * Default constructor for a function, which returns a keyboard button prepared by the bot for the user. The button will be of the type keyboardButtonTypeRequestUsers, keyboardButtonTypeRequestChat, or keyboardButtonTypeRequestManagedBot.
         *
         * <p> Returns {@link KeyboardButton KeyboardButton} </p>
         */
        public GetPreparedKeyboardButton() {
        }

        /**
         * Creates a function, which returns a keyboard button prepared by the bot for the user. The button will be of the type keyboardButtonTypeRequestUsers, keyboardButtonTypeRequestChat, or keyboardButtonTypeRequestManagedBot.
         *
         * <p> Returns {@link KeyboardButton KeyboardButton} </p>
         *
         * @param botUserId Identifier of the bot that created the button.
         * @param preparedButtonId Identifier of the prepared button.
         */
        public GetPreparedKeyboardButton(long botUserId, String preparedButtonId) {
            this.botUserId = botUserId;
            this.preparedButtonId = preparedButtonId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1162619742;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of proxies that are currently set up. Can be called before authorization.
     *
     * <p> Returns {@link AddedProxies AddedProxies} </p>
     */
    public static class GetProxies extends Function<AddedProxies> {

        /**
         * Default constructor for a function, which returns the list of proxies that are currently set up. Can be called before authorization.
         *
         * <p> Returns {@link AddedProxies AddedProxies} </p>
         */
        public GetProxies() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1234066431;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks public post search limits without actually performing the search.
     *
     * <p> Returns {@link PublicPostSearchLimits PublicPostSearchLimits} </p>
     */
    public static class GetPublicPostSearchLimits extends Function<PublicPostSearchLimits> {
        /**
         * Query that will be searched for.
         */
        public String query;

        /**
         * Default constructor for a function, which checks public post search limits without actually performing the search.
         *
         * <p> Returns {@link PublicPostSearchLimits PublicPostSearchLimits} </p>
         */
        public GetPublicPostSearchLimits() {
        }

        /**
         * Creates a function, which checks public post search limits without actually performing the search.
         *
         * <p> Returns {@link PublicPostSearchLimits PublicPostSearchLimits} </p>
         *
         * @param query Query that will be searched for.
         */
        public GetPublicPostSearchLimits(String query) {
            this.query = query;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1724216773;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a globally unique push notification subscription identifier for identification of an account, which has received a push notification. Can be called synchronously.
     *
     * <p> Returns {@link PushReceiverId PushReceiverId} </p>
     */
    public static class GetPushReceiverId extends Function<PushReceiverId> {
        /**
         * JSON-encoded push notification payload.
         */
        public String payload;

        /**
         * Default constructor for a function, which returns a globally unique push notification subscription identifier for identification of an account, which has received a push notification. Can be called synchronously.
         *
         * <p> Returns {@link PushReceiverId PushReceiverId} </p>
         */
        public GetPushReceiverId() {
        }

        /**
         * Creates a function, which returns a globally unique push notification subscription identifier for identification of an account, which has received a push notification. Can be called synchronously.
         *
         * <p> Returns {@link PushReceiverId PushReceiverId} </p>
         *
         * @param payload JSON-encoded push notification payload.
         */
        public GetPushReceiverId(String payload) {
            this.payload = payload;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -286505294;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns privacy settings for message read date.
     *
     * <p> Returns {@link ReadDatePrivacySettings ReadDatePrivacySettings} </p>
     */
    public static class GetReadDatePrivacySettings extends Function<ReadDatePrivacySettings> {

        /**
         * Default constructor for a function, which returns privacy settings for message read date.
         *
         * <p> Returns {@link ReadDatePrivacySettings ReadDatePrivacySettings} </p>
         */
        public GetReadDatePrivacySettings() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 451435451;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a received gift.
     *
     * <p> Returns {@link ReceivedGift ReceivedGift} </p>
     */
    public static class GetReceivedGift extends Function<ReceivedGift> {
        /**
         * Identifier of the gift.
         */
        public String receivedGiftId;

        /**
         * Default constructor for a function, which returns information about a received gift.
         *
         * <p> Returns {@link ReceivedGift ReceivedGift} </p>
         */
        public GetReceivedGift() {
        }

        /**
         * Creates a function, which returns information about a received gift.
         *
         * <p> Returns {@link ReceivedGift ReceivedGift} </p>
         *
         * @param receivedGiftId Identifier of the gift.
         */
        public GetReceivedGift(String receivedGiftId) {
            this.receivedGiftId = receivedGiftId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -446535239;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns gifts received by the given user or chat.
     *
     * <p> Returns {@link ReceivedGifts ReceivedGifts} </p>
     */
    public static class GetReceivedGifts extends Function<ReceivedGifts> {
        /**
         * Unique identifier of business connection on behalf of which to send the request; for bots only.
         */
        public String businessConnectionId;
        /**
         * Identifier of the gift receiver.
         */
        public MessageSender ownerId;
        /**
         * Pass collection identifier to get gifts only from the specified collection; pass 0 to get gifts regardless of collections.
         */
        public int collectionId;
        /**
         * Pass true to exclude gifts that aren't saved to the chat's profile page. Always true for gifts received by other users and channel chats without canPostMessages administrator right.
         */
        public boolean excludeUnsaved;
        /**
         * Pass true to exclude gifts that are saved to the chat's profile page. Always false for gifts received by other users and channel chats without canPostMessages administrator right.
         */
        public boolean excludeSaved;
        /**
         * Pass true to exclude gifts that can be purchased unlimited number of times.
         */
        public boolean excludeUnlimited;
        /**
         * Pass true to exclude gifts that can be purchased limited number of times and can be upgraded.
         */
        public boolean excludeUpgradable;
        /**
         * Pass true to exclude gifts that can be purchased limited number of times and can't be upgraded.
         */
        public boolean excludeNonUpgradable;
        /**
         * Pass true to exclude upgraded gifts.
         */
        public boolean excludeUpgraded;
        /**
         * Pass true to exclude gifts that can't be used in setUpgradedGiftColors.
         */
        public boolean excludeWithoutColors;
        /**
         * Pass true to exclude gifts that are just hosted and are not owned by the owner.
         */
        public boolean excludeHosted;
        /**
         * Pass true to sort results by gift price instead of send date.
         */
        public boolean sortByPrice;
        /**
         * Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         */
        public String offset;
        /**
         * The maximum number of gifts to be returned; must be positive and can't be greater than 100. For optimal performance, the number of returned objects is chosen by TDLib and can be smaller than the specified limit.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns gifts received by the given user or chat.
         *
         * <p> Returns {@link ReceivedGifts ReceivedGifts} </p>
         */
        public GetReceivedGifts() {
        }

        /**
         * Creates a function, which returns gifts received by the given user or chat.
         *
         * <p> Returns {@link ReceivedGifts ReceivedGifts} </p>
         *
         * @param businessConnectionId Unique identifier of business connection on behalf of which to send the request; for bots only.
         * @param ownerId Identifier of the gift receiver.
         * @param collectionId Pass collection identifier to get gifts only from the specified collection; pass 0 to get gifts regardless of collections.
         * @param excludeUnsaved Pass true to exclude gifts that aren't saved to the chat's profile page. Always true for gifts received by other users and channel chats without canPostMessages administrator right.
         * @param excludeSaved Pass true to exclude gifts that are saved to the chat's profile page. Always false for gifts received by other users and channel chats without canPostMessages administrator right.
         * @param excludeUnlimited Pass true to exclude gifts that can be purchased unlimited number of times.
         * @param excludeUpgradable Pass true to exclude gifts that can be purchased limited number of times and can be upgraded.
         * @param excludeNonUpgradable Pass true to exclude gifts that can be purchased limited number of times and can't be upgraded.
         * @param excludeUpgraded Pass true to exclude upgraded gifts.
         * @param excludeWithoutColors Pass true to exclude gifts that can't be used in setUpgradedGiftColors.
         * @param excludeHosted Pass true to exclude gifts that are just hosted and are not owned by the owner.
         * @param sortByPrice Pass true to sort results by gift price instead of send date.
         * @param offset Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         * @param limit The maximum number of gifts to be returned; must be positive and can't be greater than 100. For optimal performance, the number of returned objects is chosen by TDLib and can be smaller than the specified limit.
         */
        public GetReceivedGifts(String businessConnectionId, MessageSender ownerId, int collectionId, boolean excludeUnsaved, boolean excludeSaved, boolean excludeUnlimited, boolean excludeUpgradable, boolean excludeNonUpgradable, boolean excludeUpgraded, boolean excludeWithoutColors, boolean excludeHosted, boolean sortByPrice, String offset, int limit) {
            this.businessConnectionId = businessConnectionId;
            this.ownerId = ownerId;
            this.collectionId = collectionId;
            this.excludeUnsaved = excludeUnsaved;
            this.excludeSaved = excludeSaved;
            this.excludeUnlimited = excludeUnlimited;
            this.excludeUpgradable = excludeUpgradable;
            this.excludeNonUpgradable = excludeNonUpgradable;
            this.excludeUpgraded = excludeUpgraded;
            this.excludeWithoutColors = excludeWithoutColors;
            this.excludeHosted = excludeHosted;
            this.sortByPrice = sortByPrice;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1411782110;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns recent emoji statuses for self status.
     *
     * <p> Returns {@link EmojiStatuses EmojiStatuses} </p>
     */
    public static class GetRecentEmojiStatuses extends Function<EmojiStatuses> {

        /**
         * Default constructor for a function, which returns recent emoji statuses for self status.
         *
         * <p> Returns {@link EmojiStatuses EmojiStatuses} </p>
         */
        public GetRecentEmojiStatuses() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1371914967;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns up to 20 recently used inline bots in the order of their last usage.
     *
     * <p> Returns {@link Users Users} </p>
     */
    public static class GetRecentInlineBots extends Function<Users> {

        /**
         * Default constructor for a function, which returns up to 20 recently used inline bots in the order of their last usage.
         *
         * <p> Returns {@link Users Users} </p>
         */
        public GetRecentInlineBots() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1437823548;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a list of recently used stickers.
     *
     * <p> Returns {@link Stickers Stickers} </p>
     */
    public static class GetRecentStickers extends Function<Stickers> {
        /**
         * Pass true to return stickers and masks that were recently attached to photos or video files; pass false to return recently sent stickers.
         */
        public boolean isAttached;

        /**
         * Default constructor for a function, which returns a list of recently used stickers.
         *
         * <p> Returns {@link Stickers Stickers} </p>
         */
        public GetRecentStickers() {
        }

        /**
         * Creates a function, which returns a list of recently used stickers.
         *
         * <p> Returns {@link Stickers Stickers} </p>
         *
         * @param isAttached Pass true to return stickers and masks that were recently attached to photos or video files; pass false to return recently sent stickers.
         */
        public GetRecentStickers(boolean isAttached) {
            this.isAttached = isAttached;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -579622241;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns recently opened chats. This is an offline method. Returns chats in the order of last opening.
     *
     * <p> Returns {@link Chats Chats} </p>
     */
    public static class GetRecentlyOpenedChats extends Function<Chats> {
        /**
         * The maximum number of chats to be returned.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns recently opened chats. This is an offline method. Returns chats in the order of last opening.
         *
         * <p> Returns {@link Chats Chats} </p>
         */
        public GetRecentlyOpenedChats() {
        }

        /**
         * Creates a function, which returns recently opened chats. This is an offline method. Returns chats in the order of last opening.
         *
         * <p> Returns {@link Chats Chats} </p>
         *
         * @param limit The maximum number of chats to be returned.
         */
        public GetRecentlyOpenedChats(int limit) {
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1924156893;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns t.me URLs recently visited by a newly registered user.
     *
     * <p> Returns {@link TMeUrls TMeUrls} </p>
     */
    public static class GetRecentlyVisitedTMeUrls extends Function<TMeUrls> {
        /**
         * Google Play referrer to identify the user.
         */
        public String referrer;

        /**
         * Default constructor for a function, which returns t.me URLs recently visited by a newly registered user.
         *
         * <p> Returns {@link TMeUrls TMeUrls} </p>
         */
        public GetRecentlyVisitedTMeUrls() {
        }

        /**
         * Creates a function, which returns t.me URLs recently visited by a newly registered user.
         *
         * <p> Returns {@link TMeUrls TMeUrls} </p>
         *
         * @param referrer Google Play referrer to identify the user.
         */
        public GetRecentlyVisitedTMeUrls(String referrer) {
            this.referrer = referrer;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 806754961;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns recommended chat folders for the current user.
     *
     * <p> Returns {@link RecommendedChatFolders RecommendedChatFolders} </p>
     */
    public static class GetRecommendedChatFolders extends Function<RecommendedChatFolders> {

        /**
         * Default constructor for a function, which returns recommended chat folders for the current user.
         *
         * <p> Returns {@link RecommendedChatFolders RecommendedChatFolders} </p>
         */
        public GetRecommendedChatFolders() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -145540217;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a list of channel chats recommended to the current user.
     *
     * <p> Returns {@link Chats Chats} </p>
     */
    public static class GetRecommendedChats extends Function<Chats> {

        /**
         * Default constructor for a function, which returns a list of channel chats recommended to the current user.
         *
         * <p> Returns {@link Chats Chats} </p>
         */
        public GetRecommendedChats() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -649884303;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a 2-step verification recovery email address that was previously set up. This method can be used to verify a password provided by the user.
     *
     * <p> Returns {@link RecoveryEmailAddress RecoveryEmailAddress} </p>
     */
    public static class GetRecoveryEmailAddress extends Function<RecoveryEmailAddress> {
        /**
         * The 2-step verification password for the current user.
         */
        public String password;

        /**
         * Default constructor for a function, which returns a 2-step verification recovery email address that was previously set up. This method can be used to verify a password provided by the user.
         *
         * <p> Returns {@link RecoveryEmailAddress RecoveryEmailAddress} </p>
         */
        public GetRecoveryEmailAddress() {
        }

        /**
         * Creates a function, which returns a 2-step verification recovery email address that was previously set up. This method can be used to verify a password provided by the user.
         *
         * <p> Returns {@link RecoveryEmailAddress RecoveryEmailAddress} </p>
         *
         * @param password The 2-step verification password for the current user.
         */
        public GetRecoveryEmailAddress(String password) {
            this.password = password;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1594770947;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a file by its remote identifier. This is an offline method. Can be used to register a URL as a file for further uploading, or sending as a message. Even the request succeeds, the file can be used only if it is still accessible to the user. For example, if the file is from a message, then the message must be not deleted and accessible to the user. If the file database is disabled, then the corresponding object with the file must be preloaded by the application.
     *
     * <p> Returns {@link File File} </p>
     */
    public static class GetRemoteFile extends Function<File> {
        /**
         * Remote identifier of the file to get.
         */
        public String remoteFileId;
        /**
         * File type; pass null if unknown.
         */
        public FileType fileType;

        /**
         * Default constructor for a function, which returns information about a file by its remote identifier. This is an offline method. Can be used to register a URL as a file for further uploading, or sending as a message. Even the request succeeds, the file can be used only if it is still accessible to the user. For example, if the file is from a message, then the message must be not deleted and accessible to the user. If the file database is disabled, then the corresponding object with the file must be preloaded by the application.
         *
         * <p> Returns {@link File File} </p>
         */
        public GetRemoteFile() {
        }

        /**
         * Creates a function, which returns information about a file by its remote identifier. This is an offline method. Can be used to register a URL as a file for further uploading, or sending as a message. Even the request succeeds, the file can be used only if it is still accessible to the user. For example, if the file is from a message, then the message must be not deleted and accessible to the user. If the file database is disabled, then the corresponding object with the file must be preloaded by the application.
         *
         * <p> Returns {@link File File} </p>
         *
         * @param remoteFileId Remote identifier of the file to get.
         * @param fileType File type; pass null if unknown.
         */
        public GetRemoteFile(String remoteFileId, FileType fileType) {
            this.remoteFileId = remoteFileId;
            this.fileType = fileType;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2137204530;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a non-bundled message that is replied by a given message. Also, returns the pinned message for messagePinMessage, the game message for messageGameScore, the invoice message for messagePaymentSuccessful, the message with a previously set same background for messageChatSetBackground, the giveaway message for messageGiveawayCompleted, the checklist message for messageChecklistTasksDone, messageChecklistTasksAdded, the message with suggested post information for messageSuggestedPostApprovalFailed, messageSuggestedPostApproved, messageSuggestedPostDeclined, messageSuggestedPostPaid, messageSuggestedPostRefunded, the message with the regular gift that was upgraded for messageUpgradedGift with origin of the type upgradedGiftOriginUpgrade, the message with gift purchase offer for messageUpgradedGiftPurchaseOfferRejected, the message with the request to disable content protection for messageChatHasProtectedContentToggled, the message with the poll for messagePollOptionAdded and messagePollOptionDeleted, and the topic creation message for topic messages without non-bundled replied message. Returns a 404 error if the message doesn't exist.
     *
     * <p> Returns {@link Message Message} </p>
     */
    public static class GetRepliedMessage extends Function<Message> {
        /**
         * Identifier of the chat the message belongs to.
         */
        public long chatId;
        /**
         * Identifier of the reply message.
         */
        public long messageId;

        /**
         * Default constructor for a function, which returns information about a non-bundled message that is replied by a given message. Also, returns the pinned message for messagePinMessage, the game message for messageGameScore, the invoice message for messagePaymentSuccessful, the message with a previously set same background for messageChatSetBackground, the giveaway message for messageGiveawayCompleted, the checklist message for messageChecklistTasksDone, messageChecklistTasksAdded, the message with suggested post information for messageSuggestedPostApprovalFailed, messageSuggestedPostApproved, messageSuggestedPostDeclined, messageSuggestedPostPaid, messageSuggestedPostRefunded, the message with the regular gift that was upgraded for messageUpgradedGift with origin of the type upgradedGiftOriginUpgrade, the message with gift purchase offer for messageUpgradedGiftPurchaseOfferRejected, the message with the request to disable content protection for messageChatHasProtectedContentToggled, the message with the poll for messagePollOptionAdded and messagePollOptionDeleted, and the topic creation message for topic messages without non-bundled replied message. Returns a 404 error if the message doesn't exist.
         *
         * <p> Returns {@link Message Message} </p>
         */
        public GetRepliedMessage() {
        }

        /**
         * Creates a function, which returns information about a non-bundled message that is replied by a given message. Also, returns the pinned message for messagePinMessage, the game message for messageGameScore, the invoice message for messagePaymentSuccessful, the message with a previously set same background for messageChatSetBackground, the giveaway message for messageGiveawayCompleted, the checklist message for messageChecklistTasksDone, messageChecklistTasksAdded, the message with suggested post information for messageSuggestedPostApprovalFailed, messageSuggestedPostApproved, messageSuggestedPostDeclined, messageSuggestedPostPaid, messageSuggestedPostRefunded, the message with the regular gift that was upgraded for messageUpgradedGift with origin of the type upgradedGiftOriginUpgrade, the message with gift purchase offer for messageUpgradedGiftPurchaseOfferRejected, the message with the request to disable content protection for messageChatHasProtectedContentToggled, the message with the poll for messagePollOptionAdded and messagePollOptionDeleted, and the topic creation message for topic messages without non-bundled replied message. Returns a 404 error if the message doesn't exist.
         *
         * <p> Returns {@link Message Message} </p>
         *
         * @param chatId Identifier of the chat the message belongs to.
         * @param messageId Identifier of the reply message.
         */
        public GetRepliedMessage(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -641918531;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns saved animations.
     *
     * <p> Returns {@link Animations Animations} </p>
     */
    public static class GetSavedAnimations extends Function<Animations> {

        /**
         * Default constructor for a function, which returns saved animations.
         *
         * <p> Returns {@link Animations Animations} </p>
         */
        public GetSavedAnimations() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 7051032;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns tags used in Saved Messages or a Saved Messages topic.
     *
     * <p> Returns {@link SavedMessagesTags SavedMessagesTags} </p>
     */
    public static class GetSavedMessagesTags extends Function<SavedMessagesTags> {
        /**
         * Identifier of Saved Messages topic which tags will be returned; pass 0 to get all Saved Messages tags.
         */
        public long savedMessagesTopicId;

        /**
         * Default constructor for a function, which returns tags used in Saved Messages or a Saved Messages topic.
         *
         * <p> Returns {@link SavedMessagesTags SavedMessagesTags} </p>
         */
        public GetSavedMessagesTags() {
        }

        /**
         * Creates a function, which returns tags used in Saved Messages or a Saved Messages topic.
         *
         * <p> Returns {@link SavedMessagesTags SavedMessagesTags} </p>
         *
         * @param savedMessagesTopicId Identifier of Saved Messages topic which tags will be returned; pass 0 to get all Saved Messages tags.
         */
        public GetSavedMessagesTags(long savedMessagesTopicId) {
            this.savedMessagesTopicId = savedMessagesTopicId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1932105815;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns messages in a Saved Messages topic. The messages are returned in reverse chronological order (i.e., in order of decreasing messageId).
     *
     * <p> Returns {@link Messages Messages} </p>
     */
    public static class GetSavedMessagesTopicHistory extends Function<Messages> {
        /**
         * Identifier of Saved Messages topic which messages will be fetched.
         */
        public long savedMessagesTopicId;
        /**
         * Identifier of the message starting from which messages must be fetched; use 0 to get results from the last message.
         */
        public long fromMessageId;
        /**
         * Specify 0 to get results from exactly the message fromMessageId or a negative number from -99 to -1 to get additionally -offset newer messages.
         */
        public int offset;
        /**
         * The maximum number of messages to be returned; must be positive and can't be greater than 100. If the offset is negative, then the limit must be greater than or equal to -offset. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns messages in a Saved Messages topic. The messages are returned in reverse chronological order (i.e., in order of decreasing messageId).
         *
         * <p> Returns {@link Messages Messages} </p>
         */
        public GetSavedMessagesTopicHistory() {
        }

        /**
         * Creates a function, which returns messages in a Saved Messages topic. The messages are returned in reverse chronological order (i.e., in order of decreasing messageId).
         *
         * <p> Returns {@link Messages Messages} </p>
         *
         * @param savedMessagesTopicId Identifier of Saved Messages topic which messages will be fetched.
         * @param fromMessageId Identifier of the message starting from which messages must be fetched; use 0 to get results from the last message.
         * @param offset Specify 0 to get results from exactly the message fromMessageId or a negative number from -99 to -1 to get additionally -offset newer messages.
         * @param limit The maximum number of messages to be returned; must be positive and can't be greater than 100. If the offset is negative, then the limit must be greater than or equal to -offset. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         */
        public GetSavedMessagesTopicHistory(long savedMessagesTopicId, long fromMessageId, int offset, int limit) {
            this.savedMessagesTopicId = savedMessagesTopicId;
            this.fromMessageId = fromMessageId;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2011552360;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the last message sent in a Saved Messages topic no later than the specified date.
     *
     * <p> Returns {@link Message Message} </p>
     */
    public static class GetSavedMessagesTopicMessageByDate extends Function<Message> {
        /**
         * Identifier of Saved Messages topic which message will be returned.
         */
        public long savedMessagesTopicId;
        /**
         * Point in time (Unix timestamp) relative to which to search for messages.
         */
        public int date;

        /**
         * Default constructor for a function, which returns the last message sent in a Saved Messages topic no later than the specified date.
         *
         * <p> Returns {@link Message Message} </p>
         */
        public GetSavedMessagesTopicMessageByDate() {
        }

        /**
         * Creates a function, which returns the last message sent in a Saved Messages topic no later than the specified date.
         *
         * <p> Returns {@link Message Message} </p>
         *
         * @param savedMessagesTopicId Identifier of Saved Messages topic which message will be returned.
         * @param date Point in time (Unix timestamp) relative to which to search for messages.
         */
        public GetSavedMessagesTopicMessageByDate(long savedMessagesTopicId, int date) {
            this.savedMessagesTopicId = savedMessagesTopicId;
            this.date = date;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1050786176;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns saved notification sound by its identifier. Returns a 404 error if there is no saved notification sound with the specified identifier.
     *
     * <p> Returns {@link NotificationSound NotificationSound} </p>
     */
    public static class GetSavedNotificationSound extends Function<NotificationSound> {
        /**
         * Identifier of the notification sound.
         */
        public long notificationSoundId;

        /**
         * Default constructor for a function, which returns saved notification sound by its identifier. Returns a 404 error if there is no saved notification sound with the specified identifier.
         *
         * <p> Returns {@link NotificationSound NotificationSound} </p>
         */
        public GetSavedNotificationSound() {
        }

        /**
         * Creates a function, which returns saved notification sound by its identifier. Returns a 404 error if there is no saved notification sound with the specified identifier.
         *
         * <p> Returns {@link NotificationSound NotificationSound} </p>
         *
         * @param notificationSoundId Identifier of the notification sound.
         */
        public GetSavedNotificationSound(long notificationSoundId) {
            this.notificationSoundId = notificationSoundId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1790319616;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of saved notification sounds. If a sound isn't in the list, then default sound needs to be used.
     *
     * <p> Returns {@link NotificationSounds NotificationSounds} </p>
     */
    public static class GetSavedNotificationSounds extends Function<NotificationSounds> {

        /**
         * Default constructor for a function, which returns the list of saved notification sounds. If a sound isn't in the list, then default sound needs to be used.
         *
         * <p> Returns {@link NotificationSounds NotificationSounds} </p>
         */
        public GetSavedNotificationSounds() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1070305368;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns saved order information. Returns a 404 error if there is no saved order information.
     *
     * <p> Returns {@link OrderInfo OrderInfo} </p>
     */
    public static class GetSavedOrderInfo extends Function<OrderInfo> {

        /**
         * Default constructor for a function, which returns saved order information. Returns a 404 error if there is no saved order information.
         *
         * <p> Returns {@link OrderInfo OrderInfo} </p>
         */
        public GetSavedOrderInfo() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1152016675;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the notification settings for chats of a given type.
     *
     * <p> Returns {@link ScopeNotificationSettings ScopeNotificationSettings} </p>
     */
    public static class GetScopeNotificationSettings extends Function<ScopeNotificationSettings> {
        /**
         * Types of chats for which to return the notification settings information.
         */
        public NotificationSettingsScope scope;

        /**
         * Default constructor for a function, which returns the notification settings for chats of a given type.
         *
         * <p> Returns {@link ScopeNotificationSettings ScopeNotificationSettings} </p>
         */
        public GetScopeNotificationSettings() {
        }

        /**
         * Creates a function, which returns the notification settings for chats of a given type.
         *
         * <p> Returns {@link ScopeNotificationSettings ScopeNotificationSettings} </p>
         *
         * @param scope Types of chats for which to return the notification settings information.
         */
        public GetScopeNotificationSettings(NotificationSettingsScope scope) {
            this.scope = scope;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -995613361;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns sponsored chats to be shown in the search results.
     *
     * <p> Returns {@link SponsoredChats SponsoredChats} </p>
     */
    public static class GetSearchSponsoredChats extends Function<SponsoredChats> {
        /**
         * Query the user searches for.
         */
        public String query;

        /**
         * Default constructor for a function, which returns sponsored chats to be shown in the search results.
         *
         * <p> Returns {@link SponsoredChats SponsoredChats} </p>
         */
        public GetSearchSponsoredChats() {
        }

        /**
         * Creates a function, which returns sponsored chats to be shown in the search results.
         *
         * <p> Returns {@link SponsoredChats SponsoredChats} </p>
         *
         * @param query Query the user searches for.
         */
        public GetSearchSponsoredChats(String query) {
            this.query = query;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1568505164;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns recently searched for hashtags or cashtags by their prefix.
     *
     * <p> Returns {@link Hashtags Hashtags} </p>
     */
    public static class GetSearchedForTags extends Function<Hashtags> {
        /**
         * Prefix of hashtags or cashtags to return.
         */
        public String tagPrefix;
        /**
         * The maximum number of items to be returned.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns recently searched for hashtags or cashtags by their prefix.
         *
         * <p> Returns {@link Hashtags Hashtags} </p>
         */
        public GetSearchedForTags() {
        }

        /**
         * Creates a function, which returns recently searched for hashtags or cashtags by their prefix.
         *
         * <p> Returns {@link Hashtags Hashtags} </p>
         *
         * @param tagPrefix Prefix of hashtags or cashtags to return.
         * @param limit The maximum number of items to be returned.
         */
        public GetSearchedForTags(String tagPrefix, int limit) {
            this.tagPrefix = tagPrefix;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1692716851;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a secret chat by its identifier. This is an offline method.
     *
     * <p> Returns {@link SecretChat SecretChat} </p>
     */
    public static class GetSecretChat extends Function<SecretChat> {
        /**
         * Secret chat identifier.
         */
        public int secretChatId;

        /**
         * Default constructor for a function, which returns information about a secret chat by its identifier. This is an offline method.
         *
         * <p> Returns {@link SecretChat SecretChat} </p>
         */
        public GetSecretChat() {
        }

        /**
         * Creates a function, which returns information about a secret chat by its identifier. This is an offline method.
         *
         * <p> Returns {@link SecretChat SecretChat} </p>
         *
         * @param secretChatId Secret chat identifier.
         */
        public GetSecretChat(int secretChatId) {
            this.secretChatId = secretChatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 40599169;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the current state of stake dice.
     *
     * <p> Returns {@link StakeDiceState StakeDiceState} </p>
     */
    public static class GetStakeDiceState extends Function<StakeDiceState> {

        /**
         * Default constructor for a function, which returns the current state of stake dice.
         *
         * <p> Returns {@link StakeDiceState StakeDiceState} </p>
         */
        public GetStakeDiceState() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1389168065;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a URL for a Telegram Ad platform account that can be used to set up advertisements for the chat paid in the owned Telegram Stars.
     *
     * <p> Returns {@link HttpUrl HttpUrl} </p>
     */
    public static class GetStarAdAccountUrl extends Function<HttpUrl> {
        /**
         * Identifier of the owner of the Telegram Stars; can be identifier of an owned bot, or identifier of an owned channel chat.
         */
        public MessageSender ownerId;

        /**
         * Default constructor for a function, which returns a URL for a Telegram Ad platform account that can be used to set up advertisements for the chat paid in the owned Telegram Stars.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         */
        public GetStarAdAccountUrl() {
        }

        /**
         * Creates a function, which returns a URL for a Telegram Ad platform account that can be used to set up advertisements for the chat paid in the owned Telegram Stars.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         *
         * @param ownerId Identifier of the owner of the Telegram Stars; can be identifier of an owned bot, or identifier of an owned channel chat.
         */
        public GetStarAdAccountUrl(MessageSender ownerId) {
            this.ownerId = ownerId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1940473181;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns available options for Telegram Stars gifting.
     *
     * <p> Returns {@link StarPaymentOptions StarPaymentOptions} </p>
     */
    public static class GetStarGiftPaymentOptions extends Function<StarPaymentOptions> {
        /**
         * Identifier of the user who will receive Telegram Stars; pass 0 to get options for an unspecified user.
         */
        public long userId;

        /**
         * Default constructor for a function, which returns available options for Telegram Stars gifting.
         *
         * <p> Returns {@link StarPaymentOptions StarPaymentOptions} </p>
         */
        public GetStarGiftPaymentOptions() {
        }

        /**
         * Creates a function, which returns available options for Telegram Stars gifting.
         *
         * <p> Returns {@link StarPaymentOptions StarPaymentOptions} </p>
         *
         * @param userId Identifier of the user who will receive Telegram Stars; pass 0 to get options for an unspecified user.
         */
        public GetStarGiftPaymentOptions(long userId) {
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -500735773;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns available options for Telegram Star giveaway creation.
     *
     * <p> Returns {@link StarGiveawayPaymentOptions StarGiveawayPaymentOptions} </p>
     */
    public static class GetStarGiveawayPaymentOptions extends Function<StarGiveawayPaymentOptions> {

        /**
         * Default constructor for a function, which returns available options for Telegram Star giveaway creation.
         *
         * <p> Returns {@link StarGiveawayPaymentOptions StarGiveawayPaymentOptions} </p>
         */
        public GetStarGiveawayPaymentOptions() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -883172578;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns available options for Telegram Stars purchase.
     *
     * <p> Returns {@link StarPaymentOptions StarPaymentOptions} </p>
     */
    public static class GetStarPaymentOptions extends Function<StarPaymentOptions> {

        /**
         * Default constructor for a function, which returns available options for Telegram Stars purchase.
         *
         * <p> Returns {@link StarPaymentOptions StarPaymentOptions} </p>
         */
        public GetStarPaymentOptions() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1838351940;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns detailed Telegram Star revenue statistics.
     *
     * <p> Returns {@link StarRevenueStatistics StarRevenueStatistics} </p>
     */
    public static class GetStarRevenueStatistics extends Function<StarRevenueStatistics> {
        /**
         * Identifier of the owner of the Telegram Stars; can be identifier of the current user, an owned bot, or a supergroup or a channel chat with supergroupFullInfo.canGetStarRevenueStatistics == true.
         */
        public MessageSender ownerId;
        /**
         * Pass true if a dark theme is used by the application.
         */
        public boolean isDark;

        /**
         * Default constructor for a function, which returns detailed Telegram Star revenue statistics.
         *
         * <p> Returns {@link StarRevenueStatistics StarRevenueStatistics} </p>
         */
        public GetStarRevenueStatistics() {
        }

        /**
         * Creates a function, which returns detailed Telegram Star revenue statistics.
         *
         * <p> Returns {@link StarRevenueStatistics StarRevenueStatistics} </p>
         *
         * @param ownerId Identifier of the owner of the Telegram Stars; can be identifier of the current user, an owned bot, or a supergroup or a channel chat with supergroupFullInfo.canGetStarRevenueStatistics == true.
         * @param isDark Pass true if a dark theme is used by the application.
         */
        public GetStarRevenueStatistics(MessageSender ownerId, boolean isDark) {
            this.ownerId = ownerId;
            this.isDark = isDark;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -260356841;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of Telegram Star subscriptions for the current user.
     *
     * <p> Returns {@link StarSubscriptions StarSubscriptions} </p>
     */
    public static class GetStarSubscriptions extends Function<StarSubscriptions> {
        /**
         * Pass true to receive only expiring subscriptions for which there are no enough Telegram Stars to extend.
         */
        public boolean onlyExpiring;
        /**
         * Offset of the first subscription to return as received from the previous request; use empty string to get the first chunk of results.
         */
        public String offset;

        /**
         * Default constructor for a function, which returns the list of Telegram Star subscriptions for the current user.
         *
         * <p> Returns {@link StarSubscriptions StarSubscriptions} </p>
         */
        public GetStarSubscriptions() {
        }

        /**
         * Creates a function, which returns the list of Telegram Star subscriptions for the current user.
         *
         * <p> Returns {@link StarSubscriptions StarSubscriptions} </p>
         *
         * @param onlyExpiring Pass true to receive only expiring subscriptions for which there are no enough Telegram Stars to extend.
         * @param offset Offset of the first subscription to return as received from the previous request; use empty string to get the first chunk of results.
         */
        public GetStarSubscriptions(boolean onlyExpiring, String offset) {
            this.onlyExpiring = onlyExpiring;
            this.offset = offset;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -641223956;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of Telegram Star transactions for the specified owner.
     *
     * <p> Returns {@link StarTransactions StarTransactions} </p>
     */
    public static class GetStarTransactions extends Function<StarTransactions> {
        /**
         * Identifier of the owner of the Telegram Stars; can be the identifier of the current user, identifier of an owned bot, or identifier of a supergroup or a channel chat with supergroupFullInfo.canGetStarRevenueStatistics == true.
         */
        public MessageSender ownerId;
        /**
         * If non-empty, only transactions related to the Star Subscription will be returned.
         */
        public String subscriptionId;
        /**
         * Direction of the transactions to receive; pass null to get all transactions.
         */
        public TransactionDirection direction;
        /**
         * Offset of the first transaction to return as received from the previous request; use empty string to get the first chunk of results.
         */
        public String offset;
        /**
         * The maximum number of transactions to return.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns the list of Telegram Star transactions for the specified owner.
         *
         * <p> Returns {@link StarTransactions StarTransactions} </p>
         */
        public GetStarTransactions() {
        }

        /**
         * Creates a function, which returns the list of Telegram Star transactions for the specified owner.
         *
         * <p> Returns {@link StarTransactions StarTransactions} </p>
         *
         * @param ownerId Identifier of the owner of the Telegram Stars; can be the identifier of the current user, identifier of an owned bot, or identifier of a supergroup or a channel chat with supergroupFullInfo.canGetStarRevenueStatistics == true.
         * @param subscriptionId If non-empty, only transactions related to the Star Subscription will be returned.
         * @param direction Direction of the transactions to receive; pass null to get all transactions.
         * @param offset Offset of the first transaction to return as received from the previous request; use empty string to get the first chunk of results.
         * @param limit The maximum number of transactions to return.
         */
        public GetStarTransactions(MessageSender ownerId, String subscriptionId, TransactionDirection direction, String offset, int limit) {
            this.ownerId = ownerId;
            this.subscriptionId = subscriptionId;
            this.direction = direction;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -304141747;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a URL for Telegram Star withdrawal.
     *
     * <p> Returns {@link HttpUrl HttpUrl} </p>
     */
    public static class GetStarWithdrawalUrl extends Function<HttpUrl> {
        /**
         * Identifier of the owner of the Telegram Stars; can be identifier of the current user, an owned bot, or an owned supergroup or channel chat.
         */
        public MessageSender ownerId;
        /**
         * The number of Telegram Stars to withdraw; must be between getOption(&quot;star_withdrawal_count_min&quot;) and getOption(&quot;star_withdrawal_count_max&quot;).
         */
        public long starCount;
        /**
         * The 2-step verification password of the current user.
         */
        public String password;

        /**
         * Default constructor for a function, which returns a URL for Telegram Star withdrawal.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         */
        public GetStarWithdrawalUrl() {
        }

        /**
         * Creates a function, which returns a URL for Telegram Star withdrawal.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         *
         * @param ownerId Identifier of the owner of the Telegram Stars; can be identifier of the current user, an owned bot, or an owned supergroup or channel chat.
         * @param starCount The number of Telegram Stars to withdraw; must be between getOption(&quot;star_withdrawal_count_min&quot;) and getOption(&quot;star_withdrawal_count_max&quot;).
         * @param password The 2-step verification password of the current user.
         */
        public GetStarWithdrawalUrl(MessageSender ownerId, long starCount, String password) {
            this.ownerId = ownerId;
            this.starCount = starCount;
            this.password = password;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1445841134;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Loads an asynchronous or a zoomed in statistical graph.
     *
     * <p> Returns {@link StatisticalGraph StatisticalGraph} </p>
     */
    public static class GetStatisticalGraph extends Function<StatisticalGraph> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The token for graph loading.
         */
        public String token;
        /**
         * X-value for zoomed in graph or 0 otherwise.
         */
        public long x;

        /**
         * Default constructor for a function, which loads an asynchronous or a zoomed in statistical graph.
         *
         * <p> Returns {@link StatisticalGraph StatisticalGraph} </p>
         */
        public GetStatisticalGraph() {
        }

        /**
         * Creates a function, which loads an asynchronous or a zoomed in statistical graph.
         *
         * <p> Returns {@link StatisticalGraph StatisticalGraph} </p>
         *
         * @param chatId Chat identifier.
         * @param token The token for graph loading.
         * @param x X-value for zoomed in graph or 0 otherwise.
         */
        public GetStatisticalGraph(long chatId, String token, long x) {
            this.chatId = chatId;
            this.token = token;
            this.x = x;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1100975515;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns emoji corresponding to a sticker. The list is only for informational purposes, because a sticker is always sent with a fixed emoji from the corresponding Sticker object.
     *
     * <p> Returns {@link Emojis Emojis} </p>
     */
    public static class GetStickerEmojis extends Function<Emojis> {
        /**
         * Sticker file identifier.
         */
        public InputFile sticker;

        /**
         * Default constructor for a function, which returns emoji corresponding to a sticker. The list is only for informational purposes, because a sticker is always sent with a fixed emoji from the corresponding Sticker object.
         *
         * <p> Returns {@link Emojis Emojis} </p>
         */
        public GetStickerEmojis() {
        }

        /**
         * Creates a function, which returns emoji corresponding to a sticker. The list is only for informational purposes, because a sticker is always sent with a fixed emoji from the corresponding Sticker object.
         *
         * <p> Returns {@link Emojis Emojis} </p>
         *
         * @param sticker Sticker file identifier.
         */
        public GetStickerEmojis(InputFile sticker) {
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1895508665;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns outline of a sticker. This is an offline method. Returns a 404 error if the outline isn't known.
     *
     * <p> Returns {@link Outline Outline} </p>
     */
    public static class GetStickerOutline extends Function<Outline> {
        /**
         * File identifier of the sticker.
         */
        public int stickerFileId;
        /**
         * Pass true to get the outline scaled for animated emoji.
         */
        public boolean forAnimatedEmoji;
        /**
         * Pass true to get the outline scaled for clicked animated emoji message.
         */
        public boolean forClickedAnimatedEmojiMessage;

        /**
         * Default constructor for a function, which returns outline of a sticker. This is an offline method. Returns a 404 error if the outline isn't known.
         *
         * <p> Returns {@link Outline Outline} </p>
         */
        public GetStickerOutline() {
        }

        /**
         * Creates a function, which returns outline of a sticker. This is an offline method. Returns a 404 error if the outline isn't known.
         *
         * <p> Returns {@link Outline Outline} </p>
         *
         * @param stickerFileId File identifier of the sticker.
         * @param forAnimatedEmoji Pass true to get the outline scaled for animated emoji.
         * @param forClickedAnimatedEmojiMessage Pass true to get the outline scaled for clicked animated emoji message.
         */
        public GetStickerOutline(int stickerFileId, boolean forAnimatedEmoji, boolean forClickedAnimatedEmojiMessage) {
            this.stickerFileId = stickerFileId;
            this.forAnimatedEmoji = forAnimatedEmoji;
            this.forClickedAnimatedEmojiMessage = forClickedAnimatedEmojiMessage;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1550504539;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns outline of a sticker as an SVG path. This is an offline method. Returns an empty string if the outline isn't known.
     *
     * <p> Returns {@link Text Text} </p>
     */
    public static class GetStickerOutlineSvgPath extends Function<Text> {
        /**
         * File identifier of the sticker.
         */
        public int stickerFileId;
        /**
         * Pass true to get the outline scaled for animated emoji.
         */
        public boolean forAnimatedEmoji;
        /**
         * Pass true to get the outline scaled for clicked animated emoji message.
         */
        public boolean forClickedAnimatedEmojiMessage;

        /**
         * Default constructor for a function, which returns outline of a sticker as an SVG path. This is an offline method. Returns an empty string if the outline isn't known.
         *
         * <p> Returns {@link Text Text} </p>
         */
        public GetStickerOutlineSvgPath() {
        }

        /**
         * Creates a function, which returns outline of a sticker as an SVG path. This is an offline method. Returns an empty string if the outline isn't known.
         *
         * <p> Returns {@link Text Text} </p>
         *
         * @param stickerFileId File identifier of the sticker.
         * @param forAnimatedEmoji Pass true to get the outline scaled for animated emoji.
         * @param forClickedAnimatedEmojiMessage Pass true to get the outline scaled for clicked animated emoji message.
         */
        public GetStickerOutlineSvgPath(int stickerFileId, boolean forAnimatedEmoji, boolean forClickedAnimatedEmojiMessage) {
            this.stickerFileId = stickerFileId;
            this.forAnimatedEmoji = forAnimatedEmoji;
            this.forClickedAnimatedEmojiMessage = forClickedAnimatedEmojiMessage;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1615497803;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a sticker set by its identifier.
     *
     * <p> Returns {@link StickerSet StickerSet} </p>
     */
    public static class GetStickerSet extends Function<StickerSet> {
        /**
         * Identifier of the sticker set.
         */
        public long setId;

        /**
         * Default constructor for a function, which returns information about a sticker set by its identifier.
         *
         * <p> Returns {@link StickerSet StickerSet} </p>
         */
        public GetStickerSet() {
        }

        /**
         * Creates a function, which returns information about a sticker set by its identifier.
         *
         * <p> Returns {@link StickerSet StickerSet} </p>
         *
         * @param setId Identifier of the sticker set.
         */
        public GetStickerSet(long setId) {
            this.setId = setId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1052318659;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns name of a sticker set by its identifier.
     *
     * <p> Returns {@link Text Text} </p>
     */
    public static class GetStickerSetName extends Function<Text> {
        /**
         * Identifier of the sticker set.
         */
        public long setId;

        /**
         * Default constructor for a function, which returns name of a sticker set by its identifier.
         *
         * <p> Returns {@link Text Text} </p>
         */
        public GetStickerSetName() {
        }

        /**
         * Creates a function, which returns name of a sticker set by its identifier.
         *
         * <p> Returns {@link Text Text} </p>
         *
         * @param setId Identifier of the sticker set.
         */
        public GetStickerSetName(long setId) {
            this.setId = setId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1039849089;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns stickers from the installed sticker sets that correspond to any of the given emoji or can be found by sticker-specific keywords. If the query is non-empty, then favorite, recently used or trending stickers may also be returned.
     *
     * <p> Returns {@link Stickers Stickers} </p>
     */
    public static class GetStickers extends Function<Stickers> {
        /**
         * Type of the stickers to return.
         */
        public StickerType stickerType;
        /**
         * Search query; a space-separated list of emojis or a keyword prefix. If empty, returns all known installed stickers.
         */
        public String query;
        /**
         * The maximum number of stickers to be returned.
         */
        public int limit;
        /**
         * Chat identifier for which to return stickers. Available custom emoji stickers may be different for different chats.
         */
        public long chatId;

        /**
         * Default constructor for a function, which returns stickers from the installed sticker sets that correspond to any of the given emoji or can be found by sticker-specific keywords. If the query is non-empty, then favorite, recently used or trending stickers may also be returned.
         *
         * <p> Returns {@link Stickers Stickers} </p>
         */
        public GetStickers() {
        }

        /**
         * Creates a function, which returns stickers from the installed sticker sets that correspond to any of the given emoji or can be found by sticker-specific keywords. If the query is non-empty, then favorite, recently used or trending stickers may also be returned.
         *
         * <p> Returns {@link Stickers Stickers} </p>
         *
         * @param stickerType Type of the stickers to return.
         * @param query Search query; a space-separated list of emojis or a keyword prefix. If empty, returns all known installed stickers.
         * @param limit The maximum number of stickers to be returned.
         * @param chatId Chat identifier for which to return stickers. Available custom emoji stickers may be different for different chats.
         */
        public GetStickers(StickerType stickerType, String query, int limit, long chatId) {
            this.stickerType = stickerType;
            this.query = query;
            this.limit = limit;
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1158058819;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns storage usage statistics. Can be called before authorization.
     *
     * <p> Returns {@link StorageStatistics StorageStatistics} </p>
     */
    public static class GetStorageStatistics extends Function<StorageStatistics> {
        /**
         * The maximum number of chats with the largest storage usage for which separate statistics need to be returned. All other chats will be grouped in entries with chatId == 0. If the chat info database is not used, the chatLimit is ignored and is always set to 0.
         */
        public int chatLimit;

        /**
         * Default constructor for a function, which returns storage usage statistics. Can be called before authorization.
         *
         * <p> Returns {@link StorageStatistics StorageStatistics} </p>
         */
        public GetStorageStatistics() {
        }

        /**
         * Creates a function, which returns storage usage statistics. Can be called before authorization.
         *
         * <p> Returns {@link StorageStatistics StorageStatistics} </p>
         *
         * @param chatLimit The maximum number of chats with the largest storage usage for which separate statistics need to be returned. All other chats will be grouped in entries with chatId == 0. If the chat info database is not used, the chatLimit is ignored and is always set to 0.
         */
        public GetStorageStatistics(int chatLimit) {
            this.chatLimit = chatLimit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -853193929;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Quickly returns approximate storage usage statistics. Can be called before authorization.
     *
     * <p> Returns {@link StorageStatisticsFast StorageStatisticsFast} </p>
     */
    public static class GetStorageStatisticsFast extends Function<StorageStatisticsFast> {

        /**
         * Default constructor for a function, which quickly returns approximate storage usage statistics. Can be called before authorization.
         *
         * <p> Returns {@link StorageStatisticsFast StorageStatisticsFast} </p>
         */
        public GetStorageStatisticsFast() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 61368066;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a story.
     *
     * <p> Returns {@link Story Story} </p>
     */
    public static class GetStory extends Function<Story> {
        /**
         * Identifier of the chat that posted the story.
         */
        public long storyPosterChatId;
        /**
         * Story identifier.
         */
        public int storyId;
        /**
         * Pass true to get only locally available information without sending network requests.
         */
        public boolean onlyLocal;

        /**
         * Default constructor for a function, which returns a story.
         *
         * <p> Returns {@link Story Story} </p>
         */
        public GetStory() {
        }

        /**
         * Creates a function, which returns a story.
         *
         * <p> Returns {@link Story Story} </p>
         *
         * @param storyPosterChatId Identifier of the chat that posted the story.
         * @param storyId Story identifier.
         * @param onlyLocal Pass true to get only locally available information without sending network requests.
         */
        public GetStory(long storyPosterChatId, int storyId, boolean onlyLocal) {
            this.storyPosterChatId = storyPosterChatId;
            this.storyId = storyId;
            this.onlyLocal = onlyLocal;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2011076366;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of stories added to the given story album. For optimal performance, the number of returned stories is chosen by TDLib.
     *
     * <p> Returns {@link Stories Stories} </p>
     */
    public static class GetStoryAlbumStories extends Function<Stories> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Story album identifier.
         */
        public int storyAlbumId;
        /**
         * Offset of the first entry to return; use 0 to get results from the first album story.
         */
        public int offset;
        /**
         * The maximum number of stories to be returned. For optimal performance, the number of returned stories is chosen by TDLib and can be smaller than the specified limit.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns the list of stories added to the given story album. For optimal performance, the number of returned stories is chosen by TDLib.
         *
         * <p> Returns {@link Stories Stories} </p>
         */
        public GetStoryAlbumStories() {
        }

        /**
         * Creates a function, which returns the list of stories added to the given story album. For optimal performance, the number of returned stories is chosen by TDLib.
         *
         * <p> Returns {@link Stories Stories} </p>
         *
         * @param chatId Chat identifier.
         * @param storyAlbumId Story album identifier.
         * @param offset Offset of the first entry to return; use 0 to get results from the first album story.
         * @param limit The maximum number of stories to be returned. For optimal performance, the number of returned stories is chosen by TDLib and can be smaller than the specified limit.
         */
        public GetStoryAlbumStories(long chatId, int storyAlbumId, int offset, int limit) {
            this.chatId = chatId;
            this.storyAlbumId = storyAlbumId;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1915090076;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns reactions, which can be chosen for a story.
     *
     * <p> Returns {@link AvailableReactions AvailableReactions} </p>
     */
    public static class GetStoryAvailableReactions extends Function<AvailableReactions> {
        /**
         * Number of reaction per row, 5-25.
         */
        public int rowSize;

        /**
         * Default constructor for a function, which returns reactions, which can be chosen for a story.
         *
         * <p> Returns {@link AvailableReactions AvailableReactions} </p>
         */
        public GetStoryAvailableReactions() {
        }

        /**
         * Creates a function, which returns reactions, which can be chosen for a story.
         *
         * <p> Returns {@link AvailableReactions AvailableReactions} </p>
         *
         * @param rowSize Number of reaction per row, 5-25.
         */
        public GetStoryAvailableReactions(int rowSize) {
            this.rowSize = rowSize;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 595938619;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns interactions with a story. The method can be called only for stories posted on behalf of the current user.
     *
     * <p> Returns {@link StoryInteractions StoryInteractions} </p>
     */
    public static class GetStoryInteractions extends Function<StoryInteractions> {
        /**
         * Story identifier.
         */
        public int storyId;
        /**
         * Query to search for in names, usernames and titles; may be empty to get all relevant interactions.
         */
        public String query;
        /**
         * Pass true to get only interactions by contacts; pass false to get all relevant interactions.
         */
        public boolean onlyContacts;
        /**
         * Pass true to get forwards and reposts first, then reactions, then other views; pass false to get interactions sorted just by interaction date.
         */
        public boolean preferForwards;
        /**
         * Pass true to get interactions with reaction first; pass false to get interactions sorted just by interaction date. Ignored if preferForwards == true.
         */
        public boolean preferWithReaction;
        /**
         * Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         */
        public String offset;
        /**
         * The maximum number of story interactions to return.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns interactions with a story. The method can be called only for stories posted on behalf of the current user.
         *
         * <p> Returns {@link StoryInteractions StoryInteractions} </p>
         */
        public GetStoryInteractions() {
        }

        /**
         * Creates a function, which returns interactions with a story. The method can be called only for stories posted on behalf of the current user.
         *
         * <p> Returns {@link StoryInteractions StoryInteractions} </p>
         *
         * @param storyId Story identifier.
         * @param query Query to search for in names, usernames and titles; may be empty to get all relevant interactions.
         * @param onlyContacts Pass true to get only interactions by contacts; pass false to get all relevant interactions.
         * @param preferForwards Pass true to get forwards and reposts first, then reactions, then other views; pass false to get interactions sorted just by interaction date.
         * @param preferWithReaction Pass true to get interactions with reaction first; pass false to get interactions sorted just by interaction date. Ignored if preferForwards == true.
         * @param offset Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         * @param limit The maximum number of story interactions to return.
         */
        public GetStoryInteractions(int storyId, String query, boolean onlyContacts, boolean preferForwards, boolean preferWithReaction, String offset, int limit) {
            this.storyId = storyId;
            this.query = query;
            this.onlyContacts = onlyContacts;
            this.preferForwards = preferForwards;
            this.preferWithReaction = preferWithReaction;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 483475469;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of chats with non-default notification settings for stories.
     *
     * <p> Returns {@link Chats Chats} </p>
     */
    public static class GetStoryNotificationSettingsExceptions extends Function<Chats> {

        /**
         * Default constructor for a function, which returns the list of chats with non-default notification settings for stories.
         *
         * <p> Returns {@link Chats Chats} </p>
         */
        public GetStoryNotificationSettingsExceptions() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 627715760;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns forwards of a story as a message to public chats and reposts by public channels. Can be used only if the story is posted on behalf of the current user or story.canGetStatistics == true. For optimal performance, the number of returned messages and stories is chosen by TDLib.
     *
     * <p> Returns {@link PublicForwards PublicForwards} </p>
     */
    public static class GetStoryPublicForwards extends Function<PublicForwards> {
        /**
         * The identifier of the poster of the story.
         */
        public long storyPosterChatId;
        /**
         * The identifier of the story.
         */
        public int storyId;
        /**
         * Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         */
        public String offset;
        /**
         * The maximum number of messages and stories to be returned; must be positive and can't be greater than 100. For optimal performance, the number of returned objects is chosen by TDLib and can be smaller than the specified limit.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns forwards of a story as a message to public chats and reposts by public channels. Can be used only if the story is posted on behalf of the current user or story.canGetStatistics == true. For optimal performance, the number of returned messages and stories is chosen by TDLib.
         *
         * <p> Returns {@link PublicForwards PublicForwards} </p>
         */
        public GetStoryPublicForwards() {
        }

        /**
         * Creates a function, which returns forwards of a story as a message to public chats and reposts by public channels. Can be used only if the story is posted on behalf of the current user or story.canGetStatistics == true. For optimal performance, the number of returned messages and stories is chosen by TDLib.
         *
         * <p> Returns {@link PublicForwards PublicForwards} </p>
         *
         * @param storyPosterChatId The identifier of the poster of the story.
         * @param storyId The identifier of the story.
         * @param offset Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         * @param limit The maximum number of messages and stories to be returned; must be positive and can't be greater than 100. For optimal performance, the number of returned objects is chosen by TDLib and can be smaller than the specified limit.
         */
        public GetStoryPublicForwards(long storyPosterChatId, int storyId, String offset, int limit) {
            this.storyPosterChatId = storyPosterChatId;
            this.storyId = storyId;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1810378546;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns detailed statistics about a story. Can be used only if story.canGetStatistics == true.
     *
     * <p> Returns {@link StoryStatistics StoryStatistics} </p>
     */
    public static class GetStoryStatistics extends Function<StoryStatistics> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Story identifier.
         */
        public int storyId;
        /**
         * Pass true if a dark theme is used by the application.
         */
        public boolean isDark;

        /**
         * Default constructor for a function, which returns detailed statistics about a story. Can be used only if story.canGetStatistics == true.
         *
         * <p> Returns {@link StoryStatistics StoryStatistics} </p>
         */
        public GetStoryStatistics() {
        }

        /**
         * Creates a function, which returns detailed statistics about a story. Can be used only if story.canGetStatistics == true.
         *
         * <p> Returns {@link StoryStatistics StoryStatistics} </p>
         *
         * @param chatId Chat identifier.
         * @param storyId Story identifier.
         * @param isDark Pass true if a dark theme is used by the application.
         */
        public GetStoryStatistics(long chatId, int storyId, boolean isDark) {
            this.chatId = chatId;
            this.storyId = storyId;
            this.isDark = isDark;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 982926146;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns suggested name for saving a file in a given directory.
     *
     * <p> Returns {@link Text Text} </p>
     */
    public static class GetSuggestedFileName extends Function<Text> {
        /**
         * Identifier of the file.
         */
        public int fileId;
        /**
         * Directory in which the file is expected to be saved.
         */
        public String directory;

        /**
         * Default constructor for a function, which returns suggested name for saving a file in a given directory.
         *
         * <p> Returns {@link Text Text} </p>
         */
        public GetSuggestedFileName() {
        }

        /**
         * Creates a function, which returns suggested name for saving a file in a given directory.
         *
         * <p> Returns {@link Text Text} </p>
         *
         * @param fileId Identifier of the file.
         * @param directory Directory in which the file is expected to be saved.
         */
        public GetSuggestedFileName(int fileId, String directory) {
            this.fileId = fileId;
            this.directory = directory;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2049399674;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a suggested name for a new sticker set with a given title.
     *
     * <p> Returns {@link Text Text} </p>
     */
    public static class GetSuggestedStickerSetName extends Function<Text> {
        /**
         * Sticker set title; 1-64 characters.
         */
        public String title;

        /**
         * Default constructor for a function, which returns a suggested name for a new sticker set with a given title.
         *
         * <p> Returns {@link Text Text} </p>
         */
        public GetSuggestedStickerSetName() {
        }

        /**
         * Creates a function, which returns a suggested name for a new sticker set with a given title.
         *
         * <p> Returns {@link Text Text} </p>
         *
         * @param title Sticker set title; 1-64 characters.
         */
        public GetSuggestedStickerSetName(String title) {
            this.title = title;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1340995520;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a list of basic group and supergroup chats, which can be used as a discussion group for a channel. Returned basic group chats must be first upgraded to supergroups before they can be set as a discussion group. To set a returned supergroup as a discussion group, access to its old messages must be enabled using toggleSupergroupIsAllHistoryAvailable first.
     *
     * <p> Returns {@link Chats Chats} </p>
     */
    public static class GetSuitableDiscussionChats extends Function<Chats> {

        /**
         * Default constructor for a function, which returns a list of basic group and supergroup chats, which can be used as a discussion group for a channel. Returned basic group chats must be first upgraded to supergroups before they can be set as a discussion group. To set a returned supergroup as a discussion group, access to its old messages must be enabled using toggleSupergroupIsAllHistoryAvailable first.
         *
         * <p> Returns {@link Chats Chats} </p>
         */
        public GetSuitableDiscussionChats() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 49044982;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a list of channel chats, which can be used as a personal chat.
     *
     * <p> Returns {@link Chats Chats} </p>
     */
    public static class GetSuitablePersonalChats extends Function<Chats> {

        /**
         * Default constructor for a function, which returns a list of channel chats, which can be used as a personal chat.
         *
         * <p> Returns {@link Chats Chats} </p>
         */
        public GetSuitablePersonalChats() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1870357515;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a supergroup or a channel by its identifier. This is an offline method if the current user is not a bot.
     *
     * <p> Returns {@link Supergroup Supergroup} </p>
     */
    public static class GetSupergroup extends Function<Supergroup> {
        /**
         * Supergroup or channel identifier.
         */
        public long supergroupId;

        /**
         * Default constructor for a function, which returns information about a supergroup or a channel by its identifier. This is an offline method if the current user is not a bot.
         *
         * <p> Returns {@link Supergroup Supergroup} </p>
         */
        public GetSupergroup() {
        }

        /**
         * Creates a function, which returns information about a supergroup or a channel by its identifier. This is an offline method if the current user is not a bot.
         *
         * <p> Returns {@link Supergroup Supergroup} </p>
         *
         * @param supergroupId Supergroup or channel identifier.
         */
        public GetSupergroup(long supergroupId) {
            this.supergroupId = supergroupId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 989663458;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns full information about a supergroup or a channel by its identifier, cached for up to 1 minute.
     *
     * <p> Returns {@link SupergroupFullInfo SupergroupFullInfo} </p>
     */
    public static class GetSupergroupFullInfo extends Function<SupergroupFullInfo> {
        /**
         * Supergroup or channel identifier.
         */
        public long supergroupId;

        /**
         * Default constructor for a function, which returns full information about a supergroup or a channel by its identifier, cached for up to 1 minute.
         *
         * <p> Returns {@link SupergroupFullInfo SupergroupFullInfo} </p>
         */
        public GetSupergroupFullInfo() {
        }

        /**
         * Creates a function, which returns full information about a supergroup or a channel by its identifier, cached for up to 1 minute.
         *
         * <p> Returns {@link SupergroupFullInfo SupergroupFullInfo} </p>
         *
         * @param supergroupId Supergroup or channel identifier.
         */
        public GetSupergroupFullInfo(long supergroupId) {
            this.supergroupId = supergroupId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1099776056;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about members or banned users in a supergroup or channel. Can be used only if supergroupFullInfo.canGetMembers == true; additionally, administrator privileges may be required for some filters.
     *
     * <p> Returns {@link ChatMembers ChatMembers} </p>
     */
    public static class GetSupergroupMembers extends Function<ChatMembers> {
        /**
         * Identifier of the supergroup or channel.
         */
        public long supergroupId;
        /**
         * The type of users to return; pass null to use supergroupMembersFilterRecent.
         */
        public SupergroupMembersFilter filter;
        /**
         * Number of users to skip.
         */
        public int offset;
        /**
         * The maximum number of users to be returned; up to 200.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns information about members or banned users in a supergroup or channel. Can be used only if supergroupFullInfo.canGetMembers == true; additionally, administrator privileges may be required for some filters.
         *
         * <p> Returns {@link ChatMembers ChatMembers} </p>
         */
        public GetSupergroupMembers() {
        }

        /**
         * Creates a function, which returns information about members or banned users in a supergroup or channel. Can be used only if supergroupFullInfo.canGetMembers == true; additionally, administrator privileges may be required for some filters.
         *
         * <p> Returns {@link ChatMembers ChatMembers} </p>
         *
         * @param supergroupId Identifier of the supergroup or channel.
         * @param filter The type of users to return; pass null to use supergroupMembersFilterRecent.
         * @param offset Number of users to skip.
         * @param limit The maximum number of users to be returned; up to 200.
         */
        public GetSupergroupMembers(long supergroupId, SupergroupMembersFilter filter, int offset, int limit) {
            this.supergroupId = supergroupId;
            this.filter = filter;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -570940984;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns localized name of the Telegram support user; for Telegram support only.
     *
     * <p> Returns {@link Text Text} </p>
     */
    public static class GetSupportName extends Function<Text> {

        /**
         * Default constructor for a function, which returns localized name of the Telegram support user; for Telegram support only.
         *
         * <p> Returns {@link Text Text} </p>
         */
        public GetSupportName() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1302205794;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a user who can be contacted to get support.
     *
     * <p> Returns {@link User User} </p>
     */
    public static class GetSupportUser extends Function<User> {

        /**
         * Default constructor for a function, which returns a user who can be contacted to get support.
         *
         * <p> Returns {@link User User} </p>
         */
        public GetSupportUser() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1733497700;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about the current temporary password.
     *
     * <p> Returns {@link TemporaryPasswordState TemporaryPasswordState} </p>
     */
    public static class GetTemporaryPasswordState extends Function<TemporaryPasswordState> {

        /**
         * Default constructor for a function, which returns information about the current temporary password.
         *
         * <p> Returns {@link TemporaryPasswordState TemporaryPasswordState} </p>
         */
        public GetTemporaryPasswordState() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -12670830;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an example of usage of a custom text composition style.
     *
     * <p> Returns {@link TextCompositionStyleExample TextCompositionStyleExample} </p>
     */
    public static class GetTextCompositionStyleExample extends Function<TextCompositionStyleExample> {
        /**
         * Name of the style.
         */
        public String name;
        /**
         * 0-based unique number of the requested example; must be non-negative and less than getOption(&quot;text_composition_style_example_count&quot;).
         */
        public int exampleNumber;

        /**
         * Default constructor for a function, which returns an example of usage of a custom text composition style.
         *
         * <p> Returns {@link TextCompositionStyleExample TextCompositionStyleExample} </p>
         */
        public GetTextCompositionStyleExample() {
        }

        /**
         * Creates a function, which returns an example of usage of a custom text composition style.
         *
         * <p> Returns {@link TextCompositionStyleExample TextCompositionStyleExample} </p>
         *
         * @param name Name of the style.
         * @param exampleNumber 0-based unique number of the requested example; must be non-negative and less than getOption(&quot;text_composition_style_example_count&quot;).
         */
        public GetTextCompositionStyleExample(String name, int exampleNumber) {
            this.name = name;
            this.exampleNumber = exampleNumber;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1657648173;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns all entities (mentions, hashtags, cashtags, bot commands, bank card numbers, URLs, and email addresses) found in the text. Can be called synchronously.
     *
     * <p> Returns {@link TextEntities TextEntities} </p>
     */
    public static class GetTextEntities extends Function<TextEntities> {
        /**
         * The text in which to look for entities.
         */
        public String text;

        /**
         * Default constructor for a function, which returns all entities (mentions, hashtags, cashtags, bot commands, bank card numbers, URLs, and email addresses) found in the text. Can be called synchronously.
         *
         * <p> Returns {@link TextEntities TextEntities} </p>
         */
        public GetTextEntities() {
        }

        /**
         * Creates a function, which returns all entities (mentions, hashtags, cashtags, bot commands, bank card numbers, URLs, and email addresses) found in the text. Can be called synchronously.
         *
         * <p> Returns {@link TextEntities TextEntities} </p>
         *
         * @param text The text in which to look for entities.
         */
        public GetTextEntities(String text) {
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -341490693;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Converts a themeParameters object to corresponding JSON-serialized string. Can be called synchronously.
     *
     * <p> Returns {@link Text Text} </p>
     */
    public static class GetThemeParametersJsonString extends Function<Text> {
        /**
         * Theme parameters to convert to JSON.
         */
        public ThemeParameters theme;

        /**
         * Default constructor for a function, which converts a themeParameters object to corresponding JSON-serialized string. Can be called synchronously.
         *
         * <p> Returns {@link Text Text} </p>
         */
        public GetThemeParametersJsonString() {
        }

        /**
         * Creates a function, which converts a themeParameters object to corresponding JSON-serialized string. Can be called synchronously.
         *
         * <p> Returns {@link Text Text} </p>
         *
         * @param theme Theme parameters to convert to JSON.
         */
        public GetThemeParametersJsonString(ThemeParameters theme) {
            this.theme = theme;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1850145288;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns up to 8 emoji statuses, which must be shown in the emoji status list for chats.
     *
     * <p> Returns {@link EmojiStatusCustomEmojis EmojiStatusCustomEmojis} </p>
     */
    public static class GetThemedChatEmojiStatuses extends Function<EmojiStatusCustomEmojis> {

        /**
         * Default constructor for a function, which returns up to 8 emoji statuses, which must be shown in the emoji status list for chats.
         *
         * <p> Returns {@link EmojiStatusCustomEmojis EmojiStatusCustomEmojis} </p>
         */
        public GetThemedChatEmojiStatuses() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1924568314;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns up to 8 emoji statuses, which must be shown right after the default Premium Badge in the emoji status list for self status.
     *
     * <p> Returns {@link EmojiStatusCustomEmojis EmojiStatusCustomEmojis} </p>
     */
    public static class GetThemedEmojiStatuses extends Function<EmojiStatusCustomEmojis> {

        /**
         * Default constructor for a function, which returns up to 8 emoji statuses, which must be shown right after the default Premium Badge in the emoji status list for self status.
         *
         * <p> Returns {@link EmojiStatusCustomEmojis EmojiStatusCustomEmojis} </p>
         */
        public GetThemedEmojiStatuses() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1468220543;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of supported time zones.
     *
     * <p> Returns {@link TimeZones TimeZones} </p>
     */
    public static class GetTimeZones extends Function<TimeZones> {

        /**
         * Default constructor for a function, which returns the list of supported time zones.
         *
         * <p> Returns {@link TimeZones TimeZones} </p>
         */
        public GetTimeZones() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1340268632;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns detailed Toncoin revenue statistics of the current user.
     *
     * <p> Returns {@link TonRevenueStatistics TonRevenueStatistics} </p>
     */
    public static class GetTonRevenueStatistics extends Function<TonRevenueStatistics> {
        /**
         * Pass true if a dark theme is used by the application.
         */
        public boolean isDark;

        /**
         * Default constructor for a function, which returns detailed Toncoin revenue statistics of the current user.
         *
         * <p> Returns {@link TonRevenueStatistics TonRevenueStatistics} </p>
         */
        public GetTonRevenueStatistics() {
        }

        /**
         * Creates a function, which returns detailed Toncoin revenue statistics of the current user.
         *
         * <p> Returns {@link TonRevenueStatistics TonRevenueStatistics} </p>
         *
         * @param isDark Pass true if a dark theme is used by the application.
         */
        public GetTonRevenueStatistics(boolean isDark) {
            this.isDark = isDark;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1315591160;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of Toncoin transactions of the current user.
     *
     * <p> Returns {@link TonTransactions TonTransactions} </p>
     */
    public static class GetTonTransactions extends Function<TonTransactions> {
        /**
         * Direction of the transactions to receive; pass null to get all transactions.
         */
        public TransactionDirection direction;
        /**
         * Offset of the first transaction to return as received from the previous request; use empty string to get the first chunk of results.
         */
        public String offset;
        /**
         * The maximum number of transactions to return.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns the list of Toncoin transactions of the current user.
         *
         * <p> Returns {@link TonTransactions TonTransactions} </p>
         */
        public GetTonTransactions() {
        }

        /**
         * Creates a function, which returns the list of Toncoin transactions of the current user.
         *
         * <p> Returns {@link TonTransactions TonTransactions} </p>
         *
         * @param direction Direction of the transactions to receive; pass null to get all transactions.
         * @param offset Offset of the first transaction to return as received from the previous request; use empty string to get the first chunk of results.
         * @param limit The maximum number of transactions to return.
         */
        public GetTonTransactions(TransactionDirection direction, String offset, int limit) {
            this.direction = direction;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1935011115;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a URL for Toncoin withdrawal from the current user's account. The user must have at least 10 toncoins to withdraw and can withdraw up to 100000 Toncoins in one transaction.
     *
     * <p> Returns {@link HttpUrl HttpUrl} </p>
     */
    public static class GetTonWithdrawalUrl extends Function<HttpUrl> {
        /**
         * The 2-step verification password of the current user.
         */
        public String password;

        /**
         * Default constructor for a function, which returns a URL for Toncoin withdrawal from the current user's account. The user must have at least 10 toncoins to withdraw and can withdraw up to 100000 Toncoins in one transaction.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         */
        public GetTonWithdrawalUrl() {
        }

        /**
         * Creates a function, which returns a URL for Toncoin withdrawal from the current user's account. The user must have at least 10 toncoins to withdraw and can withdraw up to 100000 Toncoins in one transaction.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         *
         * @param password The 2-step verification password of the current user.
         */
        public GetTonWithdrawalUrl(String password) {
            this.password = password;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1482519601;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a list of frequently used chats.
     *
     * <p> Returns {@link Chats Chats} </p>
     */
    public static class GetTopChats extends Function<Chats> {
        /**
         * Category of chats to be returned.
         */
        public TopChatCategory category;
        /**
         * The maximum number of chats to be returned; up to 30.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns a list of frequently used chats.
         *
         * <p> Returns {@link Chats Chats} </p>
         */
        public GetTopChats() {
        }

        /**
         * Creates a function, which returns a list of frequently used chats.
         *
         * <p> Returns {@link Chats Chats} </p>
         *
         * @param category Category of chats to be returned.
         * @param limit The maximum number of chats to be returned; up to 30.
         */
        public GetTopChats(TopChatCategory category, int limit) {
            this.category = category;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -388410847;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a list of trending sticker sets. For optimal performance, the number of returned sticker sets is chosen by TDLib.
     *
     * <p> Returns {@link TrendingStickerSets TrendingStickerSets} </p>
     */
    public static class GetTrendingStickerSets extends Function<TrendingStickerSets> {
        /**
         * Type of the sticker sets to return.
         */
        public StickerType stickerType;
        /**
         * The offset from which to return the sticker sets; must be non-negative.
         */
        public int offset;
        /**
         * The maximum number of sticker sets to be returned; up to 100. For optimal performance, the number of returned sticker sets is chosen by TDLib and can be smaller than the specified limit, even if the end of the list has not been reached.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns a list of trending sticker sets. For optimal performance, the number of returned sticker sets is chosen by TDLib.
         *
         * <p> Returns {@link TrendingStickerSets TrendingStickerSets} </p>
         */
        public GetTrendingStickerSets() {
        }

        /**
         * Creates a function, which returns a list of trending sticker sets. For optimal performance, the number of returned sticker sets is chosen by TDLib.
         *
         * <p> Returns {@link TrendingStickerSets TrendingStickerSets} </p>
         *
         * @param stickerType Type of the sticker sets to return.
         * @param offset The offset from which to return the sticker sets; must be non-negative.
         * @param limit The maximum number of sticker sets to be returned; up to 100. For optimal performance, the number of returned sticker sets is chosen by TDLib and can be smaller than the specified limit, even if the end of the list has not been reached.
         */
        public GetTrendingStickerSets(StickerType stickerType, int offset, int limit) {
            this.stickerType = stickerType;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -531085986;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about an upgraded gift by its name.
     *
     * <p> Returns {@link UpgradedGift UpgradedGift} </p>
     */
    public static class GetUpgradedGift extends Function<UpgradedGift> {
        /**
         * Unique name of the upgraded gift.
         */
        public String name;

        /**
         * Default constructor for a function, which returns information about an upgraded gift by its name.
         *
         * <p> Returns {@link UpgradedGift UpgradedGift} </p>
         */
        public GetUpgradedGift() {
        }

        /**
         * Creates a function, which returns information about an upgraded gift by its name.
         *
         * <p> Returns {@link UpgradedGift UpgradedGift} </p>
         *
         * @param name Unique name of the upgraded gift.
         */
        public GetUpgradedGift(String name) {
            this.name = name;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1331821135;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns available upgraded gift emoji statuses for self status.
     *
     * <p> Returns {@link EmojiStatuses EmojiStatuses} </p>
     */
    public static class GetUpgradedGiftEmojiStatuses extends Function<EmojiStatuses> {

        /**
         * Default constructor for a function, which returns available upgraded gift emoji statuses for self status.
         *
         * <p> Returns {@link EmojiStatuses EmojiStatuses} </p>
         */
        public GetUpgradedGiftEmojiStatuses() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1748975723;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about value of an upgraded gift by its name.
     *
     * <p> Returns {@link UpgradedGiftValueInfo UpgradedGiftValueInfo} </p>
     */
    public static class GetUpgradedGiftValueInfo extends Function<UpgradedGiftValueInfo> {
        /**
         * Unique name of the upgraded gift.
         */
        public String name;

        /**
         * Default constructor for a function, which returns information about value of an upgraded gift by its name.
         *
         * <p> Returns {@link UpgradedGiftValueInfo UpgradedGiftValueInfo} </p>
         */
        public GetUpgradedGiftValueInfo() {
        }

        /**
         * Creates a function, which returns information about value of an upgraded gift by its name.
         *
         * <p> Returns {@link UpgradedGiftValueInfo UpgradedGiftValueInfo} </p>
         *
         * @param name Unique name of the upgraded gift.
         */
        public GetUpgradedGiftValueInfo(String name) {
            this.name = name;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1818813417;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns all possible variants of upgraded gifts for a regular gift.
     *
     * <p> Returns {@link GiftUpgradeVariants GiftUpgradeVariants} </p>
     */
    public static class GetUpgradedGiftVariants extends Function<GiftUpgradeVariants> {
        /**
         * Identifier of the regular gift.
         */
        public long regularGiftId;
        /**
         * Pass true to get models that can be obtained by upgrading a regular gift.
         */
        public boolean returnUpgradeModels;
        /**
         * Pass true to get models that can be obtained by crafting a gift from upgraded gifts.
         */
        public boolean returnCraftModels;

        /**
         * Default constructor for a function, which returns all possible variants of upgraded gifts for a regular gift.
         *
         * <p> Returns {@link GiftUpgradeVariants GiftUpgradeVariants} </p>
         */
        public GetUpgradedGiftVariants() {
        }

        /**
         * Creates a function, which returns all possible variants of upgraded gifts for a regular gift.
         *
         * <p> Returns {@link GiftUpgradeVariants GiftUpgradeVariants} </p>
         *
         * @param regularGiftId Identifier of the regular gift.
         * @param returnUpgradeModels Pass true to get models that can be obtained by upgrading a regular gift.
         * @param returnCraftModels Pass true to get models that can be obtained by crafting a gift from upgraded gifts.
         */
        public GetUpgradedGiftVariants(long regularGiftId, boolean returnUpgradeModels, boolean returnCraftModels) {
            this.regularGiftId = regularGiftId;
            this.returnUpgradeModels = returnUpgradeModels;
            this.returnCraftModels = returnCraftModels;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1388671540;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a URL for upgraded gift withdrawal in the TON blockchain as an NFT; requires owner privileges for gifts owned by a chat.
     *
     * <p> Returns {@link HttpUrl HttpUrl} </p>
     */
    public static class GetUpgradedGiftWithdrawalUrl extends Function<HttpUrl> {
        /**
         * Identifier of the gift.
         */
        public String receivedGiftId;
        /**
         * The 2-step verification password of the current user.
         */
        public String password;

        /**
         * Default constructor for a function, which returns a URL for upgraded gift withdrawal in the TON blockchain as an NFT; requires owner privileges for gifts owned by a chat.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         */
        public GetUpgradedGiftWithdrawalUrl() {
        }

        /**
         * Creates a function, which returns a URL for upgraded gift withdrawal in the TON blockchain as an NFT; requires owner privileges for gifts owned by a chat.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         *
         * @param receivedGiftId Identifier of the gift.
         * @param password The 2-step verification password of the current user.
         */
        public GetUpgradedGiftWithdrawalUrl(String receivedGiftId, String password) {
            this.receivedGiftId = receivedGiftId;
            this.password = password;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -784331188;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns promotional animation for upgraded gifts.
     *
     * <p> Returns {@link Animation Animation} </p>
     */
    public static class GetUpgradedGiftsPromotionalAnimation extends Function<Animation> {

        /**
         * Default constructor for a function, which returns promotional animation for upgraded gifts.
         *
         * <p> Returns {@link Animation Animation} </p>
         */
        public GetUpgradedGiftsPromotionalAnimation() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1944094513;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a user by their identifier. This is an offline method if the current user is not a bot.
     *
     * <p> Returns {@link User User} </p>
     */
    public static class GetUser extends Function<User> {
        /**
         * User identifier.
         */
        public long userId;

        /**
         * Default constructor for a function, which returns information about a user by their identifier. This is an offline method if the current user is not a bot.
         *
         * <p> Returns {@link User User} </p>
         */
        public GetUser() {
        }

        /**
         * Creates a function, which returns information about a user by their identifier. This is an offline method if the current user is not a bot.
         *
         * <p> Returns {@link User User} </p>
         *
         * @param userId User identifier.
         */
        public GetUser(long userId) {
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1117363211;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of boosts applied to a chat by a given user; requires administrator rights in the chat; for bots only.
     *
     * <p> Returns {@link FoundChatBoosts FoundChatBoosts} </p>
     */
    public static class GetUserChatBoosts extends Function<FoundChatBoosts> {
        /**
         * Identifier of the chat.
         */
        public long chatId;
        /**
         * Identifier of the user.
         */
        public long userId;

        /**
         * Default constructor for a function, which returns the list of boosts applied to a chat by a given user; requires administrator rights in the chat; for bots only.
         *
         * <p> Returns {@link FoundChatBoosts FoundChatBoosts} </p>
         */
        public GetUserChatBoosts() {
        }

        /**
         * Creates a function, which returns the list of boosts applied to a chat by a given user; requires administrator rights in the chat; for bots only.
         *
         * <p> Returns {@link FoundChatBoosts FoundChatBoosts} </p>
         *
         * @param chatId Identifier of the chat.
         * @param userId Identifier of the user.
         */
        public GetUserChatBoosts(long chatId, long userId) {
            this.chatId = chatId;
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1190205543;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns full information about a user by their identifier.
     *
     * <p> Returns {@link UserFullInfo UserFullInfo} </p>
     */
    public static class GetUserFullInfo extends Function<UserFullInfo> {
        /**
         * User identifier.
         */
        public long userId;

        /**
         * Default constructor for a function, which returns full information about a user by their identifier.
         *
         * <p> Returns {@link UserFullInfo UserFullInfo} </p>
         */
        public GetUserFullInfo() {
        }

        /**
         * Creates a function, which returns full information about a user by their identifier.
         *
         * <p> Returns {@link UserFullInfo UserFullInfo} </p>
         *
         * @param userId User identifier.
         */
        public GetUserFullInfo(long userId) {
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -776823720;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an HTTPS link, which can be used to get information about the current user.
     *
     * <p> Returns {@link UserLink UserLink} </p>
     */
    public static class GetUserLink extends Function<UserLink> {

        /**
         * Default constructor for a function, which returns an HTTPS link, which can be used to get information about the current user.
         *
         * <p> Returns {@link UserLink UserLink} </p>
         */
        public GetUserLink() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1226839270;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the current privacy settings.
     *
     * <p> Returns {@link UserPrivacySettingRules UserPrivacySettingRules} </p>
     */
    public static class GetUserPrivacySettingRules extends Function<UserPrivacySettingRules> {
        /**
         * The privacy setting.
         */
        public UserPrivacySetting setting;

        /**
         * Default constructor for a function, which returns the current privacy settings.
         *
         * <p> Returns {@link UserPrivacySettingRules UserPrivacySettingRules} </p>
         */
        public GetUserPrivacySettingRules() {
        }

        /**
         * Creates a function, which returns the current privacy settings.
         *
         * <p> Returns {@link UserPrivacySettingRules UserPrivacySettingRules} </p>
         *
         * @param setting The privacy setting.
         */
        public GetUserPrivacySettingRules(UserPrivacySetting setting) {
            this.setting = setting;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2077223311;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of profile audio files of a user.
     *
     * <p> Returns {@link Audios Audios} </p>
     */
    public static class GetUserProfileAudios extends Function<Audios> {
        /**
         * User identifier.
         */
        public long userId;
        /**
         * The number of audio files to skip; must be non-negative.
         */
        public int offset;
        /**
         * The maximum number of audio files to be returned; up to 100.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns the list of profile audio files of a user.
         *
         * <p> Returns {@link Audios Audios} </p>
         */
        public GetUserProfileAudios() {
        }

        /**
         * Creates a function, which returns the list of profile audio files of a user.
         *
         * <p> Returns {@link Audios Audios} </p>
         *
         * @param userId User identifier.
         * @param offset The number of audio files to skip; must be non-negative.
         * @param limit The maximum number of audio files to be returned; up to 100.
         */
        public GetUserProfileAudios(long userId, int offset, int limit) {
            this.userId = userId;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -208876086;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the profile photos of a user. Personal and public photo aren't returned.
     *
     * <p> Returns {@link ChatPhotos ChatPhotos} </p>
     */
    public static class GetUserProfilePhotos extends Function<ChatPhotos> {
        /**
         * User identifier.
         */
        public long userId;
        /**
         * The number of photos to skip; must be non-negative.
         */
        public int offset;
        /**
         * The maximum number of photos to be returned; up to 100.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns the profile photos of a user. Personal and public photo aren't returned.
         *
         * <p> Returns {@link ChatPhotos ChatPhotos} </p>
         */
        public GetUserProfilePhotos() {
        }

        /**
         * Creates a function, which returns the profile photos of a user. Personal and public photo aren't returned.
         *
         * <p> Returns {@link ChatPhotos ChatPhotos} </p>
         *
         * @param userId User identifier.
         * @param offset The number of photos to skip; must be non-negative.
         * @param limit The maximum number of photos to be returned; up to 100.
         */
        public GetUserProfilePhotos(long userId, int offset, int limit) {
            this.userId = userId;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -908132798;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns support information for the given user; for Telegram support only.
     *
     * <p> Returns {@link UserSupportInfo UserSupportInfo} </p>
     */
    public static class GetUserSupportInfo extends Function<UserSupportInfo> {
        /**
         * User identifier.
         */
        public long userId;

        /**
         * Default constructor for a function, which returns support information for the given user; for Telegram support only.
         *
         * <p> Returns {@link UserSupportInfo UserSupportInfo} </p>
         */
        public GetUserSupportInfo() {
        }

        /**
         * Creates a function, which returns support information for the given user; for Telegram support only.
         *
         * <p> Returns {@link UserSupportInfo UserSupportInfo} </p>
         *
         * @param userId User identifier.
         */
        public GetUserSupportInfo(long userId) {
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1957008133;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the list of participant identifiers, on whose behalf a video chat in the chat can be joined.
     *
     * <p> Returns {@link MessageSenders MessageSenders} </p>
     */
    public static class GetVideoChatAvailableParticipants extends Function<MessageSenders> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which returns the list of participant identifiers, on whose behalf a video chat in the chat can be joined.
         *
         * <p> Returns {@link MessageSenders MessageSenders} </p>
         */
        public GetVideoChatAvailableParticipants() {
        }

        /**
         * Creates a function, which returns the list of participant identifiers, on whose behalf a video chat in the chat can be joined.
         *
         * <p> Returns {@link MessageSenders MessageSenders} </p>
         *
         * @param chatId Chat identifier.
         */
        public GetVideoChatAvailableParticipants(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1000496379;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns invite link to a video chat in a public chat.
     *
     * <p> Returns {@link HttpUrl HttpUrl} </p>
     */
    public static class GetVideoChatInviteLink extends Function<HttpUrl> {
        /**
         * Group call identifier.
         */
        public int groupCallId;
        /**
         * Pass true if the invite link needs to contain an invite hash, passing which to joinVideoChat would allow the invited user to unmute themselves. Requires groupCall.canBeManaged right.
         */
        public boolean canSelfUnmute;

        /**
         * Default constructor for a function, which returns invite link to a video chat in a public chat.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         */
        public GetVideoChatInviteLink() {
        }

        /**
         * Creates a function, which returns invite link to a video chat in a public chat.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         *
         * @param groupCallId Group call identifier.
         * @param canSelfUnmute Pass true if the invite link needs to contain an invite hash, passing which to joinVideoChat would allow the invited user to unmute themselves. Requires groupCall.canBeManaged right.
         */
        public GetVideoChatInviteLink(int groupCallId, boolean canSelfUnmute) {
            this.groupCallId = groupCallId;
            this.canSelfUnmute = canSelfUnmute;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1394707321;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns RTMP URL for streaming to the video chat of a chat; requires canManageVideoChats administrator right.
     *
     * <p> Returns {@link RtmpUrl RtmpUrl} </p>
     */
    public static class GetVideoChatRtmpUrl extends Function<RtmpUrl> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which returns RTMP URL for streaming to the video chat of a chat; requires canManageVideoChats administrator right.
         *
         * <p> Returns {@link RtmpUrl RtmpUrl} </p>
         */
        public GetVideoChatRtmpUrl() {
        }

        /**
         * Creates a function, which returns RTMP URL for streaming to the video chat of a chat; requires canManageVideoChats administrator right.
         *
         * <p> Returns {@link RtmpUrl RtmpUrl} </p>
         *
         * @param chatId Chat identifier.
         */
        public GetVideoChatRtmpUrl(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1210784543;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns advertisements to be shown while a video from a message is watched. Available only if messageProperties.canGetVideoAdvertisements.
     *
     * <p> Returns {@link VideoMessageAdvertisements VideoMessageAdvertisements} </p>
     */
    public static class GetVideoMessageAdvertisements extends Function<VideoMessageAdvertisements> {
        /**
         * Identifier of the chat with the message.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;

        /**
         * Default constructor for a function, which returns advertisements to be shown while a video from a message is watched. Available only if messageProperties.canGetVideoAdvertisements.
         *
         * <p> Returns {@link VideoMessageAdvertisements VideoMessageAdvertisements} </p>
         */
        public GetVideoMessageAdvertisements() {
        }

        /**
         * Creates a function, which returns advertisements to be shown while a video from a message is watched. Available only if messageProperties.canGetVideoAdvertisements.
         *
         * <p> Returns {@link VideoMessageAdvertisements VideoMessageAdvertisements} </p>
         *
         * @param chatId Identifier of the chat with the message.
         * @param messageId Identifier of the message.
         */
        public GetVideoMessageAdvertisements(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -285681331;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an HTTPS URL of a Web App to open after a link of the type internalLinkTypeWebApp is clicked.
     *
     * <p> Returns {@link HttpUrl HttpUrl} </p>
     */
    public static class GetWebAppLinkUrl extends Function<HttpUrl> {
        /**
         * Identifier of the chat in which the link was clicked; pass 0 if none.
         */
        public long chatId;
        /**
         * Identifier of the target bot.
         */
        public long botUserId;
        /**
         * Short name of the Web App.
         */
        public String webAppShortName;
        /**
         * Start parameter from internalLinkTypeWebApp.
         */
        public String startParameter;
        /**
         * Pass true if the current user allowed the bot to send them messages.
         */
        public boolean allowWriteAccess;
        /**
         * Parameters to use to open the Web App.
         */
        public WebAppOpenParameters parameters;

        /**
         * Default constructor for a function, which returns an HTTPS URL of a Web App to open after a link of the type internalLinkTypeWebApp is clicked.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         */
        public GetWebAppLinkUrl() {
        }

        /**
         * Creates a function, which returns an HTTPS URL of a Web App to open after a link of the type internalLinkTypeWebApp is clicked.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         *
         * @param chatId Identifier of the chat in which the link was clicked; pass 0 if none.
         * @param botUserId Identifier of the target bot.
         * @param webAppShortName Short name of the Web App.
         * @param startParameter Start parameter from internalLinkTypeWebApp.
         * @param allowWriteAccess Pass true if the current user allowed the bot to send them messages.
         * @param parameters Parameters to use to open the Web App.
         */
        public GetWebAppLinkUrl(long chatId, long botUserId, String webAppShortName, String startParameter, boolean allowWriteAccess, WebAppOpenParameters parameters) {
            this.chatId = chatId;
            this.botUserId = botUserId;
            this.webAppShortName = webAppShortName;
            this.startParameter = startParameter;
            this.allowWriteAccess = allowWriteAccess;
            this.parameters = parameters;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1627284161;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns a default placeholder for Web Apps of a bot. This is an offline method. Returns a 404 error if the placeholder isn't known.
     *
     * <p> Returns {@link Outline Outline} </p>
     */
    public static class GetWebAppPlaceholder extends Function<Outline> {
        /**
         * Identifier of the target bot.
         */
        public long botUserId;

        /**
         * Default constructor for a function, which returns a default placeholder for Web Apps of a bot. This is an offline method. Returns a 404 error if the placeholder isn't known.
         *
         * <p> Returns {@link Outline Outline} </p>
         */
        public GetWebAppPlaceholder() {
        }

        /**
         * Creates a function, which returns a default placeholder for Web Apps of a bot. This is an offline method. Returns a 404 error if the placeholder isn't known.
         *
         * <p> Returns {@link Outline Outline} </p>
         *
         * @param botUserId Identifier of the target bot.
         */
        public GetWebAppPlaceholder(long botUserId) {
            this.botUserId = botUserId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 583470479;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an HTTPS URL of a Web App to open from the side menu, a keyboardButtonTypeWebApp button, or an inlineQueryResultsButtonTypeWebApp button.
     *
     * <p> Returns {@link HttpUrl HttpUrl} </p>
     */
    public static class GetWebAppUrl extends Function<HttpUrl> {
        /**
         * Identifier of the target bot. If the bot is restricted for the current user, then show an error instead of calling the method.
         */
        public long botUserId;
        /**
         * The URL from a keyboardButtonTypeWebApp button, inlineQueryResultsButtonTypeWebApp button, or an empty string when the bot is opened from the side menu.
         */
        public String url;
        /**
         * Parameters to use to open the Web App.
         */
        public WebAppOpenParameters parameters;

        /**
         * Default constructor for a function, which returns an HTTPS URL of a Web App to open from the side menu, a keyboardButtonTypeWebApp button, or an inlineQueryResultsButtonTypeWebApp button.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         */
        public GetWebAppUrl() {
        }

        /**
         * Creates a function, which returns an HTTPS URL of a Web App to open from the side menu, a keyboardButtonTypeWebApp button, or an inlineQueryResultsButtonTypeWebApp button.
         *
         * <p> Returns {@link HttpUrl HttpUrl} </p>
         *
         * @param botUserId Identifier of the target bot. If the bot is restricted for the current user, then show an error instead of calling the method.
         * @param url The URL from a keyboardButtonTypeWebApp button, inlineQueryResultsButtonTypeWebApp button, or an empty string when the bot is opened from the side menu.
         * @param parameters Parameters to use to open the Web App.
         */
        public GetWebAppUrl(long botUserId, String url, WebAppOpenParameters parameters) {
            this.botUserId = botUserId;
            this.url = url;
            this.parameters = parameters;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1526784188;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns an instant view version of a web page if available. This is an offline method if onlyLocal is true. Returns a 404 error if the web page has no instant view page.
     *
     * <p> Returns {@link WebPageInstantView WebPageInstantView} </p>
     */
    public static class GetWebPageInstantView extends Function<WebPageInstantView> {
        /**
         * The web page URL.
         */
        public String url;
        /**
         * Pass true to get only locally available information without sending network requests.
         */
        public boolean onlyLocal;

        /**
         * Default constructor for a function, which returns an instant view version of a web page if available. This is an offline method if onlyLocal is true. Returns a 404 error if the web page has no instant view page.
         *
         * <p> Returns {@link WebPageInstantView WebPageInstantView} </p>
         */
        public GetWebPageInstantView() {
        }

        /**
         * Creates a function, which returns an instant view version of a web page if available. This is an offline method if onlyLocal is true. Returns a 404 error if the web page has no instant view page.
         *
         * <p> Returns {@link WebPageInstantView WebPageInstantView} </p>
         *
         * @param url The web page URL.
         * @param onlyLocal Pass true to get only locally available information without sending network requests.
         */
        public GetWebPageInstantView(String url, boolean onlyLocal) {
            this.url = url;
            this.onlyLocal = onlyLocal;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1741395197;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Allows to buy a Telegram Premium subscription for another user with payment in Telegram Stars; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class GiftPremiumWithStars extends Function<Ok> {
        /**
         * Identifier of the user which will receive Telegram Premium.
         */
        public long userId;
        /**
         * The number of Telegram Stars to pay for subscription.
         */
        public long starCount;
        /**
         * Number of months the Telegram Premium subscription will be active for the user.
         */
        public int monthCount;
        /**
         * Text to show to the user receiving Telegram Premium; 0-getOption(&quot;gift_text_length_max&quot;) characters. Only Bold, Italic, Underline, Strikethrough, Spoiler, CustomEmoji, and DateTime entities are allowed.
         */
        public FormattedText text;

        /**
         * Default constructor for a function, which allows to buy a Telegram Premium subscription for another user with payment in Telegram Stars; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public GiftPremiumWithStars() {
        }

        /**
         * Creates a function, which allows to buy a Telegram Premium subscription for another user with payment in Telegram Stars; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param userId Identifier of the user which will receive Telegram Premium.
         * @param starCount The number of Telegram Stars to pay for subscription.
         * @param monthCount Number of months the Telegram Premium subscription will be active for the user.
         * @param text Text to show to the user receiving Telegram Premium; 0-getOption(&quot;gift_text_length_max&quot;) characters. Only Bold, Italic, Underline, Strikethrough, Spoiler, CustomEmoji, and DateTime entities are allowed.
         */
        public GiftPremiumWithStars(long userId, long starCount, int monthCount, FormattedText text) {
            this.userId = userId;
            this.starCount = starCount;
            this.monthCount = monthCount;
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2058395432;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Hides the list of contacts that have close birthdays for 24 hours.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class HideContactCloseBirthdays extends Function<Ok> {

        /**
         * Default constructor for a function, which hides the list of contacts that have close birthdays for 24 hours.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public HideContactCloseBirthdays() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1163065221;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Hides a suggested action.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class HideSuggestedAction extends Function<Ok> {
        /**
         * Suggested action to hide.
         */
        public SuggestedAction action;

        /**
         * Default constructor for a function, which hides a suggested action.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public HideSuggestedAction() {
        }

        /**
         * Creates a function, which hides a suggested action.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param action Suggested action to hide.
         */
        public HideSuggestedAction(SuggestedAction action) {
            this.action = action;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1561384065;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds new contacts or edits existing contacts by their phone numbers; contacts' user identifiers are ignored.
     *
     * <p> Returns {@link ImportedContacts ImportedContacts} </p>
     */
    public static class ImportContacts extends Function<ImportedContacts> {
        /**
         * The list of contacts to import or edit.
         */
        public ImportedContact[] contacts;

        /**
         * Default constructor for a function, which adds new contacts or edits existing contacts by their phone numbers; contacts' user identifiers are ignored.
         *
         * <p> Returns {@link ImportedContacts ImportedContacts} </p>
         */
        public ImportContacts() {
        }

        /**
         * Creates a function, which adds new contacts or edits existing contacts by their phone numbers; contacts' user identifiers are ignored.
         *
         * <p> Returns {@link ImportedContacts ImportedContacts} </p>
         *
         * @param contacts The list of contacts to import or edit.
         */
        public ImportContacts(ImportedContact[] contacts) {
            this.contacts = contacts;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -662555959;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Imports messages exported from another application.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ImportMessages extends Function<Ok> {
        /**
         * Identifier of a chat to which the messages will be imported. It must be an identifier of a private chat with a mutual contact or an identifier of a supergroup chat with canChangeInfo member right.
         */
        public long chatId;
        /**
         * File with messages to import. Only inputFileLocal and inputFileGenerated are supported. The file must not be previously uploaded.
         */
        public InputFile messageFile;
        /**
         * Files used in the imported messages. Only inputFileLocal and inputFileGenerated are supported. The files must not be previously uploaded.
         */
        public InputFile[] attachedFiles;

        /**
         * Default constructor for a function, which imports messages exported from another application.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ImportMessages() {
        }

        /**
         * Creates a function, which imports messages exported from another application.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of a chat to which the messages will be imported. It must be an identifier of a private chat with a mutual contact or an identifier of a supergroup chat with canChangeInfo member right.
         * @param messageFile File with messages to import. Only inputFileLocal and inputFileGenerated are supported. The file must not be previously uploaded.
         * @param attachedFiles Files used in the imported messages. Only inputFileLocal and inputFileGenerated are supported. The files must not be previously uploaded.
         */
        public ImportMessages(long chatId, InputFile messageFile, InputFile[] attachedFiles) {
            this.chatId = chatId;
            this.messageFile = messageFile;
            this.attachedFiles = attachedFiles;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1864116784;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Increases a bid for an auction gift without changing gift text and receiver.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class IncreaseGiftAuctionBid extends Function<Ok> {
        /**
         * Identifier of the gift to put the bid on.
         */
        public long giftId;
        /**
         * The number of Telegram Stars to put in the bid.
         */
        public long starCount;

        /**
         * Default constructor for a function, which increases a bid for an auction gift without changing gift text and receiver.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public IncreaseGiftAuctionBid() {
        }

        /**
         * Creates a function, which increases a bid for an auction gift without changing gift text and receiver.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param giftId Identifier of the gift to put the bid on.
         * @param starCount The number of Telegram Stars to put in the bid.
         */
        public IncreaseGiftAuctionBid(long giftId, long starCount) {
            this.giftId = giftId;
            this.starCount = starCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -493509001;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Invites a user to an active group call; for group calls not bound to a chat only. Sends a service message of the type messageGroupCall. The group call can have at most getOption(&quot;group_call_participant_count_max&quot;) participants.
     *
     * <p> Returns {@link InviteGroupCallParticipantResult InviteGroupCallParticipantResult} </p>
     */
    public static class InviteGroupCallParticipant extends Function<InviteGroupCallParticipantResult> {
        /**
         * Group call identifier.
         */
        public int groupCallId;
        /**
         * User identifier.
         */
        public long userId;
        /**
         * Pass true if the group call is a video call.
         */
        public boolean isVideo;

        /**
         * Default constructor for a function, which invites a user to an active group call; for group calls not bound to a chat only. Sends a service message of the type messageGroupCall. The group call can have at most getOption(&quot;group_call_participant_count_max&quot;) participants.
         *
         * <p> Returns {@link InviteGroupCallParticipantResult InviteGroupCallParticipantResult} </p>
         */
        public InviteGroupCallParticipant() {
        }

        /**
         * Creates a function, which invites a user to an active group call; for group calls not bound to a chat only. Sends a service message of the type messageGroupCall. The group call can have at most getOption(&quot;group_call_participant_count_max&quot;) participants.
         *
         * <p> Returns {@link InviteGroupCallParticipantResult InviteGroupCallParticipantResult} </p>
         *
         * @param groupCallId Group call identifier.
         * @param userId User identifier.
         * @param isVideo Pass true if the group call is a video call.
         */
        public InviteGroupCallParticipant(int groupCallId, long userId, boolean isVideo) {
            this.groupCallId = groupCallId;
            this.userId = userId;
            this.isVideo = isVideo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -631535414;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Invites users to an active video chat. Sends a service message of the type messageInviteVideoChatParticipants to the chat bound to the group call.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class InviteVideoChatParticipants extends Function<Ok> {
        /**
         * Group call identifier.
         */
        public int groupCallId;
        /**
         * User identifiers. At most 10 users can be invited simultaneously.
         */
        public long[] userIds;

        /**
         * Default constructor for a function, which invites users to an active video chat. Sends a service message of the type messageInviteVideoChatParticipants to the chat bound to the group call.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public InviteVideoChatParticipants() {
        }

        /**
         * Creates a function, which invites users to an active video chat. Sends a service message of the type messageInviteVideoChatParticipants to the chat bound to the group call.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier.
         * @param userIds User identifiers. At most 10 users can be invited simultaneously.
         */
        public InviteVideoChatParticipants(int groupCallId, long[] userIds) {
            this.groupCallId = groupCallId;
            this.userIds = userIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -473149298;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks whether the current user is required to set login email address.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class IsLoginEmailAddressRequired extends Function<Ok> {

        /**
         * Default constructor for a function, which checks whether the current user is required to set login email address.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public IsLoginEmailAddressRequired() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -874594326;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Checks whether a file is in the profile audio files of the current user. Returns a 404 error if it isn't.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class IsProfileAudio extends Function<Ok> {
        /**
         * Identifier of the audio file to check.
         */
        public int fileId;

        /**
         * Default constructor for a function, which checks whether a file is in the profile audio files of the current user. Returns a 404 error if it isn't.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public IsProfileAudio() {
        }

        /**
         * Creates a function, which checks whether a file is in the profile audio files of the current user. Returns a 404 error if it isn't.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param fileId Identifier of the audio file to check.
         */
        public IsProfileAudio(int fileId) {
            this.fileId = fileId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -245729314;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds the current user as a new member to a chat. Private and secret chats can't be joined using this method. May return an error with a message &quot;INVITE_REQUEST_SENT&quot; if only a join request was created.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class JoinChat extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which adds the current user as a new member to a chat. Private and secret chats can't be joined using this method. May return an error with a message &quot;INVITE_REQUEST_SENT&quot; if only a join request was created.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public JoinChat() {
        }

        /**
         * Creates a function, which adds the current user as a new member to a chat. Private and secret chats can't be joined using this method. May return an error with a message &quot;INVITE_REQUEST_SENT&quot; if only a join request was created.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         */
        public JoinChat(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 326769313;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Uses an invite link to add the current user to the chat if possible. May return an error with a message &quot;INVITE_REQUEST_SENT&quot; if only a join request was created.
     *
     * <p> Returns {@link Chat Chat} </p>
     */
    public static class JoinChatByInviteLink extends Function<Chat> {
        /**
         * Invite link to use.
         */
        public String inviteLink;

        /**
         * Default constructor for a function, which uses an invite link to add the current user to the chat if possible. May return an error with a message &quot;INVITE_REQUEST_SENT&quot; if only a join request was created.
         *
         * <p> Returns {@link Chat Chat} </p>
         */
        public JoinChatByInviteLink() {
        }

        /**
         * Creates a function, which uses an invite link to add the current user to the chat if possible. May return an error with a message &quot;INVITE_REQUEST_SENT&quot; if only a join request was created.
         *
         * <p> Returns {@link Chat Chat} </p>
         *
         * @param inviteLink Invite link to use.
         */
        public JoinChatByInviteLink(String inviteLink) {
            this.inviteLink = inviteLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1049973882;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Joins a regular group call that is not bound to a chat.
     *
     * <p> Returns {@link GroupCallInfo GroupCallInfo} </p>
     */
    public static class JoinGroupCall extends Function<GroupCallInfo> {
        /**
         * The group call to join.
         */
        public InputGroupCall inputGroupCall;
        /**
         * Parameters to join the call.
         */
        public GroupCallJoinParameters joinParameters;

        /**
         * Default constructor for a function, which joins a regular group call that is not bound to a chat.
         *
         * <p> Returns {@link GroupCallInfo GroupCallInfo} </p>
         */
        public JoinGroupCall() {
        }

        /**
         * Creates a function, which joins a regular group call that is not bound to a chat.
         *
         * <p> Returns {@link GroupCallInfo GroupCallInfo} </p>
         *
         * @param inputGroupCall The group call to join.
         * @param joinParameters Parameters to join the call.
         */
        public JoinGroupCall(InputGroupCall inputGroupCall, GroupCallJoinParameters joinParameters) {
            this.inputGroupCall = inputGroupCall;
            this.joinParameters = joinParameters;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2026079917;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Joins a group call of an active live story. Returns join response payload for tgcalls.
     *
     * <p> Returns {@link Text Text} </p>
     */
    public static class JoinLiveStory extends Function<Text> {
        /**
         * Group call identifier.
         */
        public int groupCallId;
        /**
         * Parameters to join the call.
         */
        public GroupCallJoinParameters joinParameters;

        /**
         * Default constructor for a function, which joins a group call of an active live story. Returns join response payload for tgcalls.
         *
         * <p> Returns {@link Text Text} </p>
         */
        public JoinLiveStory() {
        }

        /**
         * Creates a function, which joins a group call of an active live story. Returns join response payload for tgcalls.
         *
         * <p> Returns {@link Text Text} </p>
         *
         * @param groupCallId Group call identifier.
         * @param joinParameters Parameters to join the call.
         */
        public JoinLiveStory(int groupCallId, GroupCallJoinParameters joinParameters) {
            this.groupCallId = groupCallId;
            this.joinParameters = joinParameters;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 227825676;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Joins an active video chat. Returns join response payload for tgcalls.
     *
     * <p> Returns {@link Text Text} </p>
     */
    public static class JoinVideoChat extends Function<Text> {
        /**
         * Group call identifier.
         */
        public int groupCallId;
        /**
         * Identifier of a group call participant, which will be used to join the call; pass null to join as self.
         */
        public MessageSender participantId;
        /**
         * Parameters to join the call.
         */
        public GroupCallJoinParameters joinParameters;
        /**
         * Invite hash as received from internalLinkTypeVideoChat.
         */
        public String inviteHash;

        /**
         * Default constructor for a function, which joins an active video chat. Returns join response payload for tgcalls.
         *
         * <p> Returns {@link Text Text} </p>
         */
        public JoinVideoChat() {
        }

        /**
         * Creates a function, which joins an active video chat. Returns join response payload for tgcalls.
         *
         * <p> Returns {@link Text Text} </p>
         *
         * @param groupCallId Group call identifier.
         * @param participantId Identifier of a group call participant, which will be used to join the call; pass null to join as self.
         * @param joinParameters Parameters to join the call.
         * @param inviteHash Invite hash as received from internalLinkTypeVideoChat.
         */
        public JoinVideoChat(int groupCallId, MessageSender participantId, GroupCallJoinParameters joinParameters, String inviteHash) {
            this.groupCallId = groupCallId;
            this.participantId = participantId;
            this.joinParameters = joinParameters;
            this.inviteHash = inviteHash;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1322989999;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Launches a prepaid giveaway.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class LaunchPrepaidGiveaway extends Function<Ok> {
        /**
         * Unique identifier of the prepaid giveaway.
         */
        public long giveawayId;
        /**
         * Giveaway parameters.
         */
        public GiveawayParameters parameters;
        /**
         * The number of users to receive giveaway prize.
         */
        public int winnerCount;
        /**
         * The number of Telegram Stars to be distributed through the giveaway; pass 0 for Telegram Premium giveaways.
         */
        public long starCount;

        /**
         * Default constructor for a function, which launches a prepaid giveaway.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public LaunchPrepaidGiveaway() {
        }

        /**
         * Creates a function, which launches a prepaid giveaway.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param giveawayId Unique identifier of the prepaid giveaway.
         * @param parameters Giveaway parameters.
         * @param winnerCount The number of users to receive giveaway prize.
         * @param starCount The number of Telegram Stars to be distributed through the giveaway; pass 0 for Telegram Premium giveaways.
         */
        public LaunchPrepaidGiveaway(long giveawayId, GiveawayParameters parameters, int winnerCount, long starCount) {
            this.giveawayId = giveawayId;
            this.parameters = parameters;
            this.winnerCount = winnerCount;
            this.starCount = starCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 639465530;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes the current user from chat members. Private and secret chats can't be left using this method.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class LeaveChat extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which removes the current user from chat members. Private and secret chats can't be left using this method.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public LeaveChat() {
        }

        /**
         * Creates a function, which removes the current user from chat members. Private and secret chats can't be left using this method.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         */
        public LeaveChat(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1825080735;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Leaves a group call.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class LeaveGroupCall extends Function<Ok> {
        /**
         * Group call identifier.
         */
        public int groupCallId;

        /**
         * Default constructor for a function, which leaves a group call.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public LeaveGroupCall() {
        }

        /**
         * Creates a function, which leaves a group call.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier.
         */
        public LeaveGroupCall(int groupCallId) {
            this.groupCallId = groupCallId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 980152233;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs TDLib that an audio was listened by the user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ListenToAudio extends Function<Ok> {
        /**
         * Identifier of the file with an audio.
         */
        public int audioFileId;
        /**
         * Duration of the listening to the audio, in seconds.
         */
        public int duration;

        /**
         * Default constructor for a function, which informs TDLib that an audio was listened by the user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ListenToAudio() {
        }

        /**
         * Creates a function, which informs TDLib that an audio was listened by the user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param audioFileId Identifier of the file with an audio.
         * @param duration Duration of the listening to the audio, in seconds.
         */
        public ListenToAudio(int audioFileId, int duration) {
            this.audioFileId = audioFileId;
            this.duration = duration;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 589191881;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Loads more active stories from a story list. The loaded stories will be sent through updates. Active stories are sorted by the pair (activeStories.order, activeStories.storyPosterChatId) in descending order. Returns a 404 error if all active stories have been loaded.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class LoadActiveStories extends Function<Ok> {
        /**
         * The story list in which to load active stories.
         */
        public StoryList storyList;

        /**
         * Default constructor for a function, which loads more active stories from a story list. The loaded stories will be sent through updates. Active stories are sorted by the pair (activeStories.order, activeStories.storyPosterChatId) in descending order. Returns a 404 error if all active stories have been loaded.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public LoadActiveStories() {
        }

        /**
         * Creates a function, which loads more active stories from a story list. The loaded stories will be sent through updates. Active stories are sorted by the pair (activeStories.order, activeStories.storyPosterChatId) in descending order. Returns a 404 error if all active stories have been loaded.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param storyList The story list in which to load active stories.
         */
        public LoadActiveStories(StoryList storyList) {
            this.storyList = storyList;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2106390328;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Loads more chats from a chat list. The loaded chats and their positions in the chat list will be sent through updates. Chats are sorted by the pair (chat.position.order, chat.id) in descending order. Returns a 404 error if all chats have been loaded.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class LoadChats extends Function<Ok> {
        /**
         * The chat list in which to load chats; pass null to load chats from the main chat list.
         */
        public ChatList chatList;
        /**
         * The maximum number of chats to be loaded. For optimal performance, the number of loaded chats is chosen by TDLib and can be smaller than the specified limit, even if the end of the list is not reached.
         */
        public int limit;

        /**
         * Default constructor for a function, which loads more chats from a chat list. The loaded chats and their positions in the chat list will be sent through updates. Chats are sorted by the pair (chat.position.order, chat.id) in descending order. Returns a 404 error if all chats have been loaded.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public LoadChats() {
        }

        /**
         * Creates a function, which loads more chats from a chat list. The loaded chats and their positions in the chat list will be sent through updates. Chats are sorted by the pair (chat.position.order, chat.id) in descending order. Returns a 404 error if all chats have been loaded.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatList The chat list in which to load chats; pass null to load chats from the main chat list.
         * @param limit The maximum number of chats to be loaded. For optimal performance, the number of loaded chats is chosen by TDLib and can be smaller than the specified limit, even if the end of the list is not reached.
         */
        public LoadChats(ChatList chatList, int limit) {
            this.chatList = chatList;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1885635205;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Loads more topics in a channel direct messages chat administered by the current user. The loaded topics will be sent through updateDirectMessagesChatTopic. Topics are sorted by their topic.order in descending order. Returns a 404 error if all topics have been loaded.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class LoadDirectMessagesChatTopics extends Function<Ok> {
        /**
         * Chat identifier of the channel direct messages chat.
         */
        public long chatId;
        /**
         * The maximum number of topics to be loaded. For optimal performance, the number of loaded topics is chosen by TDLib and can be smaller than the specified limit, even if the end of the list is not reached.
         */
        public int limit;

        /**
         * Default constructor for a function, which loads more topics in a channel direct messages chat administered by the current user. The loaded topics will be sent through updateDirectMessagesChatTopic. Topics are sorted by their topic.order in descending order. Returns a 404 error if all topics have been loaded.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public LoadDirectMessagesChatTopics() {
        }

        /**
         * Creates a function, which loads more topics in a channel direct messages chat administered by the current user. The loaded topics will be sent through updateDirectMessagesChatTopic. Topics are sorted by their topic.order in descending order. Returns a 404 error if all topics have been loaded.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier of the channel direct messages chat.
         * @param limit The maximum number of topics to be loaded. For optimal performance, the number of loaded topics is chosen by TDLib and can be smaller than the specified limit, even if the end of the list is not reached.
         */
        public LoadDirectMessagesChatTopics(long chatId, int limit) {
            this.chatId = chatId;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1488065975;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Loads more participants of a group call; not supported in live stories. The loaded participants will be received through updates. Use the field groupCall.loadedAllParticipants to check whether all participants have already been loaded.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class LoadGroupCallParticipants extends Function<Ok> {
        /**
         * Group call identifier. The group call must be previously received through getGroupCall and must be joined or being joined.
         */
        public int groupCallId;
        /**
         * The maximum number of participants to load; up to 100.
         */
        public int limit;

        /**
         * Default constructor for a function, which loads more participants of a group call; not supported in live stories. The loaded participants will be received through updates. Use the field groupCall.loadedAllParticipants to check whether all participants have already been loaded.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public LoadGroupCallParticipants() {
        }

        /**
         * Creates a function, which loads more participants of a group call; not supported in live stories. The loaded participants will be received through updates. Use the field groupCall.loadedAllParticipants to check whether all participants have already been loaded.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier. The group call must be previously received through getGroupCall and must be joined or being joined.
         * @param limit The maximum number of participants to load; up to 100.
         */
        public LoadGroupCallParticipants(int groupCallId, int limit) {
            this.groupCallId = groupCallId;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 938720974;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Loads quick reply messages that can be sent by a given quick reply shortcut. The loaded messages will be sent through updateQuickReplyShortcutMessages.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class LoadQuickReplyShortcutMessages extends Function<Ok> {
        /**
         * Unique identifier of the quick reply shortcut.
         */
        public int shortcutId;

        /**
         * Default constructor for a function, which loads quick reply messages that can be sent by a given quick reply shortcut. The loaded messages will be sent through updateQuickReplyShortcutMessages.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public LoadQuickReplyShortcutMessages() {
        }

        /**
         * Creates a function, which loads quick reply messages that can be sent by a given quick reply shortcut. The loaded messages will be sent through updateQuickReplyShortcutMessages.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param shortcutId Unique identifier of the quick reply shortcut.
         */
        public LoadQuickReplyShortcutMessages(int shortcutId) {
            this.shortcutId = shortcutId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -46092588;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Loads quick reply shortcuts created by the current user. The loaded data will be sent through updateQuickReplyShortcut and updateQuickReplyShortcuts.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class LoadQuickReplyShortcuts extends Function<Ok> {

        /**
         * Default constructor for a function, which loads quick reply shortcuts created by the current user. The loaded data will be sent through updateQuickReplyShortcut and updateQuickReplyShortcuts.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public LoadQuickReplyShortcuts() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1016614243;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Loads more Saved Messages topics. The loaded topics will be sent through updateSavedMessagesTopic. Topics are sorted by their topic.order in descending order. Returns a 404 error if all topics have been loaded.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class LoadSavedMessagesTopics extends Function<Ok> {
        /**
         * The maximum number of topics to be loaded. For optimal performance, the number of loaded topics is chosen by TDLib and can be smaller than the specified limit, even if the end of the list is not reached.
         */
        public int limit;

        /**
         * Default constructor for a function, which loads more Saved Messages topics. The loaded topics will be sent through updateSavedMessagesTopic. Topics are sorted by their topic.order in descending order. Returns a 404 error if all topics have been loaded.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public LoadSavedMessagesTopics() {
        }

        /**
         * Creates a function, which loads more Saved Messages topics. The loaded topics will be sent through updateSavedMessagesTopic. Topics are sorted by their topic.order in descending order. Returns a 404 error if all topics have been loaded.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param limit The maximum number of topics to be loaded. For optimal performance, the number of loaded topics is chosen by TDLib and can be smaller than the specified limit, even if the end of the list is not reached.
         */
        public LoadSavedMessagesTopics(int limit) {
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 289855160;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Closes the TDLib instance after a proper logout. Requires an available network connection. All local data will be destroyed. After the logout completes, updateAuthorizationState with authorizationStateClosed will be sent.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class LogOut extends Function<Ok> {

        /**
         * Default constructor for a function, which closes the TDLib instance after a proper logout. Requires an available network connection. All local data will be destroyed. After the logout completes, updateAuthorizationState with authorizationStateClosed will be sent.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public LogOut() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1581923301;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds tasks of a checklist in a message as done or not done.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class MarkChecklistTasksAsDone extends Function<Ok> {
        /**
         * Identifier of the chat with the message.
         */
        public long chatId;
        /**
         * Identifier of the message containing the checklist. Use messageProperties.canMarkTasksAsDone to check whether the tasks can be marked as done or not done.
         */
        public long messageId;
        /**
         * Identifiers of tasks that were marked as done.
         */
        public int[] markedAsDoneTaskIds;
        /**
         * Identifiers of tasks that were marked as not done.
         */
        public int[] markedAsNotDoneTaskIds;

        /**
         * Default constructor for a function, which adds tasks of a checklist in a message as done or not done.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public MarkChecklistTasksAsDone() {
        }

        /**
         * Creates a function, which adds tasks of a checklist in a message as done or not done.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat with the message.
         * @param messageId Identifier of the message containing the checklist. Use messageProperties.canMarkTasksAsDone to check whether the tasks can be marked as done or not done.
         * @param markedAsDoneTaskIds Identifiers of tasks that were marked as done.
         * @param markedAsNotDoneTaskIds Identifiers of tasks that were marked as not done.
         */
        public MarkChecklistTasksAsDone(long chatId, long messageId, int[] markedAsDoneTaskIds, int[] markedAsNotDoneTaskIds) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.markedAsDoneTaskIds = markedAsDoneTaskIds;
            this.markedAsNotDoneTaskIds = markedAsNotDoneTaskIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 386950739;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs TDLib that a bot was opened from the list of similar bots.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class OpenBotSimilarBot extends Function<Ok> {
        /**
         * Identifier of the original bot, which similar bots were requested.
         */
        public long botUserId;
        /**
         * Identifier of the opened bot.
         */
        public long openedBotUserId;

        /**
         * Default constructor for a function, which informs TDLib that a bot was opened from the list of similar bots.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public OpenBotSimilarBot() {
        }

        /**
         * Creates a function, which informs TDLib that a bot was opened from the list of similar bots.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param botUserId Identifier of the original bot, which similar bots were requested.
         * @param openedBotUserId Identifier of the opened bot.
         */
        public OpenBotSimilarBot(long botUserId, long openedBotUserId) {
            this.botUserId = botUserId;
            this.openedBotUserId = openedBotUserId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -369688872;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs TDLib that the chat is opened by the user. Many useful activities depend on the chat being opened or closed (e.g., in supergroups and channels all updates are received only for opened chats).
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class OpenChat extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which informs TDLib that the chat is opened by the user. Many useful activities depend on the chat being opened or closed (e.g., in supergroups and channels all updates are received only for opened chats).
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public OpenChat() {
        }

        /**
         * Creates a function, which informs TDLib that the chat is opened by the user. Many useful activities depend on the chat being opened or closed (e.g., in supergroups and channels all updates are received only for opened chats).
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         */
        public OpenChat(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -323371509;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs TDLib that a chat was opened from the list of similar chats. The method is independent of openChat and closeChat methods.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class OpenChatSimilarChat extends Function<Ok> {
        /**
         * Identifier of the original chat, which similar chats were requested.
         */
        public long chatId;
        /**
         * Identifier of the opened chat.
         */
        public long openedChatId;

        /**
         * Default constructor for a function, which informs TDLib that a chat was opened from the list of similar chats. The method is independent of openChat and closeChat methods.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public OpenChatSimilarChat() {
        }

        /**
         * Creates a function, which informs TDLib that a chat was opened from the list of similar chats. The method is independent of openChat and closeChat methods.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the original chat, which similar chats were requested.
         * @param openedChatId Identifier of the opened chat.
         */
        public OpenChatSimilarChat(long chatId, long openedChatId) {
            this.chatId = chatId;
            this.openedChatId = openedChatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1884883949;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs TDLib that a gift auction was opened by the user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class OpenGiftAuction extends Function<Ok> {
        /**
         * Identifier of the gift, which auction was opened.
         */
        public long giftId;

        /**
         * Default constructor for a function, which informs TDLib that a gift auction was opened by the user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public OpenGiftAuction() {
        }

        /**
         * Creates a function, which informs TDLib that a gift auction was opened by the user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param giftId Identifier of the gift, which auction was opened.
         */
        public OpenGiftAuction(long giftId) {
            this.giftId = giftId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -694137370;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs TDLib that the message content has been opened (e.g., the user has opened a photo, video, document, location or venue, or has listened to an audio file or voice note message). An updateMessageContentOpened update will be generated if something has changed.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class OpenMessageContent extends Function<Ok> {
        /**
         * Chat identifier of the message.
         */
        public long chatId;
        /**
         * Identifier of the message with the opened content.
         */
        public long messageId;

        /**
         * Default constructor for a function, which informs TDLib that the message content has been opened (e.g., the user has opened a photo, video, document, location or venue, or has listened to an audio file or voice note message). An updateMessageContentOpened update will be generated if something has changed.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public OpenMessageContent() {
        }

        /**
         * Creates a function, which informs TDLib that the message content has been opened (e.g., the user has opened a photo, video, document, location or venue, or has listened to an audio file or voice note message). An updateMessageContentOpened update will be generated if something has changed.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier of the message.
         * @param messageId Identifier of the message with the opened content.
         */
        public OpenMessageContent(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -739088005;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs TDLib that the user opened a sponsored chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class OpenSponsoredChat extends Function<Ok> {
        /**
         * Unique identifier of the sponsored chat.
         */
        public long sponsoredChatUniqueId;

        /**
         * Default constructor for a function, which informs TDLib that the user opened a sponsored chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public OpenSponsoredChat() {
        }

        /**
         * Creates a function, which informs TDLib that the user opened a sponsored chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param sponsoredChatUniqueId Unique identifier of the sponsored chat.
         */
        public OpenSponsoredChat(long sponsoredChatUniqueId) {
            this.sponsoredChatUniqueId = sponsoredChatUniqueId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 865985573;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs TDLib that a story is opened and is being viewed by the user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class OpenStory extends Function<Ok> {
        /**
         * The identifier of the chat that posted the opened story.
         */
        public long storyPosterChatId;
        /**
         * The identifier of the story.
         */
        public int storyId;

        /**
         * Default constructor for a function, which informs TDLib that a story is opened and is being viewed by the user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public OpenStory() {
        }

        /**
         * Creates a function, which informs TDLib that a story is opened and is being viewed by the user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param storyPosterChatId The identifier of the chat that posted the opened story.
         * @param storyId The identifier of the story.
         */
        public OpenStory(long storyPosterChatId, int storyId) {
            this.storyPosterChatId = storyPosterChatId;
            this.storyId = storyId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -696723005;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs TDLib that a Web App is being opened from the attachment menu, a botMenuButton button, an internalLinkTypeAttachmentMenuBot link, or an inlineKeyboardButtonTypeWebApp button. For each bot, a confirmation alert about data sent to the bot must be shown once.
     *
     * <p> Returns {@link WebAppInfo WebAppInfo} </p>
     */
    public static class OpenWebApp extends Function<WebAppInfo> {
        /**
         * Identifier of the chat in which the Web App is opened. The Web App can't be opened in secret chats.
         */
        public long chatId;
        /**
         * Identifier of the bot, providing the Web App. If the bot is restricted for the current user, then show an error instead of calling the method.
         */
        public long botUserId;
        /**
         * The URL from an inlineKeyboardButtonTypeWebApp button, a botMenuButton button, an internalLinkTypeAttachmentMenuBot link, or an empty string otherwise.
         */
        public String url;
        /**
         * Topic in which the message will be sent; pass null if none.
         */
        public MessageTopic topicId;
        /**
         * Information about the message or story to be replied in the message sent by the Web App; pass null if none.
         */
        public InputMessageReplyTo replyTo;
        /**
         * Parameters to use to open the Web App.
         */
        public WebAppOpenParameters parameters;

        /**
         * Default constructor for a function, which informs TDLib that a Web App is being opened from the attachment menu, a botMenuButton button, an internalLinkTypeAttachmentMenuBot link, or an inlineKeyboardButtonTypeWebApp button. For each bot, a confirmation alert about data sent to the bot must be shown once.
         *
         * <p> Returns {@link WebAppInfo WebAppInfo} </p>
         */
        public OpenWebApp() {
        }

        /**
         * Creates a function, which informs TDLib that a Web App is being opened from the attachment menu, a botMenuButton button, an internalLinkTypeAttachmentMenuBot link, or an inlineKeyboardButtonTypeWebApp button. For each bot, a confirmation alert about data sent to the bot must be shown once.
         *
         * <p> Returns {@link WebAppInfo WebAppInfo} </p>
         *
         * @param chatId Identifier of the chat in which the Web App is opened. The Web App can't be opened in secret chats.
         * @param botUserId Identifier of the bot, providing the Web App. If the bot is restricted for the current user, then show an error instead of calling the method.
         * @param url The URL from an inlineKeyboardButtonTypeWebApp button, a botMenuButton button, an internalLinkTypeAttachmentMenuBot link, or an empty string otherwise.
         * @param topicId Topic in which the message will be sent; pass null if none.
         * @param replyTo Information about the message or story to be replied in the message sent by the Web App; pass null if none.
         * @param parameters Parameters to use to open the Web App.
         */
        public OpenWebApp(long chatId, long botUserId, String url, MessageTopic topicId, InputMessageReplyTo replyTo, WebAppOpenParameters parameters) {
            this.chatId = chatId;
            this.botUserId = botUserId;
            this.url = url;
            this.topicId = topicId;
            this.replyTo = replyTo;
            this.parameters = parameters;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -950685122;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Optimizes storage usage, i.e. deletes some files and returns new storage usage statistics. Secret thumbnails can't be deleted.
     *
     * <p> Returns {@link StorageStatistics StorageStatistics} </p>
     */
    public static class OptimizeStorage extends Function<StorageStatistics> {
        /**
         * Limit on the total size of files after deletion, in bytes. Pass -1 to use the default limit.
         */
        public long size;
        /**
         * Limit on the time that has passed since the last time a file was accessed (or creation time for some filesystems). Pass -1 to use the default limit.
         */
        public int ttl;
        /**
         * Limit on the total number of files after deletion. Pass -1 to use the default limit.
         */
        public int count;
        /**
         * The amount of time after the creation of a file during which it can't be deleted, in seconds. Pass -1 to use the default value.
         */
        public int immunityDelay;
        /**
         * If non-empty, only files with the given types are considered. By default, all types except thumbnails, profile photos, stickers and wallpapers are deleted.
         */
        public FileType[] fileTypes;
        /**
         * If non-empty, only files from the given chats are considered. Use 0 as chat identifier to delete files not belonging to any chat (e.g., profile photos).
         */
        public long[] chatIds;
        /**
         * If non-empty, files from the given chats are excluded. Use 0 as chat identifier to exclude all files not belonging to any chat (e.g., profile photos).
         */
        public long[] excludeChatIds;
        /**
         * Pass true if statistics about the files that were deleted must be returned instead of the whole storage usage statistics. Affects only returned statistics.
         */
        public boolean returnDeletedFileStatistics;
        /**
         * Same as in getStorageStatistics. Affects only returned statistics.
         */
        public int chatLimit;

        /**
         * Default constructor for a function, which optimizes storage usage, i.e. deletes some files and returns new storage usage statistics. Secret thumbnails can't be deleted.
         *
         * <p> Returns {@link StorageStatistics StorageStatistics} </p>
         */
        public OptimizeStorage() {
        }

        /**
         * Creates a function, which optimizes storage usage, i.e. deletes some files and returns new storage usage statistics. Secret thumbnails can't be deleted.
         *
         * <p> Returns {@link StorageStatistics StorageStatistics} </p>
         *
         * @param size Limit on the total size of files after deletion, in bytes. Pass -1 to use the default limit.
         * @param ttl Limit on the time that has passed since the last time a file was accessed (or creation time for some filesystems). Pass -1 to use the default limit.
         * @param count Limit on the total number of files after deletion. Pass -1 to use the default limit.
         * @param immunityDelay The amount of time after the creation of a file during which it can't be deleted, in seconds. Pass -1 to use the default value.
         * @param fileTypes If non-empty, only files with the given types are considered. By default, all types except thumbnails, profile photos, stickers and wallpapers are deleted.
         * @param chatIds If non-empty, only files from the given chats are considered. Use 0 as chat identifier to delete files not belonging to any chat (e.g., profile photos).
         * @param excludeChatIds If non-empty, files from the given chats are excluded. Use 0 as chat identifier to exclude all files not belonging to any chat (e.g., profile photos).
         * @param returnDeletedFileStatistics Pass true if statistics about the files that were deleted must be returned instead of the whole storage usage statistics. Affects only returned statistics.
         * @param chatLimit Same as in getStorageStatistics. Affects only returned statistics.
         */
        public OptimizeStorage(long size, int ttl, int count, int immunityDelay, FileType[] fileTypes, long[] chatIds, long[] excludeChatIds, boolean returnDeletedFileStatistics, int chatLimit) {
            this.size = size;
            this.ttl = ttl;
            this.count = count;
            this.immunityDelay = immunityDelay;
            this.fileTypes = fileTypes;
            this.chatIds = chatIds;
            this.excludeChatIds = excludeChatIds;
            this.returnDeletedFileStatistics = returnDeletedFileStatistics;
            this.chatLimit = chatLimit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 853186759;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Parses Markdown entities in a human-friendly format, ignoring markup errors. Can be called synchronously.
     *
     * <p> Returns {@link FormattedText FormattedText} </p>
     */
    public static class ParseMarkdown extends Function<FormattedText> {
        /**
         * The text to parse. For example, &quot;__italic__ ~~strikethrough~~ ||spoiler|| **bold** `code` ```pre``` __[italic__ textUrl](telegram.org) __italic**bold italic__bold**&quot;.
         */
        public FormattedText text;

        /**
         * Default constructor for a function, which parses Markdown entities in a human-friendly format, ignoring markup errors. Can be called synchronously.
         *
         * <p> Returns {@link FormattedText FormattedText} </p>
         */
        public ParseMarkdown() {
        }

        /**
         * Creates a function, which parses Markdown entities in a human-friendly format, ignoring markup errors. Can be called synchronously.
         *
         * <p> Returns {@link FormattedText FormattedText} </p>
         *
         * @param text The text to parse. For example, &quot;__italic__ ~~strikethrough~~ ||spoiler|| **bold** `code` ```pre``` __[italic__ textUrl](telegram.org) __italic**bold italic__bold**&quot;.
         */
        public ParseMarkdown(FormattedText text) {
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 756366063;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Parses Bold, Italic, Underline, Strikethrough, Spoiler, CustomEmoji, BlockQuote, ExpandableBlockQuote, Code, Pre, PreCode, TextUrl, MentionName, and DateTime entities from a marked-up text. Can be called synchronously.
     *
     * <p> Returns {@link FormattedText FormattedText} </p>
     */
    public static class ParseTextEntities extends Function<FormattedText> {
        /**
         * The text to parse.
         */
        public String text;
        /**
         * Text parse mode.
         */
        public TextParseMode parseMode;

        /**
         * Default constructor for a function, which parses Bold, Italic, Underline, Strikethrough, Spoiler, CustomEmoji, BlockQuote, ExpandableBlockQuote, Code, Pre, PreCode, TextUrl, MentionName, and DateTime entities from a marked-up text. Can be called synchronously.
         *
         * <p> Returns {@link FormattedText FormattedText} </p>
         */
        public ParseTextEntities() {
        }

        /**
         * Creates a function, which parses Bold, Italic, Underline, Strikethrough, Spoiler, CustomEmoji, BlockQuote, ExpandableBlockQuote, Code, Pre, PreCode, TextUrl, MentionName, and DateTime entities from a marked-up text. Can be called synchronously.
         *
         * <p> Returns {@link FormattedText FormattedText} </p>
         *
         * @param text The text to parse.
         * @param parseMode Text parse mode.
         */
        public ParseTextEntities(String text, TextParseMode parseMode) {
            this.text = text;
            this.parseMode = parseMode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1709194593;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Pins a message in a chat. A message can be pinned only if messageProperties.canBePinned.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class PinChatMessage extends Function<Ok> {
        /**
         * Identifier of the chat.
         */
        public long chatId;
        /**
         * Identifier of the new pinned message.
         */
        public long messageId;
        /**
         * Pass true to disable notification about the pinned message. Notifications are always disabled in channels and private chats.
         */
        public boolean disableNotification;
        /**
         * Pass true to pin the message only for self; private chats only.
         */
        public boolean onlyForSelf;

        /**
         * Default constructor for a function, which pins a message in a chat. A message can be pinned only if messageProperties.canBePinned.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public PinChatMessage() {
        }

        /**
         * Creates a function, which pins a message in a chat. A message can be pinned only if messageProperties.canBePinned.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat.
         * @param messageId Identifier of the new pinned message.
         * @param disableNotification Pass true to disable notification about the pinned message. Notifications are always disabled in channels and private chats.
         * @param onlyForSelf Pass true to pin the message only for self; private chats only.
         */
        public PinChatMessage(long chatId, long messageId, boolean disableNotification, boolean onlyForSelf) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.disableNotification = disableNotification;
            this.onlyForSelf = onlyForSelf;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2034719663;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Computes time needed to receive a response from a Telegram server through a proxy. Can be called before authorization.
     *
     * <p> Returns {@link Seconds Seconds} </p>
     */
    public static class PingProxy extends Function<Seconds> {
        /**
         * The proxy to test; pass null to ping a Telegram server without a proxy.
         */
        public Proxy proxy;

        /**
         * Default constructor for a function, which computes time needed to receive a response from a Telegram server through a proxy. Can be called before authorization.
         *
         * <p> Returns {@link Seconds Seconds} </p>
         */
        public PingProxy() {
        }

        /**
         * Creates a function, which computes time needed to receive a response from a Telegram server through a proxy. Can be called before authorization.
         *
         * <p> Returns {@link Seconds Seconds} </p>
         *
         * @param proxy The proxy to test; pass null to ping a Telegram server without a proxy.
         */
        public PingProxy(Proxy proxy) {
            this.proxy = proxy;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2144501959;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Places a bid on an auction gift.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class PlaceGiftAuctionBid extends Function<Ok> {
        /**
         * Identifier of the gift to place the bid on.
         */
        public long giftId;
        /**
         * The number of Telegram Stars to place in the bid.
         */
        public long starCount;
        /**
         * Identifier of the user who will receive the gift.
         */
        public long userId;
        /**
         * Text to show along with the gift; 0-getOption(&quot;gift_text_length_max&quot;) characters. Only Bold, Italic, Underline, Strikethrough, Spoiler, CustomEmoji, and DateTime entities are allowed. Must be empty if the receiver enabled paid messages.
         */
        public FormattedText text;
        /**
         * Pass true to show gift text and sender only to the gift receiver; otherwise, everyone will be able to see them.
         */
        public boolean isPrivate;

        /**
         * Default constructor for a function, which places a bid on an auction gift.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public PlaceGiftAuctionBid() {
        }

        /**
         * Creates a function, which places a bid on an auction gift.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param giftId Identifier of the gift to place the bid on.
         * @param starCount The number of Telegram Stars to place in the bid.
         * @param userId Identifier of the user who will receive the gift.
         * @param text Text to show along with the gift; 0-getOption(&quot;gift_text_length_max&quot;) characters. Only Bold, Italic, Underline, Strikethrough, Spoiler, CustomEmoji, and DateTime entities are allowed. Must be empty if the receiver enabled paid messages.
         * @param isPrivate Pass true to show gift text and sender only to the gift receiver; otherwise, everyone will be able to see them.
         */
        public PlaceGiftAuctionBid(long giftId, long starCount, long userId, FormattedText text, boolean isPrivate) {
            this.giftId = giftId;
            this.starCount = starCount;
            this.userId = userId;
            this.text = text;
            this.isPrivate = isPrivate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1437176980;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Posts a new story on behalf of a chat; requires canPostStories administrator right for supergroup and channel chats. Returns a temporary story.
     *
     * <p> Returns {@link Story Story} </p>
     */
    public static class PostStory extends Function<Story> {
        /**
         * Identifier of the chat that will post the story. Pass Saved Messages chat identifier when posting a story on behalf of the current user.
         */
        public long chatId;
        /**
         * Content of the story.
         */
        public InputStoryContent content;
        /**
         * Clickable rectangle areas to be shown on the story media; pass null if none.
         */
        public InputStoryAreas areas;
        /**
         * Story caption; pass null to use an empty caption; 0-getOption(&quot;story_caption_length_max&quot;) characters; can have entities only if getOption(&quot;can_use_text_entities_in_story_caption&quot;).
         */
        public FormattedText caption;
        /**
         * The privacy settings for the story; ignored for stories posted on behalf of supergroup and channel chats.
         */
        public StoryPrivacySettings privacySettings;
        /**
         * Identifiers of story albums to which the story will be added upon posting. An album can have up to getOption(&quot;story_album_size_max&quot;) stories.
         */
        public int[] albumIds;
        /**
         * Period after which the story is moved to archive, in seconds; must be one of 6 * 3600, 12 * 3600, 86400, or 2 * 86400 for Telegram Premium users, and 86400 otherwise.
         */
        public int activePeriod;
        /**
         * Full identifier of the original story, which content was used to create the story; pass null if the story isn't repost of another story.
         */
        public StoryFullId fromStoryFullId;
        /**
         * Pass true to keep the story accessible after expiration.
         */
        public boolean isPostedToChatPage;
        /**
         * Pass true if the content of the story must be protected from forwarding and screenshotting.
         */
        public boolean protectContent;

        /**
         * Default constructor for a function, which posts a new story on behalf of a chat; requires canPostStories administrator right for supergroup and channel chats. Returns a temporary story.
         *
         * <p> Returns {@link Story Story} </p>
         */
        public PostStory() {
        }

        /**
         * Creates a function, which posts a new story on behalf of a chat; requires canPostStories administrator right for supergroup and channel chats. Returns a temporary story.
         *
         * <p> Returns {@link Story Story} </p>
         *
         * @param chatId Identifier of the chat that will post the story. Pass Saved Messages chat identifier when posting a story on behalf of the current user.
         * @param content Content of the story.
         * @param areas Clickable rectangle areas to be shown on the story media; pass null if none.
         * @param caption Story caption; pass null to use an empty caption; 0-getOption(&quot;story_caption_length_max&quot;) characters; can have entities only if getOption(&quot;can_use_text_entities_in_story_caption&quot;).
         * @param privacySettings The privacy settings for the story; ignored for stories posted on behalf of supergroup and channel chats.
         * @param albumIds Identifiers of story albums to which the story will be added upon posting. An album can have up to getOption(&quot;story_album_size_max&quot;) stories.
         * @param activePeriod Period after which the story is moved to archive, in seconds; must be one of 6 * 3600, 12 * 3600, 86400, or 2 * 86400 for Telegram Premium users, and 86400 otherwise.
         * @param fromStoryFullId Full identifier of the original story, which content was used to create the story; pass null if the story isn't repost of another story.
         * @param isPostedToChatPage Pass true to keep the story accessible after expiration.
         * @param protectContent Pass true if the content of the story must be protected from forwarding and screenshotting.
         */
        public PostStory(long chatId, InputStoryContent content, InputStoryAreas areas, FormattedText caption, StoryPrivacySettings privacySettings, int[] albumIds, int activePeriod, StoryFullId fromStoryFullId, boolean isPostedToChatPage, boolean protectContent) {
            this.chatId = chatId;
            this.content = content;
            this.areas = areas;
            this.caption = caption;
            this.privacySettings = privacySettings;
            this.albumIds = albumIds;
            this.activePeriod = activePeriod;
            this.fromStoryFullId = fromStoryFullId;
            this.isPostedToChatPage = isPostedToChatPage;
            this.protectContent = protectContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1725643742;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Preliminarily uploads a file to the cloud before sending it in a message, which can be useful for uploading of being recorded voice and video notes. In all other cases there is no need to preliminary upload a file. Updates updateFile will be used to notify about upload progress. The upload will not be completed until the file is sent in a message.
     *
     * <p> Returns {@link File File} </p>
     */
    public static class PreliminaryUploadFile extends Function<File> {
        /**
         * File to upload.
         */
        public InputFile file;
        /**
         * File type; pass null if unknown.
         */
        public FileType fileType;
        /**
         * Priority of the upload (1-32). The higher the priority, the earlier the file will be uploaded. If the priorities of two files are equal, then the first one for which preliminaryUploadFile was called will be uploaded first.
         */
        public int priority;

        /**
         * Default constructor for a function, which preliminarily uploads a file to the cloud before sending it in a message, which can be useful for uploading of being recorded voice and video notes. In all other cases there is no need to preliminary upload a file. Updates updateFile will be used to notify about upload progress. The upload will not be completed until the file is sent in a message.
         *
         * <p> Returns {@link File File} </p>
         */
        public PreliminaryUploadFile() {
        }

        /**
         * Creates a function, which preliminarily uploads a file to the cloud before sending it in a message, which can be useful for uploading of being recorded voice and video notes. In all other cases there is no need to preliminary upload a file. Updates updateFile will be used to notify about upload progress. The upload will not be completed until the file is sent in a message.
         *
         * <p> Returns {@link File File} </p>
         *
         * @param file File to upload.
         * @param fileType File type; pass null if unknown.
         * @param priority Priority of the upload (1-32). The higher the priority, the earlier the file will be uploaded. If the priorities of two files are equal, then the first one for which preliminaryUploadFile was called will be uploaded first.
         */
        public PreliminaryUploadFile(InputFile file, FileType fileType, int priority) {
            this.file = file;
            this.fileType = fileType;
            this.priority = priority;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1894239129;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Process new chats added to a shareable chat folder by its owner.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ProcessChatFolderNewChats extends Function<Ok> {
        /**
         * Chat folder identifier.
         */
        public int chatFolderId;
        /**
         * Identifiers of the new chats, which are added to the chat folder. The chats are automatically joined if they aren't joined yet.
         */
        public long[] addedChatIds;

        /**
         * Default constructor for a function, which process new chats added to a shareable chat folder by its owner.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ProcessChatFolderNewChats() {
        }

        /**
         * Creates a function, which process new chats added to a shareable chat folder by its owner.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatFolderId Chat folder identifier.
         * @param addedChatIds Identifiers of the new chats, which are added to the chat folder. The chats are automatically joined if they aren't joined yet.
         */
        public ProcessChatFolderNewChats(int chatFolderId, long[] addedChatIds) {
            this.chatFolderId = chatFolderId;
            this.addedChatIds = addedChatIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1498280672;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Processes request to disable hasProtectedContent in a chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ProcessChatHasProtectedContentDisableRequest extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifier of the message with the request. The message must be incoming and has content of the type messageChatHasProtectedContentDisableRequested.
         */
        public long requestMessageId;
        /**
         * Pass true to approve the request; pass false to reject the request.
         */
        public boolean approve;

        /**
         * Default constructor for a function, which processes request to disable hasProtectedContent in a chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ProcessChatHasProtectedContentDisableRequest() {
        }

        /**
         * Creates a function, which processes request to disable hasProtectedContent in a chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param requestMessageId Identifier of the message with the request. The message must be incoming and has content of the type messageChatHasProtectedContentDisableRequested.
         * @param approve Pass true to approve the request; pass false to reject the request.
         */
        public ProcessChatHasProtectedContentDisableRequest(long chatId, long requestMessageId, boolean approve) {
            this.chatId = chatId;
            this.requestMessageId = requestMessageId;
            this.approve = approve;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2078059411;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Handles a pending join request in a chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ProcessChatJoinRequest extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifier of the user who sent the request.
         */
        public long userId;
        /**
         * Pass true to approve the request; pass false to decline it.
         */
        public boolean approve;

        /**
         * Default constructor for a function, which handles a pending join request in a chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ProcessChatJoinRequest() {
        }

        /**
         * Creates a function, which handles a pending join request in a chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param userId Identifier of the user who sent the request.
         * @param approve Pass true to approve the request; pass false to decline it.
         */
        public ProcessChatJoinRequest(long chatId, long userId, boolean approve) {
            this.chatId = chatId;
            this.userId = userId;
            this.approve = approve;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1004876963;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Handles all pending join requests for a given link in a chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ProcessChatJoinRequests extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Invite link for which to process join requests. If empty, all join requests will be processed. Requires administrator privileges and canInviteUsers right in the chat for own links and owner privileges for other links.
         */
        public String inviteLink;
        /**
         * Pass true to approve all requests; pass false to decline them.
         */
        public boolean approve;

        /**
         * Default constructor for a function, which handles all pending join requests for a given link in a chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ProcessChatJoinRequests() {
        }

        /**
         * Creates a function, which handles all pending join requests for a given link in a chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param inviteLink Invite link for which to process join requests. If empty, all join requests will be processed. Requires administrator privileges and canInviteUsers right in the chat for own links and owner privileges for other links.
         * @param approve Pass true to approve all requests; pass false to decline them.
         */
        public ProcessChatJoinRequests(long chatId, String inviteLink, boolean approve) {
            this.chatId = chatId;
            this.inviteLink = inviteLink;
            this.approve = approve;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1048722894;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Handles a pending gift purchase offer.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ProcessGiftPurchaseOffer extends Function<Ok> {
        /**
         * Identifier of the message with the gift purchase offer.
         */
        public long messageId;
        /**
         * Pass true to accept the request; pass false to reject it.
         */
        public boolean accept;

        /**
         * Default constructor for a function, which handles a pending gift purchase offer.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ProcessGiftPurchaseOffer() {
        }

        /**
         * Creates a function, which handles a pending gift purchase offer.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param messageId Identifier of the message with the gift purchase offer.
         * @param accept Pass true to accept the request; pass false to reject it.
         */
        public ProcessGiftPurchaseOffer(long messageId, boolean accept) {
            this.messageId = messageId;
            this.accept = accept;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1177407462;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Handles a push notification. Returns error with code 406 if the push notification is not supported and connection to the server is required to fetch new data. Can be called before authorization.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ProcessPushNotification extends Function<Ok> {
        /**
         * JSON-encoded push notification payload with all fields sent by the server, and &quot;google.sentTime&quot; and &quot;google.notification.sound&quot; fields added.
         */
        public String payload;

        /**
         * Default constructor for a function, which handles a push notification. Returns error with code 406 if the push notification is not supported and connection to the server is required to fetch new data. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ProcessPushNotification() {
        }

        /**
         * Creates a function, which handles a push notification. Returns error with code 406 if the push notification is not supported and connection to the server is required to fetch new data. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param payload JSON-encoded push notification payload with all fields sent by the server, and &quot;google.sentTime&quot; and &quot;google.notification.sound&quot; fields added.
         */
        public ProcessPushNotification(String payload) {
            this.payload = payload;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 786679952;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Rates recognized speech in a video note or a voice note message.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RateSpeechRecognition extends Function<Ok> {
        /**
         * Identifier of the chat to which the message belongs.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * Pass true if the speech recognition is good.
         */
        public boolean isGood;

        /**
         * Default constructor for a function, which rates recognized speech in a video note or a voice note message.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RateSpeechRecognition() {
        }

        /**
         * Creates a function, which rates recognized speech in a video note or a voice note message.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat to which the message belongs.
         * @param messageId Identifier of the message.
         * @param isGood Pass true if the speech recognition is good.
         */
        public RateSpeechRecognition(long chatId, long messageId, boolean isGood) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.isGood = isGood;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -287521867;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Marks all mentions in a chat as read.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReadAllChatMentions extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which marks all mentions in a chat as read.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReadAllChatMentions() {
        }

        /**
         * Creates a function, which marks all mentions in a chat as read.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         */
        public ReadAllChatMentions(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1357558453;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Marks all poll votes in a chat as read.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReadAllChatPollVotes extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which marks all poll votes in a chat as read.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReadAllChatPollVotes() {
        }

        /**
         * Creates a function, which marks all poll votes in a chat as read.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         */
        public ReadAllChatPollVotes(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1882393298;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Marks all reactions in a chat as read.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReadAllChatReactions extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which marks all reactions in a chat as read.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReadAllChatReactions() {
        }

        /**
         * Creates a function, which marks all reactions in a chat as read.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         */
        public ReadAllChatReactions(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1421973357;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes all unread reactions in the topic in a channel direct messages chat administered by the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReadAllDirectMessagesChatTopicReactions extends Function<Ok> {
        /**
         * Identifier of the chat.
         */
        public long chatId;
        /**
         * Topic identifier.
         */
        public long topicId;

        /**
         * Default constructor for a function, which removes all unread reactions in the topic in a channel direct messages chat administered by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReadAllDirectMessagesChatTopicReactions() {
        }

        /**
         * Creates a function, which removes all unread reactions in the topic in a channel direct messages chat administered by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat.
         * @param topicId Topic identifier.
         */
        public ReadAllDirectMessagesChatTopicReactions(long chatId, long topicId) {
            this.chatId = chatId;
            this.topicId = topicId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1154665542;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Marks all mentions in a topic in a forum supergroup chat as read.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReadAllForumTopicMentions extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Forum topic identifier in which mentions are marked as read.
         */
        public int forumTopicId;

        /**
         * Default constructor for a function, which marks all mentions in a topic in a forum supergroup chat as read.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReadAllForumTopicMentions() {
        }

        /**
         * Creates a function, which marks all mentions in a topic in a forum supergroup chat as read.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param forumTopicId Forum topic identifier in which mentions are marked as read.
         */
        public ReadAllForumTopicMentions(long chatId, int forumTopicId) {
            this.chatId = chatId;
            this.forumTopicId = forumTopicId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -996864148;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Marks all poll votes in a topic in a forum supergroup chat as read.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReadAllForumTopicPollVotes extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Forum topic identifier in which poll votes are marked as read.
         */
        public int forumTopicId;

        /**
         * Default constructor for a function, which marks all poll votes in a topic in a forum supergroup chat as read.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReadAllForumTopicPollVotes() {
        }

        /**
         * Creates a function, which marks all poll votes in a topic in a forum supergroup chat as read.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param forumTopicId Forum topic identifier in which poll votes are marked as read.
         */
        public ReadAllForumTopicPollVotes(long chatId, int forumTopicId) {
            this.chatId = chatId;
            this.forumTopicId = forumTopicId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 320081488;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Marks all reactions in a topic in a forum supergroup chat or a chat with a bot with topics as read.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReadAllForumTopicReactions extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Forum topic identifier in which reactions are marked as read.
         */
        public int forumTopicId;

        /**
         * Default constructor for a function, which marks all reactions in a topic in a forum supergroup chat or a chat with a bot with topics as read.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReadAllForumTopicReactions() {
        }

        /**
         * Creates a function, which marks all reactions in a topic in a forum supergroup chat or a chat with a bot with topics as read.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param forumTopicId Forum topic identifier in which reactions are marked as read.
         */
        public ReadAllForumTopicReactions(long chatId, int forumTopicId) {
            this.chatId = chatId;
            this.forumTopicId = forumTopicId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1986498949;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Reads a message on behalf of a business account; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReadBusinessMessage extends Function<Ok> {
        /**
         * Unique identifier of business connection through which the message was received.
         */
        public String businessConnectionId;
        /**
         * The chat the message belongs to.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;

        /**
         * Default constructor for a function, which reads a message on behalf of a business account; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReadBusinessMessage() {
        }

        /**
         * Creates a function, which reads a message on behalf of a business account; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param businessConnectionId Unique identifier of business connection through which the message was received.
         * @param chatId The chat the message belongs to.
         * @param messageId Identifier of the message.
         */
        public ReadBusinessMessage(String businessConnectionId, long chatId, long messageId) {
            this.businessConnectionId = businessConnectionId;
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1723531538;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Traverses all chats in a chat list and marks all messages in the chats as read.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReadChatList extends Function<Ok> {
        /**
         * Chat list in which to mark all chats as read.
         */
        public ChatList chatList;

        /**
         * Default constructor for a function, which traverses all chats in a chat list and marks all messages in the chats as read.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReadChatList() {
        }

        /**
         * Creates a function, which traverses all chats in a chat list and marks all messages in the chats as read.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatList Chat list in which to mark all chats as read.
         */
        public ReadChatList(ChatList chatList) {
            this.chatList = chatList;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1117480790;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Reads a part of a file from the TDLib file cache and returns read bytes. This method is intended to be used only if the application has no direct access to TDLib's file system, because it is usually slower than a direct read from the file.
     *
     * <p> Returns {@link Data Data} </p>
     */
    public static class ReadFilePart extends Function<Data> {
        /**
         * Identifier of the file. The file must be located in the TDLib file cache.
         */
        public int fileId;
        /**
         * The offset from which to read the file.
         */
        public long offset;
        /**
         * Number of bytes to read. An error will be returned if there are not enough bytes available in the file from the specified position. Pass 0 to read all available data from the specified position.
         */
        public long count;

        /**
         * Default constructor for a function, which reads a part of a file from the TDLib file cache and returns read bytes. This method is intended to be used only if the application has no direct access to TDLib's file system, because it is usually slower than a direct read from the file.
         *
         * <p> Returns {@link Data Data} </p>
         */
        public ReadFilePart() {
        }

        /**
         * Creates a function, which reads a part of a file from the TDLib file cache and returns read bytes. This method is intended to be used only if the application has no direct access to TDLib's file system, because it is usually slower than a direct read from the file.
         *
         * <p> Returns {@link Data Data} </p>
         *
         * @param fileId Identifier of the file. The file must be located in the TDLib file cache.
         * @param offset The offset from which to read the file.
         * @param count Number of bytes to read. An error will be returned if there are not enough bytes available in the file from the specified position. Pass 0 to read all available data from the specified position.
         */
        public ReadFilePart(int fileId, long offset, long count) {
            this.fileId = fileId;
            this.offset = offset;
            this.count = count;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -174576822;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Readds quick reply messages which failed to add. Can be called only for messages for which messageSendingStateFailed.canRetry is true and after specified in messageSendingStateFailed.retryAfter time passed. If a message is readded, the corresponding failed to send message is deleted. Returns the sent messages in the same order as the message identifiers passed in messageIds. If a message can't be readded, null will be returned instead of the message.
     *
     * <p> Returns {@link QuickReplyMessages QuickReplyMessages} </p>
     */
    public static class ReaddQuickReplyShortcutMessages extends Function<QuickReplyMessages> {
        /**
         * Name of the target shortcut.
         */
        public String shortcutName;
        /**
         * Identifiers of the quick reply messages to readd. Message identifiers must be in a strictly increasing order.
         */
        public long[] messageIds;

        /**
         * Default constructor for a function, which readds quick reply messages which failed to add. Can be called only for messages for which messageSendingStateFailed.canRetry is true and after specified in messageSendingStateFailed.retryAfter time passed. If a message is readded, the corresponding failed to send message is deleted. Returns the sent messages in the same order as the message identifiers passed in messageIds. If a message can't be readded, null will be returned instead of the message.
         *
         * <p> Returns {@link QuickReplyMessages QuickReplyMessages} </p>
         */
        public ReaddQuickReplyShortcutMessages() {
        }

        /**
         * Creates a function, which readds quick reply messages which failed to add. Can be called only for messages for which messageSendingStateFailed.canRetry is true and after specified in messageSendingStateFailed.retryAfter time passed. If a message is readded, the corresponding failed to send message is deleted. Returns the sent messages in the same order as the message identifiers passed in messageIds. If a message can't be readded, null will be returned instead of the message.
         *
         * <p> Returns {@link QuickReplyMessages QuickReplyMessages} </p>
         *
         * @param shortcutName Name of the target shortcut.
         * @param messageIds Identifiers of the quick reply messages to readd. Message identifiers must be in a strictly increasing order.
         */
        public ReaddQuickReplyShortcutMessages(String shortcutName, long[] messageIds) {
            this.shortcutName = shortcutName;
            this.messageIds = messageIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 387399566;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Recognizes speech in a video note or a voice note message.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RecognizeSpeech extends Function<Ok> {
        /**
         * Identifier of the chat to which the message belongs.
         */
        public long chatId;
        /**
         * Identifier of the message. Use messageProperties.canRecognizeSpeech to check whether the message is suitable.
         */
        public long messageId;

        /**
         * Default constructor for a function, which recognizes speech in a video note or a voice note message.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RecognizeSpeech() {
        }

        /**
         * Creates a function, which recognizes speech in a video note or a voice note message.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat to which the message belongs.
         * @param messageId Identifier of the message. Use messageProperties.canRecognizeSpeech to check whether the message is suitable.
         */
        public RecognizeSpeech(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1741947577;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Recovers the 2-step verification password with a password recovery code sent to an email address that was previously set up. Works only when the current authorization state is authorizationStateWaitPassword.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RecoverAuthenticationPassword extends Function<Ok> {
        /**
         * Recovery code to check.
         */
        public String recoveryCode;
        /**
         * New 2-step verification password of the user; may be empty to remove the password.
         */
        public String newPassword;
        /**
         * New password hint; may be empty.
         */
        public String newHint;

        /**
         * Default constructor for a function, which recovers the 2-step verification password with a password recovery code sent to an email address that was previously set up. Works only when the current authorization state is authorizationStateWaitPassword.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RecoverAuthenticationPassword() {
        }

        /**
         * Creates a function, which recovers the 2-step verification password with a password recovery code sent to an email address that was previously set up. Works only when the current authorization state is authorizationStateWaitPassword.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param recoveryCode Recovery code to check.
         * @param newPassword New 2-step verification password of the user; may be empty to remove the password.
         * @param newHint New password hint; may be empty.
         */
        public RecoverAuthenticationPassword(String recoveryCode, String newPassword, String newHint) {
            this.recoveryCode = recoveryCode;
            this.newPassword = newPassword;
            this.newHint = newHint;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -131001053;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Recovers the 2-step verification password using a recovery code sent to an email address that was previously set up.
     *
     * <p> Returns {@link PasswordState PasswordState} </p>
     */
    public static class RecoverPassword extends Function<PasswordState> {
        /**
         * Recovery code to check.
         */
        public String recoveryCode;
        /**
         * New 2-step verification password of the user; may be empty to remove the password.
         */
        public String newPassword;
        /**
         * New password hint; may be empty.
         */
        public String newHint;

        /**
         * Default constructor for a function, which recovers the 2-step verification password using a recovery code sent to an email address that was previously set up.
         *
         * <p> Returns {@link PasswordState PasswordState} </p>
         */
        public RecoverPassword() {
        }

        /**
         * Creates a function, which recovers the 2-step verification password using a recovery code sent to an email address that was previously set up.
         *
         * <p> Returns {@link PasswordState PasswordState} </p>
         *
         * @param recoveryCode Recovery code to check.
         * @param newPassword New 2-step verification password of the user; may be empty to remove the password.
         * @param newHint New password hint; may be empty.
         */
        public RecoverPassword(String recoveryCode, String newPassword, String newHint) {
            this.recoveryCode = recoveryCode;
            this.newPassword = newPassword;
            this.newHint = newHint;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1524262541;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Refunds a previously done payment in Telegram Stars; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RefundStarPayment extends Function<Ok> {
        /**
         * Identifier of the user who did the payment.
         */
        public long userId;
        /**
         * Telegram payment identifier.
         */
        public String telegramPaymentChargeId;

        /**
         * Default constructor for a function, which refunds a previously done payment in Telegram Stars; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RefundStarPayment() {
        }

        /**
         * Creates a function, which refunds a previously done payment in Telegram Stars; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param userId Identifier of the user who did the payment.
         * @param telegramPaymentChargeId Telegram payment identifier.
         */
        public RefundStarPayment(long userId, String telegramPaymentChargeId) {
            this.userId = userId;
            this.telegramPaymentChargeId = telegramPaymentChargeId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1804165035;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Registers the currently used device for receiving push notifications. Returns a globally unique identifier of the push notification subscription.
     *
     * <p> Returns {@link PushReceiverId PushReceiverId} </p>
     */
    public static class RegisterDevice extends Function<PushReceiverId> {
        /**
         * Device token.
         */
        public DeviceToken deviceToken;
        /**
         * List of user identifiers of other users currently using the application.
         */
        public long[] otherUserIds;

        /**
         * Default constructor for a function, which registers the currently used device for receiving push notifications. Returns a globally unique identifier of the push notification subscription.
         *
         * <p> Returns {@link PushReceiverId PushReceiverId} </p>
         */
        public RegisterDevice() {
        }

        /**
         * Creates a function, which registers the currently used device for receiving push notifications. Returns a globally unique identifier of the push notification subscription.
         *
         * <p> Returns {@link PushReceiverId PushReceiverId} </p>
         *
         * @param deviceToken Device token.
         * @param otherUserIds List of user identifiers of other users currently using the application.
         */
        public RegisterDevice(DeviceToken deviceToken, long[] otherUserIds) {
            this.deviceToken = deviceToken;
            this.otherUserIds = otherUserIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 366088823;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Finishes user registration. Works only when the current authorization state is authorizationStateWaitRegistration.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RegisterUser extends Function<Ok> {
        /**
         * The first name of the user; 1-64 characters.
         */
        public String firstName;
        /**
         * The last name of the user; 0-64 characters.
         */
        public String lastName;
        /**
         * Pass true to disable notification about the current user joining Telegram for other users that added them to contact list.
         */
        public boolean disableNotification;

        /**
         * Default constructor for a function, which finishes user registration. Works only when the current authorization state is authorizationStateWaitRegistration.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RegisterUser() {
        }

        /**
         * Creates a function, which finishes user registration. Works only when the current authorization state is authorizationStateWaitRegistration.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param firstName The first name of the user; 1-64 characters.
         * @param lastName The last name of the user; 0-64 characters.
         * @param disableNotification Pass true to disable notification about the current user joining Telegram for other users that added them to contact list.
         */
        public RegisterUser(String firstName, String lastName, boolean disableNotification) {
            this.firstName = firstName;
            this.lastName = lastName;
            this.disableNotification = disableNotification;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1012247828;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes all files from the file download list.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RemoveAllFilesFromDownloads extends Function<Ok> {
        /**
         * Pass true to remove only active downloads, including paused.
         */
        public boolean onlyActive;
        /**
         * Pass true to remove only completed downloads.
         */
        public boolean onlyCompleted;
        /**
         * Pass true to delete the file from the TDLib file cache.
         */
        public boolean deleteFromCache;

        /**
         * Default constructor for a function, which removes all files from the file download list.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RemoveAllFilesFromDownloads() {
        }

        /**
         * Creates a function, which removes all files from the file download list.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param onlyActive Pass true to remove only active downloads, including paused.
         * @param onlyCompleted Pass true to remove only completed downloads.
         * @param deleteFromCache Pass true to delete the file from the TDLib file cache.
         */
        public RemoveAllFilesFromDownloads(boolean onlyActive, boolean onlyCompleted, boolean deleteFromCache) {
            this.onlyActive = onlyActive;
            this.onlyCompleted = onlyCompleted;
            this.deleteFromCache = deleteFromCache;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1186433402;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes the connected business bot from a specific chat by adding the chat to businessRecipients.excludedChatIds.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RemoveBusinessConnectedBotFromChat extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which removes the connected business bot from a specific chat by adding the chat to businessRecipients.excludedChatIds.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RemoveBusinessConnectedBotFromChat() {
        }

        /**
         * Creates a function, which removes the connected business bot from a specific chat by adding the chat to businessRecipients.excludedChatIds.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         */
        public RemoveBusinessConnectedBotFromChat(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2020766707;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes a chat action bar without any other action.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RemoveChatActionBar extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which removes a chat action bar without any other action.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RemoveChatActionBar() {
        }

        /**
         * Creates a function, which removes a chat action bar without any other action.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         */
        public RemoveChatActionBar(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1650968070;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes users from the contact list.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RemoveContacts extends Function<Ok> {
        /**
         * Identifiers of users to be deleted.
         */
        public long[] userIds;

        /**
         * Default constructor for a function, which removes users from the contact list.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RemoveContacts() {
        }

        /**
         * Creates a function, which removes users from the contact list.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param userIds Identifiers of users to be deleted.
         */
        public RemoveContacts(long[] userIds) {
            this.userIds = userIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1943858054;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes a sticker from the list of favorite stickers.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RemoveFavoriteSticker extends Function<Ok> {
        /**
         * Sticker file to delete from the list.
         */
        public InputFile sticker;

        /**
         * Default constructor for a function, which removes a sticker from the list of favorite stickers.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RemoveFavoriteSticker() {
        }

        /**
         * Creates a function, which removes a sticker from the list of favorite stickers.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param sticker Sticker file to delete from the list.
         */
        public RemoveFavoriteSticker(InputFile sticker) {
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1152945264;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes a file from the file download list.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RemoveFileFromDownloads extends Function<Ok> {
        /**
         * Identifier of the downloaded file.
         */
        public int fileId;
        /**
         * Pass true to delete the file from the TDLib file cache.
         */
        public boolean deleteFromCache;

        /**
         * Default constructor for a function, which removes a file from the file download list.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RemoveFileFromDownloads() {
        }

        /**
         * Creates a function, which removes a file from the file download list.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param fileId Identifier of the downloaded file.
         * @param deleteFromCache Pass true to delete the file from the TDLib file cache.
         */
        public RemoveFileFromDownloads(int fileId, boolean deleteFromCache) {
            this.fileId = fileId;
            this.deleteFromCache = deleteFromCache;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1460060142;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes gifts from a collection. If the collection is owned by a channel chat, then requires canPostMessages administrator right in the channel chat. Returns the changed collection.
     *
     * <p> Returns {@link GiftCollection GiftCollection} </p>
     */
    public static class RemoveGiftCollectionGifts extends Function<GiftCollection> {
        /**
         * Identifier of the user or the channel chat that owns the collection.
         */
        public MessageSender ownerId;
        /**
         * Identifier of the gift collection.
         */
        public int collectionId;
        /**
         * Identifier of the gifts to remove from the collection.
         */
        public String[] receivedGiftIds;

        /**
         * Default constructor for a function, which removes gifts from a collection. If the collection is owned by a channel chat, then requires canPostMessages administrator right in the channel chat. Returns the changed collection.
         *
         * <p> Returns {@link GiftCollection GiftCollection} </p>
         */
        public RemoveGiftCollectionGifts() {
        }

        /**
         * Creates a function, which removes gifts from a collection. If the collection is owned by a channel chat, then requires canPostMessages administrator right in the channel chat. Returns the changed collection.
         *
         * <p> Returns {@link GiftCollection GiftCollection} </p>
         *
         * @param ownerId Identifier of the user or the channel chat that owns the collection.
         * @param collectionId Identifier of the gift collection.
         * @param receivedGiftIds Identifier of the gifts to remove from the collection.
         */
        public RemoveGiftCollectionGifts(MessageSender ownerId, int collectionId, String[] receivedGiftIds) {
            this.ownerId = ownerId;
            this.collectionId = collectionId;
            this.receivedGiftIds = receivedGiftIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -692316949;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes background from the list of installed backgrounds.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RemoveInstalledBackground extends Function<Ok> {
        /**
         * The background identifier.
         */
        public long backgroundId;

        /**
         * Default constructor for a function, which removes background from the list of installed backgrounds.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RemoveInstalledBackground() {
        }

        /**
         * Creates a function, which removes background from the list of installed backgrounds.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param backgroundId The background identifier.
         */
        public RemoveInstalledBackground(long backgroundId) {
            this.backgroundId = backgroundId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1346446652;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes a passkey from the list of passkeys allowed to be used for the login by the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RemoveLoginPasskey extends Function<Ok> {
        /**
         * Unique identifier of the passkey to remove.
         */
        public String passkeyId;

        /**
         * Default constructor for a function, which removes a passkey from the list of passkeys allowed to be used for the login by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RemoveLoginPasskey() {
        }

        /**
         * Creates a function, which removes a passkey from the list of passkeys allowed to be used for the login by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param passkeyId Unique identifier of the passkey to remove.
         */
        public RemoveLoginPasskey(String passkeyId) {
            this.passkeyId = passkeyId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1728940387;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes a reaction from a message. A chosen reaction can always be removed.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RemoveMessageReaction extends Function<Ok> {
        /**
         * Identifier of the chat to which the message belongs.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * Type of the reaction to remove. The paid reaction can't be removed.
         */
        public ReactionType reactionType;

        /**
         * Default constructor for a function, which removes a reaction from a message. A chosen reaction can always be removed.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RemoveMessageReaction() {
        }

        /**
         * Creates a function, which removes a reaction from a message. A chosen reaction can always be removed.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat to which the message belongs.
         * @param messageId Identifier of the message.
         * @param reactionType Type of the reaction to remove. The paid reaction can't be removed.
         */
        public RemoveMessageReaction(long chatId, long messageId, ReactionType reactionType) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.reactionType = reactionType;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1756934789;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes the verification status of a user or a chat by an owned bot.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RemoveMessageSenderBotVerification extends Function<Ok> {
        /**
         * Identifier of the owned bot, which verified the user or the chat.
         */
        public long botUserId;
        /**
         * Identifier of the user or the supergroup or channel chat, which verification is removed.
         */
        public MessageSender verifiedId;

        /**
         * Default constructor for a function, which removes the verification status of a user or a chat by an owned bot.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RemoveMessageSenderBotVerification() {
        }

        /**
         * Creates a function, which removes the verification status of a user or a chat by an owned bot.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param botUserId Identifier of the owned bot, which verified the user or the chat.
         * @param verifiedId Identifier of the user or the supergroup or channel chat, which verification is removed.
         */
        public RemoveMessageSenderBotVerification(long botUserId, MessageSender verifiedId) {
            this.botUserId = botUserId;
            this.verifiedId = verifiedId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1710174374;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes an active notification from notification list. Needs to be called only if the notification is removed by the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RemoveNotification extends Function<Ok> {
        /**
         * Identifier of notification group to which the notification belongs.
         */
        public int notificationGroupId;
        /**
         * Identifier of removed notification.
         */
        public int notificationId;

        /**
         * Default constructor for a function, which removes an active notification from notification list. Needs to be called only if the notification is removed by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RemoveNotification() {
        }

        /**
         * Creates a function, which removes an active notification from notification list. Needs to be called only if the notification is removed by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param notificationGroupId Identifier of notification group to which the notification belongs.
         * @param notificationId Identifier of removed notification.
         */
        public RemoveNotification(int notificationGroupId, int notificationId) {
            this.notificationGroupId = notificationGroupId;
            this.notificationId = notificationId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 862630734;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes a group of active notifications. Needs to be called only if the notification group is removed by the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RemoveNotificationGroup extends Function<Ok> {
        /**
         * Notification group identifier.
         */
        public int notificationGroupId;
        /**
         * The maximum identifier of removed notifications.
         */
        public int maxNotificationId;

        /**
         * Default constructor for a function, which removes a group of active notifications. Needs to be called only if the notification group is removed by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RemoveNotificationGroup() {
        }

        /**
         * Creates a function, which removes a group of active notifications. Needs to be called only if the notification group is removed by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param notificationGroupId Notification group identifier.
         * @param maxNotificationId The maximum identifier of removed notifications.
         */
        public RemoveNotificationGroup(int notificationGroupId, int maxNotificationId) {
            this.notificationGroupId = notificationGroupId;
            this.maxNotificationId = maxNotificationId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1713005454;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes all pending paid reactions in a live story group call.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RemovePendingLiveStoryReactions extends Function<Ok> {
        /**
         * Group call identifier.
         */
        public int groupCallId;

        /**
         * Default constructor for a function, which removes all pending paid reactions in a live story group call.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RemovePendingLiveStoryReactions() {
        }

        /**
         * Creates a function, which removes all pending paid reactions in a live story group call.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier.
         */
        public RemovePendingLiveStoryReactions(int groupCallId) {
            this.groupCallId = groupCallId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 868601112;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes all pending paid reactions on a message.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RemovePendingPaidMessageReactions extends Function<Ok> {
        /**
         * Identifier of the chat to which the message belongs.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;

        /**
         * Default constructor for a function, which removes all pending paid reactions on a message.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RemovePendingPaidMessageReactions() {
        }

        /**
         * Creates a function, which removes all pending paid reactions on a message.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat to which the message belongs.
         * @param messageId Identifier of the message.
         */
        public RemovePendingPaidMessageReactions(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1100258555;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes an audio file from the profile audio files of the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RemoveProfileAudio extends Function<Ok> {
        /**
         * Identifier of the audio file to be removed.
         */
        public int fileId;

        /**
         * Default constructor for a function, which removes an audio file from the profile audio files of the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RemoveProfileAudio() {
        }

        /**
         * Creates a function, which removes an audio file from the profile audio files of the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param fileId Identifier of the audio file to be removed.
         */
        public RemoveProfileAudio(int fileId) {
            this.fileId = fileId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1292263034;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes a proxy server. Can be called before authorization.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RemoveProxy extends Function<Ok> {
        /**
         * Proxy identifier.
         */
        public int proxyId;

        /**
         * Default constructor for a function, which removes a proxy server. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RemoveProxy() {
        }

        /**
         * Creates a function, which removes a proxy server. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param proxyId Proxy identifier.
         */
        public RemoveProxy(int proxyId) {
            this.proxyId = proxyId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1369219847;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes a hashtag from the list of recently used hashtags.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RemoveRecentHashtag extends Function<Ok> {
        /**
         * Hashtag to delete.
         */
        public String hashtag;

        /**
         * Default constructor for a function, which removes a hashtag from the list of recently used hashtags.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RemoveRecentHashtag() {
        }

        /**
         * Creates a function, which removes a hashtag from the list of recently used hashtags.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param hashtag Hashtag to delete.
         */
        public RemoveRecentHashtag(String hashtag) {
            this.hashtag = hashtag;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1013735260;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes a sticker from the list of recently used stickers.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RemoveRecentSticker extends Function<Ok> {
        /**
         * Pass true to remove the sticker from the list of stickers recently attached to photo or video files; pass false to remove the sticker from the list of recently sent stickers.
         */
        public boolean isAttached;
        /**
         * Sticker file to delete.
         */
        public InputFile sticker;

        /**
         * Default constructor for a function, which removes a sticker from the list of recently used stickers.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RemoveRecentSticker() {
        }

        /**
         * Creates a function, which removes a sticker from the list of recently used stickers.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param isAttached Pass true to remove the sticker from the list of stickers recently attached to photo or video files; pass false to remove the sticker from the list of recently sent stickers.
         * @param sticker Sticker file to delete.
         */
        public RemoveRecentSticker(boolean isAttached, InputFile sticker) {
            this.isAttached = isAttached;
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1246577677;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes a chat from the list of recently found chats.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RemoveRecentlyFoundChat extends Function<Ok> {
        /**
         * Identifier of the chat to be removed.
         */
        public long chatId;

        /**
         * Default constructor for a function, which removes a chat from the list of recently found chats.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RemoveRecentlyFoundChat() {
        }

        /**
         * Creates a function, which removes a chat from the list of recently found chats.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat to be removed.
         */
        public RemoveRecentlyFoundChat(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 717340444;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes an animation from the list of saved animations.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RemoveSavedAnimation extends Function<Ok> {
        /**
         * Animation file to be removed.
         */
        public InputFile animation;

        /**
         * Default constructor for a function, which removes an animation from the list of saved animations.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RemoveSavedAnimation() {
        }

        /**
         * Creates a function, which removes an animation from the list of saved animations.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param animation Animation file to be removed.
         */
        public RemoveSavedAnimation(InputFile animation) {
            this.animation = animation;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -495605479;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes a notification sound from the list of saved notification sounds.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RemoveSavedNotificationSound extends Function<Ok> {
        /**
         * Identifier of the notification sound.
         */
        public long notificationSoundId;

        /**
         * Default constructor for a function, which removes a notification sound from the list of saved notification sounds.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RemoveSavedNotificationSound() {
        }

        /**
         * Creates a function, which removes a notification sound from the list of saved notification sounds.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param notificationSoundId Identifier of the notification sound.
         */
        public RemoveSavedNotificationSound(long notificationSoundId) {
            this.notificationSoundId = notificationSoundId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -480032946;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes a hashtag or a cashtag from the list of recently searched for hashtags or cashtags.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RemoveSearchedForTag extends Function<Ok> {
        /**
         * Hashtag or cashtag to delete.
         */
        public String tag;

        /**
         * Default constructor for a function, which removes a hashtag or a cashtag from the list of recently searched for hashtags or cashtags.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RemoveSearchedForTag() {
        }

        /**
         * Creates a function, which removes a hashtag or a cashtag from the list of recently searched for hashtags or cashtags.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param tag Hashtag or cashtag to delete.
         */
        public RemoveSearchedForTag(String tag) {
            this.tag = tag;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 891382730;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes a sticker from the set to which it belongs. The sticker set must be owned by the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RemoveStickerFromSet extends Function<Ok> {
        /**
         * Sticker to remove from the set.
         */
        public InputFile sticker;

        /**
         * Default constructor for a function, which removes a sticker from the set to which it belongs. The sticker set must be owned by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RemoveStickerFromSet() {
        }

        /**
         * Creates a function, which removes a sticker from the set to which it belongs. The sticker set must be owned by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param sticker Sticker to remove from the set.
         */
        public RemoveStickerFromSet(InputFile sticker) {
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1642196644;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes stories from an album. If the album is owned by a supergroup or a channel chat, then requires canEditStories administrator right in the chat. Returns the changed album.
     *
     * <p> Returns {@link StoryAlbum StoryAlbum} </p>
     */
    public static class RemoveStoryAlbumStories extends Function<StoryAlbum> {
        /**
         * Identifier of the chat that owns the stories.
         */
        public long chatId;
        /**
         * Identifier of the story album.
         */
        public int storyAlbumId;
        /**
         * Identifier of the stories to remove from the album.
         */
        public int[] storyIds;

        /**
         * Default constructor for a function, which removes stories from an album. If the album is owned by a supergroup or a channel chat, then requires canEditStories administrator right in the chat. Returns the changed album.
         *
         * <p> Returns {@link StoryAlbum StoryAlbum} </p>
         */
        public RemoveStoryAlbumStories() {
        }

        /**
         * Creates a function, which removes stories from an album. If the album is owned by a supergroup or a channel chat, then requires canEditStories administrator right in the chat. Returns the changed album.
         *
         * <p> Returns {@link StoryAlbum StoryAlbum} </p>
         *
         * @param chatId Identifier of the chat that owns the stories.
         * @param storyAlbumId Identifier of the story album.
         * @param storyIds Identifier of the stories to remove from the album.
         */
        public RemoveStoryAlbumStories(long chatId, int storyAlbumId, int[] storyIds) {
            this.chatId = chatId;
            this.storyAlbumId = storyAlbumId;
            this.storyIds = storyIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1901872465;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes a custom text composition style from the list of used by the user styles. If the style was created by the current user, then it can only be deleted.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RemoveTextCompositionStyle extends Function<Ok> {
        /**
         * Name of the style.
         */
        public String name;

        /**
         * Default constructor for a function, which removes a custom text composition style from the list of used by the user styles. If the style was created by the current user, then it can only be deleted.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RemoveTextCompositionStyle() {
        }

        /**
         * Creates a function, which removes a custom text composition style from the list of used by the user styles. If the style was created by the current user, then it can only be deleted.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param name Name of the style.
         */
        public RemoveTextCompositionStyle(String name) {
            this.name = name;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -543700866;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes a chat from the list of frequently used chats. Supported only if the chat info database is enabled.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RemoveTopChat extends Function<Ok> {
        /**
         * Category of frequently used chats.
         */
        public TopChatCategory category;
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which removes a chat from the list of frequently used chats. Supported only if the chat info database is enabled.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RemoveTopChat() {
        }

        /**
         * Creates a function, which removes a chat from the list of frequently used chats. Supported only if the chat info database is enabled.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param category Category of frequently used chats.
         * @param chatId Chat identifier.
         */
        public RemoveTopChat(TopChatCategory category, long chatId) {
            this.category = category;
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1907876267;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes order of active usernames of the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReorderActiveUsernames extends Function<Ok> {
        /**
         * The new order of active usernames. All currently active usernames must be specified.
         */
        public String[] usernames;

        /**
         * Default constructor for a function, which changes order of active usernames of the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReorderActiveUsernames() {
        }

        /**
         * Creates a function, which changes order of active usernames of the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param usernames The new order of active usernames. All currently active usernames must be specified.
         */
        public ReorderActiveUsernames(String[] usernames) {
            this.usernames = usernames;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -455399375;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes order of active usernames of a bot. Can be called only if userTypeBot.canBeEdited == true.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReorderBotActiveUsernames extends Function<Ok> {
        /**
         * Identifier of the target bot.
         */
        public long botUserId;
        /**
         * The new order of active usernames. All currently active usernames must be specified.
         */
        public String[] usernames;

        /**
         * Default constructor for a function, which changes order of active usernames of a bot. Can be called only if userTypeBot.canBeEdited == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReorderBotActiveUsernames() {
        }

        /**
         * Creates a function, which changes order of active usernames of a bot. Can be called only if userTypeBot.canBeEdited == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param botUserId Identifier of the target bot.
         * @param usernames The new order of active usernames. All currently active usernames must be specified.
         */
        public ReorderBotActiveUsernames(long botUserId, String[] usernames) {
            this.botUserId = botUserId;
            this.usernames = usernames;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1602301664;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes order of media previews in the list of media previews of a bot.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReorderBotMediaPreviews extends Function<Ok> {
        /**
         * Identifier of the target bot. The bot must be owned and must have the main Web App.
         */
        public long botUserId;
        /**
         * Language code of the media previews to reorder.
         */
        public String languageCode;
        /**
         * File identifiers of the media in the new order.
         */
        public int[] fileIds;

        /**
         * Default constructor for a function, which changes order of media previews in the list of media previews of a bot.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReorderBotMediaPreviews() {
        }

        /**
         * Creates a function, which changes order of media previews in the list of media previews of a bot.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param botUserId Identifier of the target bot. The bot must be owned and must have the main Web App.
         * @param languageCode Language code of the media previews to reorder.
         * @param fileIds File identifiers of the media in the new order.
         */
        public ReorderBotMediaPreviews(long botUserId, String languageCode, int[] fileIds) {
            this.botUserId = botUserId;
            this.languageCode = languageCode;
            this.fileIds = fileIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 630851043;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the order of chat folders.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReorderChatFolders extends Function<Ok> {
        /**
         * Identifiers of chat folders in the new correct order.
         */
        public int[] chatFolderIds;
        /**
         * Position of the main chat list among chat folders, 0-based. Can be non-zero only for Premium users.
         */
        public int mainChatListPosition;

        /**
         * Default constructor for a function, which changes the order of chat folders.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReorderChatFolders() {
        }

        /**
         * Creates a function, which changes the order of chat folders.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatFolderIds Identifiers of chat folders in the new correct order.
         * @param mainChatListPosition Position of the main chat list among chat folders, 0-based. Can be non-zero only for Premium users.
         */
        public ReorderChatFolders(int[] chatFolderIds, int mainChatListPosition) {
            this.chatFolderIds = chatFolderIds;
            this.mainChatListPosition = mainChatListPosition;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1665299546;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes order of gifts in a collection. If the collection is owned by a channel chat, then requires canPostMessages administrator right in the channel chat. Returns the changed collection.
     *
     * <p> Returns {@link GiftCollection GiftCollection} </p>
     */
    public static class ReorderGiftCollectionGifts extends Function<GiftCollection> {
        /**
         * Identifier of the user or the channel chat that owns the collection.
         */
        public MessageSender ownerId;
        /**
         * Identifier of the gift collection.
         */
        public int collectionId;
        /**
         * Identifier of the gifts to move to the beginning of the collection. All other gifts are placed in the current order after the specified gifts.
         */
        public String[] receivedGiftIds;

        /**
         * Default constructor for a function, which changes order of gifts in a collection. If the collection is owned by a channel chat, then requires canPostMessages administrator right in the channel chat. Returns the changed collection.
         *
         * <p> Returns {@link GiftCollection GiftCollection} </p>
         */
        public ReorderGiftCollectionGifts() {
        }

        /**
         * Creates a function, which changes order of gifts in a collection. If the collection is owned by a channel chat, then requires canPostMessages administrator right in the channel chat. Returns the changed collection.
         *
         * <p> Returns {@link GiftCollection GiftCollection} </p>
         *
         * @param ownerId Identifier of the user or the channel chat that owns the collection.
         * @param collectionId Identifier of the gift collection.
         * @param receivedGiftIds Identifier of the gifts to move to the beginning of the collection. All other gifts are placed in the current order after the specified gifts.
         */
        public ReorderGiftCollectionGifts(MessageSender ownerId, int collectionId, String[] receivedGiftIds) {
            this.ownerId = ownerId;
            this.collectionId = collectionId;
            this.receivedGiftIds = receivedGiftIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1545340419;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes order of gift collections. If the collections are owned by a channel chat, then requires canPostMessages administrator right in the channel chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReorderGiftCollections extends Function<Ok> {
        /**
         * Identifier of the user or the channel chat that owns the collection.
         */
        public MessageSender ownerId;
        /**
         * New order of gift collections.
         */
        public int[] collectionIds;

        /**
         * Default constructor for a function, which changes order of gift collections. If the collections are owned by a channel chat, then requires canPostMessages administrator right in the channel chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReorderGiftCollections() {
        }

        /**
         * Creates a function, which changes order of gift collections. If the collections are owned by a channel chat, then requires canPostMessages administrator right in the channel chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param ownerId Identifier of the user or the channel chat that owns the collection.
         * @param collectionIds New order of gift collections.
         */
        public ReorderGiftCollections(MessageSender ownerId, int[] collectionIds) {
            this.ownerId = ownerId;
            this.collectionIds = collectionIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1607216912;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the order of installed sticker sets.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReorderInstalledStickerSets extends Function<Ok> {
        /**
         * Type of the sticker sets to reorder.
         */
        public StickerType stickerType;
        /**
         * Identifiers of installed sticker sets in the new correct order.
         */
        public long[] stickerSetIds;

        /**
         * Default constructor for a function, which changes the order of installed sticker sets.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReorderInstalledStickerSets() {
        }

        /**
         * Creates a function, which changes the order of installed sticker sets.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param stickerType Type of the sticker sets to reorder.
         * @param stickerSetIds Identifiers of installed sticker sets in the new correct order.
         */
        public ReorderInstalledStickerSets(StickerType stickerType, long[] stickerSetIds) {
            this.stickerType = stickerType;
            this.stickerSetIds = stickerSetIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1074928158;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the order of quick reply shortcuts.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReorderQuickReplyShortcuts extends Function<Ok> {
        /**
         * The new order of quick reply shortcuts.
         */
        public int[] shortcutIds;

        /**
         * Default constructor for a function, which changes the order of quick reply shortcuts.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReorderQuickReplyShortcuts() {
        }

        /**
         * Creates a function, which changes the order of quick reply shortcuts.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param shortcutIds The new order of quick reply shortcuts.
         */
        public ReorderQuickReplyShortcuts(int[] shortcutIds) {
            this.shortcutIds = shortcutIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2052799232;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes order of stories in an album. If the album is owned by a supergroup or a channel chat, then requires canEditStories administrator right in the chat. Returns the changed album.
     *
     * <p> Returns {@link StoryAlbum StoryAlbum} </p>
     */
    public static class ReorderStoryAlbumStories extends Function<StoryAlbum> {
        /**
         * Identifier of the chat that owns the stories.
         */
        public long chatId;
        /**
         * Identifier of the story album.
         */
        public int storyAlbumId;
        /**
         * Identifier of the stories to move to the beginning of the album. All other stories are placed in the current order after the specified stories.
         */
        public int[] storyIds;

        /**
         * Default constructor for a function, which changes order of stories in an album. If the album is owned by a supergroup or a channel chat, then requires canEditStories administrator right in the chat. Returns the changed album.
         *
         * <p> Returns {@link StoryAlbum StoryAlbum} </p>
         */
        public ReorderStoryAlbumStories() {
        }

        /**
         * Creates a function, which changes order of stories in an album. If the album is owned by a supergroup or a channel chat, then requires canEditStories administrator right in the chat. Returns the changed album.
         *
         * <p> Returns {@link StoryAlbum StoryAlbum} </p>
         *
         * @param chatId Identifier of the chat that owns the stories.
         * @param storyAlbumId Identifier of the story album.
         * @param storyIds Identifier of the stories to move to the beginning of the album. All other stories are placed in the current order after the specified stories.
         */
        public ReorderStoryAlbumStories(long chatId, int storyAlbumId, int[] storyIds) {
            this.chatId = chatId;
            this.storyAlbumId = storyAlbumId;
            this.storyIds = storyIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 438104756;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes order of story albums. If the albums are owned by a supergroup or a channel chat, then requires canEditStories administrator right in the chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReorderStoryAlbums extends Function<Ok> {
        /**
         * Identifier of the chat that owns the stories.
         */
        public long chatId;
        /**
         * New order of story albums.
         */
        public int[] storyAlbumIds;

        /**
         * Default constructor for a function, which changes order of story albums. If the albums are owned by a supergroup or a channel chat, then requires canEditStories administrator right in the chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReorderStoryAlbums() {
        }

        /**
         * Creates a function, which changes order of story albums. If the albums are owned by a supergroup or a channel chat, then requires canEditStories administrator right in the chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat that owns the stories.
         * @param storyAlbumIds New order of story albums.
         */
        public ReorderStoryAlbums(long chatId, int[] storyAlbumIds) {
            this.chatId = chatId;
            this.storyAlbumIds = storyAlbumIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 514423948;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes order of active usernames of a supergroup or channel, requires owner privileges in the supergroup or channel.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReorderSupergroupActiveUsernames extends Function<Ok> {
        /**
         * Identifier of the supergroup or channel.
         */
        public long supergroupId;
        /**
         * The new order of active usernames. All currently active usernames must be specified.
         */
        public String[] usernames;

        /**
         * Default constructor for a function, which changes order of active usernames of a supergroup or channel, requires owner privileges in the supergroup or channel.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReorderSupergroupActiveUsernames() {
        }

        /**
         * Creates a function, which changes order of active usernames of a supergroup or channel, requires owner privileges in the supergroup or channel.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param supergroupId Identifier of the supergroup or channel.
         * @param usernames The new order of active usernames. All currently active usernames must be specified.
         */
        public ReorderSupergroupActiveUsernames(long supergroupId, String[] usernames) {
            this.supergroupId = supergroupId;
            this.usernames = usernames;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1962466095;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Replaces the current RTMP URL for streaming to a live story; requires owner privileges for channel chats.
     *
     * <p> Returns {@link RtmpUrl RtmpUrl} </p>
     */
    public static class ReplaceLiveStoryRtmpUrl extends Function<RtmpUrl> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which replaces the current RTMP URL for streaming to a live story; requires owner privileges for channel chats.
         *
         * <p> Returns {@link RtmpUrl RtmpUrl} </p>
         */
        public ReplaceLiveStoryRtmpUrl() {
        }

        /**
         * Creates a function, which replaces the current RTMP URL for streaming to a live story; requires owner privileges for channel chats.
         *
         * <p> Returns {@link RtmpUrl RtmpUrl} </p>
         *
         * @param chatId Chat identifier.
         */
        public ReplaceLiveStoryRtmpUrl(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 585361229;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Replaces current primary invite link for a chat with a new primary invite link. Available for basic groups, supergroups, and channels. Requires administrator privileges and canInviteUsers right.
     *
     * <p> Returns {@link ChatInviteLink ChatInviteLink} </p>
     */
    public static class ReplacePrimaryChatInviteLink extends Function<ChatInviteLink> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which replaces current primary invite link for a chat with a new primary invite link. Available for basic groups, supergroups, and channels. Requires administrator privileges and canInviteUsers right.
         *
         * <p> Returns {@link ChatInviteLink ChatInviteLink} </p>
         */
        public ReplacePrimaryChatInviteLink() {
        }

        /**
         * Creates a function, which replaces current primary invite link for a chat with a new primary invite link. Available for basic groups, supergroups, and channels. Requires administrator privileges and canInviteUsers right.
         *
         * <p> Returns {@link ChatInviteLink ChatInviteLink} </p>
         *
         * @param chatId Chat identifier.
         */
        public ReplacePrimaryChatInviteLink(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1067350941;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Replaces existing sticker in a set. The function is equivalent to removeStickerFromSet, then addStickerToSet, then setStickerPositionInSet.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReplaceStickerInSet extends Function<Ok> {
        /**
         * Sticker set owner; ignored for regular users.
         */
        public long userId;
        /**
         * Sticker set name. The sticker set must be owned by the current user.
         */
        public String name;
        /**
         * Sticker to remove from the set.
         */
        public InputFile oldSticker;
        /**
         * Sticker to add to the set.
         */
        public InputSticker newSticker;

        /**
         * Default constructor for a function, which replaces existing sticker in a set. The function is equivalent to removeStickerFromSet, then addStickerToSet, then setStickerPositionInSet.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReplaceStickerInSet() {
        }

        /**
         * Creates a function, which replaces existing sticker in a set. The function is equivalent to removeStickerFromSet, then addStickerToSet, then setStickerPositionInSet.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param userId Sticker set owner; ignored for regular users.
         * @param name Sticker set name. The sticker set must be owned by the current user.
         * @param oldSticker Sticker to remove from the set.
         * @param newSticker Sticker to add to the set.
         */
        public ReplaceStickerInSet(long userId, String name, InputFile oldSticker, InputSticker newSticker) {
            this.userId = userId;
            this.name = name;
            this.oldSticker = oldSticker;
            this.newSticker = newSticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -406311399;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Replaces the current RTMP URL for streaming to the video chat of a chat; requires owner privileges in the chat.
     *
     * <p> Returns {@link RtmpUrl RtmpUrl} </p>
     */
    public static class ReplaceVideoChatRtmpUrl extends Function<RtmpUrl> {
        /**
         * Chat identifier.
         */
        public long chatId;

        /**
         * Default constructor for a function, which replaces the current RTMP URL for streaming to the video chat of a chat; requires owner privileges in the chat.
         *
         * <p> Returns {@link RtmpUrl RtmpUrl} </p>
         */
        public ReplaceVideoChatRtmpUrl() {
        }

        /**
         * Creates a function, which replaces the current RTMP URL for streaming to the video chat of a chat; requires owner privileges in the chat.
         *
         * <p> Returns {@link RtmpUrl RtmpUrl} </p>
         *
         * @param chatId Chat identifier.
         */
        public ReplaceVideoChatRtmpUrl(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 558862304;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Reports that authentication code wasn't delivered via SMS; for official mobile applications only. Works only when the current authorization state is authorizationStateWaitCode.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReportAuthenticationCodeMissing extends Function<Ok> {
        /**
         * Current mobile network code.
         */
        public String mobileNetworkCode;

        /**
         * Default constructor for a function, which reports that authentication code wasn't delivered via SMS; for official mobile applications only. Works only when the current authorization state is authorizationStateWaitCode.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReportAuthenticationCodeMissing() {
        }

        /**
         * Creates a function, which reports that authentication code wasn't delivered via SMS; for official mobile applications only. Works only when the current authorization state is authorizationStateWaitCode.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param mobileNetworkCode Current mobile network code.
         */
        public ReportAuthenticationCodeMissing(String mobileNetworkCode) {
            this.mobileNetworkCode = mobileNetworkCode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1846555064;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Reports a chat to the Telegram moderators. A chat can be reported only from the chat action bar, or if chat.canBeReported.
     *
     * <p> Returns {@link ReportChatResult ReportChatResult} </p>
     */
    public static class ReportChat extends Function<ReportChatResult> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Option identifier chosen by the user; leave empty for the initial request.
         */
        public byte[] optionId;
        /**
         * Identifiers of reported messages. Use messageProperties.canReportChat to check whether the message can be reported.
         */
        public long[] messageIds;
        /**
         * Additional report details if asked by the server; 0-1024 characters; leave empty for the initial request.
         */
        public String text;

        /**
         * Default constructor for a function, which reports a chat to the Telegram moderators. A chat can be reported only from the chat action bar, or if chat.canBeReported.
         *
         * <p> Returns {@link ReportChatResult ReportChatResult} </p>
         */
        public ReportChat() {
        }

        /**
         * Creates a function, which reports a chat to the Telegram moderators. A chat can be reported only from the chat action bar, or if chat.canBeReported.
         *
         * <p> Returns {@link ReportChatResult ReportChatResult} </p>
         *
         * @param chatId Chat identifier.
         * @param optionId Option identifier chosen by the user; leave empty for the initial request.
         * @param messageIds Identifiers of reported messages. Use messageProperties.canReportChat to check whether the message can be reported.
         * @param text Additional report details if asked by the server; 0-1024 characters; leave empty for the initial request.
         */
        public ReportChat(long chatId, byte[] optionId, long[] messageIds, String text) {
            this.chatId = chatId;
            this.optionId = optionId;
            this.messageIds = messageIds;
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1058475058;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Reports a chat photo to the Telegram moderators. A chat photo can be reported only if chat.canBeReported.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReportChatPhoto extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifier of the photo to report. Only full photos from chatPhoto can be reported.
         */
        public int fileId;
        /**
         * The reason for reporting the chat photo.
         */
        public ReportReason reason;
        /**
         * Additional report details; 0-1024 characters.
         */
        public String text;

        /**
         * Default constructor for a function, which reports a chat photo to the Telegram moderators. A chat photo can be reported only if chat.canBeReported.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReportChatPhoto() {
        }

        /**
         * Creates a function, which reports a chat photo to the Telegram moderators. A chat photo can be reported only if chat.canBeReported.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param fileId Identifier of the photo to report. Only full photos from chatPhoto can be reported.
         * @param reason The reason for reporting the chat photo.
         * @param text Additional report details; 0-1024 characters.
         */
        public ReportChatPhoto(long chatId, int fileId, ReportReason reason, String text) {
            this.chatId = chatId;
            this.fileId = fileId;
            this.reason = reason;
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -646966648;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Reports a sponsored message to Telegram moderators.
     *
     * <p> Returns {@link ReportSponsoredResult ReportSponsoredResult} </p>
     */
    public static class ReportChatSponsoredMessage extends Function<ReportSponsoredResult> {
        /**
         * Chat identifier of the sponsored message.
         */
        public long chatId;
        /**
         * Identifier of the sponsored message.
         */
        public long messageId;
        /**
         * Option identifier chosen by the user; leave empty for the initial request.
         */
        public byte[] optionId;

        /**
         * Default constructor for a function, which reports a sponsored message to Telegram moderators.
         *
         * <p> Returns {@link ReportSponsoredResult ReportSponsoredResult} </p>
         */
        public ReportChatSponsoredMessage() {
        }

        /**
         * Creates a function, which reports a sponsored message to Telegram moderators.
         *
         * <p> Returns {@link ReportSponsoredResult ReportSponsoredResult} </p>
         *
         * @param chatId Chat identifier of the sponsored message.
         * @param messageId Identifier of the sponsored message.
         * @param optionId Option identifier chosen by the user; leave empty for the initial request.
         */
        public ReportChatSponsoredMessage(long chatId, long messageId, byte[] optionId) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.optionId = optionId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -979984820;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Reports reactions set on a message to the Telegram moderators. Reactions on a message can be reported only if messageProperties.canReportReactions.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReportMessageReactions extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Message identifier.
         */
        public long messageId;
        /**
         * Identifier of the sender, which added the reaction.
         */
        public MessageSender senderId;

        /**
         * Default constructor for a function, which reports reactions set on a message to the Telegram moderators. Reactions on a message can be reported only if messageProperties.canReportReactions.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReportMessageReactions() {
        }

        /**
         * Creates a function, which reports reactions set on a message to the Telegram moderators. Reactions on a message can be reported only if messageProperties.canReportReactions.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param messageId Message identifier.
         * @param senderId Identifier of the sender, which added the reaction.
         */
        public ReportMessageReactions(long chatId, long messageId, MessageSender senderId) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.senderId = senderId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 919111719;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Reports that authentication code wasn't delivered via SMS to the specified phone number; for official mobile applications only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReportPhoneNumberCodeMissing extends Function<Ok> {
        /**
         * Current mobile network code.
         */
        public String mobileNetworkCode;

        /**
         * Default constructor for a function, which reports that authentication code wasn't delivered via SMS to the specified phone number; for official mobile applications only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReportPhoneNumberCodeMissing() {
        }

        /**
         * Creates a function, which reports that authentication code wasn't delivered via SMS to the specified phone number; for official mobile applications only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param mobileNetworkCode Current mobile network code.
         */
        public ReportPhoneNumberCodeMissing(String mobileNetworkCode) {
            this.mobileNetworkCode = mobileNetworkCode;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -895175341;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Reports a sponsored chat to Telegram moderators.
     *
     * <p> Returns {@link ReportSponsoredResult ReportSponsoredResult} </p>
     */
    public static class ReportSponsoredChat extends Function<ReportSponsoredResult> {
        /**
         * Unique identifier of the sponsored chat.
         */
        public long sponsoredChatUniqueId;
        /**
         * Option identifier chosen by the user; leave empty for the initial request.
         */
        public byte[] optionId;

        /**
         * Default constructor for a function, which reports a sponsored chat to Telegram moderators.
         *
         * <p> Returns {@link ReportSponsoredResult ReportSponsoredResult} </p>
         */
        public ReportSponsoredChat() {
        }

        /**
         * Creates a function, which reports a sponsored chat to Telegram moderators.
         *
         * <p> Returns {@link ReportSponsoredResult ReportSponsoredResult} </p>
         *
         * @param sponsoredChatUniqueId Unique identifier of the sponsored chat.
         * @param optionId Option identifier chosen by the user; leave empty for the initial request.
         */
        public ReportSponsoredChat(long sponsoredChatUniqueId, byte[] optionId) {
            this.sponsoredChatUniqueId = sponsoredChatUniqueId;
            this.optionId = optionId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -902673019;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Reports a story to the Telegram moderators.
     *
     * <p> Returns {@link ReportStoryResult ReportStoryResult} </p>
     */
    public static class ReportStory extends Function<ReportStoryResult> {
        /**
         * The identifier of the poster of the story to report.
         */
        public long storyPosterChatId;
        /**
         * The identifier of the story to report.
         */
        public int storyId;
        /**
         * Option identifier chosen by the user; leave empty for the initial request.
         */
        public byte[] optionId;
        /**
         * Additional report details; 0-1024 characters; leave empty for the initial request.
         */
        public String text;

        /**
         * Default constructor for a function, which reports a story to the Telegram moderators.
         *
         * <p> Returns {@link ReportStoryResult ReportStoryResult} </p>
         */
        public ReportStory() {
        }

        /**
         * Creates a function, which reports a story to the Telegram moderators.
         *
         * <p> Returns {@link ReportStoryResult ReportStoryResult} </p>
         *
         * @param storyPosterChatId The identifier of the poster of the story to report.
         * @param storyId The identifier of the story to report.
         * @param optionId Option identifier chosen by the user; leave empty for the initial request.
         * @param text Additional report details; 0-1024 characters; leave empty for the initial request.
         */
        public ReportStory(long storyPosterChatId, int storyId, byte[] optionId, String text) {
            this.storyPosterChatId = storyPosterChatId;
            this.storyId = storyId;
            this.optionId = optionId;
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1823256372;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Reports a false deletion of a message by aggressive anti-spam checks; requires administrator rights in the supergroup. Can be called only for messages from chatEventMessageDeleted with canReportAntiSpamFalsePositive == true.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReportSupergroupAntiSpamFalsePositive extends Function<Ok> {
        /**
         * Supergroup identifier.
         */
        public long supergroupId;
        /**
         * Identifier of the erroneously deleted message from chatEventMessageDeleted.
         */
        public long messageId;

        /**
         * Default constructor for a function, which reports a false deletion of a message by aggressive anti-spam checks; requires administrator rights in the supergroup. Can be called only for messages from chatEventMessageDeleted with canReportAntiSpamFalsePositive == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReportSupergroupAntiSpamFalsePositive() {
        }

        /**
         * Creates a function, which reports a false deletion of a message by aggressive anti-spam checks; requires administrator rights in the supergroup. Can be called only for messages from chatEventMessageDeleted with canReportAntiSpamFalsePositive == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param supergroupId Supergroup identifier.
         * @param messageId Identifier of the erroneously deleted message from chatEventMessageDeleted.
         */
        public ReportSupergroupAntiSpamFalsePositive(long supergroupId, long messageId) {
            this.supergroupId = supergroupId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -516050872;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Reports messages in a supergroup as spam; requires administrator rights in the supergroup.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReportSupergroupSpam extends Function<Ok> {
        /**
         * Supergroup identifier.
         */
        public long supergroupId;
        /**
         * Identifiers of messages to report. Use messageProperties.canReportSupergroupSpam to check whether the message can be reported.
         */
        public long[] messageIds;

        /**
         * Default constructor for a function, which reports messages in a supergroup as spam; requires administrator rights in the supergroup.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReportSupergroupSpam() {
        }

        /**
         * Creates a function, which reports messages in a supergroup as spam; requires administrator rights in the supergroup.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param supergroupId Supergroup identifier.
         * @param messageIds Identifiers of messages to report. Use messageProperties.canReportSupergroupSpam to check whether the message can be reported.
         */
        public ReportSupergroupSpam(long supergroupId, long[] messageIds) {
            this.supergroupId = supergroupId;
            this.messageIds = messageIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -94825000;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Reports a video message advertisement to Telegram moderators.
     *
     * <p> Returns {@link ReportSponsoredResult ReportSponsoredResult} </p>
     */
    public static class ReportVideoMessageAdvertisement extends Function<ReportSponsoredResult> {
        /**
         * Unique identifier of the advertisement.
         */
        public long advertisementUniqueId;
        /**
         * Option identifier chosen by the user; leave empty for the initial request.
         */
        public byte[] optionId;

        /**
         * Default constructor for a function, which reports a video message advertisement to Telegram moderators.
         *
         * <p> Returns {@link ReportSponsoredResult ReportSponsoredResult} </p>
         */
        public ReportVideoMessageAdvertisement() {
        }

        /**
         * Creates a function, which reports a video message advertisement to Telegram moderators.
         *
         * <p> Returns {@link ReportSponsoredResult ReportSponsoredResult} </p>
         *
         * @param advertisementUniqueId Unique identifier of the advertisement.
         * @param optionId Option identifier chosen by the user; leave empty for the initial request.
         */
        public ReportVideoMessageAdvertisement(long advertisementUniqueId, byte[] optionId) {
            this.advertisementUniqueId = advertisementUniqueId;
            this.optionId = optionId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 617137942;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Requests to send a 2-step verification password recovery code to an email address that was previously set up. Works only when the current authorization state is authorizationStateWaitPassword.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RequestAuthenticationPasswordRecovery extends Function<Ok> {

        /**
         * Default constructor for a function, which requests to send a 2-step verification password recovery code to an email address that was previously set up. Works only when the current authorization state is authorizationStateWaitPassword.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RequestAuthenticationPasswordRecovery() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1393896118;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Requests to send a 2-step verification password recovery code to an email address that was previously set up.
     *
     * <p> Returns {@link EmailAddressAuthenticationCodeInfo EmailAddressAuthenticationCodeInfo} </p>
     */
    public static class RequestPasswordRecovery extends Function<EmailAddressAuthenticationCodeInfo> {

        /**
         * Default constructor for a function, which requests to send a 2-step verification password recovery code to an email address that was previously set up.
         *
         * <p> Returns {@link EmailAddressAuthenticationCodeInfo EmailAddressAuthenticationCodeInfo} </p>
         */
        public RequestPasswordRecovery() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -13777582;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Requests QR code authentication by scanning a QR code on another logged in device. Works only when the current authorization state is authorizationStateWaitPhoneNumber, or if there is no pending authentication query and the current authorization state is authorizationStateWaitPremiumPurchase, authorizationStateWaitEmailAddress, authorizationStateWaitEmailCode, authorizationStateWaitCode, authorizationStateWaitRegistration, or authorizationStateWaitPassword.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RequestQrCodeAuthentication extends Function<Ok> {
        /**
         * List of user identifiers of other users currently using the application.
         */
        public long[] otherUserIds;

        /**
         * Default constructor for a function, which requests QR code authentication by scanning a QR code on another logged in device. Works only when the current authorization state is authorizationStateWaitPhoneNumber, or if there is no pending authentication query and the current authorization state is authorizationStateWaitPremiumPurchase, authorizationStateWaitEmailAddress, authorizationStateWaitEmailCode, authorizationStateWaitCode, authorizationStateWaitRegistration, or authorizationStateWaitPassword.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RequestQrCodeAuthentication() {
        }

        /**
         * Creates a function, which requests QR code authentication by scanning a QR code on another logged in device. Works only when the current authorization state is authorizationStateWaitPhoneNumber, or if there is no pending authentication query and the current authorization state is authorizationStateWaitPremiumPurchase, authorizationStateWaitEmailAddress, authorizationStateWaitEmailCode, authorizationStateWaitCode, authorizationStateWaitRegistration, or authorizationStateWaitPassword.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param otherUserIds List of user identifiers of other users currently using the application.
         */
        public RequestQrCodeAuthentication(long[] otherUserIds) {
            this.otherUserIds = otherUserIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1363496527;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Resends an authentication code to the user. Works only when the current authorization state is authorizationStateWaitCode, the nextCodeType of the result is not null and the server-specified timeout has passed, or when the current authorization state is authorizationStateWaitEmailCode.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ResendAuthenticationCode extends Function<Ok> {
        /**
         * Reason of code resending; pass null if unknown.
         */
        public ResendCodeReason reason;

        /**
         * Default constructor for a function, which resends an authentication code to the user. Works only when the current authorization state is authorizationStateWaitCode, the nextCodeType of the result is not null and the server-specified timeout has passed, or when the current authorization state is authorizationStateWaitEmailCode.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ResendAuthenticationCode() {
        }

        /**
         * Creates a function, which resends an authentication code to the user. Works only when the current authorization state is authorizationStateWaitCode, the nextCodeType of the result is not null and the server-specified timeout has passed, or when the current authorization state is authorizationStateWaitEmailCode.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param reason Reason of code resending; pass null if unknown.
         */
        public ResendAuthenticationCode(ResendCodeReason reason) {
            this.reason = reason;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1506755656;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Resends the code to verify an email address to be added to a user's Telegram Passport.
     *
     * <p> Returns {@link EmailAddressAuthenticationCodeInfo EmailAddressAuthenticationCodeInfo} </p>
     */
    public static class ResendEmailAddressVerificationCode extends Function<EmailAddressAuthenticationCodeInfo> {

        /**
         * Default constructor for a function, which resends the code to verify an email address to be added to a user's Telegram Passport.
         *
         * <p> Returns {@link EmailAddressAuthenticationCodeInfo EmailAddressAuthenticationCodeInfo} </p>
         */
        public ResendEmailAddressVerificationCode() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1872416732;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Resends the login email address verification code.
     *
     * <p> Returns {@link EmailAddressAuthenticationCodeInfo EmailAddressAuthenticationCodeInfo} </p>
     */
    public static class ResendLoginEmailAddressCode extends Function<EmailAddressAuthenticationCodeInfo> {

        /**
         * Default constructor for a function, which resends the login email address verification code.
         *
         * <p> Returns {@link EmailAddressAuthenticationCodeInfo EmailAddressAuthenticationCodeInfo} </p>
         */
        public ResendLoginEmailAddressCode() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 292966933;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Resends messages which failed to send. Can be called only for messages for which messageSendingStateFailed.canRetry is true and after specified in messageSendingStateFailed.retryAfter time passed. If a message is re-sent, the corresponding failed to send message is deleted. Returns the sent messages in the same order as the message identifiers passed in messageIds. If a message can't be re-sent, null will be returned instead of the message.
     *
     * <p> Returns {@link Messages Messages} </p>
     */
    public static class ResendMessages extends Function<Messages> {
        /**
         * Identifier of the chat to send messages.
         */
        public long chatId;
        /**
         * Identifiers of the messages to resend. Message identifiers must be in a strictly increasing order.
         */
        public long[] messageIds;
        /**
         * New manually chosen quote from the message to be replied; pass null if none. Ignored if more than one message is re-sent, or if messageSendingStateFailed.needAnotherReplyQuote == false.
         */
        public InputTextQuote quote;
        /**
         * The number of Telegram Stars the user agreed to pay to send the messages. Ignored if messageSendingStateFailed.requiredPaidMessageStarCount == 0.
         */
        public long paidMessageStarCount;

        /**
         * Default constructor for a function, which resends messages which failed to send. Can be called only for messages for which messageSendingStateFailed.canRetry is true and after specified in messageSendingStateFailed.retryAfter time passed. If a message is re-sent, the corresponding failed to send message is deleted. Returns the sent messages in the same order as the message identifiers passed in messageIds. If a message can't be re-sent, null will be returned instead of the message.
         *
         * <p> Returns {@link Messages Messages} </p>
         */
        public ResendMessages() {
        }

        /**
         * Creates a function, which resends messages which failed to send. Can be called only for messages for which messageSendingStateFailed.canRetry is true and after specified in messageSendingStateFailed.retryAfter time passed. If a message is re-sent, the corresponding failed to send message is deleted. Returns the sent messages in the same order as the message identifiers passed in messageIds. If a message can't be re-sent, null will be returned instead of the message.
         *
         * <p> Returns {@link Messages Messages} </p>
         *
         * @param chatId Identifier of the chat to send messages.
         * @param messageIds Identifiers of the messages to resend. Message identifiers must be in a strictly increasing order.
         * @param quote New manually chosen quote from the message to be replied; pass null if none. Ignored if more than one message is re-sent, or if messageSendingStateFailed.needAnotherReplyQuote == false.
         * @param paidMessageStarCount The number of Telegram Stars the user agreed to pay to send the messages. Ignored if messageSendingStateFailed.requiredPaidMessageStarCount == 0.
         */
        public ResendMessages(long chatId, long[] messageIds, InputTextQuote quote, long paidMessageStarCount) {
            this.chatId = chatId;
            this.messageIds = messageIds;
            this.quote = quote;
            this.paidMessageStarCount = paidMessageStarCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 526374678;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Resends the authentication code sent to a phone number. Works only if the previously received authenticationCodeInfo nextCodeType was not null and the server-specified timeout has passed.
     *
     * <p> Returns {@link AuthenticationCodeInfo AuthenticationCodeInfo} </p>
     */
    public static class ResendPhoneNumberCode extends Function<AuthenticationCodeInfo> {
        /**
         * Reason of code resending; pass null if unknown.
         */
        public ResendCodeReason reason;

        /**
         * Default constructor for a function, which resends the authentication code sent to a phone number. Works only if the previously received authenticationCodeInfo nextCodeType was not null and the server-specified timeout has passed.
         *
         * <p> Returns {@link AuthenticationCodeInfo AuthenticationCodeInfo} </p>
         */
        public ResendPhoneNumberCode() {
        }

        /**
         * Creates a function, which resends the authentication code sent to a phone number. Works only if the previously received authenticationCodeInfo nextCodeType was not null and the server-specified timeout has passed.
         *
         * <p> Returns {@link AuthenticationCodeInfo AuthenticationCodeInfo} </p>
         *
         * @param reason Reason of code resending; pass null if unknown.
         */
        public ResendPhoneNumberCode(ResendCodeReason reason) {
            this.reason = reason;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1808704551;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Resends the 2-step verification recovery email address verification code.
     *
     * <p> Returns {@link PasswordState PasswordState} </p>
     */
    public static class ResendRecoveryEmailAddressCode extends Function<PasswordState> {

        /**
         * Default constructor for a function, which resends the 2-step verification recovery email address verification code.
         *
         * <p> Returns {@link PasswordState PasswordState} </p>
         */
        public ResendRecoveryEmailAddressCode() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 433483548;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Resets all chat and scope notification settings to their default values. By default, all chats are unmuted and message previews are shown.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ResetAllNotificationSettings extends Function<Ok> {

        /**
         * Default constructor for a function, which resets all chat and scope notification settings to their default values. By default, all chats are unmuted and message previews are shown.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ResetAllNotificationSettings() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -174020359;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Resets the login email address. May return an error with a message &quot;TASK_ALREADY_EXISTS&quot; if reset is still pending. Works only when the current authorization state is authorizationStateWaitEmailCode and authorizationState.canResetEmailAddress == true.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ResetAuthenticationEmailAddress extends Function<Ok> {

        /**
         * Default constructor for a function, which resets the login email address. May return an error with a message &quot;TASK_ALREADY_EXISTS&quot; if reset is still pending. Works only when the current authorization state is authorizationStateWaitEmailCode and authorizationState.canResetEmailAddress == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ResetAuthenticationEmailAddress() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -415075796;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Resets list of installed backgrounds to its default value.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ResetInstalledBackgrounds extends Function<Ok> {

        /**
         * Default constructor for a function, which resets list of installed backgrounds to its default value.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ResetInstalledBackgrounds() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1884553559;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Resets all network data usage statistics to zero. Can be called before authorization.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ResetNetworkStatistics extends Function<Ok> {

        /**
         * Default constructor for a function, which resets all network data usage statistics to zero. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ResetNetworkStatistics() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1646452102;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes 2-step verification password without previous password and access to recovery email address. The password can't be reset immediately and the request needs to be repeated after the specified time.
     *
     * <p> Returns {@link ResetPasswordResult ResetPasswordResult} </p>
     */
    public static class ResetPassword extends Function<ResetPasswordResult> {

        /**
         * Default constructor for a function, which removes 2-step verification password without previous password and access to recovery email address. The password can't be reset immediately and the request needs to be repeated after the specified time.
         *
         * <p> Returns {@link ResetPasswordResult ResetPasswordResult} </p>
         */
        public ResetPassword() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -593589091;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Reuses an active Telegram Star subscription to a channel chat and joins the chat again.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ReuseStarSubscription extends Function<Ok> {
        /**
         * Identifier of the subscription.
         */
        public String subscriptionId;

        /**
         * Default constructor for a function, which reuses an active Telegram Star subscription to a channel chat and joins the chat again.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ReuseStarSubscription() {
        }

        /**
         * Creates a function, which reuses an active Telegram Star subscription to a channel chat and joins the chat again.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param subscriptionId Identifier of the subscription.
         */
        public ReuseStarSubscription(String subscriptionId) {
            this.subscriptionId = subscriptionId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 778531905;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Revokes invite link for a chat. Available for basic groups, supergroups, and channels. Requires administrator privileges and canInviteUsers right in the chat for own links and owner privileges for other links. If a primary link is revoked, then additionally to the revoked link returns new primary link.
     *
     * <p> Returns {@link ChatInviteLinks ChatInviteLinks} </p>
     */
    public static class RevokeChatInviteLink extends Function<ChatInviteLinks> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Invite link to be revoked.
         */
        public String inviteLink;

        /**
         * Default constructor for a function, which revokes invite link for a chat. Available for basic groups, supergroups, and channels. Requires administrator privileges and canInviteUsers right in the chat for own links and owner privileges for other links. If a primary link is revoked, then additionally to the revoked link returns new primary link.
         *
         * <p> Returns {@link ChatInviteLinks ChatInviteLinks} </p>
         */
        public RevokeChatInviteLink() {
        }

        /**
         * Creates a function, which revokes invite link for a chat. Available for basic groups, supergroups, and channels. Requires administrator privileges and canInviteUsers right in the chat for own links and owner privileges for other links. If a primary link is revoked, then additionally to the revoked link returns new primary link.
         *
         * <p> Returns {@link ChatInviteLinks ChatInviteLinks} </p>
         *
         * @param chatId Chat identifier.
         * @param inviteLink Invite link to be revoked.
         */
        public RevokeChatInviteLink(long chatId, String inviteLink) {
            this.chatId = chatId;
            this.inviteLink = inviteLink;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -776514135;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Revokes invite link for a group call. Requires groupCall.canBeManaged right for video chats or groupCall.isOwned otherwise.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class RevokeGroupCallInviteLink extends Function<Ok> {
        /**
         * Group call identifier.
         */
        public int groupCallId;

        /**
         * Default constructor for a function, which revokes invite link for a group call. Requires groupCall.canBeManaged right for video chats or groupCall.isOwned otherwise.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public RevokeGroupCallInviteLink() {
        }

        /**
         * Creates a function, which revokes invite link for a group call. Requires groupCall.canBeManaged right for video chats or groupCall.isOwned otherwise.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier.
         */
        public RevokeGroupCallInviteLink(int groupCallId) {
            this.groupCallId = groupCallId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 501589140;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Saves application log event on the server. Can be called before authorization.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SaveApplicationLogEvent extends Function<Ok> {
        /**
         * Event type.
         */
        public String type;
        /**
         * Optional chat identifier, associated with the event.
         */
        public long chatId;
        /**
         * The log event data.
         */
        public JsonValue data;

        /**
         * Default constructor for a function, which saves application log event on the server. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SaveApplicationLogEvent() {
        }

        /**
         * Creates a function, which saves application log event on the server. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param type Event type.
         * @param chatId Optional chat identifier, associated with the event.
         * @param data The log event data.
         */
        public SaveApplicationLogEvent(String type, long chatId, JsonValue data) {
            this.type = type;
            this.chatId = chatId;
            this.data = data;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -811154930;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Saves an inline message to be sent by the given user; for bots only.
     *
     * <p> Returns {@link PreparedInlineMessageId PreparedInlineMessageId} </p>
     */
    public static class SavePreparedInlineMessage extends Function<PreparedInlineMessageId> {
        /**
         * Identifier of the user.
         */
        public long userId;
        /**
         * The description of the message.
         */
        public InputInlineQueryResult result;
        /**
         * Types of the chats to which the message can be sent.
         */
        public TargetChatTypes chatTypes;

        /**
         * Default constructor for a function, which saves an inline message to be sent by the given user; for bots only.
         *
         * <p> Returns {@link PreparedInlineMessageId PreparedInlineMessageId} </p>
         */
        public SavePreparedInlineMessage() {
        }

        /**
         * Creates a function, which saves an inline message to be sent by the given user; for bots only.
         *
         * <p> Returns {@link PreparedInlineMessageId PreparedInlineMessageId} </p>
         *
         * @param userId Identifier of the user.
         * @param result The description of the message.
         * @param chatTypes Types of the chats to which the message can be sent.
         */
        public SavePreparedInlineMessage(long userId, InputInlineQueryResult result, TargetChatTypes chatTypes) {
            this.userId = userId;
            this.result = result;
            this.chatTypes = chatTypes;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -954963751;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Saves a keyboard button to be shown to the given user; for bots only.
     *
     * <p> Returns {@link Text Text} </p>
     */
    public static class SavePreparedKeyboardButton extends Function<Text> {
        /**
         * Identifier of the user.
         */
        public long userId;
        /**
         * The button; must be of the type keyboardButtonTypeRequestUsers, keyboardButtonTypeRequestChat, or keyboardButtonTypeRequestManagedBot.
         */
        public KeyboardButton button;

        /**
         * Default constructor for a function, which saves a keyboard button to be shown to the given user; for bots only.
         *
         * <p> Returns {@link Text Text} </p>
         */
        public SavePreparedKeyboardButton() {
        }

        /**
         * Creates a function, which saves a keyboard button to be shown to the given user; for bots only.
         *
         * <p> Returns {@link Text Text} </p>
         *
         * @param userId Identifier of the user.
         * @param button The button; must be of the type keyboardButtonTypeRequestUsers, keyboardButtonTypeRequestChat, or keyboardButtonTypeRequestManagedBot.
         */
        public SavePreparedKeyboardButton(long userId, KeyboardButton button) {
            this.userId = userId;
            this.button = button;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -894817192;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches affiliate programs that can be connected to the given affiliate.
     *
     * <p> Returns {@link FoundAffiliatePrograms FoundAffiliatePrograms} </p>
     */
    public static class SearchAffiliatePrograms extends Function<FoundAffiliatePrograms> {
        /**
         * The affiliate for which affiliate programs are searched for.
         */
        public AffiliateType affiliate;
        /**
         * Sort order for the results.
         */
        public AffiliateProgramSortOrder sortOrder;
        /**
         * Offset of the first affiliate program to return as received from the previous request; use empty string to get the first chunk of results.
         */
        public String offset;
        /**
         * The maximum number of affiliate programs to return.
         */
        public int limit;

        /**
         * Default constructor for a function, which searches affiliate programs that can be connected to the given affiliate.
         *
         * <p> Returns {@link FoundAffiliatePrograms FoundAffiliatePrograms} </p>
         */
        public SearchAffiliatePrograms() {
        }

        /**
         * Creates a function, which searches affiliate programs that can be connected to the given affiliate.
         *
         * <p> Returns {@link FoundAffiliatePrograms FoundAffiliatePrograms} </p>
         *
         * @param affiliate The affiliate for which affiliate programs are searched for.
         * @param sortOrder Sort order for the results.
         * @param offset Offset of the first affiliate program to return as received from the previous request; use empty string to get the first chunk of results.
         * @param limit The maximum number of affiliate programs to return.
         */
        public SearchAffiliatePrograms(AffiliateType affiliate, AffiliateProgramSortOrder sortOrder, String offset, int limit) {
            this.affiliate = affiliate;
            this.sortOrder = sortOrder;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 681156625;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for a background by its name.
     *
     * <p> Returns {@link Background Background} </p>
     */
    public static class SearchBackground extends Function<Background> {
        /**
         * The name of the background.
         */
        public String name;

        /**
         * Default constructor for a function, which searches for a background by its name.
         *
         * <p> Returns {@link Background Background} </p>
         */
        public SearchBackground() {
        }

        /**
         * Creates a function, which searches for a background by its name.
         *
         * <p> Returns {@link Background Background} </p>
         *
         * @param name The name of the background.
         */
        public SearchBackground(String name) {
            this.name = name;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2130996959;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for call and group call messages. Returns the results in reverse chronological order (i.e., in order of decreasing messageId). For optimal performance, the number of returned messages is chosen by TDLib.
     *
     * <p> Returns {@link FoundMessages FoundMessages} </p>
     */
    public static class SearchCallMessages extends Function<FoundMessages> {
        /**
         * Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         */
        public String offset;
        /**
         * The maximum number of messages to be returned; up to 100. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         */
        public int limit;
        /**
         * Pass true to search only for messages with missed/declined calls.
         */
        public boolean onlyMissed;

        /**
         * Default constructor for a function, which searches for call and group call messages. Returns the results in reverse chronological order (i.e., in order of decreasing messageId). For optimal performance, the number of returned messages is chosen by TDLib.
         *
         * <p> Returns {@link FoundMessages FoundMessages} </p>
         */
        public SearchCallMessages() {
        }

        /**
         * Creates a function, which searches for call and group call messages. Returns the results in reverse chronological order (i.e., in order of decreasing messageId). For optimal performance, the number of returned messages is chosen by TDLib.
         *
         * <p> Returns {@link FoundMessages FoundMessages} </p>
         *
         * @param offset Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         * @param limit The maximum number of messages to be returned; up to 100. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         * @param onlyMissed Pass true to search only for messages with missed/declined calls.
         */
        public SearchCallMessages(String offset, int limit, boolean onlyMissed) {
            this.offset = offset;
            this.limit = limit;
            this.onlyMissed = onlyMissed;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1942229221;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches a chat with an affiliate program. Returns the chat if found and the program is active.
     *
     * <p> Returns {@link Chat Chat} </p>
     */
    public static class SearchChatAffiliateProgram extends Function<Chat> {
        /**
         * Username of the chat.
         */
        public String username;
        /**
         * The referrer from an internalLinkTypeChatAffiliateProgram link.
         */
        public String referrer;

        /**
         * Default constructor for a function, which searches a chat with an affiliate program. Returns the chat if found and the program is active.
         *
         * <p> Returns {@link Chat Chat} </p>
         */
        public SearchChatAffiliateProgram() {
        }

        /**
         * Creates a function, which searches a chat with an affiliate program. Returns the chat if found and the program is active.
         *
         * <p> Returns {@link Chat Chat} </p>
         *
         * @param username Username of the chat.
         * @param referrer The referrer from an internalLinkTypeChatAffiliateProgram link.
         */
        public SearchChatAffiliateProgram(String username, String referrer) {
            this.username = username;
            this.referrer = referrer;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1339291206;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for a specified query in the first name, last name and usernames of the members of a specified chat. Requires administrator rights if the chat is a channel.
     *
     * <p> Returns {@link ChatMembers ChatMembers} </p>
     */
    public static class SearchChatMembers extends Function<ChatMembers> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Query to search for.
         */
        public String query;
        /**
         * The maximum number of users to be returned; up to 200.
         */
        public int limit;
        /**
         * The type of users to search for; pass null to search among all chat members.
         */
        public ChatMembersFilter filter;

        /**
         * Default constructor for a function, which searches for a specified query in the first name, last name and usernames of the members of a specified chat. Requires administrator rights if the chat is a channel.
         *
         * <p> Returns {@link ChatMembers ChatMembers} </p>
         */
        public SearchChatMembers() {
        }

        /**
         * Creates a function, which searches for a specified query in the first name, last name and usernames of the members of a specified chat. Requires administrator rights if the chat is a channel.
         *
         * <p> Returns {@link ChatMembers ChatMembers} </p>
         *
         * @param chatId Chat identifier.
         * @param query Query to search for.
         * @param limit The maximum number of users to be returned; up to 200.
         * @param filter The type of users to search for; pass null to search among all chat members.
         */
        public SearchChatMembers(long chatId, String query, int limit, ChatMembersFilter filter) {
            this.chatId = chatId;
            this.query = query;
            this.limit = limit;
            this.filter = filter;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -445823291;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for messages with given words in the chat. Returns the results in reverse chronological order, i.e. in order of decreasing messageId. Cannot be used in secret chats with a non-empty query (searchSecretMessages must be used instead), or without an enabled message database. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit. A combination of query, senderId, filter and topicId search criteria is expected to be supported, only if it is required for Telegram official application implementation.
     *
     * <p> Returns {@link FoundChatMessages FoundChatMessages} </p>
     */
    public static class SearchChatMessages extends Function<FoundChatMessages> {
        /**
         * Identifier of the chat in which to search messages.
         */
        public long chatId;
        /**
         * Pass topic identifier to search messages only in specific topic; pass null to search for messages in all topics.
         */
        public MessageTopic topicId;
        /**
         * Query to search for.
         */
        public String query;
        /**
         * Identifier of the sender of messages to search for; pass null to search for messages from any sender. Not supported in secret chats.
         */
        public MessageSender senderId;
        /**
         * Identifier of the message starting from which history must be fetched; use 0 to get results from the last message.
         */
        public long fromMessageId;
        /**
         * Specify 0 to get results from exactly the message fromMessageId or a negative number to get the specified message and some newer messages.
         */
        public int offset;
        /**
         * The maximum number of messages to be returned; must be positive and can't be greater than 100. If the offset is negative, then the limit must be greater than -offset. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         */
        public int limit;
        /**
         * Additional filter for messages to search; pass null to search for all messages.
         */
        public SearchMessagesFilter filter;

        /**
         * Default constructor for a function, which searches for messages with given words in the chat. Returns the results in reverse chronological order, i.e. in order of decreasing messageId. Cannot be used in secret chats with a non-empty query (searchSecretMessages must be used instead), or without an enabled message database. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit. A combination of query, senderId, filter and topicId search criteria is expected to be supported, only if it is required for Telegram official application implementation.
         *
         * <p> Returns {@link FoundChatMessages FoundChatMessages} </p>
         */
        public SearchChatMessages() {
        }

        /**
         * Creates a function, which searches for messages with given words in the chat. Returns the results in reverse chronological order, i.e. in order of decreasing messageId. Cannot be used in secret chats with a non-empty query (searchSecretMessages must be used instead), or without an enabled message database. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit. A combination of query, senderId, filter and topicId search criteria is expected to be supported, only if it is required for Telegram official application implementation.
         *
         * <p> Returns {@link FoundChatMessages FoundChatMessages} </p>
         *
         * @param chatId Identifier of the chat in which to search messages.
         * @param topicId Pass topic identifier to search messages only in specific topic; pass null to search for messages in all topics.
         * @param query Query to search for.
         * @param senderId Identifier of the sender of messages to search for; pass null to search for messages from any sender. Not supported in secret chats.
         * @param fromMessageId Identifier of the message starting from which history must be fetched; use 0 to get results from the last message.
         * @param offset Specify 0 to get results from exactly the message fromMessageId or a negative number to get the specified message and some newer messages.
         * @param limit The maximum number of messages to be returned; must be positive and can't be greater than 100. If the offset is negative, then the limit must be greater than -offset. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         * @param filter Additional filter for messages to search; pass null to search for all messages.
         */
        public SearchChatMessages(long chatId, MessageTopic topicId, String query, MessageSender senderId, long fromMessageId, int offset, int limit, SearchMessagesFilter filter) {
            this.chatId = chatId;
            this.topicId = topicId;
            this.query = query;
            this.senderId = senderId;
            this.fromMessageId = fromMessageId;
            this.offset = offset;
            this.limit = limit;
            this.filter = filter;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1072442212;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about the recent locations of chat members that were sent to the chat. Returns up to 1 location message per user.
     *
     * <p> Returns {@link Messages Messages} </p>
     */
    public static class SearchChatRecentLocationMessages extends Function<Messages> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The maximum number of messages to be returned.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns information about the recent locations of chat members that were sent to the chat. Returns up to 1 location message per user.
         *
         * <p> Returns {@link Messages Messages} </p>
         */
        public SearchChatRecentLocationMessages() {
        }

        /**
         * Creates a function, which returns information about the recent locations of chat members that were sent to the chat. Returns up to 1 location message per user.
         *
         * <p> Returns {@link Messages Messages} </p>
         *
         * @param chatId Chat identifier.
         * @param limit The maximum number of messages to be returned.
         */
        public SearchChatRecentLocationMessages(long chatId, int limit) {
            this.chatId = chatId;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 950238950;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for the specified query in the title and username of already known chats. This is an offline method. Returns chats in the order seen in the main chat list.
     *
     * <p> Returns {@link Chats Chats} </p>
     */
    public static class SearchChats extends Function<Chats> {
        /**
         * Query to search for. If the query is empty, returns up to 50 recently found chats.
         */
        public String query;
        /**
         * The maximum number of chats to be returned.
         */
        public int limit;

        /**
         * Default constructor for a function, which searches for the specified query in the title and username of already known chats. This is an offline method. Returns chats in the order seen in the main chat list.
         *
         * <p> Returns {@link Chats Chats} </p>
         */
        public SearchChats() {
        }

        /**
         * Creates a function, which searches for the specified query in the title and username of already known chats. This is an offline method. Returns chats in the order seen in the main chat list.
         *
         * <p> Returns {@link Chats Chats} </p>
         *
         * @param query Query to search for. If the query is empty, returns up to 50 recently found chats.
         * @param limit The maximum number of chats to be returned.
         */
        public SearchChats(String query, int limit) {
            this.query = query;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1879787060;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for the specified query in the title and username of already known chats via request to the server. Returns chats in the order seen in the main chat list.
     *
     * <p> Returns {@link Chats Chats} </p>
     */
    public static class SearchChatsOnServer extends Function<Chats> {
        /**
         * Query to search for.
         */
        public String query;
        /**
         * The maximum number of chats to be returned.
         */
        public int limit;

        /**
         * Default constructor for a function, which searches for the specified query in the title and username of already known chats via request to the server. Returns chats in the order seen in the main chat list.
         *
         * <p> Returns {@link Chats Chats} </p>
         */
        public SearchChatsOnServer() {
        }

        /**
         * Creates a function, which searches for the specified query in the title and username of already known chats via request to the server. Returns chats in the order seen in the main chat list.
         *
         * <p> Returns {@link Chats Chats} </p>
         *
         * @param query Query to search for.
         * @param limit The maximum number of chats to be returned.
         */
        public SearchChatsOnServer(String query, int limit) {
            this.query = query;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1158402188;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for the specified query in the first names, last names and usernames of the known user contacts.
     *
     * <p> Returns {@link Users Users} </p>
     */
    public static class SearchContacts extends Function<Users> {
        /**
         * Query to search for; may be empty to return all contacts.
         */
        public String query;
        /**
         * The maximum number of users to be returned.
         */
        public int limit;

        /**
         * Default constructor for a function, which searches for the specified query in the first names, last names and usernames of the known user contacts.
         *
         * <p> Returns {@link Users Users} </p>
         */
        public SearchContacts() {
        }

        /**
         * Creates a function, which searches for the specified query in the first names, last names and usernames of the known user contacts.
         *
         * <p> Returns {@link Users Users} </p>
         *
         * @param query Query to search for; may be empty to return all contacts.
         * @param limit The maximum number of users to be returned.
         */
        public SearchContacts(String query, int limit) {
            this.query = query;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1794690715;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for emojis by keywords. Supported only if the file database is enabled. Order of results is unspecified.
     *
     * <p> Returns {@link EmojiKeywords EmojiKeywords} </p>
     */
    public static class SearchEmojis extends Function<EmojiKeywords> {
        /**
         * Text to search for.
         */
        public String text;
        /**
         * List of possible IETF language tags of the user's input language; may be empty if unknown.
         */
        public String[] inputLanguageCodes;

        /**
         * Default constructor for a function, which searches for emojis by keywords. Supported only if the file database is enabled. Order of results is unspecified.
         *
         * <p> Returns {@link EmojiKeywords EmojiKeywords} </p>
         */
        public SearchEmojis() {
        }

        /**
         * Creates a function, which searches for emojis by keywords. Supported only if the file database is enabled. Order of results is unspecified.
         *
         * <p> Returns {@link EmojiKeywords EmojiKeywords} </p>
         *
         * @param text Text to search for.
         * @param inputLanguageCodes List of possible IETF language tags of the user's input language; may be empty if unknown.
         */
        public SearchEmojis(String text, String[] inputLanguageCodes) {
            this.text = text;
            this.inputLanguageCodes = inputLanguageCodes;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1456187668;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for files in the file download list or recently downloaded files from the list.
     *
     * <p> Returns {@link FoundFileDownloads FoundFileDownloads} </p>
     */
    public static class SearchFileDownloads extends Function<FoundFileDownloads> {
        /**
         * Query to search for; may be empty to return all downloaded files.
         */
        public String query;
        /**
         * Pass true to search only for active downloads, including paused.
         */
        public boolean onlyActive;
        /**
         * Pass true to search only for completed downloads.
         */
        public boolean onlyCompleted;
        /**
         * Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         */
        public String offset;
        /**
         * The maximum number of files to be returned.
         */
        public int limit;

        /**
         * Default constructor for a function, which searches for files in the file download list or recently downloaded files from the list.
         *
         * <p> Returns {@link FoundFileDownloads FoundFileDownloads} </p>
         */
        public SearchFileDownloads() {
        }

        /**
         * Creates a function, which searches for files in the file download list or recently downloaded files from the list.
         *
         * <p> Returns {@link FoundFileDownloads FoundFileDownloads} </p>
         *
         * @param query Query to search for; may be empty to return all downloaded files.
         * @param onlyActive Pass true to search only for active downloads, including paused.
         * @param onlyCompleted Pass true to search only for completed downloads.
         * @param offset Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         * @param limit The maximum number of files to be returned.
         */
        public SearchFileDownloads(String query, boolean onlyActive, boolean onlyCompleted, String offset, int limit) {
            this.query = query;
            this.onlyActive = onlyActive;
            this.onlyCompleted = onlyCompleted;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 706611286;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns upgraded gifts that can be bought from other owners using sendResoldGift.
     *
     * <p> Returns {@link GiftsForResale GiftsForResale} </p>
     */
    public static class SearchGiftsForResale extends Function<GiftsForResale> {
        /**
         * Identifier of the regular gift that was upgraded to a unique gift.
         */
        public long giftId;
        /**
         * Order in which the results will be sorted.
         */
        public GiftForResaleOrder order;
        /**
         * Pass true to get only gifts suitable for crafting.
         */
        public boolean forCrafting;
        /**
         * Pass true to get only gifts that can be bought using Telegram Stars.
         */
        public boolean forStars;
        /**
         * Attributes used to filter received gifts. If multiple attributes of the same type are specified, then all of them are allowed. If none attributes of specific type are specified, then all values for this attribute type are allowed.
         */
        public UpgradedGiftAttributeId[] attributes;
        /**
         * Offset of the first entry to return as received from the previous request with the same order and attributes; use empty string to get the first chunk of results.
         */
        public String offset;
        /**
         * The maximum number of gifts to return.
         */
        public int limit;

        /**
         * Default constructor for a function, which returns upgraded gifts that can be bought from other owners using sendResoldGift.
         *
         * <p> Returns {@link GiftsForResale GiftsForResale} </p>
         */
        public SearchGiftsForResale() {
        }

        /**
         * Creates a function, which returns upgraded gifts that can be bought from other owners using sendResoldGift.
         *
         * <p> Returns {@link GiftsForResale GiftsForResale} </p>
         *
         * @param giftId Identifier of the regular gift that was upgraded to a unique gift.
         * @param order Order in which the results will be sorted.
         * @param forCrafting Pass true to get only gifts suitable for crafting.
         * @param forStars Pass true to get only gifts that can be bought using Telegram Stars.
         * @param attributes Attributes used to filter received gifts. If multiple attributes of the same type are specified, then all of them are allowed. If none attributes of specific type are specified, then all values for this attribute type are allowed.
         * @param offset Offset of the first entry to return as received from the previous request with the same order and attributes; use empty string to get the first chunk of results.
         * @param limit The maximum number of gifts to return.
         */
        public SearchGiftsForResale(long giftId, GiftForResaleOrder order, boolean forCrafting, boolean forStars, UpgradedGiftAttributeId[] attributes, String offset, int limit) {
            this.giftId = giftId;
            this.order = order;
            this.forCrafting = forCrafting;
            this.forStars = forStars;
            this.attributes = attributes;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1947702322;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for recently used hashtags by their prefix.
     *
     * <p> Returns {@link Hashtags Hashtags} </p>
     */
    public static class SearchHashtags extends Function<Hashtags> {
        /**
         * Hashtag prefix to search for.
         */
        public String prefix;
        /**
         * The maximum number of hashtags to be returned.
         */
        public int limit;

        /**
         * Default constructor for a function, which searches for recently used hashtags by their prefix.
         *
         * <p> Returns {@link Hashtags Hashtags} </p>
         */
        public SearchHashtags() {
        }

        /**
         * Creates a function, which searches for recently used hashtags by their prefix.
         *
         * <p> Returns {@link Hashtags Hashtags} </p>
         *
         * @param prefix Hashtag prefix to search for.
         * @param limit The maximum number of hashtags to be returned.
         */
        public SearchHashtags(String prefix, int limit) {
            this.prefix = prefix;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1043637617;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for installed sticker sets by looking for specified query in their title and name.
     *
     * <p> Returns {@link StickerSets StickerSets} </p>
     */
    public static class SearchInstalledStickerSets extends Function<StickerSets> {
        /**
         * Type of the sticker sets to search for.
         */
        public StickerType stickerType;
        /**
         * Query to search for.
         */
        public String query;
        /**
         * The maximum number of sticker sets to return.
         */
        public int limit;

        /**
         * Default constructor for a function, which searches for installed sticker sets by looking for specified query in their title and name.
         *
         * <p> Returns {@link StickerSets StickerSets} </p>
         */
        public SearchInstalledStickerSets() {
        }

        /**
         * Creates a function, which searches for installed sticker sets by looking for specified query in their title and name.
         *
         * <p> Returns {@link StickerSets StickerSets} </p>
         *
         * @param stickerType Type of the sticker sets to search for.
         * @param query Query to search for.
         * @param limit The maximum number of sticker sets to return.
         */
        public SearchInstalledStickerSets(StickerType stickerType, String query, int limit) {
            this.stickerType = stickerType;
            this.query = query;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2120122276;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for messages in all chats except secret chats. Returns the results in reverse chronological order (i.e., in order of decreasing (date, chatId, messageId)). For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
     *
     * <p> Returns {@link FoundMessages FoundMessages} </p>
     */
    public static class SearchMessages extends Function<FoundMessages> {
        /**
         * Chat list in which to search messages; pass null to search in all chats regardless of their chat list. Only Main and Archive chat lists are supported.
         */
        public ChatList chatList;
        /**
         * Query to search for.
         */
        public String query;
        /**
         * Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         */
        public String offset;
        /**
         * The maximum number of messages to be returned; up to 100. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         */
        public int limit;
        /**
         * Additional filter for messages to search; pass null to search for all messages. Filters searchMessagesFilterMention, searchMessagesFilterUnreadMention, searchMessagesFilterUnreadReaction, searchMessagesFilterUnreadPollVote, searchMessagesFilterFailedToSend, and searchMessagesFilterPinned are unsupported in this function.
         */
        public SearchMessagesFilter filter;
        /**
         * Additional filter for type of the chat of the searched messages; pass null to search for messages in all chats.
         */
        public SearchMessagesChatTypeFilter chatTypeFilter;
        /**
         * If not 0, the minimum date of the messages to return.
         */
        public int minDate;
        /**
         * If not 0, the maximum date of the messages to return.
         */
        public int maxDate;

        /**
         * Default constructor for a function, which searches for messages in all chats except secret chats. Returns the results in reverse chronological order (i.e., in order of decreasing (date, chatId, messageId)). For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         *
         * <p> Returns {@link FoundMessages FoundMessages} </p>
         */
        public SearchMessages() {
        }

        /**
         * Creates a function, which searches for messages in all chats except secret chats. Returns the results in reverse chronological order (i.e., in order of decreasing (date, chatId, messageId)). For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         *
         * <p> Returns {@link FoundMessages FoundMessages} </p>
         *
         * @param chatList Chat list in which to search messages; pass null to search in all chats regardless of their chat list. Only Main and Archive chat lists are supported.
         * @param query Query to search for.
         * @param offset Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         * @param limit The maximum number of messages to be returned; up to 100. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         * @param filter Additional filter for messages to search; pass null to search for all messages. Filters searchMessagesFilterMention, searchMessagesFilterUnreadMention, searchMessagesFilterUnreadReaction, searchMessagesFilterUnreadPollVote, searchMessagesFilterFailedToSend, and searchMessagesFilterPinned are unsupported in this function.
         * @param chatTypeFilter Additional filter for type of the chat of the searched messages; pass null to search for messages in all chats.
         * @param minDate If not 0, the minimum date of the messages to return.
         * @param maxDate If not 0, the maximum date of the messages to return.
         */
        public SearchMessages(ChatList chatList, String query, String offset, int limit, SearchMessagesFilter filter, SearchMessagesChatTypeFilter chatTypeFilter, int minDate, int maxDate) {
            this.chatList = chatList;
            this.query = query;
            this.offset = offset;
            this.limit = limit;
            this.filter = filter;
            this.chatTypeFilter = chatTypeFilter;
            this.minDate = minDate;
            this.maxDate = maxDate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1225448885;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for outgoing messages with content of the type messageDocument in all chats except secret chats. Returns the results in reverse chronological order.
     *
     * <p> Returns {@link FoundMessages FoundMessages} </p>
     */
    public static class SearchOutgoingDocumentMessages extends Function<FoundMessages> {
        /**
         * Query to search for in document file name and message caption.
         */
        public String query;
        /**
         * The maximum number of messages to be returned; up to 100.
         */
        public int limit;

        /**
         * Default constructor for a function, which searches for outgoing messages with content of the type messageDocument in all chats except secret chats. Returns the results in reverse chronological order.
         *
         * <p> Returns {@link FoundMessages FoundMessages} </p>
         */
        public SearchOutgoingDocumentMessages() {
        }

        /**
         * Creates a function, which searches for outgoing messages with content of the type messageDocument in all chats except secret chats. Returns the results in reverse chronological order.
         *
         * <p> Returns {@link FoundMessages FoundMessages} </p>
         *
         * @param query Query to search for in document file name and message caption.
         * @param limit The maximum number of messages to be returned; up to 100.
         */
        public SearchOutgoingDocumentMessages(String query, int limit) {
            this.query = query;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1071397762;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches a public chat by its username. Currently, only private chats, supergroups and channels can be public. Returns the chat if found; otherwise, an error is returned.
     *
     * <p> Returns {@link Chat Chat} </p>
     */
    public static class SearchPublicChat extends Function<Chat> {
        /**
         * Username to be resolved.
         */
        public String username;

        /**
         * Default constructor for a function, which searches a public chat by its username. Currently, only private chats, supergroups and channels can be public. Returns the chat if found; otherwise, an error is returned.
         *
         * <p> Returns {@link Chat Chat} </p>
         */
        public SearchPublicChat() {
        }

        /**
         * Creates a function, which searches a public chat by its username. Currently, only private chats, supergroups and channels can be public. Returns the chat if found; otherwise, an error is returned.
         *
         * <p> Returns {@link Chat Chat} </p>
         *
         * @param username Username to be resolved.
         */
        public SearchPublicChat(String username) {
            this.username = username;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 857135533;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches public chats by looking for specified query in their username and title. Currently, only private chats, supergroups and channels can be public. Returns a meaningful number of results. Excludes private chats with contacts and chats from the chat list from the results.
     *
     * <p> Returns {@link Chats Chats} </p>
     */
    public static class SearchPublicChats extends Function<Chats> {
        /**
         * Query to search for.
         */
        public String query;

        /**
         * Default constructor for a function, which searches public chats by looking for specified query in their username and title. Currently, only private chats, supergroups and channels can be public. Returns a meaningful number of results. Excludes private chats with contacts and chats from the chat list from the results.
         *
         * <p> Returns {@link Chats Chats} </p>
         */
        public SearchPublicChats() {
        }

        /**
         * Creates a function, which searches public chats by looking for specified query in their username and title. Currently, only private chats, supergroups and channels can be public. Returns a meaningful number of results. Excludes private chats with contacts and chats from the chat list from the results.
         *
         * <p> Returns {@link Chats Chats} </p>
         *
         * @param query Query to search for.
         */
        public SearchPublicChats(String query) {
            this.query = query;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 970385337;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for public channel posts containing the given hashtag or cashtag. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
     *
     * <p> Returns {@link FoundMessages FoundMessages} </p>
     */
    public static class SearchPublicMessagesByTag extends Function<FoundMessages> {
        /**
         * Hashtag or cashtag to search for.
         */
        public String tag;
        /**
         * Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         */
        public String offset;
        /**
         * The maximum number of messages to be returned; up to 100. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         */
        public int limit;

        /**
         * Default constructor for a function, which searches for public channel posts containing the given hashtag or cashtag. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         *
         * <p> Returns {@link FoundMessages FoundMessages} </p>
         */
        public SearchPublicMessagesByTag() {
        }

        /**
         * Creates a function, which searches for public channel posts containing the given hashtag or cashtag. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         *
         * <p> Returns {@link FoundMessages FoundMessages} </p>
         *
         * @param tag Hashtag or cashtag to search for.
         * @param offset Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         * @param limit The maximum number of messages to be returned; up to 100. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         */
        public SearchPublicMessagesByTag(String tag, String offset, int limit) {
            this.tag = tag;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 630680746;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for public channel posts using the given query. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
     *
     * <p> Returns {@link FoundPublicPosts FoundPublicPosts} </p>
     */
    public static class SearchPublicPosts extends Function<FoundPublicPosts> {
        /**
         * Query to search for.
         */
        public String query;
        /**
         * Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         */
        public String offset;
        /**
         * The maximum number of messages to be returned; up to 100. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         */
        public int limit;
        /**
         * The Telegram Star amount the user agreed to pay for the search; pass 0 for free searches.
         */
        public long starCount;

        /**
         * Default constructor for a function, which searches for public channel posts using the given query. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         *
         * <p> Returns {@link FoundPublicPosts FoundPublicPosts} </p>
         */
        public SearchPublicPosts() {
        }

        /**
         * Creates a function, which searches for public channel posts using the given query. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         *
         * <p> Returns {@link FoundPublicPosts FoundPublicPosts} </p>
         *
         * @param query Query to search for.
         * @param offset Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         * @param limit The maximum number of messages to be returned; up to 100. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         * @param starCount The Telegram Star amount the user agreed to pay for the search; pass 0 for free searches.
         */
        public SearchPublicPosts(String query, String offset, int limit, long starCount) {
            this.query = query;
            this.offset = offset;
            this.limit = limit;
            this.starCount = starCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 618133347;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for public stories by the given address location. For optimal performance, the number of returned stories is chosen by TDLib and can be smaller than the specified limit.
     *
     * <p> Returns {@link FoundStories FoundStories} </p>
     */
    public static class SearchPublicStoriesByLocation extends Function<FoundStories> {
        /**
         * Address of the location.
         */
        public LocationAddress address;
        /**
         * Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         */
        public String offset;
        /**
         * The maximum number of stories to be returned; up to 100. For optimal performance, the number of returned stories is chosen by TDLib and can be smaller than the specified limit.
         */
        public int limit;

        /**
         * Default constructor for a function, which searches for public stories by the given address location. For optimal performance, the number of returned stories is chosen by TDLib and can be smaller than the specified limit.
         *
         * <p> Returns {@link FoundStories FoundStories} </p>
         */
        public SearchPublicStoriesByLocation() {
        }

        /**
         * Creates a function, which searches for public stories by the given address location. For optimal performance, the number of returned stories is chosen by TDLib and can be smaller than the specified limit.
         *
         * <p> Returns {@link FoundStories FoundStories} </p>
         *
         * @param address Address of the location.
         * @param offset Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         * @param limit The maximum number of stories to be returned; up to 100. For optimal performance, the number of returned stories is chosen by TDLib and can be smaller than the specified limit.
         */
        public SearchPublicStoriesByLocation(LocationAddress address, String offset, int limit) {
            this.address = address;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1596709256;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for public stories containing the given hashtag or cashtag. For optimal performance, the number of returned stories is chosen by TDLib and can be smaller than the specified limit.
     *
     * <p> Returns {@link FoundStories FoundStories} </p>
     */
    public static class SearchPublicStoriesByTag extends Function<FoundStories> {
        /**
         * Identifier of the chat that posted the stories to search for; pass 0 to search stories in all chats.
         */
        public long storyPosterChatId;
        /**
         * Hashtag or cashtag to search for.
         */
        public String tag;
        /**
         * Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         */
        public String offset;
        /**
         * The maximum number of stories to be returned; up to 100. For optimal performance, the number of returned stories is chosen by TDLib and can be smaller than the specified limit.
         */
        public int limit;

        /**
         * Default constructor for a function, which searches for public stories containing the given hashtag or cashtag. For optimal performance, the number of returned stories is chosen by TDLib and can be smaller than the specified limit.
         *
         * <p> Returns {@link FoundStories FoundStories} </p>
         */
        public SearchPublicStoriesByTag() {
        }

        /**
         * Creates a function, which searches for public stories containing the given hashtag or cashtag. For optimal performance, the number of returned stories is chosen by TDLib and can be smaller than the specified limit.
         *
         * <p> Returns {@link FoundStories FoundStories} </p>
         *
         * @param storyPosterChatId Identifier of the chat that posted the stories to search for; pass 0 to search stories in all chats.
         * @param tag Hashtag or cashtag to search for.
         * @param offset Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         * @param limit The maximum number of stories to be returned; up to 100. For optimal performance, the number of returned stories is chosen by TDLib and can be smaller than the specified limit.
         */
        public SearchPublicStoriesByTag(long storyPosterChatId, String tag, String offset, int limit) {
            this.storyPosterChatId = storyPosterChatId;
            this.tag = tag;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1778102602;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for public stories from the given venue. For optimal performance, the number of returned stories is chosen by TDLib and can be smaller than the specified limit.
     *
     * <p> Returns {@link FoundStories FoundStories} </p>
     */
    public static class SearchPublicStoriesByVenue extends Function<FoundStories> {
        /**
         * Provider of the venue.
         */
        public String venueProvider;
        /**
         * Identifier of the venue in the provider database.
         */
        public String venueId;
        /**
         * Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         */
        public String offset;
        /**
         * The maximum number of stories to be returned; up to 100. For optimal performance, the number of returned stories is chosen by TDLib and can be smaller than the specified limit.
         */
        public int limit;

        /**
         * Default constructor for a function, which searches for public stories from the given venue. For optimal performance, the number of returned stories is chosen by TDLib and can be smaller than the specified limit.
         *
         * <p> Returns {@link FoundStories FoundStories} </p>
         */
        public SearchPublicStoriesByVenue() {
        }

        /**
         * Creates a function, which searches for public stories from the given venue. For optimal performance, the number of returned stories is chosen by TDLib and can be smaller than the specified limit.
         *
         * <p> Returns {@link FoundStories FoundStories} </p>
         *
         * @param venueProvider Provider of the venue.
         * @param venueId Identifier of the venue in the provider database.
         * @param offset Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         * @param limit The maximum number of stories to be returned; up to 100. For optimal performance, the number of returned stories is chosen by TDLib and can be smaller than the specified limit.
         */
        public SearchPublicStoriesByVenue(String venueProvider, String venueId, String offset, int limit) {
            this.venueProvider = venueProvider;
            this.venueId = venueId;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -686136790;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for a given quote in a text. Returns found quote start position in UTF-16 code units. Returns a 404 error if the quote is not found. Can be called synchronously.
     *
     * <p> Returns {@link FoundPosition FoundPosition} </p>
     */
    public static class SearchQuote extends Function<FoundPosition> {
        /**
         * Text in which to search for the quote.
         */
        public FormattedText text;
        /**
         * Quote to search for.
         */
        public FormattedText quote;
        /**
         * Approximate quote position in UTF-16 code units.
         */
        public int quotePosition;

        /**
         * Default constructor for a function, which searches for a given quote in a text. Returns found quote start position in UTF-16 code units. Returns a 404 error if the quote is not found. Can be called synchronously.
         *
         * <p> Returns {@link FoundPosition FoundPosition} </p>
         */
        public SearchQuote() {
        }

        /**
         * Creates a function, which searches for a given quote in a text. Returns found quote start position in UTF-16 code units. Returns a 404 error if the quote is not found. Can be called synchronously.
         *
         * <p> Returns {@link FoundPosition FoundPosition} </p>
         *
         * @param text Text in which to search for the quote.
         * @param quote Quote to search for.
         * @param quotePosition Approximate quote position in UTF-16 code units.
         */
        public SearchQuote(FormattedText text, FormattedText quote, int quotePosition) {
            this.text = text;
            this.quote = quote;
            this.quotePosition = quotePosition;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1751384351;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for the specified query in the title and username of up to 50 recently found chats. This is an offline method.
     *
     * <p> Returns {@link Chats Chats} </p>
     */
    public static class SearchRecentlyFoundChats extends Function<Chats> {
        /**
         * Query to search for.
         */
        public String query;
        /**
         * The maximum number of chats to be returned.
         */
        public int limit;

        /**
         * Default constructor for a function, which searches for the specified query in the title and username of up to 50 recently found chats. This is an offline method.
         *
         * <p> Returns {@link Chats Chats} </p>
         */
        public SearchRecentlyFoundChats() {
        }

        /**
         * Creates a function, which searches for the specified query in the title and username of up to 50 recently found chats. This is an offline method.
         *
         * <p> Returns {@link Chats Chats} </p>
         *
         * @param query Query to search for.
         * @param limit The maximum number of chats to be returned.
         */
        public SearchRecentlyFoundChats(String query, int limit) {
            this.query = query;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1647445393;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for messages tagged by the given reaction and with the given words in the Saved Messages chat; for Telegram Premium users only. Returns the results in reverse chronological order, i.e. in order of decreasing messageId. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
     *
     * <p> Returns {@link FoundChatMessages FoundChatMessages} </p>
     */
    public static class SearchSavedMessages extends Function<FoundChatMessages> {
        /**
         * If not 0, only messages in the specified Saved Messages topic will be considered; pass 0 to consider all messages.
         */
        public long savedMessagesTopicId;
        /**
         * Tag to search for; pass null to return all suitable messages.
         */
        public ReactionType tag;
        /**
         * Query to search for.
         */
        public String query;
        /**
         * Identifier of the message starting from which messages must be fetched; use 0 to get results from the last message.
         */
        public long fromMessageId;
        /**
         * Specify 0 to get results from exactly the message fromMessageId or a negative number to get the specified message and some newer messages.
         */
        public int offset;
        /**
         * The maximum number of messages to be returned; must be positive and can't be greater than 100. If the offset is negative, then the limit must be greater than -offset. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         */
        public int limit;

        /**
         * Default constructor for a function, which searches for messages tagged by the given reaction and with the given words in the Saved Messages chat; for Telegram Premium users only. Returns the results in reverse chronological order, i.e. in order of decreasing messageId. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         *
         * <p> Returns {@link FoundChatMessages FoundChatMessages} </p>
         */
        public SearchSavedMessages() {
        }

        /**
         * Creates a function, which searches for messages tagged by the given reaction and with the given words in the Saved Messages chat; for Telegram Premium users only. Returns the results in reverse chronological order, i.e. in order of decreasing messageId. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         *
         * <p> Returns {@link FoundChatMessages FoundChatMessages} </p>
         *
         * @param savedMessagesTopicId If not 0, only messages in the specified Saved Messages topic will be considered; pass 0 to consider all messages.
         * @param tag Tag to search for; pass null to return all suitable messages.
         * @param query Query to search for.
         * @param fromMessageId Identifier of the message starting from which messages must be fetched; use 0 to get results from the last message.
         * @param offset Specify 0 to get results from exactly the message fromMessageId or a negative number to get the specified message and some newer messages.
         * @param limit The maximum number of messages to be returned; must be positive and can't be greater than 100. If the offset is negative, then the limit must be greater than -offset. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         */
        public SearchSavedMessages(long savedMessagesTopicId, ReactionType tag, String query, long fromMessageId, int offset, int limit) {
            this.savedMessagesTopicId = savedMessagesTopicId;
            this.tag = tag;
            this.query = query;
            this.fromMessageId = fromMessageId;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1969512554;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for messages in secret chats. Returns the results in reverse chronological order. For optimal performance, the number of returned messages is chosen by TDLib.
     *
     * <p> Returns {@link FoundMessages FoundMessages} </p>
     */
    public static class SearchSecretMessages extends Function<FoundMessages> {
        /**
         * Identifier of the chat in which to search. Specify 0 to search in all secret chats.
         */
        public long chatId;
        /**
         * Query to search for. If empty, searchChatMessages must be used instead.
         */
        public String query;
        /**
         * Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         */
        public String offset;
        /**
         * The maximum number of messages to be returned; up to 100. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         */
        public int limit;
        /**
         * Additional filter for messages to search; pass null to search for all messages.
         */
        public SearchMessagesFilter filter;

        /**
         * Default constructor for a function, which searches for messages in secret chats. Returns the results in reverse chronological order. For optimal performance, the number of returned messages is chosen by TDLib.
         *
         * <p> Returns {@link FoundMessages FoundMessages} </p>
         */
        public SearchSecretMessages() {
        }

        /**
         * Creates a function, which searches for messages in secret chats. Returns the results in reverse chronological order. For optimal performance, the number of returned messages is chosen by TDLib.
         *
         * <p> Returns {@link FoundMessages FoundMessages} </p>
         *
         * @param chatId Identifier of the chat in which to search. Specify 0 to search in all secret chats.
         * @param query Query to search for. If empty, searchChatMessages must be used instead.
         * @param offset Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results.
         * @param limit The maximum number of messages to be returned; up to 100. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit.
         * @param filter Additional filter for messages to search; pass null to search for all messages.
         */
        public SearchSecretMessages(long chatId, String query, String offset, int limit, SearchMessagesFilter filter) {
            this.chatId = chatId;
            this.query = query;
            this.offset = offset;
            this.limit = limit;
            this.filter = filter;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -852865892;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for a sticker set by its name.
     *
     * <p> Returns {@link StickerSet StickerSet} </p>
     */
    public static class SearchStickerSet extends Function<StickerSet> {
        /**
         * Name of the sticker set.
         */
        public String name;
        /**
         * Pass true to ignore local cache of sticker sets and always send a network request.
         */
        public boolean ignoreCache;

        /**
         * Default constructor for a function, which searches for a sticker set by its name.
         *
         * <p> Returns {@link StickerSet StickerSet} </p>
         */
        public SearchStickerSet() {
        }

        /**
         * Creates a function, which searches for a sticker set by its name.
         *
         * <p> Returns {@link StickerSet StickerSet} </p>
         *
         * @param name Name of the sticker set.
         * @param ignoreCache Pass true to ignore local cache of sticker sets and always send a network request.
         */
        public SearchStickerSet(String name, boolean ignoreCache) {
            this.name = name;
            this.ignoreCache = ignoreCache;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1676592898;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for sticker sets by looking for specified query in their title and name. Excludes installed sticker sets from the results.
     *
     * <p> Returns {@link StickerSets StickerSets} </p>
     */
    public static class SearchStickerSets extends Function<StickerSets> {
        /**
         * Type of the sticker sets to return.
         */
        public StickerType stickerType;
        /**
         * Query to search for.
         */
        public String query;

        /**
         * Default constructor for a function, which searches for sticker sets by looking for specified query in their title and name. Excludes installed sticker sets from the results.
         *
         * <p> Returns {@link StickerSets StickerSets} </p>
         */
        public SearchStickerSets() {
        }

        /**
         * Creates a function, which searches for sticker sets by looking for specified query in their title and name. Excludes installed sticker sets from the results.
         *
         * <p> Returns {@link StickerSets StickerSets} </p>
         *
         * @param stickerType Type of the sticker sets to return.
         * @param query Query to search for.
         */
        public SearchStickerSets(StickerType stickerType, String query) {
            this.stickerType = stickerType;
            this.query = query;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 262801004;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches for stickers from public sticker sets that correspond to any of the given emoji.
     *
     * <p> Returns {@link Stickers Stickers} </p>
     */
    public static class SearchStickers extends Function<Stickers> {
        /**
         * Type of the stickers to return.
         */
        public StickerType stickerType;
        /**
         * Space-separated list of emojis to search for.
         */
        public String emojis;
        /**
         * Query to search for; may be empty to search for emoji only.
         */
        public String query;
        /**
         * List of possible IETF language tags of the user's input language; may be empty if unknown.
         */
        public String[] inputLanguageCodes;
        /**
         * The offset from which to return the stickers; must be non-negative.
         */
        public int offset;
        /**
         * The maximum number of stickers to be returned; 0-100.
         */
        public int limit;

        /**
         * Default constructor for a function, which searches for stickers from public sticker sets that correspond to any of the given emoji.
         *
         * <p> Returns {@link Stickers Stickers} </p>
         */
        public SearchStickers() {
        }

        /**
         * Creates a function, which searches for stickers from public sticker sets that correspond to any of the given emoji.
         *
         * <p> Returns {@link Stickers Stickers} </p>
         *
         * @param stickerType Type of the stickers to return.
         * @param emojis Space-separated list of emojis to search for.
         * @param query Query to search for; may be empty to search for emoji only.
         * @param inputLanguageCodes List of possible IETF language tags of the user's input language; may be empty if unknown.
         * @param offset The offset from which to return the stickers; must be non-negative.
         * @param limit The maximum number of stickers to be returned; 0-100.
         */
        public SearchStickers(StickerType stickerType, String emojis, String query, String[] inputLanguageCodes, int offset, int limit) {
            this.stickerType = stickerType;
            this.emojis = emojis;
            this.query = query;
            this.inputLanguageCodes = inputLanguageCodes;
            this.offset = offset;
            this.limit = limit;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1856294754;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches specified query by word prefixes in the provided strings. Returns 0-based positions of strings that matched. Can be called synchronously.
     *
     * <p> Returns {@link FoundPositions FoundPositions} </p>
     */
    public static class SearchStringsByPrefix extends Function<FoundPositions> {
        /**
         * The strings to search in for the query.
         */
        public String[] strings;
        /**
         * Query to search for.
         */
        public String query;
        /**
         * The maximum number of objects to return.
         */
        public int limit;
        /**
         * Pass true to receive no results for an empty query.
         */
        public boolean returnNoneForEmptyQuery;

        /**
         * Default constructor for a function, which searches specified query by word prefixes in the provided strings. Returns 0-based positions of strings that matched. Can be called synchronously.
         *
         * <p> Returns {@link FoundPositions FoundPositions} </p>
         */
        public SearchStringsByPrefix() {
        }

        /**
         * Creates a function, which searches specified query by word prefixes in the provided strings. Returns 0-based positions of strings that matched. Can be called synchronously.
         *
         * <p> Returns {@link FoundPositions FoundPositions} </p>
         *
         * @param strings The strings to search in for the query.
         * @param query Query to search for.
         * @param limit The maximum number of objects to return.
         * @param returnNoneForEmptyQuery Pass true to receive no results for an empty query.
         */
        public SearchStringsByPrefix(String[] strings, String query, int limit, boolean returnNoneForEmptyQuery) {
            this.strings = strings;
            this.query = query;
            this.limit = limit;
            this.returnNoneForEmptyQuery = returnNoneForEmptyQuery;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2023251463;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches a custom text composition style by its name.
     *
     * <p> Returns {@link TextCompositionStyle TextCompositionStyle} </p>
     */
    public static class SearchTextCompositionStyle extends Function<TextCompositionStyle> {
        /**
         * Name of the style.
         */
        public String name;

        /**
         * Default constructor for a function, which searches a custom text composition style by its name.
         *
         * <p> Returns {@link TextCompositionStyle TextCompositionStyle} </p>
         */
        public SearchTextCompositionStyle() {
        }

        /**
         * Creates a function, which searches a custom text composition style by its name.
         *
         * <p> Returns {@link TextCompositionStyle TextCompositionStyle} </p>
         *
         * @param name Name of the style.
         */
        public SearchTextCompositionStyle(String name) {
            this.name = name;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -704463202;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches a user by their phone number. Returns a 404 error if the user can't be found.
     *
     * <p> Returns {@link User User} </p>
     */
    public static class SearchUserByPhoneNumber extends Function<User> {
        /**
         * Phone number to search for.
         */
        public String phoneNumber;
        /**
         * Pass true to get only locally available information without sending network requests.
         */
        public boolean onlyLocal;

        /**
         * Default constructor for a function, which searches a user by their phone number. Returns a 404 error if the user can't be found.
         *
         * <p> Returns {@link User User} </p>
         */
        public SearchUserByPhoneNumber() {
        }

        /**
         * Creates a function, which searches a user by their phone number. Returns a 404 error if the user can't be found.
         *
         * <p> Returns {@link User User} </p>
         *
         * @param phoneNumber Phone number to search for.
         * @param onlyLocal Pass true to get only locally available information without sending network requests.
         */
        public SearchUserByPhoneNumber(String phoneNumber, boolean onlyLocal) {
            this.phoneNumber = phoneNumber;
            this.onlyLocal = onlyLocal;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -343757368;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Searches a user by a token from the user's link.
     *
     * <p> Returns {@link User User} </p>
     */
    public static class SearchUserByToken extends Function<User> {
        /**
         * Token to search for.
         */
        public String token;

        /**
         * Default constructor for a function, which searches a user by a token from the user's link.
         *
         * <p> Returns {@link User User} </p>
         */
        public SearchUserByToken() {
        }

        /**
         * Creates a function, which searches a user by a token from the user's link.
         *
         * <p> Returns {@link User User} </p>
         *
         * @param token Token to search for.
         */
        public SearchUserByToken(String token) {
            this.token = token;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -666766282;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns information about a Web App by its short name. Returns a 404 error if the Web App is not found.
     *
     * <p> Returns {@link FoundWebApp FoundWebApp} </p>
     */
    public static class SearchWebApp extends Function<FoundWebApp> {
        /**
         * Identifier of the target bot.
         */
        public long botUserId;
        /**
         * Short name of the Web App.
         */
        public String webAppShortName;

        /**
         * Default constructor for a function, which returns information about a Web App by its short name. Returns a 404 error if the Web App is not found.
         *
         * <p> Returns {@link FoundWebApp FoundWebApp} </p>
         */
        public SearchWebApp() {
        }

        /**
         * Creates a function, which returns information about a Web App by its short name. Returns a 404 error if the Web App is not found.
         *
         * <p> Returns {@link FoundWebApp FoundWebApp} </p>
         *
         * @param botUserId Identifier of the target bot.
         * @param webAppShortName Short name of the Web App.
         */
        public SearchWebApp(long botUserId, String webAppShortName) {
            this.botUserId = botUserId;
            this.webAppShortName = webAppShortName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1241740747;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sells a gift for Telegram Stars; requires owner privileges for gifts owned by a chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SellGift extends Function<Ok> {
        /**
         * Unique identifier of business connection on behalf of which to send the request; for bots only.
         */
        public String businessConnectionId;
        /**
         * Identifier of the gift.
         */
        public String receivedGiftId;

        /**
         * Default constructor for a function, which sells a gift for Telegram Stars; requires owner privileges for gifts owned by a chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SellGift() {
        }

        /**
         * Creates a function, which sells a gift for Telegram Stars; requires owner privileges for gifts owned by a chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param businessConnectionId Unique identifier of business connection on behalf of which to send the request; for bots only.
         * @param receivedGiftId Identifier of the gift.
         */
        public SellGift(String businessConnectionId, String receivedGiftId) {
            this.businessConnectionId = businessConnectionId;
            this.receivedGiftId = receivedGiftId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -298298375;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends Firebase Authentication SMS to the phone number of the user. Works only when the current authorization state is authorizationStateWaitCode and the server returned code of the type authenticationCodeTypeFirebaseAndroid or authenticationCodeTypeFirebaseIos.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SendAuthenticationFirebaseSms extends Function<Ok> {
        /**
         * Play Integrity API or SafetyNet Attestation API token for the Android application, or secret from push notification for the iOS application.
         */
        public String token;

        /**
         * Default constructor for a function, which sends Firebase Authentication SMS to the phone number of the user. Works only when the current authorization state is authorizationStateWaitCode and the server returned code of the type authenticationCodeTypeFirebaseAndroid or authenticationCodeTypeFirebaseIos.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SendAuthenticationFirebaseSms() {
        }

        /**
         * Creates a function, which sends Firebase Authentication SMS to the phone number of the user. Works only when the current authorization state is authorizationStateWaitCode and the server returned code of the type authenticationCodeTypeFirebaseAndroid or authenticationCodeTypeFirebaseIos.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param token Play Integrity API or SafetyNet Attestation API token for the Android application, or secret from push notification for the iOS application.
         */
        public SendAuthenticationFirebaseSms(String token) {
            this.token = token;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 364994111;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Invites a bot to a chat (if it is not yet a member) and sends it the /start command; requires canInviteUsers member right. Bots can't be invited to a private chat other than the chat with the bot. Bots can't be invited to channels (although they can be added as admins) and secret chats. Returns the sent message.
     *
     * <p> Returns {@link Message Message} </p>
     */
    public static class SendBotStartMessage extends Function<Message> {
        /**
         * Identifier of the bot.
         */
        public long botUserId;
        /**
         * Identifier of the target chat.
         */
        public long chatId;
        /**
         * A hidden parameter sent to the bot for deep linking purposes (https://core.telegram.org/bots#deep-linking).
         */
        public String parameter;

        /**
         * Default constructor for a function, which invites a bot to a chat (if it is not yet a member) and sends it the /start command; requires canInviteUsers member right. Bots can't be invited to a private chat other than the chat with the bot. Bots can't be invited to channels (although they can be added as admins) and secret chats. Returns the sent message.
         *
         * <p> Returns {@link Message Message} </p>
         */
        public SendBotStartMessage() {
        }

        /**
         * Creates a function, which invites a bot to a chat (if it is not yet a member) and sends it the /start command; requires canInviteUsers member right. Bots can't be invited to a private chat other than the chat with the bot. Bots can't be invited to channels (although they can be added as admins) and secret chats. Returns the sent message.
         *
         * <p> Returns {@link Message Message} </p>
         *
         * @param botUserId Identifier of the bot.
         * @param chatId Identifier of the target chat.
         * @param parameter A hidden parameter sent to the bot for deep linking purposes (https://core.telegram.org/bots#deep-linking).
         */
        public SendBotStartMessage(long botUserId, long chatId, String parameter) {
            this.botUserId = botUserId;
            this.chatId = chatId;
            this.parameter = parameter;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1435877650;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends a message on behalf of a business account; for bots only. Returns the message after it was sent.
     *
     * <p> Returns {@link BusinessMessage BusinessMessage} </p>
     */
    public static class SendBusinessMessage extends Function<BusinessMessage> {
        /**
         * Unique identifier of business connection on behalf of which to send the request.
         */
        public String businessConnectionId;
        /**
         * Target chat.
         */
        public long chatId;
        /**
         * Information about the message to be replied; pass null if none.
         */
        public InputMessageReplyTo replyTo;
        /**
         * Pass true to disable notification for the message.
         */
        public boolean disableNotification;
        /**
         * Pass true if the content of the message must be protected from forwarding and saving.
         */
        public boolean protectContent;
        /**
         * Identifier of the effect to apply to the message.
         */
        public long effectId;
        /**
         * Markup for replying to the message; pass null if none.
         */
        public ReplyMarkup replyMarkup;
        /**
         * The content of the message to be sent.
         */
        public InputMessageContent inputMessageContent;

        /**
         * Default constructor for a function, which sends a message on behalf of a business account; for bots only. Returns the message after it was sent.
         *
         * <p> Returns {@link BusinessMessage BusinessMessage} </p>
         */
        public SendBusinessMessage() {
        }

        /**
         * Creates a function, which sends a message on behalf of a business account; for bots only. Returns the message after it was sent.
         *
         * <p> Returns {@link BusinessMessage BusinessMessage} </p>
         *
         * @param businessConnectionId Unique identifier of business connection on behalf of which to send the request.
         * @param chatId Target chat.
         * @param replyTo Information about the message to be replied; pass null if none.
         * @param disableNotification Pass true to disable notification for the message.
         * @param protectContent Pass true if the content of the message must be protected from forwarding and saving.
         * @param effectId Identifier of the effect to apply to the message.
         * @param replyMarkup Markup for replying to the message; pass null if none.
         * @param inputMessageContent The content of the message to be sent.
         */
        public SendBusinessMessage(String businessConnectionId, long chatId, InputMessageReplyTo replyTo, boolean disableNotification, boolean protectContent, long effectId, ReplyMarkup replyMarkup, InputMessageContent inputMessageContent) {
            this.businessConnectionId = businessConnectionId;
            this.chatId = chatId;
            this.replyTo = replyTo;
            this.disableNotification = disableNotification;
            this.protectContent = protectContent;
            this.effectId = effectId;
            this.replyMarkup = replyMarkup;
            this.inputMessageContent = inputMessageContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 159888387;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends 2-10 messages grouped together into an album on behalf of a business account; for bots only. Currently, only audio, document, photo and video messages can be grouped into an album. Documents and audio files can be only grouped in an album with messages of the same type. Returns sent messages.
     *
     * <p> Returns {@link BusinessMessages BusinessMessages} </p>
     */
    public static class SendBusinessMessageAlbum extends Function<BusinessMessages> {
        /**
         * Unique identifier of business connection on behalf of which to send the request.
         */
        public String businessConnectionId;
        /**
         * Target chat.
         */
        public long chatId;
        /**
         * Information about the message to be replied; pass null if none.
         */
        public InputMessageReplyTo replyTo;
        /**
         * Pass true to disable notification for the message.
         */
        public boolean disableNotification;
        /**
         * Pass true if the content of the message must be protected from forwarding and saving.
         */
        public boolean protectContent;
        /**
         * Identifier of the effect to apply to the message.
         */
        public long effectId;
        /**
         * Contents of messages to be sent. At most 10 messages can be added to an album. All messages must have the same value of showCaptionAboveMedia.
         */
        public InputMessageContent[] inputMessageContents;

        /**
         * Default constructor for a function, which sends 2-10 messages grouped together into an album on behalf of a business account; for bots only. Currently, only audio, document, photo and video messages can be grouped into an album. Documents and audio files can be only grouped in an album with messages of the same type. Returns sent messages.
         *
         * <p> Returns {@link BusinessMessages BusinessMessages} </p>
         */
        public SendBusinessMessageAlbum() {
        }

        /**
         * Creates a function, which sends 2-10 messages grouped together into an album on behalf of a business account; for bots only. Currently, only audio, document, photo and video messages can be grouped into an album. Documents and audio files can be only grouped in an album with messages of the same type. Returns sent messages.
         *
         * <p> Returns {@link BusinessMessages BusinessMessages} </p>
         *
         * @param businessConnectionId Unique identifier of business connection on behalf of which to send the request.
         * @param chatId Target chat.
         * @param replyTo Information about the message to be replied; pass null if none.
         * @param disableNotification Pass true to disable notification for the message.
         * @param protectContent Pass true if the content of the message must be protected from forwarding and saving.
         * @param effectId Identifier of the effect to apply to the message.
         * @param inputMessageContents Contents of messages to be sent. At most 10 messages can be added to an album. All messages must have the same value of showCaptionAboveMedia.
         */
        public SendBusinessMessageAlbum(String businessConnectionId, long chatId, InputMessageReplyTo replyTo, boolean disableNotification, boolean protectContent, long effectId, InputMessageContent[] inputMessageContents) {
            this.businessConnectionId = businessConnectionId;
            this.chatId = chatId;
            this.replyTo = replyTo;
            this.disableNotification = disableNotification;
            this.protectContent = protectContent;
            this.effectId = effectId;
            this.inputMessageContents = inputMessageContents;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 788608366;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends debug information for a call to Telegram servers.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SendCallDebugInformation extends Function<Ok> {
        /**
         * Call identifier.
         */
        public InputCall callId;
        /**
         * Debug information in application-specific format.
         */
        public String debugInformation;

        /**
         * Default constructor for a function, which sends debug information for a call to Telegram servers.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SendCallDebugInformation() {
        }

        /**
         * Creates a function, which sends debug information for a call to Telegram servers.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param callId Call identifier.
         * @param debugInformation Debug information in application-specific format.
         */
        public SendCallDebugInformation(InputCall callId, String debugInformation) {
            this.callId = callId;
            this.debugInformation = debugInformation;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1671879106;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends log file for a call to Telegram servers.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SendCallLog extends Function<Ok> {
        /**
         * Call identifier.
         */
        public InputCall callId;
        /**
         * Call log file. Only inputFileLocal and inputFileGenerated are supported.
         */
        public InputFile logFile;

        /**
         * Default constructor for a function, which sends log file for a call to Telegram servers.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SendCallLog() {
        }

        /**
         * Creates a function, which sends log file for a call to Telegram servers.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param callId Call identifier.
         * @param logFile Call log file. Only inputFileLocal and inputFileGenerated are supported.
         */
        public SendCallLog(InputCall callId, InputFile logFile) {
            this.callId = callId;
            this.logFile = logFile;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -608809175;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends a call rating.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SendCallRating extends Function<Ok> {
        /**
         * Call identifier.
         */
        public InputCall callId;
        /**
         * Call rating; 1-5.
         */
        public int rating;
        /**
         * An optional user comment if the rating is less than 5.
         */
        public String comment;
        /**
         * List of the exact types of problems with the call, specified by the user.
         */
        public CallProblem[] problems;

        /**
         * Default constructor for a function, which sends a call rating.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SendCallRating() {
        }

        /**
         * Creates a function, which sends a call rating.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param callId Call identifier.
         * @param rating Call rating; 1-5.
         * @param comment An optional user comment if the rating is less than 5.
         * @param problems List of the exact types of problems with the call, specified by the user.
         */
        public SendCallRating(InputCall callId, int rating, String comment, CallProblem[] problems) {
            this.callId = callId;
            this.rating = rating;
            this.comment = comment;
            this.problems = problems;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -158354447;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends call signaling data.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SendCallSignalingData extends Function<Ok> {
        /**
         * Call identifier.
         */
        public int callId;
        /**
         * The data.
         */
        public byte[] data;

        /**
         * Default constructor for a function, which sends call signaling data.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SendCallSignalingData() {
        }

        /**
         * Creates a function, which sends call signaling data.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param callId Call identifier.
         * @param data The data.
         */
        public SendCallSignalingData(int callId, byte[] data) {
            this.callId = callId;
            this.data = data;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1412280732;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends a notification about user activity in a chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SendChatAction extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifier of the topic in which the action is performed; pass null if none.
         */
        public MessageTopic topicId;
        /**
         * Unique identifier of business connection on behalf of which to send the request; for bots only.
         */
        public String businessConnectionId;
        /**
         * The action description; pass null to cancel the currently active action.
         */
        public ChatAction action;

        /**
         * Default constructor for a function, which sends a notification about user activity in a chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SendChatAction() {
        }

        /**
         * Creates a function, which sends a notification about user activity in a chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param topicId Identifier of the topic in which the action is performed; pass null if none.
         * @param businessConnectionId Unique identifier of business connection on behalf of which to send the request; for bots only.
         * @param action The action description; pass null to cancel the currently active action.
         */
        public SendChatAction(long chatId, MessageTopic topicId, String businessConnectionId, ChatAction action) {
            this.chatId = chatId;
            this.topicId = topicId;
            this.businessConnectionId = businessConnectionId;
            this.action = action;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1586808788;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends a custom request; for bots only.
     *
     * <p> Returns {@link CustomRequestResult CustomRequestResult} </p>
     */
    public static class SendCustomRequest extends Function<CustomRequestResult> {
        /**
         * The method name.
         */
        public String method;
        /**
         * JSON-serialized method parameters.
         */
        public String parameters;

        /**
         * Default constructor for a function, which sends a custom request; for bots only.
         *
         * <p> Returns {@link CustomRequestResult CustomRequestResult} </p>
         */
        public SendCustomRequest() {
        }

        /**
         * Creates a function, which sends a custom request; for bots only.
         *
         * <p> Returns {@link CustomRequestResult CustomRequestResult} </p>
         *
         * @param method The method name.
         * @param parameters JSON-serialized method parameters.
         */
        public SendCustomRequest(String method, String parameters) {
            this.method = method;
            this.parameters = parameters;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 285045153;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends a code to verify an email address to be added to a user's Telegram Passport.
     *
     * <p> Returns {@link EmailAddressAuthenticationCodeInfo EmailAddressAuthenticationCodeInfo} </p>
     */
    public static class SendEmailAddressVerificationCode extends Function<EmailAddressAuthenticationCodeInfo> {
        /**
         * Email address.
         */
        public String emailAddress;

        /**
         * Default constructor for a function, which sends a code to verify an email address to be added to a user's Telegram Passport.
         *
         * <p> Returns {@link EmailAddressAuthenticationCodeInfo EmailAddressAuthenticationCodeInfo} </p>
         */
        public SendEmailAddressVerificationCode() {
        }

        /**
         * Creates a function, which sends a code to verify an email address to be added to a user's Telegram Passport.
         *
         * <p> Returns {@link EmailAddressAuthenticationCodeInfo EmailAddressAuthenticationCodeInfo} </p>
         *
         * @param emailAddress Email address.
         */
        public SendEmailAddressVerificationCode(String emailAddress) {
            this.emailAddress = emailAddress;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -221621379;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends a gift to another user or channel chat. May return an error with a message &quot;STARGIFT_USAGE_LIMITED&quot; if the gift was sold out.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SendGift extends Function<Ok> {
        /**
         * Identifier of the gift to send.
         */
        public long giftId;
        /**
         * Identifier of the user or the channel chat that will receive the gift; limited gifts can't be sent to channel chats.
         */
        public MessageSender ownerId;
        /**
         * Text to show along with the gift; 0-getOption(&quot;gift_text_length_max&quot;) characters. Only Bold, Italic, Underline, Strikethrough, Spoiler, CustomEmoji, and DateTime entities are allowed. Must be empty if the receiver enabled paid messages.
         */
        public FormattedText text;
        /**
         * Pass true to show gift text and sender only to the gift receiver; otherwise, everyone will be able to see them.
         */
        public boolean isPrivate;
        /**
         * Pass true to additionally pay for the gift upgrade and allow the receiver to upgrade it for free.
         */
        public boolean payForUpgrade;

        /**
         * Default constructor for a function, which sends a gift to another user or channel chat. May return an error with a message &quot;STARGIFT_USAGE_LIMITED&quot; if the gift was sold out.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SendGift() {
        }

        /**
         * Creates a function, which sends a gift to another user or channel chat. May return an error with a message &quot;STARGIFT_USAGE_LIMITED&quot; if the gift was sold out.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param giftId Identifier of the gift to send.
         * @param ownerId Identifier of the user or the channel chat that will receive the gift; limited gifts can't be sent to channel chats.
         * @param text Text to show along with the gift; 0-getOption(&quot;gift_text_length_max&quot;) characters. Only Bold, Italic, Underline, Strikethrough, Spoiler, CustomEmoji, and DateTime entities are allowed. Must be empty if the receiver enabled paid messages.
         * @param isPrivate Pass true to show gift text and sender only to the gift receiver; otherwise, everyone will be able to see them.
         * @param payForUpgrade Pass true to additionally pay for the gift upgrade and allow the receiver to upgrade it for free.
         */
        public SendGift(long giftId, MessageSender ownerId, FormattedText text, boolean isPrivate, boolean payForUpgrade) {
            this.giftId = giftId;
            this.ownerId = ownerId;
            this.text = text;
            this.isPrivate = isPrivate;
            this.payForUpgrade = payForUpgrade;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1199356118;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends an offer to purchase an upgraded gift.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SendGiftPurchaseOffer extends Function<Ok> {
        /**
         * Identifier of the user or the channel chat that currently owns the gift and will receive the offer.
         */
        public MessageSender ownerId;
        /**
         * Name of the upgraded gift.
         */
        public String giftName;
        /**
         * The price that the user agreed to pay for the gift.
         */
        public GiftResalePrice price;
        /**
         * Duration of the offer, in seconds; must be one of 21600, 43200, 86400, 129600, 172800, or 259200. Can also be 120 if Telegram test environment is used.
         */
        public int duration;
        /**
         * The number of Telegram Stars the user agreed to pay additionally for sending of the offer message to the current gift owner; pass userFullInfo.outgoingPaidMessageStarCount for users and 0 otherwise.
         */
        public long paidMessageStarCount;

        /**
         * Default constructor for a function, which sends an offer to purchase an upgraded gift.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SendGiftPurchaseOffer() {
        }

        /**
         * Creates a function, which sends an offer to purchase an upgraded gift.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param ownerId Identifier of the user or the channel chat that currently owns the gift and will receive the offer.
         * @param giftName Name of the upgraded gift.
         * @param price The price that the user agreed to pay for the gift.
         * @param duration Duration of the offer, in seconds; must be one of 21600, 43200, 86400, 129600, 172800, or 259200. Can also be 120 if Telegram test environment is used.
         * @param paidMessageStarCount The number of Telegram Stars the user agreed to pay additionally for sending of the offer message to the current gift owner; pass userFullInfo.outgoingPaidMessageStarCount for users and 0 otherwise.
         */
        public SendGiftPurchaseOffer(MessageSender ownerId, String giftName, GiftResalePrice price, int duration, long paidMessageStarCount) {
            this.ownerId = ownerId;
            this.giftName = giftName;
            this.price = price;
            this.duration = duration;
            this.paidMessageStarCount = paidMessageStarCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 917878931;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends a message to other participants of a group call. Requires groupCall.canSendMessages right.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SendGroupCallMessage extends Function<Ok> {
        /**
         * Group call identifier.
         */
        public int groupCallId;
        /**
         * Text of the message to send; 1-getOption(&quot;group_call_message_text_length_max&quot;) characters for non-live-stories; see updateGroupCallMessageLevels for live story restrictions, which depends on paidMessageStarCount. Can't contain line feeds for live stories. Can contain only Bold, Italic, Underline, Strikethrough, Spoiler, CustomEmoji, and DateTime entities for live stories.
         */
        public FormattedText text;
        /**
         * The number of Telegram Stars the user agreed to pay to send the message; for live stories only; 0-getOption(&quot;paid_group_call_message_star_count_max&quot;). Must be 0 for messages sent to live stories posted by the current user.
         */
        public long paidMessageStarCount;

        /**
         * Default constructor for a function, which sends a message to other participants of a group call. Requires groupCall.canSendMessages right.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SendGroupCallMessage() {
        }

        /**
         * Creates a function, which sends a message to other participants of a group call. Requires groupCall.canSendMessages right.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier.
         * @param text Text of the message to send; 1-getOption(&quot;group_call_message_text_length_max&quot;) characters for non-live-stories; see updateGroupCallMessageLevels for live story restrictions, which depends on paidMessageStarCount. Can't contain line feeds for live stories. Can contain only Bold, Italic, Underline, Strikethrough, Spoiler, CustomEmoji, and DateTime entities for live stories.
         * @param paidMessageStarCount The number of Telegram Stars the user agreed to pay to send the message; for live stories only; 0-getOption(&quot;paid_group_call_message_star_count_max&quot;). Must be 0 for messages sent to live stories posted by the current user.
         */
        public SendGroupCallMessage(int groupCallId, FormattedText text, long paidMessageStarCount) {
            this.groupCallId = groupCallId;
            this.text = text;
            this.paidMessageStarCount = paidMessageStarCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2133590097;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends the result of an inline query as a message. Returns the sent message. Always clears a chat draft message.
     *
     * <p> Returns {@link Message Message} </p>
     */
    public static class SendInlineQueryResultMessage extends Function<Message> {
        /**
         * Target chat.
         */
        public long chatId;
        /**
         * Topic in which the message will be sent; pass null if none.
         */
        public MessageTopic topicId;
        /**
         * Information about the message or story to be replied; pass null if none.
         */
        public InputMessageReplyTo replyTo;
        /**
         * Options to be used to send the message; pass null to use default options.
         */
        public MessageSendOptions options;
        /**
         * Identifier of the inline query.
         */
        public long queryId;
        /**
         * Identifier of the inline query result.
         */
        public String resultId;
        /**
         * Pass true to hide the bot, via which the message is sent. Can be used only for bots getOption(&quot;animation_search_bot_username&quot;), getOption(&quot;photo_search_bot_username&quot;), and getOption(&quot;venue_search_bot_username&quot;).
         */
        public boolean hideViaBot;

        /**
         * Default constructor for a function, which sends the result of an inline query as a message. Returns the sent message. Always clears a chat draft message.
         *
         * <p> Returns {@link Message Message} </p>
         */
        public SendInlineQueryResultMessage() {
        }

        /**
         * Creates a function, which sends the result of an inline query as a message. Returns the sent message. Always clears a chat draft message.
         *
         * <p> Returns {@link Message Message} </p>
         *
         * @param chatId Target chat.
         * @param topicId Topic in which the message will be sent; pass null if none.
         * @param replyTo Information about the message or story to be replied; pass null if none.
         * @param options Options to be used to send the message; pass null to use default options.
         * @param queryId Identifier of the inline query.
         * @param resultId Identifier of the inline query result.
         * @param hideViaBot Pass true to hide the bot, via which the message is sent. Can be used only for bots getOption(&quot;animation_search_bot_username&quot;), getOption(&quot;photo_search_bot_username&quot;), and getOption(&quot;venue_search_bot_username&quot;).
         */
        public SendInlineQueryResultMessage(long chatId, MessageTopic topicId, InputMessageReplyTo replyTo, MessageSendOptions options, long queryId, String resultId, boolean hideViaBot) {
            this.chatId = chatId;
            this.topicId = topicId;
            this.replyTo = replyTo;
            this.options = options;
            this.queryId = queryId;
            this.resultId = resultId;
            this.hideViaBot = hideViaBot;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1445935970;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends a message. Returns the sent message.
     *
     * <p> Returns {@link Message Message} </p>
     */
    public static class SendMessage extends Function<Message> {
        /**
         * Target chat.
         */
        public long chatId;
        /**
         * Topic in which the message will be sent; pass null if none.
         */
        public MessageTopic topicId;
        /**
         * Information about the message or story to be replied; pass null if none.
         */
        public InputMessageReplyTo replyTo;
        /**
         * Options to be used to send the message; pass null to use default options.
         */
        public MessageSendOptions options;
        /**
         * Markup for replying to the message; pass null if none; for bots only.
         */
        public ReplyMarkup replyMarkup;
        /**
         * The content of the message to be sent.
         */
        public InputMessageContent inputMessageContent;

        /**
         * Default constructor for a function, which sends a message. Returns the sent message.
         *
         * <p> Returns {@link Message Message} </p>
         */
        public SendMessage() {
        }

        /**
         * Creates a function, which sends a message. Returns the sent message.
         *
         * <p> Returns {@link Message Message} </p>
         *
         * @param chatId Target chat.
         * @param topicId Topic in which the message will be sent; pass null if none.
         * @param replyTo Information about the message or story to be replied; pass null if none.
         * @param options Options to be used to send the message; pass null to use default options.
         * @param replyMarkup Markup for replying to the message; pass null if none; for bots only.
         * @param inputMessageContent The content of the message to be sent.
         */
        public SendMessage(long chatId, MessageTopic topicId, InputMessageReplyTo replyTo, MessageSendOptions options, ReplyMarkup replyMarkup, InputMessageContent inputMessageContent) {
            this.chatId = chatId;
            this.topicId = topicId;
            this.replyTo = replyTo;
            this.options = options;
            this.replyMarkup = replyMarkup;
            this.inputMessageContent = inputMessageContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 964116012;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends 2-10 messages grouped together into an album. Currently, only audio, document, photo and video messages can be grouped into an album. Documents and audio files can be only grouped in an album with messages of the same type. Returns sent messages.
     *
     * <p> Returns {@link Messages Messages} </p>
     */
    public static class SendMessageAlbum extends Function<Messages> {
        /**
         * Target chat.
         */
        public long chatId;
        /**
         * Topic in which the messages will be sent; pass null if none.
         */
        public MessageTopic topicId;
        /**
         * Information about the message or story to be replied; pass null if none.
         */
        public InputMessageReplyTo replyTo;
        /**
         * Options to be used to send the messages; pass null to use default options.
         */
        public MessageSendOptions options;
        /**
         * Contents of messages to be sent. At most 10 messages can be added to an album. All messages must have the same value of showCaptionAboveMedia.
         */
        public InputMessageContent[] inputMessageContents;

        /**
         * Default constructor for a function, which sends 2-10 messages grouped together into an album. Currently, only audio, document, photo and video messages can be grouped into an album. Documents and audio files can be only grouped in an album with messages of the same type. Returns sent messages.
         *
         * <p> Returns {@link Messages Messages} </p>
         */
        public SendMessageAlbum() {
        }

        /**
         * Creates a function, which sends 2-10 messages grouped together into an album. Currently, only audio, document, photo and video messages can be grouped into an album. Documents and audio files can be only grouped in an album with messages of the same type. Returns sent messages.
         *
         * <p> Returns {@link Messages Messages} </p>
         *
         * @param chatId Target chat.
         * @param topicId Topic in which the messages will be sent; pass null if none.
         * @param replyTo Information about the message or story to be replied; pass null if none.
         * @param options Options to be used to send the messages; pass null to use default options.
         * @param inputMessageContents Contents of messages to be sent. At most 10 messages can be added to an album. All messages must have the same value of showCaptionAboveMedia.
         */
        public SendMessageAlbum(long chatId, MessageTopic topicId, InputMessageReplyTo replyTo, MessageSendOptions options, InputMessageContent[] inputMessageContents) {
            this.chatId = chatId;
            this.topicId = topicId;
            this.replyTo = replyTo;
            this.options = options;
            this.inputMessageContents = inputMessageContents;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1488607732;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs TDLib about details of a message view by the user from a chat, a message thread or a forum topic history. The method must be called if the message wasn't seen for more than 300 milliseconds, the viewport was destroyed, or the total view duration exceeded 5 minutes.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SendMessageViewMetrics extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The identifier of the message being viewed.
         */
        public long messageId;
        /**
         * The amount of time the message was seen by at least 1 pixel; in milliseconds.
         */
        public int timeInViewMs;
        /**
         * The amount of time the message was seen by at least 1 pixel within 15 seconds after any action from the user; in milliseconds.
         */
        public int activeTimeInViewMs;
        /**
         * The ratio of the post height to the viewport height in 1/1000 fractions.
         */
        public int heightToViewportRatioPerMille;
        /**
         * The ratio of the viewed post height to the full post height in 1/1000 fractions; 0-1000.
         */
        public int seenRangeRatioPerMille;

        /**
         * Default constructor for a function, which informs TDLib about details of a message view by the user from a chat, a message thread or a forum topic history. The method must be called if the message wasn't seen for more than 300 milliseconds, the viewport was destroyed, or the total view duration exceeded 5 minutes.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SendMessageViewMetrics() {
        }

        /**
         * Creates a function, which informs TDLib about details of a message view by the user from a chat, a message thread or a forum topic history. The method must be called if the message wasn't seen for more than 300 milliseconds, the viewport was destroyed, or the total view duration exceeded 5 minutes.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param messageId The identifier of the message being viewed.
         * @param timeInViewMs The amount of time the message was seen by at least 1 pixel; in milliseconds.
         * @param activeTimeInViewMs The amount of time the message was seen by at least 1 pixel within 15 seconds after any action from the user; in milliseconds.
         * @param heightToViewportRatioPerMille The ratio of the post height to the viewport height in 1/1000 fractions.
         * @param seenRangeRatioPerMille The ratio of the viewed post height to the full post height in 1/1000 fractions; 0-1000.
         */
        public SendMessageViewMetrics(long chatId, long messageId, int timeInViewMs, int activeTimeInViewMs, int heightToViewportRatioPerMille, int seenRangeRatioPerMille) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.timeInViewMs = timeInViewMs;
            this.activeTimeInViewMs = activeTimeInViewMs;
            this.heightToViewportRatioPerMille = heightToViewportRatioPerMille;
            this.seenRangeRatioPerMille = seenRangeRatioPerMille;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 698012087;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends a Telegram Passport authorization form, effectively sharing data with the service. This method must be called after getPassportAuthorizationFormAvailableElements if some previously available elements are going to be reused.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SendPassportAuthorizationForm extends Function<Ok> {
        /**
         * Authorization form identifier.
         */
        public int authorizationFormId;
        /**
         * Types of Telegram Passport elements chosen by user to complete the authorization form.
         */
        public PassportElementType[] types;

        /**
         * Default constructor for a function, which sends a Telegram Passport authorization form, effectively sharing data with the service. This method must be called after getPassportAuthorizationFormAvailableElements if some previously available elements are going to be reused.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SendPassportAuthorizationForm() {
        }

        /**
         * Creates a function, which sends a Telegram Passport authorization form, effectively sharing data with the service. This method must be called after getPassportAuthorizationFormAvailableElements if some previously available elements are going to be reused.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param authorizationFormId Authorization form identifier.
         * @param types Types of Telegram Passport elements chosen by user to complete the authorization form.
         */
        public SendPassportAuthorizationForm(int authorizationFormId, PassportElementType[] types) {
            this.authorizationFormId = authorizationFormId;
            this.types = types;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 652160701;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends a filled-out payment form to the bot for final verification.
     *
     * <p> Returns {@link PaymentResult PaymentResult} </p>
     */
    public static class SendPaymentForm extends Function<PaymentResult> {
        /**
         * The invoice.
         */
        public InputInvoice inputInvoice;
        /**
         * Payment form identifier returned by getPaymentForm.
         */
        public long paymentFormId;
        /**
         * Identifier returned by validateOrderInfo, or an empty string.
         */
        public String orderInfoId;
        /**
         * Identifier of a chosen shipping option, if applicable.
         */
        public String shippingOptionId;
        /**
         * The credentials chosen by user for payment; pass null for a payment in Telegram Stars.
         */
        public InputCredentials credentials;
        /**
         * Chosen by the user amount of tip in the smallest units of the currency.
         */
        public long tipAmount;

        /**
         * Default constructor for a function, which sends a filled-out payment form to the bot for final verification.
         *
         * <p> Returns {@link PaymentResult PaymentResult} </p>
         */
        public SendPaymentForm() {
        }

        /**
         * Creates a function, which sends a filled-out payment form to the bot for final verification.
         *
         * <p> Returns {@link PaymentResult PaymentResult} </p>
         *
         * @param inputInvoice The invoice.
         * @param paymentFormId Payment form identifier returned by getPaymentForm.
         * @param orderInfoId Identifier returned by validateOrderInfo, or an empty string.
         * @param shippingOptionId Identifier of a chosen shipping option, if applicable.
         * @param credentials The credentials chosen by user for payment; pass null for a payment in Telegram Stars.
         * @param tipAmount Chosen by the user amount of tip in the smallest units of the currency.
         */
        public SendPaymentForm(InputInvoice inputInvoice, long paymentFormId, String orderInfoId, String shippingOptionId, InputCredentials credentials, long tipAmount) {
            this.inputInvoice = inputInvoice;
            this.paymentFormId = paymentFormId;
            this.orderInfoId = orderInfoId;
            this.shippingOptionId = shippingOptionId;
            this.credentials = credentials;
            this.tipAmount = tipAmount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -965855094;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends a code to the specified phone number. Aborts previous phone number verification if there was one. On success, returns information about the sent code.
     *
     * <p> Returns {@link AuthenticationCodeInfo AuthenticationCodeInfo} </p>
     */
    public static class SendPhoneNumberCode extends Function<AuthenticationCodeInfo> {
        /**
         * The phone number, in international format.
         */
        public String phoneNumber;
        /**
         * Settings for the authentication of the user's phone number; pass null to use default settings.
         */
        public PhoneNumberAuthenticationSettings settings;
        /**
         * Type of the request for which the code is sent.
         */
        public PhoneNumberCodeType type;

        /**
         * Default constructor for a function, which sends a code to the specified phone number. Aborts previous phone number verification if there was one. On success, returns information about the sent code.
         *
         * <p> Returns {@link AuthenticationCodeInfo AuthenticationCodeInfo} </p>
         */
        public SendPhoneNumberCode() {
        }

        /**
         * Creates a function, which sends a code to the specified phone number. Aborts previous phone number verification if there was one. On success, returns information about the sent code.
         *
         * <p> Returns {@link AuthenticationCodeInfo AuthenticationCodeInfo} </p>
         *
         * @param phoneNumber The phone number, in international format.
         * @param settings Settings for the authentication of the user's phone number; pass null to use default settings.
         * @param type Type of the request for which the code is sent.
         */
        public SendPhoneNumberCode(String phoneNumber, PhoneNumberAuthenticationSettings settings, PhoneNumberCodeType type) {
            this.phoneNumber = phoneNumber;
            this.settings = settings;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1084112144;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends Firebase Authentication SMS to the specified phone number. Works only when received a code of the type authenticationCodeTypeFirebaseAndroid or authenticationCodeTypeFirebaseIos.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SendPhoneNumberFirebaseSms extends Function<Ok> {
        /**
         * Play Integrity API or SafetyNet Attestation API token for the Android application, or secret from push notification for the iOS application.
         */
        public String token;

        /**
         * Default constructor for a function, which sends Firebase Authentication SMS to the specified phone number. Works only when received a code of the type authenticationCodeTypeFirebaseAndroid or authenticationCodeTypeFirebaseIos.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SendPhoneNumberFirebaseSms() {
        }

        /**
         * Creates a function, which sends Firebase Authentication SMS to the specified phone number. Works only when received a code of the type authenticationCodeTypeFirebaseAndroid or authenticationCodeTypeFirebaseIos.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param token Play Integrity API or SafetyNet Attestation API token for the Android application, or secret from push notification for the iOS application.
         */
        public SendPhoneNumberFirebaseSms(String token) {
            this.token = token;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 261910660;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends messages from a quick reply shortcut. Requires Telegram Business subscription. Can't be used to send paid messages.
     *
     * <p> Returns {@link Messages Messages} </p>
     */
    public static class SendQuickReplyShortcutMessages extends Function<Messages> {
        /**
         * Identifier of the chat to which to send messages. The chat must be a private chat with a regular user.
         */
        public long chatId;
        /**
         * Unique identifier of the quick reply shortcut.
         */
        public int shortcutId;
        /**
         * Non-persistent identifier, which will be returned back in messageSendingStatePending object and can be used to match sent messages and corresponding updateNewMessage updates.
         */
        public int sendingId;

        /**
         * Default constructor for a function, which sends messages from a quick reply shortcut. Requires Telegram Business subscription. Can't be used to send paid messages.
         *
         * <p> Returns {@link Messages Messages} </p>
         */
        public SendQuickReplyShortcutMessages() {
        }

        /**
         * Creates a function, which sends messages from a quick reply shortcut. Requires Telegram Business subscription. Can't be used to send paid messages.
         *
         * <p> Returns {@link Messages Messages} </p>
         *
         * @param chatId Identifier of the chat to which to send messages. The chat must be a private chat with a regular user.
         * @param shortcutId Unique identifier of the quick reply shortcut.
         * @param sendingId Non-persistent identifier, which will be returned back in messageSendingStatePending object and can be used to match sent messages and corresponding updateNewMessage updates.
         */
        public SendQuickReplyShortcutMessages(long chatId, int shortcutId, int sendingId) {
            this.chatId = chatId;
            this.shortcutId = shortcutId;
            this.sendingId = sendingId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 232068765;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends an upgraded gift that is available for resale to another user or channel chat; gifts already owned by the current user must be transferred using transferGift and can't be passed to the method.
     *
     * <p> Returns {@link GiftResaleResult GiftResaleResult} </p>
     */
    public static class SendResoldGift extends Function<GiftResaleResult> {
        /**
         * Name of the upgraded gift to send.
         */
        public String giftName;
        /**
         * Identifier of the user or the channel chat that will receive the gift.
         */
        public MessageSender ownerId;
        /**
         * The price that the user agreed to pay for the gift.
         */
        public GiftResalePrice price;

        /**
         * Default constructor for a function, which sends an upgraded gift that is available for resale to another user or channel chat; gifts already owned by the current user must be transferred using transferGift and can't be passed to the method.
         *
         * <p> Returns {@link GiftResaleResult GiftResaleResult} </p>
         */
        public SendResoldGift() {
        }

        /**
         * Creates a function, which sends an upgraded gift that is available for resale to another user or channel chat; gifts already owned by the current user must be transferred using transferGift and can't be passed to the method.
         *
         * <p> Returns {@link GiftResaleResult GiftResaleResult} </p>
         *
         * @param giftName Name of the upgraded gift to send.
         * @param ownerId Identifier of the user or the channel chat that will receive the gift.
         * @param price The price that the user agreed to pay for the gift.
         */
        public SendResoldGift(String giftName, MessageSender ownerId, GiftResalePrice price) {
            this.giftName = giftName;
            this.ownerId = ownerId;
            this.price = price;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1427446834;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends a draft for a being generated text message; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SendTextMessageDraft extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The forum topic identifier in which the message will be sent; pass 0 if none.
         */
        public int forumTopicId;
        /**
         * Unique identifier of the draft.
         */
        public long draftId;
        /**
         * Draft text of the message; pass null to show a &quot;Thinking...&quot; placeholder.
         */
        public FormattedText text;

        /**
         * Default constructor for a function, which sends a draft for a being generated text message; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SendTextMessageDraft() {
        }

        /**
         * Creates a function, which sends a draft for a being generated text message; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param forumTopicId The forum topic identifier in which the message will be sent; pass 0 if none.
         * @param draftId Unique identifier of the draft.
         * @param text Draft text of the message; pass null to show a &quot;Thinking...&quot; placeholder.
         */
        public SendTextMessageDraft(long chatId, int forumTopicId, long draftId, FormattedText text) {
            this.chatId = chatId;
            this.forumTopicId = forumTopicId;
            this.draftId = draftId;
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2121571326;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends a custom request from a Web App.
     *
     * <p> Returns {@link CustomRequestResult CustomRequestResult} </p>
     */
    public static class SendWebAppCustomRequest extends Function<CustomRequestResult> {
        /**
         * Identifier of the bot.
         */
        public long botUserId;
        /**
         * The method name.
         */
        public String method;
        /**
         * JSON-serialized method parameters.
         */
        public String parameters;

        /**
         * Default constructor for a function, which sends a custom request from a Web App.
         *
         * <p> Returns {@link CustomRequestResult CustomRequestResult} </p>
         */
        public SendWebAppCustomRequest() {
        }

        /**
         * Creates a function, which sends a custom request from a Web App.
         *
         * <p> Returns {@link CustomRequestResult CustomRequestResult} </p>
         *
         * @param botUserId Identifier of the bot.
         * @param method The method name.
         * @param parameters JSON-serialized method parameters.
         */
        public SendWebAppCustomRequest(long botUserId, String method, String parameters) {
            this.botUserId = botUserId;
            this.method = method;
            this.parameters = parameters;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 922705352;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends data received from a keyboardButtonTypeWebApp Web App to a bot.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SendWebAppData extends Function<Ok> {
        /**
         * Identifier of the target bot.
         */
        public long botUserId;
        /**
         * Text of the keyboardButtonTypeWebApp button, which opened the Web App.
         */
        public String buttonText;
        /**
         * The data.
         */
        public String data;

        /**
         * Default constructor for a function, which sends data received from a keyboardButtonTypeWebApp Web App to a bot.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SendWebAppData() {
        }

        /**
         * Creates a function, which sends data received from a keyboardButtonTypeWebApp Web App to a bot.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param botUserId Identifier of the target bot.
         * @param buttonText Text of the keyboardButtonTypeWebApp button, which opened the Web App.
         * @param data The data.
         */
        public SendWebAppData(long botUserId, String buttonText, String data) {
            this.botUserId = botUserId;
            this.buttonText = buttonText;
            this.data = data;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1423978996;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes accent color and background custom emoji for the current user; for Telegram Premium users only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetAccentColor extends Function<Ok> {
        /**
         * Identifier of the accent color to use.
         */
        public int accentColorId;
        /**
         * Identifier of a custom emoji to be shown on the reply header and link preview background; 0 if none.
         */
        public long backgroundCustomEmojiId;

        /**
         * Default constructor for a function, which changes accent color and background custom emoji for the current user; for Telegram Premium users only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetAccentColor() {
        }

        /**
         * Creates a function, which changes accent color and background custom emoji for the current user; for Telegram Premium users only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param accentColorId Identifier of the accent color to use.
         * @param backgroundCustomEmojiId Identifier of a custom emoji to be shown on the reply header and link preview background; 0 if none.
         */
        public SetAccentColor(int accentColorId, long backgroundCustomEmojiId) {
            this.accentColorId = accentColorId;
            this.backgroundCustomEmojiId = backgroundCustomEmojiId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1669974841;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the period of inactivity after which the account of the current user will automatically be deleted.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetAccountTtl extends Function<Ok> {
        /**
         * New account TTL.
         */
        public AccountTtl ttl;

        /**
         * Default constructor for a function, which changes the period of inactivity after which the account of the current user will automatically be deleted.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetAccountTtl() {
        }

        /**
         * Creates a function, which changes the period of inactivity after which the account of the current user will automatically be deleted.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param ttl New account TTL.
         */
        public SetAccountTtl(AccountTtl ttl) {
            this.ttl = ttl;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 701389032;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Succeeds after a specified amount of time has passed. Can be called before initialization.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetAlarm extends Function<Ok> {
        /**
         * Number of seconds before the function returns.
         */
        public double seconds;

        /**
         * Default constructor for a function, which succeeds after a specified amount of time has passed. Can be called before initialization.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetAlarm() {
        }

        /**
         * Creates a function, which succeeds after a specified amount of time has passed. Can be called before initialization.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param seconds Number of seconds before the function returns.
         */
        public SetAlarm(double seconds) {
            this.seconds = seconds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -873497067;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs TDLib that application or reCAPTCHA verification has been completed. Can be called before authorization.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetApplicationVerificationToken extends Function<Ok> {
        /**
         * Unique identifier for the verification process as received from updateApplicationVerificationRequired or updateApplicationRecaptchaVerificationRequired.
         */
        public long verificationId;
        /**
         * Play Integrity API token for the Android application, or secret from push notification for the iOS application for application verification, or reCAPTCHA token for reCAPTCHA verifications; pass an empty string to abort verification and receive the error &quot;VERIFICATION_FAILED&quot; for the request.
         */
        public String token;

        /**
         * Default constructor for a function, which informs TDLib that application or reCAPTCHA verification has been completed. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetApplicationVerificationToken() {
        }

        /**
         * Creates a function, which informs TDLib that application or reCAPTCHA verification has been completed. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param verificationId Unique identifier for the verification process as received from updateApplicationVerificationRequired or updateApplicationRecaptchaVerificationRequired.
         * @param token Play Integrity API token for the Android application, or secret from push notification for the iOS application for application verification, or reCAPTCHA token for reCAPTCHA verifications; pass an empty string to abort verification and receive the error &quot;VERIFICATION_FAILED&quot; for the request.
         */
        public SetApplicationVerificationToken(long verificationId, String token) {
            this.verificationId = verificationId;
            this.token = token;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 927248261;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes settings for automatic moving of chats to and from the Archive chat lists.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetArchiveChatListSettings extends Function<Ok> {
        /**
         * New settings.
         */
        public ArchiveChatListSettings settings;

        /**
         * Default constructor for a function, which changes settings for automatic moving of chats to and from the Archive chat lists.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetArchiveChatListSettings() {
        }

        /**
         * Creates a function, which changes settings for automatic moving of chats to and from the Archive chat lists.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param settings New settings.
         */
        public SetArchiveChatListSettings(ArchiveChatListSettings settings) {
            this.settings = settings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -884650998;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets the email address of the user and sends an authentication code to the email address. Works only when the current authorization state is authorizationStateWaitEmailAddress.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetAuthenticationEmailAddress extends Function<Ok> {
        /**
         * The email address of the user.
         */
        public String emailAddress;

        /**
         * Default constructor for a function, which sets the email address of the user and sends an authentication code to the email address. Works only when the current authorization state is authorizationStateWaitEmailAddress.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetAuthenticationEmailAddress() {
        }

        /**
         * Creates a function, which sets the email address of the user and sends an authentication code to the email address. Works only when the current authorization state is authorizationStateWaitEmailAddress.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param emailAddress The email address of the user.
         */
        public SetAuthenticationEmailAddress(String emailAddress) {
            this.emailAddress = emailAddress;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1773323522;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets the phone number of the user and sends an authentication code to the user. Works only when the current authorization state is authorizationStateWaitPhoneNumber, or if there is no pending authentication query and the current authorization state is authorizationStateWaitPremiumPurchase, authorizationStateWaitEmailAddress, authorizationStateWaitEmailCode, authorizationStateWaitCode, authorizationStateWaitRegistration, or authorizationStateWaitPassword.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetAuthenticationPhoneNumber extends Function<Ok> {
        /**
         * The phone number of the user, in international format.
         */
        public String phoneNumber;
        /**
         * Settings for the authentication of the user's phone number; pass null to use default settings.
         */
        public PhoneNumberAuthenticationSettings settings;

        /**
         * Default constructor for a function, which sets the phone number of the user and sends an authentication code to the user. Works only when the current authorization state is authorizationStateWaitPhoneNumber, or if there is no pending authentication query and the current authorization state is authorizationStateWaitPremiumPurchase, authorizationStateWaitEmailAddress, authorizationStateWaitEmailCode, authorizationStateWaitCode, authorizationStateWaitRegistration, or authorizationStateWaitPassword.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetAuthenticationPhoneNumber() {
        }

        /**
         * Creates a function, which sets the phone number of the user and sends an authentication code to the user. Works only when the current authorization state is authorizationStateWaitPhoneNumber, or if there is no pending authentication query and the current authorization state is authorizationStateWaitPremiumPurchase, authorizationStateWaitEmailAddress, authorizationStateWaitEmailCode, authorizationStateWaitCode, authorizationStateWaitRegistration, or authorizationStateWaitPassword.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param phoneNumber The phone number of the user, in international format.
         * @param settings Settings for the authentication of the user's phone number; pass null to use default settings.
         */
        public SetAuthenticationPhoneNumber(String phoneNumber, PhoneNumberAuthenticationSettings settings) {
            this.phoneNumber = phoneNumber;
            this.settings = settings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 868276259;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs server about an in-store purchase of Telegram Premium before authorization. Works only when the current authorization state is authorizationStateWaitPremiumPurchase.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetAuthenticationPremiumPurchaseTransaction extends Function<Ok> {
        /**
         * Information about the transaction.
         */
        public StoreTransaction transaction;
        /**
         * Pass true if this is a restore of a Telegram Premium purchase; only for App Store.
         */
        public boolean isRestore;
        /**
         * The number of days for which the Telegram Premium subscription will be granted.
         */
        public int premiumDayCount;
        /**
         * ISO 4217 currency code of the payment currency.
         */
        public String currency;
        /**
         * Paid amount, in the smallest units of the currency.
         */
        public long amount;

        /**
         * Default constructor for a function, which informs server about an in-store purchase of Telegram Premium before authorization. Works only when the current authorization state is authorizationStateWaitPremiumPurchase.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetAuthenticationPremiumPurchaseTransaction() {
        }

        /**
         * Creates a function, which informs server about an in-store purchase of Telegram Premium before authorization. Works only when the current authorization state is authorizationStateWaitPremiumPurchase.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param transaction Information about the transaction.
         * @param isRestore Pass true if this is a restore of a Telegram Premium purchase; only for App Store.
         * @param premiumDayCount The number of days for which the Telegram Premium subscription will be granted.
         * @param currency ISO 4217 currency code of the payment currency.
         * @param amount Paid amount, in the smallest units of the currency.
         */
        public SetAuthenticationPremiumPurchaseTransaction(StoreTransaction transaction, boolean isRestore, int premiumDayCount, String currency, long amount) {
            this.transaction = transaction;
            this.isRestore = isRestore;
            this.premiumDayCount = premiumDayCount;
            this.currency = currency;
            this.amount = amount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2014147806;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets auto-download settings.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetAutoDownloadSettings extends Function<Ok> {
        /**
         * New user auto-download settings.
         */
        public AutoDownloadSettings settings;
        /**
         * Type of the network for which the new settings are relevant.
         */
        public NetworkType type;

        /**
         * Default constructor for a function, which sets auto-download settings.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetAutoDownloadSettings() {
        }

        /**
         * Creates a function, which sets auto-download settings.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param settings New user auto-download settings.
         * @param type Type of the network for which the new settings are relevant.
         */
        public SetAutoDownloadSettings(AutoDownloadSettings settings, NetworkType type) {
            this.settings = settings;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -353671948;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets autosave settings for the given scope. The method is guaranteed to work only after at least one call to getAutosaveSettings.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetAutosaveSettings extends Function<Ok> {
        /**
         * Autosave settings scope.
         */
        public AutosaveSettingsScope scope;
        /**
         * New autosave settings for the scope; pass null to set autosave settings to default.
         */
        public ScopeAutosaveSettings settings;

        /**
         * Default constructor for a function, which sets autosave settings for the given scope. The method is guaranteed to work only after at least one call to getAutosaveSettings.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetAutosaveSettings() {
        }

        /**
         * Creates a function, which sets autosave settings for the given scope. The method is guaranteed to work only after at least one call to getAutosaveSettings.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param scope Autosave settings scope.
         * @param settings New autosave settings for the scope; pass null to set autosave settings to default.
         */
        public SetAutosaveSettings(AutosaveSettingsScope scope, ScopeAutosaveSettings settings) {
            this.scope = scope;
            this.settings = settings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 6846656;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the bio of the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetBio extends Function<Ok> {
        /**
         * The new value of the user bio; 0-getOption(&quot;bio_length_max&quot;) characters without line feeds.
         */
        public String bio;

        /**
         * Default constructor for a function, which changes the bio of the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetBio() {
        }

        /**
         * Creates a function, which changes the bio of the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param bio The new value of the user bio; 0-getOption(&quot;bio_length_max&quot;) characters without line feeds.
         */
        public SetBio(String bio) {
            this.bio = bio;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1619582124;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the birthdate of the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetBirthdate extends Function<Ok> {
        /**
         * The new value of the current user's birthdate; pass null to remove the birthdate.
         */
        public Birthdate birthdate;

        /**
         * Default constructor for a function, which changes the birthdate of the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetBirthdate() {
        }

        /**
         * Creates a function, which changes the birthdate of the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param birthdate The new value of the current user's birthdate; pass null to remove the birthdate.
         */
        public SetBirthdate(Birthdate birthdate) {
            this.birthdate = birthdate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1319755160;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets the text shown in the chat with a bot if the chat is empty. Can be called only if userTypeBot.canBeEdited == true.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetBotInfoDescription extends Function<Ok> {
        /**
         * Identifier of the target bot.
         */
        public long botUserId;
        /**
         * A two-letter ISO 639-1 language code. If empty, the description will be shown to all users for whose languages there is no dedicated description.
         */
        public String languageCode;
        /**
         * New bot's description on the specified language.
         */
        public String description;

        /**
         * Default constructor for a function, which sets the text shown in the chat with a bot if the chat is empty. Can be called only if userTypeBot.canBeEdited == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetBotInfoDescription() {
        }

        /**
         * Creates a function, which sets the text shown in the chat with a bot if the chat is empty. Can be called only if userTypeBot.canBeEdited == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param botUserId Identifier of the target bot.
         * @param languageCode A two-letter ISO 639-1 language code. If empty, the description will be shown to all users for whose languages there is no dedicated description.
         * @param description New bot's description on the specified language.
         */
        public SetBotInfoDescription(long botUserId, String languageCode, String description) {
            this.botUserId = botUserId;
            this.languageCode = languageCode;
            this.description = description;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 693574984;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets the text shown on a bot's profile page and sent together with the link when users share the bot. Can be called only if userTypeBot.canBeEdited == true.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetBotInfoShortDescription extends Function<Ok> {
        /**
         * Identifier of the target bot.
         */
        public long botUserId;
        /**
         * A two-letter ISO 639-1 language code. If empty, the short description will be shown to all users for whose languages there is no dedicated description.
         */
        public String languageCode;
        /**
         * New bot's short description on the specified language.
         */
        public String shortDescription;

        /**
         * Default constructor for a function, which sets the text shown on a bot's profile page and sent together with the link when users share the bot. Can be called only if userTypeBot.canBeEdited == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetBotInfoShortDescription() {
        }

        /**
         * Creates a function, which sets the text shown on a bot's profile page and sent together with the link when users share the bot. Can be called only if userTypeBot.canBeEdited == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param botUserId Identifier of the target bot.
         * @param languageCode A two-letter ISO 639-1 language code. If empty, the short description will be shown to all users for whose languages there is no dedicated description.
         * @param shortDescription New bot's short description on the specified language.
         */
        public SetBotInfoShortDescription(long botUserId, String languageCode, String shortDescription) {
            this.botUserId = botUserId;
            this.languageCode = languageCode;
            this.shortDescription = shortDescription;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 982956771;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets the name of a bot. Can be called only if userTypeBot.canBeEdited == true.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetBotName extends Function<Ok> {
        /**
         * Identifier of the target bot.
         */
        public long botUserId;
        /**
         * A two-letter ISO 639-1 language code. If empty, the name will be shown to all users for whose languages there is no dedicated name.
         */
        public String languageCode;
        /**
         * New bot's name on the specified language; 0-64 characters; must be non-empty if language code is empty.
         */
        public String name;

        /**
         * Default constructor for a function, which sets the name of a bot. Can be called only if userTypeBot.canBeEdited == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetBotName() {
        }

        /**
         * Creates a function, which sets the name of a bot. Can be called only if userTypeBot.canBeEdited == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param botUserId Identifier of the target bot.
         * @param languageCode A two-letter ISO 639-1 language code. If empty, the name will be shown to all users for whose languages there is no dedicated name.
         * @param name New bot's name on the specified language; 0-64 characters; must be non-empty if language code is empty.
         */
        public SetBotName(long botUserId, String languageCode, String name) {
            this.botUserId = botUserId;
            this.languageCode = languageCode;
            this.name = name;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -761922959;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes a profile photo for a bot.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetBotProfilePhoto extends Function<Ok> {
        /**
         * Identifier of the target bot.
         */
        public long botUserId;
        /**
         * Profile photo to set; pass null to delete the chat photo.
         */
        public InputChatPhoto photo;

        /**
         * Default constructor for a function, which changes a profile photo for a bot.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetBotProfilePhoto() {
        }

        /**
         * Creates a function, which changes a profile photo for a bot.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param botUserId Identifier of the target bot.
         * @param photo Profile photo to set; pass null to delete the chat photo.
         */
        public SetBotProfilePhoto(long botUserId, InputChatPhoto photo) {
            this.botUserId = botUserId;
            this.photo = photo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1115272346;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs the server about the number of pending bot updates if they haven't been processed for a long time; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetBotUpdatesStatus extends Function<Ok> {
        /**
         * The number of pending updates.
         */
        public int pendingUpdateCount;
        /**
         * The last error message.
         */
        public String errorMessage;

        /**
         * Default constructor for a function, which informs the server about the number of pending bot updates if they haven't been processed for a long time; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetBotUpdatesStatus() {
        }

        /**
         * Creates a function, which informs the server about the number of pending bot updates if they haven't been processed for a long time; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param pendingUpdateCount The number of pending updates.
         * @param errorMessage The last error message.
         */
        public SetBotUpdatesStatus(int pendingUpdateCount, String errorMessage) {
            this.pendingUpdateCount = pendingUpdateCount;
            this.errorMessage = errorMessage;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1154926191;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the bio of a business account; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetBusinessAccountBio extends Function<Ok> {
        /**
         * Unique identifier of business connection.
         */
        public String businessConnectionId;
        /**
         * The new value of the bio; 0-getOption(&quot;bio_length_max&quot;) characters without line feeds.
         */
        public String bio;

        /**
         * Default constructor for a function, which changes the bio of a business account; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetBusinessAccountBio() {
        }

        /**
         * Creates a function, which changes the bio of a business account; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param businessConnectionId Unique identifier of business connection.
         * @param bio The new value of the bio; 0-getOption(&quot;bio_length_max&quot;) characters without line feeds.
         */
        public SetBusinessAccountBio(String businessConnectionId, String bio) {
            this.businessConnectionId = businessConnectionId;
            this.bio = bio;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1698538041;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes settings for gift receiving of a business account; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetBusinessAccountGiftSettings extends Function<Ok> {
        /**
         * Unique identifier of business connection.
         */
        public String businessConnectionId;
        /**
         * The new settings.
         */
        public GiftSettings settings;

        /**
         * Default constructor for a function, which changes settings for gift receiving of a business account; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetBusinessAccountGiftSettings() {
        }

        /**
         * Creates a function, which changes settings for gift receiving of a business account; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param businessConnectionId Unique identifier of business connection.
         * @param settings The new settings.
         */
        public SetBusinessAccountGiftSettings(String businessConnectionId, GiftSettings settings) {
            this.businessConnectionId = businessConnectionId;
            this.settings = settings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1757763090;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the first and last name of a business account; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetBusinessAccountName extends Function<Ok> {
        /**
         * Unique identifier of business connection.
         */
        public String businessConnectionId;
        /**
         * The new value of the first name for the business account; 1-64 characters.
         */
        public String firstName;
        /**
         * The new value of the optional last name for the business account; 0-64 characters.
         */
        public String lastName;

        /**
         * Default constructor for a function, which changes the first and last name of a business account; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetBusinessAccountName() {
        }

        /**
         * Creates a function, which changes the first and last name of a business account; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param businessConnectionId Unique identifier of business connection.
         * @param firstName The new value of the first name for the business account; 1-64 characters.
         * @param lastName The new value of the optional last name for the business account; 0-64 characters.
         */
        public SetBusinessAccountName(String businessConnectionId, String firstName, String lastName) {
            this.businessConnectionId = businessConnectionId;
            this.firstName = firstName;
            this.lastName = lastName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 999582546;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes a profile photo of a business account; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetBusinessAccountProfilePhoto extends Function<Ok> {
        /**
         * Unique identifier of business connection.
         */
        public String businessConnectionId;
        /**
         * Profile photo to set; pass null to remove the photo.
         */
        public InputChatPhoto photo;
        /**
         * Pass true to set the public photo, which will be visible even if the main photo is hidden by privacy settings.
         */
        public boolean isPublic;

        /**
         * Default constructor for a function, which changes a profile photo of a business account; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetBusinessAccountProfilePhoto() {
        }

        /**
         * Creates a function, which changes a profile photo of a business account; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param businessConnectionId Unique identifier of business connection.
         * @param photo Profile photo to set; pass null to remove the photo.
         * @param isPublic Pass true to set the public photo, which will be visible even if the main photo is hidden by privacy settings.
         */
        public SetBusinessAccountProfilePhoto(String businessConnectionId, InputChatPhoto photo, boolean isPublic) {
            this.businessConnectionId = businessConnectionId;
            this.photo = photo;
            this.isPublic = isPublic;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1174440149;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the editable username of a business account; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetBusinessAccountUsername extends Function<Ok> {
        /**
         * Unique identifier of business connection.
         */
        public String businessConnectionId;
        /**
         * The new value of the username.
         */
        public String username;

        /**
         * Default constructor for a function, which changes the editable username of a business account; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetBusinessAccountUsername() {
        }

        /**
         * Creates a function, which changes the editable username of a business account; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param businessConnectionId Unique identifier of business connection.
         * @param username The new value of the username.
         */
        public SetBusinessAccountUsername(String businessConnectionId, String username) {
            this.businessConnectionId = businessConnectionId;
            this.username = username;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1520126367;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the business away message settings of the current user. Requires Telegram Business subscription.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetBusinessAwayMessageSettings extends Function<Ok> {
        /**
         * The new settings for the away message of the business; pass null to disable the away message.
         */
        public BusinessAwayMessageSettings awayMessageSettings;

        /**
         * Default constructor for a function, which changes the business away message settings of the current user. Requires Telegram Business subscription.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetBusinessAwayMessageSettings() {
        }

        /**
         * Creates a function, which changes the business away message settings of the current user. Requires Telegram Business subscription.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param awayMessageSettings The new settings for the away message of the business; pass null to disable the away message.
         */
        public SetBusinessAwayMessageSettings(BusinessAwayMessageSettings awayMessageSettings) {
            this.awayMessageSettings = awayMessageSettings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1232357484;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds or changes business bot that is connected to the current user account.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetBusinessConnectedBot extends Function<Ok> {
        /**
         * Connection settings for the bot.
         */
        public BusinessConnectedBot bot;

        /**
         * Default constructor for a function, which adds or changes business bot that is connected to the current user account.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetBusinessConnectedBot() {
        }

        /**
         * Creates a function, which adds or changes business bot that is connected to the current user account.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param bot Connection settings for the bot.
         */
        public SetBusinessConnectedBot(BusinessConnectedBot bot) {
            this.bot = bot;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1393459472;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the business greeting message settings of the current user. Requires Telegram Business subscription.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetBusinessGreetingMessageSettings extends Function<Ok> {
        /**
         * The new settings for the greeting message of the business; pass null to disable the greeting message.
         */
        public BusinessGreetingMessageSettings greetingMessageSettings;

        /**
         * Default constructor for a function, which changes the business greeting message settings of the current user. Requires Telegram Business subscription.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetBusinessGreetingMessageSettings() {
        }

        /**
         * Creates a function, which changes the business greeting message settings of the current user. Requires Telegram Business subscription.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param greetingMessageSettings The new settings for the greeting message of the business; pass null to disable the greeting message.
         */
        public SetBusinessGreetingMessageSettings(BusinessGreetingMessageSettings greetingMessageSettings) {
            this.greetingMessageSettings = greetingMessageSettings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -873120707;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the business location of the current user. Requires Telegram Business subscription.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetBusinessLocation extends Function<Ok> {
        /**
         * The new location of the business; pass null to remove the location.
         */
        public BusinessLocation location;

        /**
         * Default constructor for a function, which changes the business location of the current user. Requires Telegram Business subscription.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetBusinessLocation() {
        }

        /**
         * Creates a function, which changes the business location of the current user. Requires Telegram Business subscription.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param location The new location of the business; pass null to remove the location.
         */
        public SetBusinessLocation(BusinessLocation location) {
            this.location = location;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -344717547;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Pins or unpins a message sent on behalf of a business account; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetBusinessMessageIsPinned extends Function<Ok> {
        /**
         * Unique identifier of business connection on behalf of which the message was sent.
         */
        public String businessConnectionId;
        /**
         * The chat the message belongs to.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * Pass true to pin the message, pass false to unpin it.
         */
        public boolean isPinned;

        /**
         * Default constructor for a function, which pins or unpins a message sent on behalf of a business account; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetBusinessMessageIsPinned() {
        }

        /**
         * Creates a function, which pins or unpins a message sent on behalf of a business account; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param businessConnectionId Unique identifier of business connection on behalf of which the message was sent.
         * @param chatId The chat the message belongs to.
         * @param messageId Identifier of the message.
         * @param isPinned Pass true to pin the message, pass false to unpin it.
         */
        public SetBusinessMessageIsPinned(String businessConnectionId, long chatId, long messageId, boolean isPinned) {
            this.businessConnectionId = businessConnectionId;
            this.chatId = chatId;
            this.messageId = messageId;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -15403536;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the business opening hours of the current user. Requires Telegram Business subscription.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetBusinessOpeningHours extends Function<Ok> {
        /**
         * The new opening hours of the business; pass null to remove the opening hours; up to 28 time intervals can be specified.
         */
        public BusinessOpeningHours openingHours;

        /**
         * Default constructor for a function, which changes the business opening hours of the current user. Requires Telegram Business subscription.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetBusinessOpeningHours() {
        }

        /**
         * Creates a function, which changes the business opening hours of the current user. Requires Telegram Business subscription.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param openingHours The new opening hours of the business; pass null to remove the opening hours; up to 28 time intervals can be specified.
         */
        public SetBusinessOpeningHours(BusinessOpeningHours openingHours) {
            this.openingHours = openingHours;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -462379918;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the business start page of the current user. Requires Telegram Business subscription.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetBusinessStartPage extends Function<Ok> {
        /**
         * The new start page of the business; pass null to remove custom start page.
         */
        public InputBusinessStartPage startPage;

        /**
         * Default constructor for a function, which changes the business start page of the current user. Requires Telegram Business subscription.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetBusinessStartPage() {
        }

        /**
         * Creates a function, which changes the business start page of the current user. Requires Telegram Business subscription.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param startPage The new start page of the business; pass null to remove custom start page.
         */
        public SetBusinessStartPage(InputBusinessStartPage startPage) {
            this.startPage = startPage;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1628616290;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes accent color and background custom emoji of a channel chat. Requires canChangeInfo administrator right.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatAccentColor extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifier of the accent color to use. The chat must have at least accentColor.minChannelChatBoostLevel boost level to pass the corresponding color.
         */
        public int accentColorId;
        /**
         * Identifier of a custom emoji to be shown on the reply header and link preview background; 0 if none. Use chatBoostLevelFeatures.canSetBackgroundCustomEmoji to check whether a custom emoji can be set.
         */
        public long backgroundCustomEmojiId;

        /**
         * Default constructor for a function, which changes accent color and background custom emoji of a channel chat. Requires canChangeInfo administrator right.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatAccentColor() {
        }

        /**
         * Creates a function, which changes accent color and background custom emoji of a channel chat. Requires canChangeInfo administrator right.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param accentColorId Identifier of the accent color to use. The chat must have at least accentColor.minChannelChatBoostLevel boost level to pass the corresponding color.
         * @param backgroundCustomEmojiId Identifier of a custom emoji to be shown on the reply header and link preview background; 0 if none. Use chatBoostLevelFeatures.canSetBackgroundCustomEmoji to check whether a custom emoji can be set.
         */
        public SetChatAccentColor(long chatId, int accentColorId, long backgroundCustomEmojiId) {
            this.chatId = chatId;
            this.accentColorId = accentColorId;
            this.backgroundCustomEmojiId = backgroundCustomEmojiId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 882857930;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes story list in which stories from the chat are shown.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatActiveStoriesList extends Function<Ok> {
        /**
         * Identifier of the chat that posted stories.
         */
        public long chatId;
        /**
         * New list for active stories posted by the chat.
         */
        public StoryList storyList;

        /**
         * Default constructor for a function, which changes story list in which stories from the chat are shown.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatActiveStoriesList() {
        }

        /**
         * Creates a function, which changes story list in which stories from the chat are shown.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat that posted stories.
         * @param storyList New list for active stories posted by the chat.
         */
        public SetChatActiveStoriesList(long chatId, StoryList storyList) {
            this.chatId = chatId;
            this.storyList = storyList;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -521970415;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes affiliate program for a bot.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatAffiliateProgram extends Function<Ok> {
        /**
         * Identifier of the chat with an owned bot for which affiliate program is changed.
         */
        public long chatId;
        /**
         * Parameters of the affiliate program; pass null to close the currently active program. If there is an active program, then commission and program duration can only be increased. If the active program is scheduled to be closed, then it can't be changed anymore.
         */
        public AffiliateProgramParameters parameters;

        /**
         * Default constructor for a function, which changes affiliate program for a bot.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatAffiliateProgram() {
        }

        /**
         * Creates a function, which changes affiliate program for a bot.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat with an owned bot for which affiliate program is changed.
         * @param parameters Parameters of the affiliate program; pass null to close the currently active program. If there is an active program, then commission and program duration can only be increased. If the active program is scheduled to be closed, then it can't be changed anymore.
         */
        public SetChatAffiliateProgram(long chatId, AffiliateProgramParameters parameters) {
            this.chatId = chatId;
            this.parameters = parameters;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 14680631;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes reactions, available in a chat. Available for basic groups, supergroups, and channels. Requires canChangeInfo member right.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatAvailableReactions extends Function<Ok> {
        /**
         * Identifier of the chat.
         */
        public long chatId;
        /**
         * Reactions available in the chat. All explicitly specified emoji reactions must be active. In channel chats up to the chat's boost level custom emoji reactions can be explicitly specified.
         */
        public ChatAvailableReactions availableReactions;

        /**
         * Default constructor for a function, which changes reactions, available in a chat. Available for basic groups, supergroups, and channels. Requires canChangeInfo member right.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatAvailableReactions() {
        }

        /**
         * Creates a function, which changes reactions, available in a chat. Available for basic groups, supergroups, and channels. Requires canChangeInfo member right.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat.
         * @param availableReactions Reactions available in the chat. All explicitly specified emoji reactions must be active. In channel chats up to the chat's boost level custom emoji reactions can be explicitly specified.
         */
        public SetChatAvailableReactions(long chatId, ChatAvailableReactions availableReactions) {
            this.chatId = chatId;
            this.availableReactions = availableReactions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 267075078;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets the background in a specific chat. Supported only in private and secret chats with non-deleted users, and in chats with sufficient boost level and canChangeInfo administrator right.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatBackground extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The input background to use; pass null to create a new filled or chat theme background.
         */
        public InputBackground background;
        /**
         * Background type; pass null to use default background type for the chosen background; backgroundTypeChatTheme isn't supported for private and secret chats. Use chatBoostLevelFeatures.chatThemeBackgroundCount and chatBoostLevelFeatures.canSetCustomBackground to check whether the background type can be set in the boosted chat.
         */
        public BackgroundType type;
        /**
         * Dimming of the background in dark themes, as a percentage; 0-100. Applied only to Wallpaper and Fill types of background.
         */
        public int darkThemeDimming;
        /**
         * Pass true to set background only for self; pass false to set background for all chat users. Always false for backgrounds set in boosted chats. Background can be set for both users only by Telegram Premium users and if set background isn't of the type inputBackgroundPrevious.
         */
        public boolean onlyForSelf;

        /**
         * Default constructor for a function, which sets the background in a specific chat. Supported only in private and secret chats with non-deleted users, and in chats with sufficient boost level and canChangeInfo administrator right.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatBackground() {
        }

        /**
         * Creates a function, which sets the background in a specific chat. Supported only in private and secret chats with non-deleted users, and in chats with sufficient boost level and canChangeInfo administrator right.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param background The input background to use; pass null to create a new filled or chat theme background.
         * @param type Background type; pass null to use default background type for the chosen background; backgroundTypeChatTheme isn't supported for private and secret chats. Use chatBoostLevelFeatures.chatThemeBackgroundCount and chatBoostLevelFeatures.canSetCustomBackground to check whether the background type can be set in the boosted chat.
         * @param darkThemeDimming Dimming of the background in dark themes, as a percentage; 0-100. Applied only to Wallpaper and Fill types of background.
         * @param onlyForSelf Pass true to set background only for self; pass false to set background for all chat users. Always false for backgrounds set in boosted chats. Background can be set for both users only by Telegram Premium users and if set background isn't of the type inputBackgroundPrevious.
         */
        public SetChatBackground(long chatId, InputBackground background, BackgroundType type, int darkThemeDimming, boolean onlyForSelf) {
            this.chatId = chatId;
            this.background = background;
            this.type = type;
            this.darkThemeDimming = darkThemeDimming;
            this.onlyForSelf = onlyForSelf;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 246727678;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes application-specific data associated with a chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatClientData extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New value of clientData.
         */
        public String clientData;

        /**
         * Default constructor for a function, which changes application-specific data associated with a chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatClientData() {
        }

        /**
         * Creates a function, which changes application-specific data associated with a chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param clientData New value of clientData.
         */
        public SetChatClientData(long chatId, String clientData) {
            this.chatId = chatId;
            this.clientData = clientData;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -827119811;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes information about a chat. Available for basic groups, supergroups, and channels. Requires canChangeInfo member right.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatDescription extends Function<Ok> {
        /**
         * Identifier of the chat.
         */
        public long chatId;
        /**
         * New chat description; 0-255 characters.
         */
        public String description;

        /**
         * Default constructor for a function, which changes information about a chat. Available for basic groups, supergroups, and channels. Requires canChangeInfo member right.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatDescription() {
        }

        /**
         * Creates a function, which changes information about a chat. Available for basic groups, supergroups, and channels. Requires canChangeInfo member right.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat.
         * @param description New chat description; 0-255 characters.
         */
        public SetChatDescription(long chatId, String description) {
            this.chatId = chatId;
            this.description = description;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1957213277;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes direct messages group settings for a channel chat; requires owner privileges in the chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatDirectMessagesGroup extends Function<Ok> {
        /**
         * Identifier of the channel chat.
         */
        public long chatId;
        /**
         * Pass true if the direct messages group is enabled for the channel chat; pass false otherwise.
         */
        public boolean isEnabled;
        /**
         * The new number of Telegram Stars that must be paid for each message that is sent to the direct messages chat unless the sender is an administrator of the channel chat; 0-getOption(&quot;paid_message_star_count_max&quot;). The channel will receive getOption(&quot;paid_message_earnings_per_mille&quot;) Telegram Stars for each 1000 Telegram Stars paid for message sending. Requires supergroupFullInfo.canEnablePaidMessages for positive amounts.
         */
        public long paidMessageStarCount;

        /**
         * Default constructor for a function, which changes direct messages group settings for a channel chat; requires owner privileges in the chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatDirectMessagesGroup() {
        }

        /**
         * Creates a function, which changes direct messages group settings for a channel chat; requires owner privileges in the chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the channel chat.
         * @param isEnabled Pass true if the direct messages group is enabled for the channel chat; pass false otherwise.
         * @param paidMessageStarCount The new number of Telegram Stars that must be paid for each message that is sent to the direct messages chat unless the sender is an administrator of the channel chat; 0-getOption(&quot;paid_message_star_count_max&quot;). The channel will receive getOption(&quot;paid_message_earnings_per_mille&quot;) Telegram Stars for each 1000 Telegram Stars paid for message sending. Requires supergroupFullInfo.canEnablePaidMessages for positive amounts.
         */
        public SetChatDirectMessagesGroup(long chatId, boolean isEnabled, long paidMessageStarCount) {
            this.chatId = chatId;
            this.isEnabled = isEnabled;
            this.paidMessageStarCount = paidMessageStarCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1633150115;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the discussion group of a channel chat; requires canChangeInfo administrator right in the channel if it is specified.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatDiscussionGroup extends Function<Ok> {
        /**
         * Identifier of the channel chat. Pass 0 to remove a link from the supergroup passed in the second argument to a linked channel chat (requires canPinMessages member right in the supergroup).
         */
        public long chatId;
        /**
         * Identifier of a new channel's discussion group. Use 0 to remove the discussion group. Use the method getSuitableDiscussionChats to find all suitable groups. Basic group chats must be first upgraded to supergroup chats. If new chat members don't have access to old messages in the supergroup, then toggleSupergroupIsAllHistoryAvailable must be used first to change that.
         */
        public long discussionChatId;

        /**
         * Default constructor for a function, which changes the discussion group of a channel chat; requires canChangeInfo administrator right in the channel if it is specified.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatDiscussionGroup() {
        }

        /**
         * Creates a function, which changes the discussion group of a channel chat; requires canChangeInfo administrator right in the channel if it is specified.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the channel chat. Pass 0 to remove a link from the supergroup passed in the second argument to a linked channel chat (requires canPinMessages member right in the supergroup).
         * @param discussionChatId Identifier of a new channel's discussion group. Use 0 to remove the discussion group. Use the method getSuitableDiscussionChats to find all suitable groups. Basic group chats must be first upgraded to supergroup chats. If new chat members don't have access to old messages in the supergroup, then toggleSupergroupIsAllHistoryAvailable must be used first to change that.
         */
        public SetChatDiscussionGroup(long chatId, long discussionChatId) {
            this.chatId = chatId;
            this.discussionChatId = discussionChatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -918801736;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the draft message in a chat or a topic.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatDraftMessage extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Topic in which the draft will be changed; pass null to change the draft for the chat itself.
         */
        public MessageTopic topicId;
        /**
         * New draft message; pass null to remove the draft. All files in draft message content must be of the type inputFileLocal. Media thumbnails and captions are ignored.
         */
        public DraftMessage draftMessage;

        /**
         * Default constructor for a function, which changes the draft message in a chat or a topic.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatDraftMessage() {
        }

        /**
         * Creates a function, which changes the draft message in a chat or a topic.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param topicId Topic in which the draft will be changed; pass null to change the draft for the chat itself.
         * @param draftMessage New draft message; pass null to remove the draft. All files in draft message content must be of the type inputFileLocal. Media thumbnails and captions are ignored.
         */
        public SetChatDraftMessage(long chatId, MessageTopic topicId, DraftMessage draftMessage) {
            this.chatId = chatId;
            this.topicId = topicId;
            this.draftMessage = draftMessage;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -555614927;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the emoji status of a chat. Use chatBoostLevelFeatures.canSetEmojiStatus to check whether an emoji status can be set. Requires canChangeInfo administrator right.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatEmojiStatus extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New emoji status; pass null to remove emoji status.
         */
        public EmojiStatus emojiStatus;

        /**
         * Default constructor for a function, which changes the emoji status of a chat. Use chatBoostLevelFeatures.canSetEmojiStatus to check whether an emoji status can be set. Requires canChangeInfo administrator right.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatEmojiStatus() {
        }

        /**
         * Creates a function, which changes the emoji status of a chat. Use chatBoostLevelFeatures.canSetEmojiStatus to check whether an emoji status can be set. Requires canChangeInfo administrator right.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param emojiStatus New emoji status; pass null to remove emoji status.
         */
        public SetChatEmojiStatus(long chatId, EmojiStatus emojiStatus) {
            this.chatId = chatId;
            this.emojiStatus = emojiStatus;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1434982674;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the location of a chat. Available only for some location-based supergroups, use supergroupFullInfo.canSetLocation to check whether the method is allowed to use.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatLocation extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New location for the chat; must be valid and not null.
         */
        public ChatLocation location;

        /**
         * Default constructor for a function, which changes the location of a chat. Available only for some location-based supergroups, use supergroupFullInfo.canSetLocation to check whether the method is allowed to use.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatLocation() {
        }

        /**
         * Creates a function, which changes the location of a chat. Available only for some location-based supergroups, use supergroupFullInfo.canSetLocation to check whether the method is allowed to use.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param location New location for the chat; must be valid and not null.
         */
        public SetChatLocation(long chatId, ChatLocation location) {
            this.chatId = chatId;
            this.location = location;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -767091286;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the status of a chat member; requires canInviteUsers member right to add a chat member, canPromoteMembers administrator right to change administrator rights of the member, and canRestrictMembers administrator right to change restrictions of a user. This function is currently not suitable for transferring chat ownership; use transferChatOwnership instead. Use addChatMember or banChatMember if some additional parameters needs to be passed.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatMemberStatus extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Member identifier. Chats can be only banned and unbanned in supergroups and channels.
         */
        public MessageSender memberId;
        /**
         * The new status of the member in the chat.
         */
        public ChatMemberStatus status;

        /**
         * Default constructor for a function, which changes the status of a chat member; requires canInviteUsers member right to add a chat member, canPromoteMembers administrator right to change administrator rights of the member, and canRestrictMembers administrator right to change restrictions of a user. This function is currently not suitable for transferring chat ownership; use transferChatOwnership instead. Use addChatMember or banChatMember if some additional parameters needs to be passed.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatMemberStatus() {
        }

        /**
         * Creates a function, which changes the status of a chat member; requires canInviteUsers member right to add a chat member, canPromoteMembers administrator right to change administrator rights of the member, and canRestrictMembers administrator right to change restrictions of a user. This function is currently not suitable for transferring chat ownership; use transferChatOwnership instead. Use addChatMember or banChatMember if some additional parameters needs to be passed.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param memberId Member identifier. Chats can be only banned and unbanned in supergroups and channels.
         * @param status The new status of the member in the chat.
         */
        public SetChatMemberStatus(long chatId, MessageSender memberId, ChatMemberStatus status) {
            this.chatId = chatId;
            this.memberId = memberId;
            this.status = status;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 81794847;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the tag or custom title of a chat member; requires canManageTags administrator right to change tag of other users; for basic groups and supergroups only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatMemberTag extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifier of the user, which tag is changed. Chats can't have member tags.
         */
        public long userId;
        /**
         * The new tag of the member in the chat; 0-16 characters without emoji.
         */
        public String tag;

        /**
         * Default constructor for a function, which changes the tag or custom title of a chat member; requires canManageTags administrator right to change tag of other users; for basic groups and supergroups only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatMemberTag() {
        }

        /**
         * Creates a function, which changes the tag or custom title of a chat member; requires canManageTags administrator right to change tag of other users; for basic groups and supergroups only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param userId Identifier of the user, which tag is changed. Chats can't have member tags.
         * @param tag The new tag of the member in the chat; 0-16 characters without emoji.
         */
        public SetChatMemberTag(long chatId, long userId, String tag) {
            this.chatId = chatId;
            this.userId = userId;
            this.tag = tag;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 937859366;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the message auto-delete or self-destruct (for secret chats) time in a chat. Requires changeInfo administrator right in basic groups, supergroups and channels. Message auto-delete time can't be changed in a chat with the current user (Saved Messages) and the chat 777000 (Telegram).
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatMessageAutoDeleteTime extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New time value, in seconds; unless the chat is secret, it must be from 0 up to 365 * 86400 and be divisible by 86400. If 0, then messages aren't deleted automatically.
         */
        public int messageAutoDeleteTime;

        /**
         * Default constructor for a function, which changes the message auto-delete or self-destruct (for secret chats) time in a chat. Requires changeInfo administrator right in basic groups, supergroups and channels. Message auto-delete time can't be changed in a chat with the current user (Saved Messages) and the chat 777000 (Telegram).
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatMessageAutoDeleteTime() {
        }

        /**
         * Creates a function, which changes the message auto-delete or self-destruct (for secret chats) time in a chat. Requires changeInfo administrator right in basic groups, supergroups and channels. Message auto-delete time can't be changed in a chat with the current user (Saved Messages) and the chat 777000 (Telegram).
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param messageAutoDeleteTime New time value, in seconds; unless the chat is secret, it must be from 0 up to 365 * 86400 and be divisible by 86400. If 0, then messages aren't deleted automatically.
         */
        public SetChatMessageAutoDeleteTime(long chatId, int messageAutoDeleteTime) {
            this.chatId = chatId;
            this.messageAutoDeleteTime = messageAutoDeleteTime;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1505643265;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Selects a message sender to send messages in a chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatMessageSender extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New message sender for the chat.
         */
        public MessageSender messageSenderId;

        /**
         * Default constructor for a function, which selects a message sender to send messages in a chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatMessageSender() {
        }

        /**
         * Creates a function, which selects a message sender to send messages in a chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param messageSenderId New message sender for the chat.
         */
        public SetChatMessageSender(long chatId, MessageSender messageSenderId) {
            this.chatId = chatId;
            this.messageSenderId = messageSenderId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1421513858;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the notification settings of a chat. Notification settings of a chat with the current user (Saved Messages) can't be changed.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatNotificationSettings extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New notification settings for the chat. If the chat is muted for more than 366 days, it is considered to be muted forever.
         */
        public ChatNotificationSettings notificationSettings;

        /**
         * Default constructor for a function, which changes the notification settings of a chat. Notification settings of a chat with the current user (Saved Messages) can't be changed.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatNotificationSettings() {
        }

        /**
         * Creates a function, which changes the notification settings of a chat. Notification settings of a chat with the current user (Saved Messages) can't be changed.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param notificationSettings New notification settings for the chat. If the chat is muted for more than 366 days, it is considered to be muted forever.
         */
        public SetChatNotificationSettings(long chatId, ChatNotificationSettings notificationSettings) {
            this.chatId = chatId;
            this.notificationSettings = notificationSettings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 777199614;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the Telegram Star amount that must be paid to send a message to a supergroup chat; requires canRestrictMembers administrator right and supergroupFullInfo.canEnablePaidMessages.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatPaidMessageStarCount extends Function<Ok> {
        /**
         * Identifier of the supergroup chat.
         */
        public long chatId;
        /**
         * The new number of Telegram Stars that must be paid for each message that is sent to the supergroup chat unless the sender is an administrator of the chat; 0-getOption(&quot;paid_message_star_count_max&quot;). The supergroup will receive getOption(&quot;paid_message_earnings_per_mille&quot;) Telegram Stars for each 1000 Telegram Stars paid for message sending.
         */
        public long paidMessageStarCount;

        /**
         * Default constructor for a function, which changes the Telegram Star amount that must be paid to send a message to a supergroup chat; requires canRestrictMembers administrator right and supergroupFullInfo.canEnablePaidMessages.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatPaidMessageStarCount() {
        }

        /**
         * Creates a function, which changes the Telegram Star amount that must be paid to send a message to a supergroup chat; requires canRestrictMembers administrator right and supergroupFullInfo.canEnablePaidMessages.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the supergroup chat.
         * @param paidMessageStarCount The new number of Telegram Stars that must be paid for each message that is sent to the supergroup chat unless the sender is an administrator of the chat; 0-getOption(&quot;paid_message_star_count_max&quot;). The supergroup will receive getOption(&quot;paid_message_earnings_per_mille&quot;) Telegram Stars for each 1000 Telegram Stars paid for message sending.
         */
        public SetChatPaidMessageStarCount(long chatId, long paidMessageStarCount) {
            this.chatId = chatId;
            this.paidMessageStarCount = paidMessageStarCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1187053289;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the chat members permissions. Supported only for basic groups and supergroups. Requires canRestrictMembers administrator right.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatPermissions extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New non-administrator members permissions in the chat.
         */
        public ChatPermissions permissions;

        /**
         * Default constructor for a function, which changes the chat members permissions. Supported only for basic groups and supergroups. Requires canRestrictMembers administrator right.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatPermissions() {
        }

        /**
         * Creates a function, which changes the chat members permissions. Supported only for basic groups and supergroups. Requires canRestrictMembers administrator right.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param permissions New non-administrator members permissions in the chat.
         */
        public SetChatPermissions(long chatId, ChatPermissions permissions) {
            this.chatId = chatId;
            this.permissions = permissions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2138507006;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the photo of a chat. Supported only for basic groups, supergroups and channels. Requires canChangeInfo member right.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatPhoto extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New chat photo; pass null to delete the chat photo.
         */
        public InputChatPhoto photo;

        /**
         * Default constructor for a function, which changes the photo of a chat. Supported only for basic groups, supergroups and channels. Requires canChangeInfo member right.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatPhoto() {
        }

        /**
         * Creates a function, which changes the photo of a chat. Supported only for basic groups, supergroups and channels. Requires canChangeInfo member right.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param photo New chat photo; pass null to delete the chat photo.
         */
        public SetChatPhoto(long chatId, InputChatPhoto photo) {
            this.chatId = chatId;
            this.photo = photo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -377778941;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the list of pinned stories on a chat page; requires canEditStories administrator right in the chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatPinnedStories extends Function<Ok> {
        /**
         * Identifier of the chat that posted the stories.
         */
        public long chatId;
        /**
         * New list of pinned stories. All stories must be posted to the chat page first. There can be up to getOption(&quot;pinned_story_count_max&quot;) pinned stories on a chat page.
         */
        public int[] storyIds;

        /**
         * Default constructor for a function, which changes the list of pinned stories on a chat page; requires canEditStories administrator right in the chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatPinnedStories() {
        }

        /**
         * Creates a function, which changes the list of pinned stories on a chat page; requires canEditStories administrator right in the chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat that posted the stories.
         * @param storyIds New list of pinned stories. All stories must be posted to the chat page first. There can be up to getOption(&quot;pinned_story_count_max&quot;) pinned stories on a chat page.
         */
        public SetChatPinnedStories(long chatId, int[] storyIds) {
            this.chatId = chatId;
            this.storyIds = storyIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -669062355;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes accent color and background custom emoji for profile of a supergroup or channel chat. Requires canChangeInfo administrator right.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatProfileAccentColor extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifier of the accent color to use for profile; pass -1 if none. The chat must have at least profileAccentColor.minSupergroupChatBoostLevel for supergroups or profileAccentColor.minChannelChatBoostLevel for channels boost level to pass the corresponding color.
         */
        public int profileAccentColorId;
        /**
         * Identifier of a custom emoji to be shown on the chat's profile photo background; 0 if none. Use chatBoostLevelFeatures.canSetProfileBackgroundCustomEmoji to check whether a custom emoji can be set.
         */
        public long profileBackgroundCustomEmojiId;

        /**
         * Default constructor for a function, which changes accent color and background custom emoji for profile of a supergroup or channel chat. Requires canChangeInfo administrator right.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatProfileAccentColor() {
        }

        /**
         * Creates a function, which changes accent color and background custom emoji for profile of a supergroup or channel chat. Requires canChangeInfo administrator right.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param profileAccentColorId Identifier of the accent color to use for profile; pass -1 if none. The chat must have at least profileAccentColor.minSupergroupChatBoostLevel for supergroups or profileAccentColor.minChannelChatBoostLevel for channels boost level to pass the corresponding color.
         * @param profileBackgroundCustomEmojiId Identifier of a custom emoji to be shown on the chat's profile photo background; 0 if none. Use chatBoostLevelFeatures.canSetProfileBackgroundCustomEmoji to check whether a custom emoji can be set.
         */
        public SetChatProfileAccentColor(long chatId, int profileAccentColorId, long profileBackgroundCustomEmojiId) {
            this.chatId = chatId;
            this.profileAccentColorId = profileAccentColorId;
            this.profileBackgroundCustomEmojiId = profileBackgroundCustomEmojiId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1109896826;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the slow mode delay of a chat. Available only for supergroups; requires canRestrictMembers administrator right.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatSlowModeDelay extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New slow mode delay for the chat, in seconds; must be one of 0, 5, 10, 30, 60, 300, 900, 3600.
         */
        public int slowModeDelay;

        /**
         * Default constructor for a function, which changes the slow mode delay of a chat. Available only for supergroups; requires canRestrictMembers administrator right.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatSlowModeDelay() {
        }

        /**
         * Creates a function, which changes the slow mode delay of a chat. Available only for supergroups; requires canRestrictMembers administrator right.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param slowModeDelay New slow mode delay for the chat, in seconds; must be one of 0, 5, 10, 30, 60, 300, 900, 3600.
         */
        public SetChatSlowModeDelay(long chatId, int slowModeDelay) {
            this.chatId = chatId;
            this.slowModeDelay = slowModeDelay;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -540350914;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the chat theme. Supported only in private and secret chats.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatTheme extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New chat theme; pass null to return the default theme.
         */
        public InputChatTheme theme;

        /**
         * Default constructor for a function, which changes the chat theme. Supported only in private and secret chats.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatTheme() {
        }

        /**
         * Creates a function, which changes the chat theme. Supported only in private and secret chats.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param theme New chat theme; pass null to return the default theme.
         */
        public SetChatTheme(long chatId, InputChatTheme theme) {
            this.chatId = chatId;
            this.theme = theme;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1474791506;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the chat title. Supported only for basic groups, supergroups and channels. Requires canChangeInfo member right.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetChatTitle extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New title of the chat; 1-128 characters.
         */
        public String title;

        /**
         * Default constructor for a function, which changes the chat title. Supported only for basic groups, supergroups and channels. Requires canChangeInfo member right.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetChatTitle() {
        }

        /**
         * Creates a function, which changes the chat title. Supported only for basic groups, supergroups and channels. Requires canChangeInfo member right.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param title New title of the chat; 1-128 characters.
         */
        public SetChatTitle(long chatId, String title) {
            this.chatId = chatId;
            this.title = title;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 164282047;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the list of close friends of the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetCloseFriends extends Function<Ok> {
        /**
         * User identifiers of close friends; the users must be contacts of the current user.
         */
        public long[] userIds;

        /**
         * Default constructor for a function, which changes the list of close friends of the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetCloseFriends() {
        }

        /**
         * Creates a function, which changes the list of close friends of the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param userIds User identifiers of close friends; the users must be contacts of the current user.
         */
        public SetCloseFriends(long[] userIds) {
            this.userIds = userIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1908013258;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets the list of commands supported by the bot for the given user scope and language; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetCommands extends Function<Ok> {
        /**
         * The scope to which the commands are relevant; pass null to change commands in the default bot command scope.
         */
        public BotCommandScope scope;
        /**
         * A two-letter ISO 639-1 language code. If empty, the commands will be applied to all users from the given scope, for which language there are no dedicated commands.
         */
        public String languageCode;
        /**
         * List of the bot's commands.
         */
        public BotCommand[] commands;

        /**
         * Default constructor for a function, which sets the list of commands supported by the bot for the given user scope and language; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetCommands() {
        }

        /**
         * Creates a function, which sets the list of commands supported by the bot for the given user scope and language; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param scope The scope to which the commands are relevant; pass null to change commands in the default bot command scope.
         * @param languageCode A two-letter ISO 639-1 language code. If empty, the commands will be applied to all users from the given scope, for which language there are no dedicated commands.
         * @param commands List of the bot's commands.
         */
        public SetCommands(BotCommandScope scope, String languageCode, BotCommand[] commands) {
            this.scope = scope;
            this.languageCode = languageCode;
            this.commands = commands;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -907165606;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets a custom emoji sticker set thumbnail.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetCustomEmojiStickerSetThumbnail extends Function<Ok> {
        /**
         * Sticker set name. The sticker set must be owned by the current user.
         */
        public String name;
        /**
         * Identifier of the custom emoji from the sticker set, which will be set as sticker set thumbnail; pass 0 to remove the sticker set thumbnail.
         */
        public long customEmojiId;

        /**
         * Default constructor for a function, which sets a custom emoji sticker set thumbnail.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetCustomEmojiStickerSetThumbnail() {
        }

        /**
         * Creates a function, which sets a custom emoji sticker set thumbnail.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param name Sticker set name. The sticker set must be owned by the current user.
         * @param customEmojiId Identifier of the custom emoji from the sticker set, which will be set as sticker set thumbnail; pass 0 to remove the sticker set thumbnail.
         */
        public SetCustomEmojiStickerSetThumbnail(String name, long customEmojiId) {
            this.name = name;
            this.customEmojiId = customEmojiId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1122836246;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds or changes a custom local language pack to the current localization target.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetCustomLanguagePack extends Function<Ok> {
        /**
         * Information about the language pack. Language pack identifier must start with 'X', consist only of English letters, digits and hyphens, and must not exceed 64 characters. Can be called before authorization.
         */
        public LanguagePackInfo info;
        /**
         * Strings of the new language pack.
         */
        public LanguagePackString[] strings;

        /**
         * Default constructor for a function, which adds or changes a custom local language pack to the current localization target.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetCustomLanguagePack() {
        }

        /**
         * Creates a function, which adds or changes a custom local language pack to the current localization target.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param info Information about the language pack. Language pack identifier must start with 'X', consist only of English letters, digits and hyphens, and must not exceed 64 characters. Can be called before authorization.
         * @param strings Strings of the new language pack.
         */
        public SetCustomLanguagePack(LanguagePackInfo info, LanguagePackString[] strings) {
            this.info = info;
            this.strings = strings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -296742819;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds, edits or deletes a string in a custom local language pack. Can be called before authorization.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetCustomLanguagePackString extends Function<Ok> {
        /**
         * Identifier of a previously added custom local language pack in the current localization target.
         */
        public String languagePackId;
        /**
         * New language pack string.
         */
        public LanguagePackString newString;

        /**
         * Default constructor for a function, which adds, edits or deletes a string in a custom local language pack. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetCustomLanguagePackString() {
        }

        /**
         * Creates a function, which adds, edits or deletes a string in a custom local language pack. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param languagePackId Identifier of a previously added custom local language pack in the current localization target.
         * @param newString New language pack string.
         */
        public SetCustomLanguagePackString(String languagePackId, LanguagePackString newString) {
            this.languagePackId = languagePackId;
            this.newString = newString;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1316365592;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the database encryption key. Usually the encryption key is never changed and is stored in some OS keychain.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetDatabaseEncryptionKey extends Function<Ok> {
        /**
         * New encryption key.
         */
        public byte[] newEncryptionKey;

        /**
         * Default constructor for a function, which changes the database encryption key. Usually the encryption key is never changed and is stored in some OS keychain.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetDatabaseEncryptionKey() {
        }

        /**
         * Creates a function, which changes the database encryption key. Usually the encryption key is never changed and is stored in some OS keychain.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param newEncryptionKey New encryption key.
         */
        public SetDatabaseEncryptionKey(byte[] newEncryptionKey) {
            this.newEncryptionKey = newEncryptionKey;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1204599371;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets default background for chats; adds the background to the list of installed backgrounds.
     *
     * <p> Returns {@link Background Background} </p>
     */
    public static class SetDefaultBackground extends Function<Background> {
        /**
         * The input background to use; pass null to create a new filled background.
         */
        public InputBackground background;
        /**
         * Background type; pass null to use the default type of the remote background; backgroundTypeChatTheme isn't supported.
         */
        public BackgroundType type;
        /**
         * Pass true if the background is set for a dark theme.
         */
        public boolean forDarkTheme;

        /**
         * Default constructor for a function, which sets default background for chats; adds the background to the list of installed backgrounds.
         *
         * <p> Returns {@link Background Background} </p>
         */
        public SetDefaultBackground() {
        }

        /**
         * Creates a function, which sets default background for chats; adds the background to the list of installed backgrounds.
         *
         * <p> Returns {@link Background Background} </p>
         *
         * @param background The input background to use; pass null to create a new filled background.
         * @param type Background type; pass null to use the default type of the remote background; backgroundTypeChatTheme isn't supported.
         * @param forDarkTheme Pass true if the background is set for a dark theme.
         */
        public SetDefaultBackground(InputBackground background, BackgroundType type, boolean forDarkTheme) {
            this.background = background;
            this.type = type;
            this.forDarkTheme = forDarkTheme;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1982748511;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets default administrator rights for adding the bot to channel chats; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetDefaultChannelAdministratorRights extends Function<Ok> {
        /**
         * Default administrator rights for adding the bot to channels; pass null to remove default rights.
         */
        public ChatAdministratorRights defaultChannelAdministratorRights;

        /**
         * Default constructor for a function, which sets default administrator rights for adding the bot to channel chats; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetDefaultChannelAdministratorRights() {
        }

        /**
         * Creates a function, which sets default administrator rights for adding the bot to channel chats; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param defaultChannelAdministratorRights Default administrator rights for adding the bot to channels; pass null to remove default rights.
         */
        public SetDefaultChannelAdministratorRights(ChatAdministratorRights defaultChannelAdministratorRights) {
            this.defaultChannelAdministratorRights = defaultChannelAdministratorRights;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -234004967;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets default administrator rights for adding the bot to basic group and supergroup chats; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetDefaultGroupAdministratorRights extends Function<Ok> {
        /**
         * Default administrator rights for adding the bot to basic group and supergroup chats; pass null to remove default rights.
         */
        public ChatAdministratorRights defaultGroupAdministratorRights;

        /**
         * Default constructor for a function, which sets default administrator rights for adding the bot to basic group and supergroup chats; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetDefaultGroupAdministratorRights() {
        }

        /**
         * Creates a function, which sets default administrator rights for adding the bot to basic group and supergroup chats; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param defaultGroupAdministratorRights Default administrator rights for adding the bot to basic group and supergroup chats; pass null to remove default rights.
         */
        public SetDefaultGroupAdministratorRights(ChatAdministratorRights defaultGroupAdministratorRights) {
            this.defaultGroupAdministratorRights = defaultGroupAdministratorRights;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1700231016;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the default message auto-delete time for new chats.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetDefaultMessageAutoDeleteTime extends Function<Ok> {
        /**
         * New default message auto-delete time; must be from 0 up to 365 * 86400 and be divisible by 86400. If 0, then messages aren't deleted automatically.
         */
        public MessageAutoDeleteTime messageAutoDeleteTime;

        /**
         * Default constructor for a function, which changes the default message auto-delete time for new chats.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetDefaultMessageAutoDeleteTime() {
        }

        /**
         * Creates a function, which changes the default message auto-delete time for new chats.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param messageAutoDeleteTime New default message auto-delete time; must be from 0 up to 365 * 86400 and be divisible by 86400. If 0, then messages aren't deleted automatically.
         */
        public SetDefaultMessageAutoDeleteTime(MessageAutoDeleteTime messageAutoDeleteTime) {
            this.messageAutoDeleteTime = messageAutoDeleteTime;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1772301460;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes type of default reaction for the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetDefaultReactionType extends Function<Ok> {
        /**
         * New type of the default reaction. The paid reaction can't be set as default.
         */
        public ReactionType reactionType;

        /**
         * Default constructor for a function, which changes type of default reaction for the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetDefaultReactionType() {
        }

        /**
         * Creates a function, which changes type of default reaction for the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param reactionType New type of the default reaction. The paid reaction can't be set as default.
         */
        public SetDefaultReactionType(ReactionType reactionType) {
            this.reactionType = reactionType;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1694730813;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the marked as unread state of the topic in a channel direct messages chat administered by the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetDirectMessagesChatTopicIsMarkedAsUnread extends Function<Ok> {
        /**
         * Chat identifier of the channel direct messages chat.
         */
        public long chatId;
        /**
         * Topic identifier.
         */
        public long topicId;
        /**
         * New value of isMarkedAsUnread.
         */
        public boolean isMarkedAsUnread;

        /**
         * Default constructor for a function, which changes the marked as unread state of the topic in a channel direct messages chat administered by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetDirectMessagesChatTopicIsMarkedAsUnread() {
        }

        /**
         * Creates a function, which changes the marked as unread state of the topic in a channel direct messages chat administered by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier of the channel direct messages chat.
         * @param topicId Topic identifier.
         * @param isMarkedAsUnread New value of isMarkedAsUnread.
         */
        public SetDirectMessagesChatTopicIsMarkedAsUnread(long chatId, long topicId, boolean isMarkedAsUnread) {
            this.chatId = chatId;
            this.topicId = topicId;
            this.isMarkedAsUnread = isMarkedAsUnread;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1569655059;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the emoji status of the current user; for Telegram Premium users only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetEmojiStatus extends Function<Ok> {
        /**
         * New emoji status; pass null to switch to the default badge.
         */
        public EmojiStatus emojiStatus;

        /**
         * Default constructor for a function, which changes the emoji status of the current user; for Telegram Premium users only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetEmojiStatus() {
        }

        /**
         * Creates a function, which changes the emoji status of the current user; for Telegram Premium users only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param emojiStatus New emoji status; pass null to switch to the default badge.
         */
        public SetEmojiStatus(EmojiStatus emojiStatus) {
            this.emojiStatus = emojiStatus;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1829224867;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs TDLib on a file generation progress.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetFileGenerationProgress extends Function<Ok> {
        /**
         * The identifier of the generation process.
         */
        public long generationId;
        /**
         * Expected size of the generated file, in bytes; 0 if unknown.
         */
        public long expectedSize;
        /**
         * The number of bytes already generated.
         */
        public long localPrefixSize;

        /**
         * Default constructor for a function, which informs TDLib on a file generation progress.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetFileGenerationProgress() {
        }

        /**
         * Creates a function, which informs TDLib on a file generation progress.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param generationId The identifier of the generation process.
         * @param expectedSize Expected size of the generated file, in bytes; 0 if unknown.
         * @param localPrefixSize The number of bytes already generated.
         */
        public SetFileGenerationProgress(long generationId, long expectedSize, long localPrefixSize) {
            this.generationId = generationId;
            this.expectedSize = expectedSize;
            this.localPrefixSize = localPrefixSize;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1836403518;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the notification settings of a forum topic in a forum supergroup chat or a chat with a bot with topics.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetForumTopicNotificationSettings extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Forum topic identifier.
         */
        public int forumTopicId;
        /**
         * New notification settings for the forum topic. If the topic is muted for more than 366 days, it is considered to be muted forever.
         */
        public ChatNotificationSettings notificationSettings;

        /**
         * Default constructor for a function, which changes the notification settings of a forum topic in a forum supergroup chat or a chat with a bot with topics.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetForumTopicNotificationSettings() {
        }

        /**
         * Creates a function, which changes the notification settings of a forum topic in a forum supergroup chat or a chat with a bot with topics.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param forumTopicId Forum topic identifier.
         * @param notificationSettings New notification settings for the forum topic. If the topic is muted for more than 366 days, it is considered to be muted forever.
         */
        public SetForumTopicNotificationSettings(long chatId, int forumTopicId, ChatNotificationSettings notificationSettings) {
            this.chatId = chatId;
            this.forumTopicId = forumTopicId;
            this.notificationSettings = notificationSettings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1989500300;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Updates the game score of the specified user in the game; for bots only.
     *
     * <p> Returns {@link Message Message} </p>
     */
    public static class SetGameScore extends Function<Message> {
        /**
         * The chat to which the message with the game belongs.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * Pass true to edit the game message to include the current scoreboard.
         */
        public boolean editMessage;
        /**
         * User identifier.
         */
        public long userId;
        /**
         * The new score.
         */
        public int score;
        /**
         * Pass true to update the score even if it decreases. If the score is 0, the user will be deleted from the high score table.
         */
        public boolean force;

        /**
         * Default constructor for a function, which updates the game score of the specified user in the game; for bots only.
         *
         * <p> Returns {@link Message Message} </p>
         */
        public SetGameScore() {
        }

        /**
         * Creates a function, which updates the game score of the specified user in the game; for bots only.
         *
         * <p> Returns {@link Message Message} </p>
         *
         * @param chatId The chat to which the message with the game belongs.
         * @param messageId Identifier of the message.
         * @param editMessage Pass true to edit the game message to include the current scoreboard.
         * @param userId User identifier.
         * @param score The new score.
         * @param force Pass true to update the score even if it decreases. If the score is 0, the user will be deleted from the high score table.
         */
        public SetGameScore(long chatId, long messageId, boolean editMessage, long userId, int score, boolean force) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.editMessage = editMessage;
            this.userId = userId;
            this.score = score;
            this.force = force;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2127359430;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes name of a gift collection. If the collection is owned by a channel chat, then requires canPostMessages administrator right in the channel chat. Returns the changed collection.
     *
     * <p> Returns {@link GiftCollection GiftCollection} </p>
     */
    public static class SetGiftCollectionName extends Function<GiftCollection> {
        /**
         * Identifier of the user or the channel chat that owns the collection.
         */
        public MessageSender ownerId;
        /**
         * Identifier of the gift collection.
         */
        public int collectionId;
        /**
         * New name of the collection; 1-12 characters.
         */
        public String name;

        /**
         * Default constructor for a function, which changes name of a gift collection. If the collection is owned by a channel chat, then requires canPostMessages administrator right in the channel chat. Returns the changed collection.
         *
         * <p> Returns {@link GiftCollection GiftCollection} </p>
         */
        public SetGiftCollectionName() {
        }

        /**
         * Creates a function, which changes name of a gift collection. If the collection is owned by a channel chat, then requires canPostMessages administrator right in the channel chat. Returns the changed collection.
         *
         * <p> Returns {@link GiftCollection GiftCollection} </p>
         *
         * @param ownerId Identifier of the user or the channel chat that owns the collection.
         * @param collectionId Identifier of the gift collection.
         * @param name New name of the collection; 1-12 characters.
         */
        public SetGiftCollectionName(MessageSender ownerId, int collectionId, String name) {
            this.ownerId = ownerId;
            this.collectionId = collectionId;
            this.name = name;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1108355593;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes resale price of a unique gift owned by the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetGiftResalePrice extends Function<Ok> {
        /**
         * Identifier of the unique gift.
         */
        public String receivedGiftId;
        /**
         * The new price for the unique gift; pass null to disallow gift resale. The current user will receive getOption(&quot;gift_resale_star_earnings_per_mille&quot;) Telegram Stars for each 1000 Telegram Stars paid for the gift if the gift price is in Telegram Stars or getOption(&quot;gift_resale_ton_earnings_per_mille&quot;) Toncoins for each 1000 Toncoins paid for the gift if the gift price is in Toncoins.
         */
        public GiftResalePrice price;

        /**
         * Default constructor for a function, which changes resale price of a unique gift owned by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetGiftResalePrice() {
        }

        /**
         * Creates a function, which changes resale price of a unique gift owned by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param receivedGiftId Identifier of the unique gift.
         * @param price The new price for the unique gift; pass null to disallow gift resale. The current user will receive getOption(&quot;gift_resale_star_earnings_per_mille&quot;) Telegram Stars for each 1000 Telegram Stars paid for the gift if the gift price is in Telegram Stars or getOption(&quot;gift_resale_ton_earnings_per_mille&quot;) Toncoins for each 1000 Toncoins paid for the gift if the gift price is in Toncoins.
         */
        public SetGiftResalePrice(String receivedGiftId, GiftResalePrice price) {
            this.receivedGiftId = receivedGiftId;
            this.price = price;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 373916170;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes settings for gift receiving for the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetGiftSettings extends Function<Ok> {
        /**
         * The new settings.
         */
        public GiftSettings settings;

        /**
         * Default constructor for a function, which changes settings for gift receiving for the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetGiftSettings() {
        }

        /**
         * Creates a function, which changes settings for gift receiving for the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param settings The new settings.
         */
        public SetGiftSettings(GiftSettings settings) {
            this.settings = settings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -519330046;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the minimum number of Telegram Stars that must be paid by general participant for each sent message to a live story call. Requires groupCall.canBeManaged right.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetGroupCallPaidMessageStarCount extends Function<Ok> {
        /**
         * Group call identifier; must be an identifier of a live story call.
         */
        public int groupCallId;
        /**
         * The new minimum number of Telegram Stars; 0-getOption(&quot;paid_group_call_message_star_count_max&quot;).
         */
        public long paidMessageStarCount;

        /**
         * Default constructor for a function, which changes the minimum number of Telegram Stars that must be paid by general participant for each sent message to a live story call. Requires groupCall.canBeManaged right.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetGroupCallPaidMessageStarCount() {
        }

        /**
         * Creates a function, which changes the minimum number of Telegram Stars that must be paid by general participant for each sent message to a live story call. Requires groupCall.canBeManaged right.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier; must be an identifier of a live story call.
         * @param paidMessageStarCount The new minimum number of Telegram Stars; 0-getOption(&quot;paid_group_call_message_star_count_max&quot;).
         */
        public SetGroupCallPaidMessageStarCount(int groupCallId, long paidMessageStarCount) {
            this.groupCallId = groupCallId;
            this.paidMessageStarCount = paidMessageStarCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1764341527;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs TDLib that speaking state of a participant of an active group call has changed. Returns identifier of the participant if it is found.
     *
     * <p> Returns {@link MessageSender MessageSender} </p>
     */
    public static class SetGroupCallParticipantIsSpeaking extends Function<MessageSender> {
        /**
         * Group call identifier.
         */
        public int groupCallId;
        /**
         * Group call participant's synchronization audio source identifier, or 0 for the current user.
         */
        public int audioSource;
        /**
         * Pass true if the user is speaking.
         */
        public boolean isSpeaking;

        /**
         * Default constructor for a function, which informs TDLib that speaking state of a participant of an active group call has changed. Returns identifier of the participant if it is found.
         *
         * <p> Returns {@link MessageSender MessageSender} </p>
         */
        public SetGroupCallParticipantIsSpeaking() {
        }

        /**
         * Creates a function, which informs TDLib that speaking state of a participant of an active group call has changed. Returns identifier of the participant if it is found.
         *
         * <p> Returns {@link MessageSender MessageSender} </p>
         *
         * @param groupCallId Group call identifier.
         * @param audioSource Group call participant's synchronization audio source identifier, or 0 for the current user.
         * @param isSpeaking Pass true if the user is speaking.
         */
        public SetGroupCallParticipantIsSpeaking(int groupCallId, int audioSource, boolean isSpeaking) {
            this.groupCallId = groupCallId;
            this.audioSource = audioSource;
            this.isSpeaking = isSpeaking;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1019676164;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes volume level of a participant of an active group call; not supported for live stories. If the current user can manage the group call or is the owner of the group call, then the participant's volume level will be changed for all users with the default volume level.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetGroupCallParticipantVolumeLevel extends Function<Ok> {
        /**
         * Group call identifier.
         */
        public int groupCallId;
        /**
         * Participant identifier.
         */
        public MessageSender participantId;
        /**
         * New participant's volume level; 1-20000 in hundreds of percents.
         */
        public int volumeLevel;

        /**
         * Default constructor for a function, which changes volume level of a participant of an active group call; not supported for live stories. If the current user can manage the group call or is the owner of the group call, then the participant's volume level will be changed for all users with the default volume level.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetGroupCallParticipantVolumeLevel() {
        }

        /**
         * Creates a function, which changes volume level of a participant of an active group call; not supported for live stories. If the current user can manage the group call or is the owner of the group call, then the participant's volume level will be changed for all users with the default volume level.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier.
         * @param participantId Participant identifier.
         * @param volumeLevel New participant's volume level; 1-20000 in hundreds of percents.
         */
        public SetGroupCallParticipantVolumeLevel(int groupCallId, MessageSender participantId, int volumeLevel) {
            this.groupCallId = groupCallId;
            this.participantId = participantId;
            this.volumeLevel = volumeLevel;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1753769944;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the period of inactivity after which sessions will automatically be terminated.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetInactiveSessionTtl extends Function<Ok> {
        /**
         * New number of days of inactivity before sessions will be automatically terminated; 1-366 days.
         */
        public int inactiveSessionTtlDays;

        /**
         * Default constructor for a function, which changes the period of inactivity after which sessions will automatically be terminated.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetInactiveSessionTtl() {
        }

        /**
         * Creates a function, which changes the period of inactivity after which sessions will automatically be terminated.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param inactiveSessionTtlDays New number of days of inactivity before sessions will be automatically terminated; 1-366 days.
         */
        public SetInactiveSessionTtl(int inactiveSessionTtlDays) {
            this.inactiveSessionTtlDays = inactiveSessionTtlDays;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1570548048;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Updates the game score of the specified user in a game; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetInlineGameScore extends Function<Ok> {
        /**
         * Inline message identifier.
         */
        public String inlineMessageId;
        /**
         * Pass true to edit the game message to include the current scoreboard.
         */
        public boolean editMessage;
        /**
         * User identifier.
         */
        public long userId;
        /**
         * The new score.
         */
        public int score;
        /**
         * Pass true to update the score even if it decreases. If the score is 0, the user will be deleted from the high score table.
         */
        public boolean force;

        /**
         * Default constructor for a function, which updates the game score of the specified user in a game; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetInlineGameScore() {
        }

        /**
         * Creates a function, which updates the game score of the specified user in a game; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param inlineMessageId Inline message identifier.
         * @param editMessage Pass true to edit the game message to include the current scoreboard.
         * @param userId User identifier.
         * @param score The new score.
         * @param force Pass true to update the score even if it decreases. If the score is 0, the user will be deleted from the high score table.
         */
        public SetInlineGameScore(String inlineMessageId, boolean editMessage, long userId, int score, boolean force) {
            this.inlineMessageId = inlineMessageId;
            this.editMessage = editMessage;
            this.userId = userId;
            this.score = score;
            this.force = force;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -948871797;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Selects a message sender to send messages in a live story call.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetLiveStoryMessageSender extends Function<Ok> {
        /**
         * Group call identifier.
         */
        public int groupCallId;
        /**
         * New message sender for the group call.
         */
        public MessageSender messageSenderId;

        /**
         * Default constructor for a function, which selects a message sender to send messages in a live story call.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetLiveStoryMessageSender() {
        }

        /**
         * Creates a function, which selects a message sender to send messages in a live story call.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier.
         * @param messageSenderId New message sender for the group call.
         */
        public SetLiveStoryMessageSender(int groupCallId, MessageSender messageSenderId) {
            this.groupCallId = groupCallId;
            this.messageSenderId = messageSenderId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1855297410;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets new log stream for internal logging of TDLib. Can be called synchronously.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetLogStream extends Function<Ok> {
        /**
         * New log stream.
         */
        public LogStream logStream;

        /**
         * Default constructor for a function, which sets new log stream for internal logging of TDLib. Can be called synchronously.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetLogStream() {
        }

        /**
         * Creates a function, which sets new log stream for internal logging of TDLib. Can be called synchronously.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param logStream New log stream.
         */
        public SetLogStream(LogStream logStream) {
            this.logStream = logStream;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1364199535;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets the verbosity level for a specified TDLib internal log tag. Can be called synchronously.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetLogTagVerbosityLevel extends Function<Ok> {
        /**
         * Logging tag to change verbosity level.
         */
        public String tag;
        /**
         * New verbosity level; 1-1024.
         */
        public int newVerbosityLevel;

        /**
         * Default constructor for a function, which sets the verbosity level for a specified TDLib internal log tag. Can be called synchronously.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetLogTagVerbosityLevel() {
        }

        /**
         * Creates a function, which sets the verbosity level for a specified TDLib internal log tag. Can be called synchronously.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param tag Logging tag to change verbosity level.
         * @param newVerbosityLevel New verbosity level; 1-1024.
         */
        public SetLogTagVerbosityLevel(String tag, int newVerbosityLevel) {
            this.tag = tag;
            this.newVerbosityLevel = newVerbosityLevel;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2095589738;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets the verbosity level of the internal logging of TDLib. Can be called synchronously.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetLogVerbosityLevel extends Function<Ok> {
        /**
         * New value of the verbosity level for logging. Value 0 corresponds to fatal errors, value 1 corresponds to errors, value 2 corresponds to warnings and debug warnings, value 3 corresponds to informational, value 4 corresponds to debug, value 5 corresponds to verbose debug, value greater than 5 and up to 1023 can be used to enable even more logging.
         */
        public int newVerbosityLevel;

        /**
         * Default constructor for a function, which sets the verbosity level of the internal logging of TDLib. Can be called synchronously.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetLogVerbosityLevel() {
        }

        /**
         * Creates a function, which sets the verbosity level of the internal logging of TDLib. Can be called synchronously.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param newVerbosityLevel New value of the verbosity level for logging. Value 0 corresponds to fatal errors, value 1 corresponds to errors, value 2 corresponds to warnings and debug warnings, value 3 corresponds to informational, value 4 corresponds to debug, value 5 corresponds to verbose debug, value greater than 5 and up to 1023 can be used to enable even more logging.
         */
        public SetLogVerbosityLevel(int newVerbosityLevel) {
            this.newVerbosityLevel = newVerbosityLevel;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -303429678;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the login email address of the user. The email address can be changed only if the current user already has login email and passwordState.loginEmailAddressPattern is non-empty, or the user received suggestedActionSetLoginEmailAddress and isLoginEmailAddressRequired succeeds. The change will not be applied until the new login email address is confirmed with checkLoginEmailAddressCode. To use Apple ID/Google ID instead of an email address, call checkLoginEmailAddressCode directly.
     *
     * <p> Returns {@link EmailAddressAuthenticationCodeInfo EmailAddressAuthenticationCodeInfo} </p>
     */
    public static class SetLoginEmailAddress extends Function<EmailAddressAuthenticationCodeInfo> {
        /**
         * New login email address.
         */
        public String newLoginEmailAddress;

        /**
         * Default constructor for a function, which changes the login email address of the user. The email address can be changed only if the current user already has login email and passwordState.loginEmailAddressPattern is non-empty, or the user received suggestedActionSetLoginEmailAddress and isLoginEmailAddressRequired succeeds. The change will not be applied until the new login email address is confirmed with checkLoginEmailAddressCode. To use Apple ID/Google ID instead of an email address, call checkLoginEmailAddressCode directly.
         *
         * <p> Returns {@link EmailAddressAuthenticationCodeInfo EmailAddressAuthenticationCodeInfo} </p>
         */
        public SetLoginEmailAddress() {
        }

        /**
         * Creates a function, which changes the login email address of the user. The email address can be changed only if the current user already has login email and passwordState.loginEmailAddressPattern is non-empty, or the user received suggestedActionSetLoginEmailAddress and isLoginEmailAddressRequired succeeds. The change will not be applied until the new login email address is confirmed with checkLoginEmailAddressCode. To use Apple ID/Google ID instead of an email address, call checkLoginEmailAddressCode directly.
         *
         * <p> Returns {@link EmailAddressAuthenticationCodeInfo EmailAddressAuthenticationCodeInfo} </p>
         *
         * @param newLoginEmailAddress New login email address.
         */
        public SetLoginEmailAddress(String newLoginEmailAddress) {
            this.newLoginEmailAddress = newLoginEmailAddress;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 935019476;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the main profile tab of the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetMainProfileTab extends Function<Ok> {
        /**
         * The new value of the main profile tab.
         */
        public ProfileTab mainProfileTab;

        /**
         * Default constructor for a function, which changes the main profile tab of the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetMainProfileTab() {
        }

        /**
         * Creates a function, which changes the main profile tab of the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param mainProfileTab The new value of the main profile tab.
         */
        public SetMainProfileTab(ProfileTab mainProfileTab) {
            this.mainProfileTab = mainProfileTab;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1663496423;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets access settings of a managed bot; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetManagedBotAccessSettings extends Function<Ok> {
        /**
         * Identifier of the managed bot.
         */
        public long botUserId;
        /**
         * New access settings.
         */
        public BotAccessSettings settings;

        /**
         * Default constructor for a function, which sets access settings of a managed bot; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetManagedBotAccessSettings() {
        }

        /**
         * Creates a function, which sets access settings of a managed bot; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param botUserId Identifier of the managed bot.
         * @param settings New access settings.
         */
        public SetManagedBotAccessSettings(long botUserId, BotAccessSettings settings) {
            this.botUserId = botUserId;
            this.settings = settings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -662104110;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets menu button for the given user or for all users; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetMenuButton extends Function<Ok> {
        /**
         * Identifier of the user or 0 to set menu button for all users.
         */
        public long userId;
        /**
         * New menu button.
         */
        public BotMenuButton menuButton;

        /**
         * Default constructor for a function, which sets menu button for the given user or for all users; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetMenuButton() {
        }

        /**
         * Creates a function, which sets menu button for the given user or for all users; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param userId Identifier of the user or 0 to set menu button for all users.
         * @param menuButton New menu button.
         */
        public SetMenuButton(long userId, BotMenuButton menuButton) {
            this.userId = userId;
            this.menuButton = menuButton;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1269841599;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the fact-check of a message. Can be only used if messageProperties.canSetFactCheck == true.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetMessageFactCheck extends Function<Ok> {
        /**
         * The channel chat the message belongs to.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * New text of the fact-check; 0-getOption(&quot;fact_check_length_max&quot;) characters; pass null to remove it. Only Bold, Italic, and TextUrl entities with https://t.me/ links are supported.
         */
        public FormattedText text;

        /**
         * Default constructor for a function, which changes the fact-check of a message. Can be only used if messageProperties.canSetFactCheck == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetMessageFactCheck() {
        }

        /**
         * Creates a function, which changes the fact-check of a message. Can be only used if messageProperties.canSetFactCheck == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId The channel chat the message belongs to.
         * @param messageId Identifier of the message.
         * @param text New text of the fact-check; 0-getOption(&quot;fact_check_length_max&quot;) characters; pass null to remove it. Only Bold, Italic, and TextUrl entities with https://t.me/ links are supported.
         */
        public SetMessageFactCheck(long chatId, long messageId, FormattedText text) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.text = text;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -4309752;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets reactions on a message; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetMessageReactions extends Function<Ok> {
        /**
         * Identifier of the chat to which the message belongs.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * Types of the reaction to set; pass an empty list to remove the reactions.
         */
        public ReactionType[] reactionTypes;
        /**
         * Pass true if the reactions are added with a big animation.
         */
        public boolean isBig;

        /**
         * Default constructor for a function, which sets reactions on a message; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetMessageReactions() {
        }

        /**
         * Creates a function, which sets reactions on a message; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat to which the message belongs.
         * @param messageId Identifier of the message.
         * @param reactionTypes Types of the reaction to set; pass an empty list to remove the reactions.
         * @param isBig Pass true if the reactions are added with a big animation.
         */
        public SetMessageReactions(long chatId, long messageId, ReactionType[] reactionTypes, boolean isBig) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.reactionTypes = reactionTypes;
            this.isBig = isBig;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -372524900;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the block list of a message sender. Currently, only users and supergroup chats can be blocked.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetMessageSenderBlockList extends Function<Ok> {
        /**
         * Identifier of a message sender to block/unblock.
         */
        public MessageSender senderId;
        /**
         * New block list for the message sender; pass null to unblock the message sender.
         */
        public BlockList blockList;

        /**
         * Default constructor for a function, which changes the block list of a message sender. Currently, only users and supergroup chats can be blocked.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetMessageSenderBlockList() {
        }

        /**
         * Creates a function, which changes the block list of a message sender. Currently, only users and supergroup chats can be blocked.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param senderId Identifier of a message sender to block/unblock.
         * @param blockList New block list for the message sender; pass null to unblock the message sender.
         */
        public SetMessageSenderBlockList(MessageSender senderId, BlockList blockList) {
            this.senderId = senderId;
            this.blockList = blockList;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1987355503;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the verification status of a user or a chat by an owned bot.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetMessageSenderBotVerification extends Function<Ok> {
        /**
         * Identifier of the owned bot, which will verify the user or the chat.
         */
        public long botUserId;
        /**
         * Identifier of the user or the supergroup or channel chat, which will be verified by the bot.
         */
        public MessageSender verifiedId;
        /**
         * Custom description of verification reason; 0-getOption(&quot;bot_verification_custom_description_length_max&quot;). If empty, then &quot;was verified by organization &quot;organization_name&quot;&quot; will be used as description. Can be specified only if the bot is allowed to provide custom description.
         */
        public String customDescription;

        /**
         * Default constructor for a function, which changes the verification status of a user or a chat by an owned bot.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetMessageSenderBotVerification() {
        }

        /**
         * Creates a function, which changes the verification status of a user or a chat by an owned bot.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param botUserId Identifier of the owned bot, which will verify the user or the chat.
         * @param verifiedId Identifier of the user or the supergroup or channel chat, which will be verified by the bot.
         * @param customDescription Custom description of verification reason; 0-getOption(&quot;bot_verification_custom_description_length_max&quot;). If empty, then &quot;was verified by organization &quot;organization_name&quot;&quot; will be used as description. Can be specified only if the bot is allowed to provide custom description.
         */
        public SetMessageSenderBotVerification(long botUserId, MessageSender verifiedId, String customDescription) {
            this.botUserId = botUserId;
            this.verifiedId = verifiedId;
            this.customDescription = customDescription;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1262364086;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the first and last name of the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetName extends Function<Ok> {
        /**
         * The new value of the first name for the current user; 1-64 characters.
         */
        public String firstName;
        /**
         * The new value of the optional last name for the current user; 0-64 characters.
         */
        public String lastName;

        /**
         * Default constructor for a function, which changes the first and last name of the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetName() {
        }

        /**
         * Creates a function, which changes the first and last name of the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param firstName The new value of the first name for the current user; 1-64 characters.
         * @param lastName The new value of the optional last name for the current user; 0-64 characters.
         */
        public SetName(String firstName, String lastName) {
            this.firstName = firstName;
            this.lastName = lastName;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1711693584;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets the current network type. Can be called before authorization. Calling this method forces all network connections to reopen, mitigating the delay in switching between different networks, so it must be called whenever the network is changed, even if the network type remains the same. Network type is used to check whether the library can use the network at all and also for collecting detailed network data usage statistics.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetNetworkType extends Function<Ok> {
        /**
         * The new network type; pass null to set network type to networkTypeOther.
         */
        public NetworkType type;

        /**
         * Default constructor for a function, which sets the current network type. Can be called before authorization. Calling this method forces all network connections to reopen, mitigating the delay in switching between different networks, so it must be called whenever the network is changed, even if the network type remains the same. Network type is used to check whether the library can use the network at all and also for collecting detailed network data usage statistics.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetNetworkType() {
        }

        /**
         * Creates a function, which sets the current network type. Can be called before authorization. Calling this method forces all network connections to reopen, mitigating the delay in switching between different networks, so it must be called whenever the network is changed, even if the network type remains the same. Network type is used to check whether the library can use the network at all and also for collecting detailed network data usage statistics.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param type The new network type; pass null to set network type to networkTypeOther.
         */
        public SetNetworkType(NetworkType type) {
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -701635234;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes privacy settings for new chat creation; can be used only if getOption(&quot;can_set_new_chat_privacy_settings&quot;).
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetNewChatPrivacySettings extends Function<Ok> {
        /**
         * New settings.
         */
        public NewChatPrivacySettings settings;

        /**
         * Default constructor for a function, which changes privacy settings for new chat creation; can be used only if getOption(&quot;can_set_new_chat_privacy_settings&quot;).
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetNewChatPrivacySettings() {
        }

        /**
         * Creates a function, which changes privacy settings for new chat creation; can be used only if getOption(&quot;can_set_new_chat_privacy_settings&quot;).
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param settings New settings.
         */
        public SetNewChatPrivacySettings(NewChatPrivacySettings settings) {
            this.settings = settings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1774139215;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets the value of an option. (Check the list of available options on https://core.telegram.org/tdlib/options.) Only writable options can be set. Can be called before authorization.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetOption extends Function<Ok> {
        /**
         * The name of the option.
         */
        public String name;
        /**
         * The new value of the option; pass null to reset option value to a default value.
         */
        public OptionValue value;

        /**
         * Default constructor for a function, which sets the value of an option. (Check the list of available options on https://core.telegram.org/tdlib/options.) Only writable options can be set. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetOption() {
        }

        /**
         * Creates a function, which sets the value of an option. (Check the list of available options on https://core.telegram.org/tdlib/options.) Only writable options can be set. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param name The name of the option.
         * @param value The new value of the option; pass null to reset option value to a default value.
         */
        public SetOption(String name, OptionValue value) {
            this.name = name;
            this.value = value;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2114670322;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes type of paid message reaction of the current user on a message. The message must have paid reaction added by the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetPaidMessageReactionType extends Function<Ok> {
        /**
         * Identifier of the chat to which the message belongs.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * New type of the paid reaction.
         */
        public PaidReactionType type;

        /**
         * Default constructor for a function, which changes type of paid message reaction of the current user on a message. The message must have paid reaction added by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetPaidMessageReactionType() {
        }

        /**
         * Creates a function, which changes type of paid message reaction of the current user on a message. The message must have paid reaction added by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat to which the message belongs.
         * @param messageId Identifier of the message.
         * @param type New type of the paid reaction.
         */
        public SetPaidMessageReactionType(long chatId, long messageId, PaidReactionType type) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.type = type;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -829934930;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds an element to the user's Telegram Passport. May return an error with a message &quot;PHONE_VERIFICATION_NEEDED&quot; or &quot;EMAIL_VERIFICATION_NEEDED&quot; if the chosen phone number or the chosen email address must be verified first.
     *
     * <p> Returns {@link PassportElement PassportElement} </p>
     */
    public static class SetPassportElement extends Function<PassportElement> {
        /**
         * Input Telegram Passport element.
         */
        public InputPassportElement element;
        /**
         * The 2-step verification password of the current user.
         */
        public String password;

        /**
         * Default constructor for a function, which adds an element to the user's Telegram Passport. May return an error with a message &quot;PHONE_VERIFICATION_NEEDED&quot; or &quot;EMAIL_VERIFICATION_NEEDED&quot; if the chosen phone number or the chosen email address must be verified first.
         *
         * <p> Returns {@link PassportElement PassportElement} </p>
         */
        public SetPassportElement() {
        }

        /**
         * Creates a function, which adds an element to the user's Telegram Passport. May return an error with a message &quot;PHONE_VERIFICATION_NEEDED&quot; or &quot;EMAIL_VERIFICATION_NEEDED&quot; if the chosen phone number or the chosen email address must be verified first.
         *
         * <p> Returns {@link PassportElement PassportElement} </p>
         *
         * @param element Input Telegram Passport element.
         * @param password The 2-step verification password of the current user.
         */
        public SetPassportElement(InputPassportElement element, String password) {
            this.element = element;
            this.password = password;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2068173212;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs the user who some of the elements in their Telegram Passport contain errors; for bots only. The user will not be able to resend the elements, until the errors are fixed.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetPassportElementErrors extends Function<Ok> {
        /**
         * User identifier.
         */
        public long userId;
        /**
         * The errors.
         */
        public InputPassportElementError[] errors;

        /**
         * Default constructor for a function, which informs the user who some of the elements in their Telegram Passport contain errors; for bots only. The user will not be able to resend the elements, until the errors are fixed.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetPassportElementErrors() {
        }

        /**
         * Creates a function, which informs the user who some of the elements in their Telegram Passport contain errors; for bots only. The user will not be able to resend the elements, until the errors are fixed.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param userId User identifier.
         * @param errors The errors.
         */
        public SetPassportElementErrors(long userId, InputPassportElementError[] errors) {
            this.userId = userId;
            this.errors = errors;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2056754881;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the 2-step verification password for the current user. If a new recovery email address is specified, then the change will not be applied until the new recovery email address is confirmed.
     *
     * <p> Returns {@link PasswordState PasswordState} </p>
     */
    public static class SetPassword extends Function<PasswordState> {
        /**
         * Previous 2-step verification password of the user.
         */
        public String oldPassword;
        /**
         * New 2-step verification password of the user; may be empty to remove the password.
         */
        public String newPassword;
        /**
         * New password hint; may be empty.
         */
        public String newHint;
        /**
         * Pass true to change also the recovery email address.
         */
        public boolean setRecoveryEmailAddress;
        /**
         * New recovery email address; may be empty.
         */
        public String newRecoveryEmailAddress;

        /**
         * Default constructor for a function, which changes the 2-step verification password for the current user. If a new recovery email address is specified, then the change will not be applied until the new recovery email address is confirmed.
         *
         * <p> Returns {@link PasswordState PasswordState} </p>
         */
        public SetPassword() {
        }

        /**
         * Creates a function, which changes the 2-step verification password for the current user. If a new recovery email address is specified, then the change will not be applied until the new recovery email address is confirmed.
         *
         * <p> Returns {@link PasswordState PasswordState} </p>
         *
         * @param oldPassword Previous 2-step verification password of the user.
         * @param newPassword New 2-step verification password of the user; may be empty to remove the password.
         * @param newHint New password hint; may be empty.
         * @param setRecoveryEmailAddress Pass true to change also the recovery email address.
         * @param newRecoveryEmailAddress New recovery email address; may be empty.
         */
        public SetPassword(String oldPassword, String newPassword, String newHint, boolean setRecoveryEmailAddress, String newRecoveryEmailAddress) {
            this.oldPassword = oldPassword;
            this.newPassword = newPassword;
            this.newHint = newHint;
            this.setRecoveryEmailAddress = setRecoveryEmailAddress;
            this.newRecoveryEmailAddress = newRecoveryEmailAddress;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1193589027;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the personal chat of the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetPersonalChat extends Function<Ok> {
        /**
         * Identifier of the new personal chat; pass 0 to remove the chat. Use getSuitablePersonalChats to get suitable chats.
         */
        public long chatId;

        /**
         * Default constructor for a function, which changes the personal chat of the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetPersonalChat() {
        }

        /**
         * Creates a function, which changes the personal chat of the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the new personal chat; pass 0 to remove the chat. Use getSuitablePersonalChats to get suitable chats.
         */
        public SetPersonalChat(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1068782668;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the order of pinned chats.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetPinnedChats extends Function<Ok> {
        /**
         * Chat list in which to change the order of pinned chats.
         */
        public ChatList chatList;
        /**
         * The new list of pinned chats.
         */
        public long[] chatIds;

        /**
         * Default constructor for a function, which changes the order of pinned chats.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetPinnedChats() {
        }

        /**
         * Creates a function, which changes the order of pinned chats.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatList Chat list in which to change the order of pinned chats.
         * @param chatIds The new list of pinned chats.
         */
        public SetPinnedChats(ChatList chatList, long[] chatIds) {
            this.chatList = chatList;
            this.chatIds = chatIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -695640000;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the order of pinned topics in a forum supergroup chat or a chat with a bot with topics; requires canManageTopics administrator right in the supergroup.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetPinnedForumTopics extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The new list of identifiers of the pinned forum topics.
         */
        public int[] forumTopicIds;

        /**
         * Default constructor for a function, which changes the order of pinned topics in a forum supergroup chat or a chat with a bot with topics; requires canManageTopics administrator right in the supergroup.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetPinnedForumTopics() {
        }

        /**
         * Creates a function, which changes the order of pinned topics in a forum supergroup chat or a chat with a bot with topics; requires canManageTopics administrator right in the supergroup.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param forumTopicIds The new list of identifiers of the pinned forum topics.
         */
        public SetPinnedForumTopics(long chatId, int[] forumTopicIds) {
            this.chatId = chatId;
            this.forumTopicIds = forumTopicIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1871668497;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the list of pinned gifts on the current user's or the channel's profile page; requires canPostMessages administrator right in the channel chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetPinnedGifts extends Function<Ok> {
        /**
         * Identifier of the user or the channel chat that received the gifts.
         */
        public MessageSender ownerId;
        /**
         * New list of pinned gifts. All gifts must be upgraded and saved on the profile page first. There can be up to getOption(&quot;pinned_gift_count_max&quot;) pinned gifts.
         */
        public String[] receivedGiftIds;

        /**
         * Default constructor for a function, which changes the list of pinned gifts on the current user's or the channel's profile page; requires canPostMessages administrator right in the channel chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetPinnedGifts() {
        }

        /**
         * Creates a function, which changes the list of pinned gifts on the current user's or the channel's profile page; requires canPostMessages administrator right in the channel chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param ownerId Identifier of the user or the channel chat that received the gifts.
         * @param receivedGiftIds New list of pinned gifts. All gifts must be upgraded and saved on the profile page first. There can be up to getOption(&quot;pinned_gift_count_max&quot;) pinned gifts.
         */
        public SetPinnedGifts(MessageSender ownerId, String[] receivedGiftIds) {
            this.ownerId = ownerId;
            this.receivedGiftIds = receivedGiftIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1613526306;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the order of pinned Saved Messages topics.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetPinnedSavedMessagesTopics extends Function<Ok> {
        /**
         * Identifiers of the new pinned Saved Messages topics.
         */
        public long[] savedMessagesTopicIds;

        /**
         * Default constructor for a function, which changes the order of pinned Saved Messages topics.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetPinnedSavedMessagesTopics() {
        }

        /**
         * Creates a function, which changes the order of pinned Saved Messages topics.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param savedMessagesTopicIds Identifiers of the new pinned Saved Messages topics.
         */
        public SetPinnedSavedMessagesTopics(long[] savedMessagesTopicIds) {
            this.savedMessagesTopicIds = savedMessagesTopicIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -194818924;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the user answer to a poll.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetPollAnswer extends Function<Ok> {
        /**
         * Identifier of the chat to which the poll belongs.
         */
        public long chatId;
        /**
         * Identifier of the message containing the poll.
         */
        public long messageId;
        /**
         * 0-based identifiers of answer options, chosen by the user. User can choose more than 1 answer option only is the poll allows multiple answers.
         */
        public int[] optionIds;

        /**
         * Default constructor for a function, which changes the user answer to a poll.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetPollAnswer() {
        }

        /**
         * Creates a function, which changes the user answer to a poll.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat to which the poll belongs.
         * @param messageId Identifier of the message containing the poll.
         * @param optionIds 0-based identifiers of answer options, chosen by the user. User can choose more than 1 answer option only is the poll allows multiple answers.
         */
        public SetPollAnswer(long chatId, long messageId, int[] optionIds) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.optionIds = optionIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1399388792;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes accent color and background custom emoji for profile of the current user; for Telegram Premium users only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetProfileAccentColor extends Function<Ok> {
        /**
         * Identifier of the accent color to use for profile; pass -1 if none.
         */
        public int profileAccentColorId;
        /**
         * Identifier of a custom emoji to be shown on the user's profile photo background; 0 if none.
         */
        public long profileBackgroundCustomEmojiId;

        /**
         * Default constructor for a function, which changes accent color and background custom emoji for profile of the current user; for Telegram Premium users only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetProfileAccentColor() {
        }

        /**
         * Creates a function, which changes accent color and background custom emoji for profile of the current user; for Telegram Premium users only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param profileAccentColorId Identifier of the accent color to use for profile; pass -1 if none.
         * @param profileBackgroundCustomEmojiId Identifier of a custom emoji to be shown on the user's profile photo background; 0 if none.
         */
        public SetProfileAccentColor(int profileAccentColorId, long profileBackgroundCustomEmojiId) {
            this.profileAccentColorId = profileAccentColorId;
            this.profileBackgroundCustomEmojiId = profileBackgroundCustomEmojiId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1986281112;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes position of an audio file in the profile audio files of the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetProfileAudioPosition extends Function<Ok> {
        /**
         * Identifier of the file from profile audio files, which position will be changed.
         */
        public int fileId;
        /**
         * Identifier of the file from profile audio files after which the file will be positioned; pass 0 to move the file to the beginning of the list.
         */
        public int afterFileId;

        /**
         * Default constructor for a function, which changes position of an audio file in the profile audio files of the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetProfileAudioPosition() {
        }

        /**
         * Creates a function, which changes position of an audio file in the profile audio files of the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param fileId Identifier of the file from profile audio files, which position will be changed.
         * @param afterFileId Identifier of the file from profile audio files after which the file will be positioned; pass 0 to move the file to the beginning of the list.
         */
        public SetProfileAudioPosition(int fileId, int afterFileId) {
            this.fileId = fileId;
            this.afterFileId = afterFileId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1209963614;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes a profile photo for the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetProfilePhoto extends Function<Ok> {
        /**
         * Profile photo to set.
         */
        public InputChatPhoto photo;
        /**
         * Pass true to set the public photo, which will be visible even if the main photo is hidden by privacy settings.
         */
        public boolean isPublic;

        /**
         * Default constructor for a function, which changes a profile photo for the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetProfilePhoto() {
        }

        /**
         * Creates a function, which changes a profile photo for the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param photo Profile photo to set.
         * @param isPublic Pass true to set the public photo, which will be visible even if the main photo is hidden by privacy settings.
         */
        public SetProfilePhoto(InputChatPhoto photo, boolean isPublic) {
            this.photo = photo;
            this.isPublic = isPublic;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2048260627;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes name of a quick reply shortcut.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetQuickReplyShortcutName extends Function<Ok> {
        /**
         * Unique identifier of the quick reply shortcut.
         */
        public int shortcutId;
        /**
         * New name for the shortcut. Use checkQuickReplyShortcutName to check its validness.
         */
        public String name;

        /**
         * Default constructor for a function, which changes name of a quick reply shortcut.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetQuickReplyShortcutName() {
        }

        /**
         * Creates a function, which changes name of a quick reply shortcut.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param shortcutId Unique identifier of the quick reply shortcut.
         * @param name New name for the shortcut. Use checkQuickReplyShortcutName to check its validness.
         */
        public SetQuickReplyShortcutName(int shortcutId, String name) {
            this.shortcutId = shortcutId;
            this.name = name;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 186709105;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes notification settings for reactions.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetReactionNotificationSettings extends Function<Ok> {
        /**
         * The new notification settings for reactions.
         */
        public ReactionNotificationSettings notificationSettings;

        /**
         * Default constructor for a function, which changes notification settings for reactions.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetReactionNotificationSettings() {
        }

        /**
         * Creates a function, which changes notification settings for reactions.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param notificationSettings The new notification settings for reactions.
         */
        public SetReactionNotificationSettings(ReactionNotificationSettings notificationSettings) {
            this.notificationSettings = notificationSettings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1186124949;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes privacy settings for message read date.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetReadDatePrivacySettings extends Function<Ok> {
        /**
         * New settings.
         */
        public ReadDatePrivacySettings settings;

        /**
         * Default constructor for a function, which changes privacy settings for message read date.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetReadDatePrivacySettings() {
        }

        /**
         * Creates a function, which changes privacy settings for message read date.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param settings New settings.
         */
        public SetReadDatePrivacySettings(ReadDatePrivacySettings settings) {
            this.settings = settings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 493913782;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the 2-step verification recovery email address of the user. If a new recovery email address is specified, then the change will not be applied until the new recovery email address is confirmed. If newRecoveryEmailAddress is the same as the email address that is currently set up, this call succeeds immediately and aborts all other requests waiting for an email confirmation.
     *
     * <p> Returns {@link PasswordState PasswordState} </p>
     */
    public static class SetRecoveryEmailAddress extends Function<PasswordState> {
        /**
         * The 2-step verification password of the current user.
         */
        public String password;
        /**
         * New recovery email address.
         */
        public String newRecoveryEmailAddress;

        /**
         * Default constructor for a function, which changes the 2-step verification recovery email address of the user. If a new recovery email address is specified, then the change will not be applied until the new recovery email address is confirmed. If newRecoveryEmailAddress is the same as the email address that is currently set up, this call succeeds immediately and aborts all other requests waiting for an email confirmation.
         *
         * <p> Returns {@link PasswordState PasswordState} </p>
         */
        public SetRecoveryEmailAddress() {
        }

        /**
         * Creates a function, which changes the 2-step verification recovery email address of the user. If a new recovery email address is specified, then the change will not be applied until the new recovery email address is confirmed. If newRecoveryEmailAddress is the same as the email address that is currently set up, this call succeeds immediately and aborts all other requests waiting for an email confirmation.
         *
         * <p> Returns {@link PasswordState PasswordState} </p>
         *
         * @param password The 2-step verification password of the current user.
         * @param newRecoveryEmailAddress New recovery email address.
         */
        public SetRecoveryEmailAddress(String password, String newRecoveryEmailAddress) {
            this.password = password;
            this.newRecoveryEmailAddress = newRecoveryEmailAddress;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1981836385;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes label of a Saved Messages tag; for Telegram Premium users only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetSavedMessagesTagLabel extends Function<Ok> {
        /**
         * The tag which label will be changed.
         */
        public ReactionType tag;
        /**
         * New label for the tag; 0-12 characters.
         */
        public String label;

        /**
         * Default constructor for a function, which changes label of a Saved Messages tag; for Telegram Premium users only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetSavedMessagesTagLabel() {
        }

        /**
         * Creates a function, which changes label of a Saved Messages tag; for Telegram Premium users only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param tag The tag which label will be changed.
         * @param label New label for the tag; 0-12 characters.
         */
        public SetSavedMessagesTagLabel(ReactionType tag, String label) {
            this.tag = tag;
            this.label = label;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1338323696;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes notification settings for chats of a given type.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetScopeNotificationSettings extends Function<Ok> {
        /**
         * Types of chats for which to change the notification settings.
         */
        public NotificationSettingsScope scope;
        /**
         * The new notification settings for the given scope.
         */
        public ScopeNotificationSettings notificationSettings;

        /**
         * Default constructor for a function, which changes notification settings for chats of a given type.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetScopeNotificationSettings() {
        }

        /**
         * Creates a function, which changes notification settings for chats of a given type.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param scope Types of chats for which to change the notification settings.
         * @param notificationSettings The new notification settings for the given scope.
         */
        public SetScopeNotificationSettings(NotificationSettingsScope scope, ScopeNotificationSettings notificationSettings) {
            this.scope = scope;
            this.notificationSettings = notificationSettings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2049984966;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the list of emojis corresponding to a sticker. The sticker must belong to a regular or custom emoji sticker set that is owned by the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetStickerEmojis extends Function<Ok> {
        /**
         * Sticker.
         */
        public InputFile sticker;
        /**
         * New string with 1-20 emoji corresponding to the sticker.
         */
        public String emojis;

        /**
         * Default constructor for a function, which changes the list of emojis corresponding to a sticker. The sticker must belong to a regular or custom emoji sticker set that is owned by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetStickerEmojis() {
        }

        /**
         * Creates a function, which changes the list of emojis corresponding to a sticker. The sticker must belong to a regular or custom emoji sticker set that is owned by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param sticker Sticker.
         * @param emojis New string with 1-20 emoji corresponding to the sticker.
         */
        public SetStickerEmojis(InputFile sticker, String emojis) {
            this.sticker = sticker;
            this.emojis = emojis;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -638843855;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the list of keywords of a sticker. The sticker must belong to a regular or custom emoji sticker set that is owned by the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetStickerKeywords extends Function<Ok> {
        /**
         * Sticker.
         */
        public InputFile sticker;
        /**
         * List of up to 20 keywords with total length up to 64 characters, which can be used to find the sticker.
         */
        public String[] keywords;

        /**
         * Default constructor for a function, which changes the list of keywords of a sticker. The sticker must belong to a regular or custom emoji sticker set that is owned by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetStickerKeywords() {
        }

        /**
         * Creates a function, which changes the list of keywords of a sticker. The sticker must belong to a regular or custom emoji sticker set that is owned by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param sticker Sticker.
         * @param keywords List of up to 20 keywords with total length up to 64 characters, which can be used to find the sticker.
         */
        public SetStickerKeywords(InputFile sticker, String[] keywords) {
            this.sticker = sticker;
            this.keywords = keywords;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 137223565;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the mask position of a mask sticker. The sticker must belong to a mask sticker set that is owned by the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetStickerMaskPosition extends Function<Ok> {
        /**
         * Sticker.
         */
        public InputFile sticker;
        /**
         * Position where the mask is placed; pass null to remove mask position.
         */
        public MaskPosition maskPosition;

        /**
         * Default constructor for a function, which changes the mask position of a mask sticker. The sticker must belong to a mask sticker set that is owned by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetStickerMaskPosition() {
        }

        /**
         * Creates a function, which changes the mask position of a mask sticker. The sticker must belong to a mask sticker set that is owned by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param sticker Sticker.
         * @param maskPosition Position where the mask is placed; pass null to remove mask position.
         */
        public SetStickerMaskPosition(InputFile sticker, MaskPosition maskPosition) {
            this.sticker = sticker;
            this.maskPosition = maskPosition;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1202280912;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the position of a sticker in the set to which it belongs. The sticker set must be owned by the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetStickerPositionInSet extends Function<Ok> {
        /**
         * Sticker.
         */
        public InputFile sticker;
        /**
         * New position of the sticker in the set, 0-based.
         */
        public int position;

        /**
         * Default constructor for a function, which changes the position of a sticker in the set to which it belongs. The sticker set must be owned by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetStickerPositionInSet() {
        }

        /**
         * Creates a function, which changes the position of a sticker in the set to which it belongs. The sticker set must be owned by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param sticker Sticker.
         * @param position New position of the sticker in the set, 0-based.
         */
        public SetStickerPositionInSet(InputFile sticker, int position) {
            this.sticker = sticker;
            this.position = position;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2075281185;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets a sticker set thumbnail.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetStickerSetThumbnail extends Function<Ok> {
        /**
         * Sticker set owner; ignored for regular users.
         */
        public long userId;
        /**
         * Sticker set name. The sticker set must be owned by the current user.
         */
        public String name;
        /**
         * Thumbnail to set; pass null to remove the sticker set thumbnail.
         */
        public InputFile thumbnail;
        /**
         * Format of the thumbnail; pass null if thumbnail is removed.
         */
        public StickerFormat format;

        /**
         * Default constructor for a function, which sets a sticker set thumbnail.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetStickerSetThumbnail() {
        }

        /**
         * Creates a function, which sets a sticker set thumbnail.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param userId Sticker set owner; ignored for regular users.
         * @param name Sticker set name. The sticker set must be owned by the current user.
         * @param thumbnail Thumbnail to set; pass null to remove the sticker set thumbnail.
         * @param format Format of the thumbnail; pass null if thumbnail is removed.
         */
        public SetStickerSetThumbnail(long userId, String name, InputFile thumbnail, StickerFormat format) {
            this.userId = userId;
            this.name = name;
            this.thumbnail = thumbnail;
            this.format = format;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1677617458;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets a sticker set title.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetStickerSetTitle extends Function<Ok> {
        /**
         * Sticker set name. The sticker set must be owned by the current user.
         */
        public String name;
        /**
         * New sticker set title.
         */
        public String title;

        /**
         * Default constructor for a function, which sets a sticker set title.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetStickerSetTitle() {
        }

        /**
         * Creates a function, which sets a sticker set title.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param name Sticker set name. The sticker set must be owned by the current user.
         * @param title New sticker set title.
         */
        public SetStickerSetTitle(String name, String title) {
            this.name = name;
            this.title = title;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1693004706;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes name of an album of stories. If the album is owned by a supergroup or a channel chat, then requires canEditStories administrator right in the chat. Returns the changed album.
     *
     * <p> Returns {@link StoryAlbum StoryAlbum} </p>
     */
    public static class SetStoryAlbumName extends Function<StoryAlbum> {
        /**
         * Identifier of the chat that owns the stories.
         */
        public long chatId;
        /**
         * Identifier of the story album.
         */
        public int storyAlbumId;
        /**
         * New name of the album; 1-12 characters.
         */
        public String name;

        /**
         * Default constructor for a function, which changes name of an album of stories. If the album is owned by a supergroup or a channel chat, then requires canEditStories administrator right in the chat. Returns the changed album.
         *
         * <p> Returns {@link StoryAlbum StoryAlbum} </p>
         */
        public SetStoryAlbumName() {
        }

        /**
         * Creates a function, which changes name of an album of stories. If the album is owned by a supergroup or a channel chat, then requires canEditStories administrator right in the chat. Returns the changed album.
         *
         * <p> Returns {@link StoryAlbum StoryAlbum} </p>
         *
         * @param chatId Identifier of the chat that owns the stories.
         * @param storyAlbumId Identifier of the story album.
         * @param name New name of the album; 1-12 characters.
         */
        public SetStoryAlbumName(long chatId, int storyAlbumId, String name) {
            this.chatId = chatId;
            this.storyAlbumId = storyAlbumId;
            this.name = name;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1143129794;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes privacy settings of a story. The method can be called only for stories posted on behalf of the current user and if story.canSetPrivacySettings == true.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetStoryPrivacySettings extends Function<Ok> {
        /**
         * Identifier of the story.
         */
        public int storyId;
        /**
         * The new privacy settings for the story.
         */
        public StoryPrivacySettings privacySettings;

        /**
         * Default constructor for a function, which changes privacy settings of a story. The method can be called only for stories posted on behalf of the current user and if story.canSetPrivacySettings == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetStoryPrivacySettings() {
        }

        /**
         * Creates a function, which changes privacy settings of a story. The method can be called only for stories posted on behalf of the current user and if story.canSetPrivacySettings == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param storyId Identifier of the story.
         * @param privacySettings The new privacy settings for the story.
         */
        public SetStoryPrivacySettings(int storyId, StoryPrivacySettings privacySettings) {
            this.storyId = storyId;
            this.privacySettings = privacySettings;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -655801550;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes chosen reaction on a story that has already been sent; not supported for live stories.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetStoryReaction extends Function<Ok> {
        /**
         * The identifier of the poster of the story.
         */
        public long storyPosterChatId;
        /**
         * The identifier of the story.
         */
        public int storyId;
        /**
         * Type of the reaction to set; pass null to remove the reaction. Custom emoji reactions can be used only by Telegram Premium users. Paid reactions can't be set.
         */
        public ReactionType reactionType;
        /**
         * Pass true if the reaction needs to be added to recent reactions.
         */
        public boolean updateRecentReactions;

        /**
         * Default constructor for a function, which changes chosen reaction on a story that has already been sent; not supported for live stories.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetStoryReaction() {
        }

        /**
         * Creates a function, which changes chosen reaction on a story that has already been sent; not supported for live stories.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param storyPosterChatId The identifier of the poster of the story.
         * @param storyId The identifier of the story.
         * @param reactionType Type of the reaction to set; pass null to remove the reaction. Custom emoji reactions can be used only by Telegram Premium users. Paid reactions can't be set.
         * @param updateRecentReactions Pass true if the reaction needs to be added to recent reactions.
         */
        public SetStoryReaction(long storyPosterChatId, int storyId, ReactionType reactionType, boolean updateRecentReactions) {
            this.storyPosterChatId = storyPosterChatId;
            this.storyId = storyId;
            this.reactionType = reactionType;
            this.updateRecentReactions = updateRecentReactions;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 250731529;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the custom emoji sticker set of a supergroup; requires canChangeInfo administrator right. The chat must have at least chatBoostFeatures.minCustomEmojiStickerSetBoostLevel boost level to pass the corresponding color.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetSupergroupCustomEmojiStickerSet extends Function<Ok> {
        /**
         * Identifier of the supergroup.
         */
        public long supergroupId;
        /**
         * New value of the custom emoji sticker set identifier for the supergroup. Use 0 to remove the custom emoji sticker set in the supergroup.
         */
        public long customEmojiStickerSetId;

        /**
         * Default constructor for a function, which changes the custom emoji sticker set of a supergroup; requires canChangeInfo administrator right. The chat must have at least chatBoostFeatures.minCustomEmojiStickerSetBoostLevel boost level to pass the corresponding color.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetSupergroupCustomEmojiStickerSet() {
        }

        /**
         * Creates a function, which changes the custom emoji sticker set of a supergroup; requires canChangeInfo administrator right. The chat must have at least chatBoostFeatures.minCustomEmojiStickerSetBoostLevel boost level to pass the corresponding color.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param supergroupId Identifier of the supergroup.
         * @param customEmojiStickerSetId New value of the custom emoji sticker set identifier for the supergroup. Use 0 to remove the custom emoji sticker set in the supergroup.
         */
        public SetSupergroupCustomEmojiStickerSet(long supergroupId, long customEmojiStickerSetId) {
            this.supergroupId = supergroupId;
            this.customEmojiStickerSetId = customEmojiStickerSetId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1328894639;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the main profile tab of the channel; requires canChangeInfo administrator right.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetSupergroupMainProfileTab extends Function<Ok> {
        /**
         * Identifier of the channel.
         */
        public long supergroupId;
        /**
         * The new value of the main profile tab.
         */
        public ProfileTab mainProfileTab;

        /**
         * Default constructor for a function, which changes the main profile tab of the channel; requires canChangeInfo administrator right.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetSupergroupMainProfileTab() {
        }

        /**
         * Creates a function, which changes the main profile tab of the channel; requires canChangeInfo administrator right.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param supergroupId Identifier of the channel.
         * @param mainProfileTab The new value of the main profile tab.
         */
        public SetSupergroupMainProfileTab(long supergroupId, ProfileTab mainProfileTab) {
            this.supergroupId = supergroupId;
            this.mainProfileTab = mainProfileTab;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1314899548;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the sticker set of a supergroup; requires canChangeInfo administrator right.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetSupergroupStickerSet extends Function<Ok> {
        /**
         * Identifier of the supergroup.
         */
        public long supergroupId;
        /**
         * New value of the supergroup sticker set identifier. Use 0 to remove the supergroup sticker set.
         */
        public long stickerSetId;

        /**
         * Default constructor for a function, which changes the sticker set of a supergroup; requires canChangeInfo administrator right.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetSupergroupStickerSet() {
        }

        /**
         * Creates a function, which changes the sticker set of a supergroup; requires canChangeInfo administrator right.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param supergroupId Identifier of the supergroup.
         * @param stickerSetId New value of the supergroup sticker set identifier. Use 0 to remove the supergroup sticker set.
         */
        public SetSupergroupStickerSet(long supergroupId, long stickerSetId) {
            this.supergroupId = supergroupId;
            this.stickerSetId = stickerSetId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2056344215;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the number of times the supergroup must be boosted by a user to ignore slow mode and chat permission restrictions; requires canRestrictMembers administrator right.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetSupergroupUnrestrictBoostCount extends Function<Ok> {
        /**
         * Identifier of the supergroup.
         */
        public long supergroupId;
        /**
         * New value of the unrestrictBoostCount supergroup setting; 0-8. Use 0 to remove the setting.
         */
        public int unrestrictBoostCount;

        /**
         * Default constructor for a function, which changes the number of times the supergroup must be boosted by a user to ignore slow mode and chat permission restrictions; requires canRestrictMembers administrator right.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetSupergroupUnrestrictBoostCount() {
        }

        /**
         * Creates a function, which changes the number of times the supergroup must be boosted by a user to ignore slow mode and chat permission restrictions; requires canRestrictMembers administrator right.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param supergroupId Identifier of the supergroup.
         * @param unrestrictBoostCount New value of the unrestrictBoostCount supergroup setting; 0-8. Use 0 to remove the setting.
         */
        public SetSupergroupUnrestrictBoostCount(long supergroupId, int unrestrictBoostCount) {
            this.supergroupId = supergroupId;
            this.unrestrictBoostCount = unrestrictBoostCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 969814179;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the editable username of a supergroup or channel, requires owner privileges in the supergroup or channel.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetSupergroupUsername extends Function<Ok> {
        /**
         * Identifier of the supergroup or channel.
         */
        public long supergroupId;
        /**
         * New value of the username. Use an empty string to remove the username. The username can't be completely removed if there is another active or disabled username.
         */
        public String username;

        /**
         * Default constructor for a function, which changes the editable username of a supergroup or channel, requires owner privileges in the supergroup or channel.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetSupergroupUsername() {
        }

        /**
         * Creates a function, which changes the editable username of a supergroup or channel, requires owner privileges in the supergroup or channel.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param supergroupId Identifier of the supergroup or channel.
         * @param username New value of the username. Use an empty string to remove the username. The username can't be completely removed if there is another active or disabled username.
         */
        public SetSupergroupUsername(long supergroupId, String username) {
            this.supergroupId = supergroupId;
            this.username = username;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1346325252;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets the parameters for TDLib initialization. Works only when the current authorization state is authorizationStateWaitTdlibParameters.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetTdlibParameters extends Function<Ok> {
        /**
         * Pass true to use Telegram test environment instead of the production environment.
         */
        public boolean useTestDc;
        /**
         * The path to the directory for the persistent database; if empty, the current working directory will be used.
         */
        public String databaseDirectory;
        /**
         * The path to the directory for storing files; if empty, databaseDirectory will be used.
         */
        public String filesDirectory;
        /**
         * Encryption key for the database. If the encryption key is invalid, then an error with code 401 will be returned.
         */
        public byte[] databaseEncryptionKey;
        /**
         * Pass true to keep information about downloaded and uploaded files between application restarts.
         */
        public boolean useFileDatabase;
        /**
         * Pass true to keep cache of users, basic groups, supergroups, channels and secret chats between restarts. Implies useFileDatabase.
         */
        public boolean useChatInfoDatabase;
        /**
         * Pass true to keep cache of chats and messages between restarts. Implies useChatInfoDatabase.
         */
        public boolean useMessageDatabase;
        /**
         * Pass true to enable support for secret chats.
         */
        public boolean useSecretChats;
        /**
         * Application identifier for Telegram API access, which can be obtained at https://my.telegram.org.
         */
        public int apiId;
        /**
         * Application identifier hash for Telegram API access, which can be obtained at https://my.telegram.org.
         */
        public String apiHash;
        /**
         * IETF language tag of the user's operating system language; must be non-empty.
         */
        public String systemLanguageCode;
        /**
         * Model of the device the application is being run on; must be non-empty.
         */
        public String deviceModel;
        /**
         * Version of the operating system the application is being run on. If empty, the version is automatically detected by TDLib.
         */
        public String systemVersion;
        /**
         * Application version; must be non-empty.
         */
        public String applicationVersion;

        /**
         * Default constructor for a function, which sets the parameters for TDLib initialization. Works only when the current authorization state is authorizationStateWaitTdlibParameters.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetTdlibParameters() {
        }

        /**
         * Creates a function, which sets the parameters for TDLib initialization. Works only when the current authorization state is authorizationStateWaitTdlibParameters.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param useTestDc Pass true to use Telegram test environment instead of the production environment.
         * @param databaseDirectory The path to the directory for the persistent database; if empty, the current working directory will be used.
         * @param filesDirectory The path to the directory for storing files; if empty, databaseDirectory will be used.
         * @param databaseEncryptionKey Encryption key for the database. If the encryption key is invalid, then an error with code 401 will be returned.
         * @param useFileDatabase Pass true to keep information about downloaded and uploaded files between application restarts.
         * @param useChatInfoDatabase Pass true to keep cache of users, basic groups, supergroups, channels and secret chats between restarts. Implies useFileDatabase.
         * @param useMessageDatabase Pass true to keep cache of chats and messages between restarts. Implies useChatInfoDatabase.
         * @param useSecretChats Pass true to enable support for secret chats.
         * @param apiId Application identifier for Telegram API access, which can be obtained at https://my.telegram.org.
         * @param apiHash Application identifier hash for Telegram API access, which can be obtained at https://my.telegram.org.
         * @param systemLanguageCode IETF language tag of the user's operating system language; must be non-empty.
         * @param deviceModel Model of the device the application is being run on; must be non-empty.
         * @param systemVersion Version of the operating system the application is being run on. If empty, the version is automatically detected by TDLib.
         * @param applicationVersion Application version; must be non-empty.
         */
        public SetTdlibParameters(boolean useTestDc, String databaseDirectory, String filesDirectory, byte[] databaseEncryptionKey, boolean useFileDatabase, boolean useChatInfoDatabase, boolean useMessageDatabase, boolean useSecretChats, int apiId, String apiHash, String systemLanguageCode, String deviceModel, String systemVersion, String applicationVersion) {
            this.useTestDc = useTestDc;
            this.databaseDirectory = databaseDirectory;
            this.filesDirectory = filesDirectory;
            this.databaseEncryptionKey = databaseEncryptionKey;
            this.useFileDatabase = useFileDatabase;
            this.useChatInfoDatabase = useChatInfoDatabase;
            this.useMessageDatabase = useMessageDatabase;
            this.useSecretChats = useSecretChats;
            this.apiId = apiId;
            this.apiHash = apiHash;
            this.systemLanguageCode = systemLanguageCode;
            this.deviceModel = deviceModel;
            this.systemVersion = systemVersion;
            this.applicationVersion = applicationVersion;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -775883218;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes color scheme for the current user based on an owned or a hosted upgraded gift; for Telegram Premium users only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetUpgradedGiftColors extends Function<Ok> {
        /**
         * Identifier of the upgradedGiftColors scheme to use.
         */
        public long upgradedGiftColorsId;

        /**
         * Default constructor for a function, which changes color scheme for the current user based on an owned or a hosted upgraded gift; for Telegram Premium users only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetUpgradedGiftColors() {
        }

        /**
         * Creates a function, which changes color scheme for the current user based on an owned or a hosted upgraded gift; for Telegram Premium users only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param upgradedGiftColorsId Identifier of the upgradedGiftColors scheme to use.
         */
        public SetUpgradedGiftColors(long upgradedGiftColorsId) {
            this.upgradedGiftColorsId = upgradedGiftColorsId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -966832402;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the emoji status of a user; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetUserEmojiStatus extends Function<Ok> {
        /**
         * Identifier of the user.
         */
        public long userId;
        /**
         * New emoji status; pass null to switch to the default badge.
         */
        public EmojiStatus emojiStatus;

        /**
         * Default constructor for a function, which changes the emoji status of a user; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetUserEmojiStatus() {
        }

        /**
         * Creates a function, which changes the emoji status of a user; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param userId Identifier of the user.
         * @param emojiStatus New emoji status; pass null to switch to the default badge.
         */
        public SetUserEmojiStatus(long userId, EmojiStatus emojiStatus) {
            this.userId = userId;
            this.emojiStatus = emojiStatus;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -451519541;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes a note of a contact user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetUserNote extends Function<Ok> {
        /**
         * User identifier.
         */
        public long userId;
        /**
         * Note to set for the user; 0-getOption(&quot;user_note_text_length_max&quot;) characters. Only Bold, Italic, Underline, Strikethrough, Spoiler, CustomEmoji, and DateTime entities are allowed.
         */
        public FormattedText note;

        /**
         * Default constructor for a function, which changes a note of a contact user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetUserNote() {
        }

        /**
         * Creates a function, which changes a note of a contact user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param userId User identifier.
         * @param note Note to set for the user; 0-getOption(&quot;user_note_text_length_max&quot;) characters. Only Bold, Italic, Underline, Strikethrough, Spoiler, CustomEmoji, and DateTime entities are allowed.
         */
        public SetUserNote(long userId, FormattedText note) {
            this.userId = userId;
            this.note = note;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -351487655;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes a personal profile photo of a contact user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetUserPersonalProfilePhoto extends Function<Ok> {
        /**
         * User identifier.
         */
        public long userId;
        /**
         * Profile photo to set; pass null to delete the photo; inputChatPhotoPrevious isn't supported in this function.
         */
        public InputChatPhoto photo;

        /**
         * Default constructor for a function, which changes a personal profile photo of a contact user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetUserPersonalProfilePhoto() {
        }

        /**
         * Creates a function, which changes a personal profile photo of a contact user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param userId User identifier.
         * @param photo Profile photo to set; pass null to delete the photo; inputChatPhotoPrevious isn't supported in this function.
         */
        public SetUserPersonalProfilePhoto(long userId, InputChatPhoto photo) {
            this.userId = userId;
            this.photo = photo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 464136438;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes user privacy settings.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetUserPrivacySettingRules extends Function<Ok> {
        /**
         * The privacy setting.
         */
        public UserPrivacySetting setting;
        /**
         * The new privacy rules.
         */
        public UserPrivacySettingRules rules;

        /**
         * Default constructor for a function, which changes user privacy settings.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetUserPrivacySettingRules() {
        }

        /**
         * Creates a function, which changes user privacy settings.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param setting The privacy setting.
         * @param rules The new privacy rules.
         */
        public SetUserPrivacySettingRules(UserPrivacySetting setting, UserPrivacySettingRules rules) {
            this.setting = setting;
            this.rules = rules;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -473812741;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets support information for the given user; for Telegram support only.
     *
     * <p> Returns {@link UserSupportInfo UserSupportInfo} </p>
     */
    public static class SetUserSupportInfo extends Function<UserSupportInfo> {
        /**
         * User identifier.
         */
        public long userId;
        /**
         * New information message.
         */
        public FormattedText message;

        /**
         * Default constructor for a function, which sets support information for the given user; for Telegram support only.
         *
         * <p> Returns {@link UserSupportInfo UserSupportInfo} </p>
         */
        public SetUserSupportInfo() {
        }

        /**
         * Creates a function, which sets support information for the given user; for Telegram support only.
         *
         * <p> Returns {@link UserSupportInfo UserSupportInfo} </p>
         *
         * @param userId User identifier.
         * @param message New information message.
         */
        public SetUserSupportInfo(long userId, FormattedText message) {
            this.userId = userId;
            this.message = message;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2088986621;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the editable username of the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetUsername extends Function<Ok> {
        /**
         * The new value of the username. Use an empty string to remove the username. The username can't be completely removed if there is another active or disabled username.
         */
        public String username;

        /**
         * Default constructor for a function, which changes the editable username of the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetUsername() {
        }

        /**
         * Creates a function, which changes the editable username of the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param username The new value of the username. Use an empty string to remove the username. The username can't be completely removed if there is another active or disabled username.
         */
        public SetUsername(String username) {
            this.username = username;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 439901214;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes default participant identifier, on whose behalf a video chat in the chat will be joined.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetVideoChatDefaultParticipant extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Default group call participant identifier to join the video chats in the chat.
         */
        public MessageSender defaultParticipantId;

        /**
         * Default constructor for a function, which changes default participant identifier, on whose behalf a video chat in the chat will be joined.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetVideoChatDefaultParticipant() {
        }

        /**
         * Creates a function, which changes default participant identifier, on whose behalf a video chat in the chat will be joined.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param defaultParticipantId Default group call participant identifier to join the video chats in the chat.
         */
        public SetVideoChatDefaultParticipant(long chatId, MessageSender defaultParticipantId) {
            this.chatId = chatId;
            this.defaultParticipantId = defaultParticipantId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -240749901;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sets title of a video chat; requires groupCall.canBeManaged right.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SetVideoChatTitle extends Function<Ok> {
        /**
         * Group call identifier.
         */
        public int groupCallId;
        /**
         * New group call title; 1-64 characters.
         */
        public String title;

        /**
         * Default constructor for a function, which sets title of a video chat; requires groupCall.canBeManaged right.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SetVideoChatTitle() {
        }

        /**
         * Creates a function, which sets title of a video chat; requires groupCall.canBeManaged right.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier.
         * @param title New group call title; 1-64 characters.
         */
        public SetVideoChatTitle(int groupCallId, String title) {
            this.groupCallId = groupCallId;
            this.title = title;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1915482994;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Shares a chat after pressing a keyboardButtonTypeRequestChat button with the bot.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ShareChatWithBot extends Function<Ok> {
        /**
         * Source of the button.
         */
        public KeyboardButtonSource source;
        /**
         * Identifier of the button.
         */
        public int buttonId;
        /**
         * Identifier of the shared chat.
         */
        public long sharedChatId;
        /**
         * Pass true to check that the chat can be shared by the button instead of actually sharing it. Doesn't check botIsMember and botAdministratorRights restrictions. If the bot must be a member, then all chats from getGroupsInCommon and all chats, where the user can add the bot, are suitable. In the latter case the bot will be automatically added to the chat. If the bot must be an administrator, then all chats, where the bot already has requested rights or can be added to administrators by the user, are suitable. In the latter case the bot will be automatically granted requested rights.
         */
        public boolean onlyCheck;

        /**
         * Default constructor for a function, which shares a chat after pressing a keyboardButtonTypeRequestChat button with the bot.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ShareChatWithBot() {
        }

        /**
         * Creates a function, which shares a chat after pressing a keyboardButtonTypeRequestChat button with the bot.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param source Source of the button.
         * @param buttonId Identifier of the button.
         * @param sharedChatId Identifier of the shared chat.
         * @param onlyCheck Pass true to check that the chat can be shared by the button instead of actually sharing it. Doesn't check botIsMember and botAdministratorRights restrictions. If the bot must be a member, then all chats from getGroupsInCommon and all chats, where the user can add the bot, are suitable. In the latter case the bot will be automatically added to the chat. If the bot must be an administrator, then all chats, where the bot already has requested rights or can be added to administrators by the user, are suitable. In the latter case the bot will be automatically granted requested rights.
         */
        public ShareChatWithBot(KeyboardButtonSource source, int buttonId, long sharedChatId, boolean onlyCheck) {
            this.source = source;
            this.buttonId = buttonId;
            this.sharedChatId = sharedChatId;
            this.onlyCheck = onlyCheck;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -917243698;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Shares the phone number of the current user with a mutual contact. Supposed to be called when the user clicks on chatActionBarSharePhoneNumber.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SharePhoneNumber extends Function<Ok> {
        /**
         * Identifier of the user with whom to share the phone number. The user must be a mutual contact.
         */
        public long userId;

        /**
         * Default constructor for a function, which shares the phone number of the current user with a mutual contact. Supposed to be called when the user clicks on chatActionBarSharePhoneNumber.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SharePhoneNumber() {
        }

        /**
         * Creates a function, which shares the phone number of the current user with a mutual contact. Supposed to be called when the user clicks on chatActionBarSharePhoneNumber.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param userId Identifier of the user with whom to share the phone number. The user must be a mutual contact.
         */
        public SharePhoneNumber(long userId) {
            this.userId = userId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1097130069;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Shares users after pressing a keyboardButtonTypeRequestUsers button with the bot.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ShareUsersWithBot extends Function<Ok> {
        /**
         * Source of the button.
         */
        public KeyboardButtonSource source;
        /**
         * Identifier of the button.
         */
        public int buttonId;
        /**
         * Identifiers of the shared users.
         */
        public long[] sharedUserIds;
        /**
         * Pass true to check that the users can be shared by the button instead of actually sharing them.
         */
        public boolean onlyCheck;

        /**
         * Default constructor for a function, which shares users after pressing a keyboardButtonTypeRequestUsers button with the bot.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ShareUsersWithBot() {
        }

        /**
         * Creates a function, which shares users after pressing a keyboardButtonTypeRequestUsers button with the bot.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param source Source of the button.
         * @param buttonId Identifier of the button.
         * @param sharedUserIds Identifiers of the shared users.
         * @param onlyCheck Pass true to check that the users can be shared by the button instead of actually sharing them.
         */
        public ShareUsersWithBot(KeyboardButtonSource source, int buttonId, long[] sharedUserIds, boolean onlyCheck) {
            this.source = source;
            this.buttonId = buttonId;
            this.sharedUserIds = sharedUserIds;
            this.onlyCheck = onlyCheck;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1154320179;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Starts recording of an active group call; for video chats only. Requires groupCall.canBeManaged right.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class StartGroupCallRecording extends Function<Ok> {
        /**
         * Group call identifier.
         */
        public int groupCallId;
        /**
         * Group call recording title; 0-64 characters.
         */
        public String title;
        /**
         * Pass true to record a video file instead of an audio file.
         */
        public boolean recordVideo;
        /**
         * Pass true to use portrait orientation for video instead of landscape one.
         */
        public boolean usePortraitOrientation;

        /**
         * Default constructor for a function, which starts recording of an active group call; for video chats only. Requires groupCall.canBeManaged right.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public StartGroupCallRecording() {
        }

        /**
         * Creates a function, which starts recording of an active group call; for video chats only. Requires groupCall.canBeManaged right.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier.
         * @param title Group call recording title; 0-64 characters.
         * @param recordVideo Pass true to record a video file instead of an audio file.
         * @param usePortraitOrientation Pass true to use portrait orientation for video instead of landscape one.
         */
        public StartGroupCallRecording(int groupCallId, String title, boolean recordVideo, boolean usePortraitOrientation) {
            this.groupCallId = groupCallId;
            this.title = title;
            this.recordVideo = recordVideo;
            this.usePortraitOrientation = usePortraitOrientation;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1757774971;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Starts screen sharing in a joined group call; not supported in live stories. Returns join response payload for tgcalls.
     *
     * <p> Returns {@link Text Text} </p>
     */
    public static class StartGroupCallScreenSharing extends Function<Text> {
        /**
         * Group call identifier.
         */
        public int groupCallId;
        /**
         * Screen sharing audio channel synchronization source identifier; received from tgcalls.
         */
        public int audioSourceId;
        /**
         * Group call join payload; received from tgcalls.
         */
        public String payload;

        /**
         * Default constructor for a function, which starts screen sharing in a joined group call; not supported in live stories. Returns join response payload for tgcalls.
         *
         * <p> Returns {@link Text Text} </p>
         */
        public StartGroupCallScreenSharing() {
        }

        /**
         * Creates a function, which starts screen sharing in a joined group call; not supported in live stories. Returns join response payload for tgcalls.
         *
         * <p> Returns {@link Text Text} </p>
         *
         * @param groupCallId Group call identifier.
         * @param audioSourceId Screen sharing audio channel synchronization source identifier; received from tgcalls.
         * @param payload Group call join payload; received from tgcalls.
         */
        public StartGroupCallScreenSharing(int groupCallId, int audioSourceId, String payload) {
            this.groupCallId = groupCallId;
            this.audioSourceId = audioSourceId;
            this.payload = payload;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -884068051;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Starts a new live story on behalf of a chat; requires canPostStories administrator right for channel chats.
     *
     * <p> Returns {@link StartLiveStoryResult StartLiveStoryResult} </p>
     */
    public static class StartLiveStory extends Function<StartLiveStoryResult> {
        /**
         * Identifier of the chat that will start the live story. Pass Saved Messages chat identifier when starting a live story on behalf of the current user, or a channel chat identifier.
         */
        public long chatId;
        /**
         * The privacy settings for the story; ignored for stories posted on behalf of channel chats.
         */
        public StoryPrivacySettings privacySettings;
        /**
         * Pass true if the content of the story must be protected from screenshotting.
         */
        public boolean protectContent;
        /**
         * Pass true to create an RTMP stream instead of an ordinary group call.
         */
        public boolean isRtmpStream;
        /**
         * Pass true to allow viewers of the story to send messages.
         */
        public boolean enableMessages;
        /**
         * The minimum number of Telegram Stars that must be paid by viewers for each sent message to the call; 0-getOption(&quot;paid_group_call_message_star_count_max&quot;).
         */
        public long paidMessageStarCount;

        /**
         * Default constructor for a function, which starts a new live story on behalf of a chat; requires canPostStories administrator right for channel chats.
         *
         * <p> Returns {@link StartLiveStoryResult StartLiveStoryResult} </p>
         */
        public StartLiveStory() {
        }

        /**
         * Creates a function, which starts a new live story on behalf of a chat; requires canPostStories administrator right for channel chats.
         *
         * <p> Returns {@link StartLiveStoryResult StartLiveStoryResult} </p>
         *
         * @param chatId Identifier of the chat that will start the live story. Pass Saved Messages chat identifier when starting a live story on behalf of the current user, or a channel chat identifier.
         * @param privacySettings The privacy settings for the story; ignored for stories posted on behalf of channel chats.
         * @param protectContent Pass true if the content of the story must be protected from screenshotting.
         * @param isRtmpStream Pass true to create an RTMP stream instead of an ordinary group call.
         * @param enableMessages Pass true to allow viewers of the story to send messages.
         * @param paidMessageStarCount The minimum number of Telegram Stars that must be paid by viewers for each sent message to the call; 0-getOption(&quot;paid_group_call_message_star_count_max&quot;).
         */
        public StartLiveStory(long chatId, StoryPrivacySettings privacySettings, boolean protectContent, boolean isRtmpStream, boolean enableMessages, long paidMessageStarCount) {
            this.chatId = chatId;
            this.privacySettings = privacySettings;
            this.protectContent = protectContent;
            this.isRtmpStream = isRtmpStream;
            this.enableMessages = enableMessages;
            this.paidMessageStarCount = paidMessageStarCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1253467958;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Starts a scheduled video chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class StartScheduledVideoChat extends Function<Ok> {
        /**
         * Group call identifier of the video chat.
         */
        public int groupCallId;

        /**
         * Default constructor for a function, which starts a scheduled video chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public StartScheduledVideoChat() {
        }

        /**
         * Creates a function, which starts a scheduled video chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier of the video chat.
         */
        public StartScheduledVideoChat(int groupCallId) {
            this.groupCallId = groupCallId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1300829822;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Stops a poll sent on behalf of a business account; for bots only.
     *
     * <p> Returns {@link BusinessMessage BusinessMessage} </p>
     */
    public static class StopBusinessPoll extends Function<BusinessMessage> {
        /**
         * Unique identifier of business connection on behalf of which the message with the poll was sent.
         */
        public String businessConnectionId;
        /**
         * The chat the message belongs to.
         */
        public long chatId;
        /**
         * Identifier of the message containing the poll.
         */
        public long messageId;
        /**
         * The new message reply markup; pass null if none.
         */
        public ReplyMarkup replyMarkup;

        /**
         * Default constructor for a function, which stops a poll sent on behalf of a business account; for bots only.
         *
         * <p> Returns {@link BusinessMessage BusinessMessage} </p>
         */
        public StopBusinessPoll() {
        }

        /**
         * Creates a function, which stops a poll sent on behalf of a business account; for bots only.
         *
         * <p> Returns {@link BusinessMessage BusinessMessage} </p>
         *
         * @param businessConnectionId Unique identifier of business connection on behalf of which the message with the poll was sent.
         * @param chatId The chat the message belongs to.
         * @param messageId Identifier of the message containing the poll.
         * @param replyMarkup The new message reply markup; pass null if none.
         */
        public StopBusinessPoll(String businessConnectionId, long chatId, long messageId, ReplyMarkup replyMarkup) {
            this.businessConnectionId = businessConnectionId;
            this.chatId = chatId;
            this.messageId = messageId;
            this.replyMarkup = replyMarkup;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1142218400;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Stops a poll.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class StopPoll extends Function<Ok> {
        /**
         * Identifier of the chat to which the poll belongs.
         */
        public long chatId;
        /**
         * Identifier of the message containing the poll. Use messageProperties.canBeEdited to check whether the poll can be stopped.
         */
        public long messageId;
        /**
         * The new message reply markup; pass null if none; for bots only.
         */
        public ReplyMarkup replyMarkup;

        /**
         * Default constructor for a function, which stops a poll.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public StopPoll() {
        }

        /**
         * Creates a function, which stops a poll.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat to which the poll belongs.
         * @param messageId Identifier of the message containing the poll. Use messageProperties.canBeEdited to check whether the poll can be stopped.
         * @param replyMarkup The new message reply markup; pass null if none; for bots only.
         */
        public StopPoll(long chatId, long messageId, ReplyMarkup replyMarkup) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.replyMarkup = replyMarkup;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1659374253;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Suggests a birthdate to another regular user with common messages and allowing non-paid messages.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SuggestUserBirthdate extends Function<Ok> {
        /**
         * User identifier.
         */
        public long userId;
        /**
         * Birthdate to suggest.
         */
        public Birthdate birthdate;

        /**
         * Default constructor for a function, which suggests a birthdate to another regular user with common messages and allowing non-paid messages.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SuggestUserBirthdate() {
        }

        /**
         * Creates a function, which suggests a birthdate to another regular user with common messages and allowing non-paid messages.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param userId User identifier.
         * @param birthdate Birthdate to suggest.
         */
        public SuggestUserBirthdate(long userId, Birthdate birthdate) {
            this.userId = userId;
            this.birthdate = birthdate;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 39506613;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Suggests a profile photo to another regular user with common messages and allowing non-paid messages.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SuggestUserProfilePhoto extends Function<Ok> {
        /**
         * User identifier.
         */
        public long userId;
        /**
         * Profile photo to suggest; inputChatPhotoPrevious isn't supported in this function.
         */
        public InputChatPhoto photo;

        /**
         * Default constructor for a function, which suggests a profile photo to another regular user with common messages and allowing non-paid messages.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SuggestUserProfilePhoto() {
        }

        /**
         * Creates a function, which suggests a profile photo to another regular user with common messages and allowing non-paid messages.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param userId User identifier.
         * @param photo Profile photo to suggest; inputChatPhotoPrevious isn't supported in this function.
         */
        public SuggestUserProfilePhoto(long userId, InputChatPhoto photo) {
            this.userId = userId;
            this.photo = photo;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1788742557;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Summarizes content of the message with non-empty summaryLanguageCode.
     *
     * <p> Returns {@link FormattedText FormattedText} </p>
     */
    public static class SummarizeMessage extends Function<FormattedText> {
        /**
         * Identifier of the chat to which the message belongs.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * Pass a language code to which the summary will be translated; pass an empty string if translation isn't needed. See translateText.toLanguageCode for the list of supported values.
         */
        public String translateToLanguageCode;
        /**
         * Tone of the summarization; see translateText.tone for the list of supported values.
         */
        public String tone;

        /**
         * Default constructor for a function, which summarizes content of the message with non-empty summaryLanguageCode.
         *
         * <p> Returns {@link FormattedText FormattedText} </p>
         */
        public SummarizeMessage() {
        }

        /**
         * Creates a function, which summarizes content of the message with non-empty summaryLanguageCode.
         *
         * <p> Returns {@link FormattedText FormattedText} </p>
         *
         * @param chatId Identifier of the chat to which the message belongs.
         * @param messageId Identifier of the message.
         * @param translateToLanguageCode Pass a language code to which the summary will be translated; pass an empty string if translation isn't needed. See translateText.toLanguageCode for the list of supported values.
         * @param tone Tone of the summarization; see translateText.tone for the list of supported values.
         */
        public SummarizeMessage(long chatId, long messageId, String translateToLanguageCode, String tone) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.translateToLanguageCode = translateToLanguageCode;
            this.tone = tone;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1464885562;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Fetches the latest versions of all strings from a language pack in the current localization target from the server. This method doesn't need to be called explicitly for the current used/base language packs. Can be called before authorization.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class SynchronizeLanguagePack extends Function<Ok> {
        /**
         * Language pack identifier.
         */
        public String languagePackId;

        /**
         * Default constructor for a function, which fetches the latest versions of all strings from a language pack in the current localization target from the server. This method doesn't need to be called explicitly for the current used/base language packs. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public SynchronizeLanguagePack() {
        }

        /**
         * Creates a function, which fetches the latest versions of all strings from a language pack in the current localization target from the server. This method doesn't need to be called explicitly for the current used/base language packs. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param languagePackId Language pack identifier.
         */
        public SynchronizeLanguagePack(String languagePackId) {
            this.languagePackId = languagePackId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2065307858;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Terminates all other sessions of the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class TerminateAllOtherSessions extends Function<Ok> {

        /**
         * Default constructor for a function, which terminates all other sessions of the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public TerminateAllOtherSessions() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1874485523;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Terminates a session of the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class TerminateSession extends Function<Ok> {
        /**
         * Session identifier.
         */
        public long sessionId;

        /**
         * Default constructor for a function, which terminates a session of the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public TerminateSession() {
        }

        /**
         * Creates a function, which terminates a session of the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param sessionId Session identifier.
         */
        public TerminateSession(long sessionId) {
            this.sessionId = sessionId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -407385812;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the received bytes; for testing only. This is an offline method. Can be called before authorization.
     *
     * <p> Returns {@link TestBytes TestBytes} </p>
     */
    public static class TestCallBytes extends Function<TestBytes> {
        /**
         * Bytes to return.
         */
        public byte[] x;

        /**
         * Default constructor for a function, which returns the received bytes; for testing only. This is an offline method. Can be called before authorization.
         *
         * <p> Returns {@link TestBytes TestBytes} </p>
         */
        public TestCallBytes() {
        }

        /**
         * Creates a function, which returns the received bytes; for testing only. This is an offline method. Can be called before authorization.
         *
         * <p> Returns {@link TestBytes TestBytes} </p>
         *
         * @param x Bytes to return.
         */
        public TestCallBytes(byte[] x) {
            this.x = x;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -736011607;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Does nothing; for testing only. This is an offline method. Can be called before authorization.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class TestCallEmpty extends Function<Ok> {

        /**
         * Default constructor for a function, which does nothing; for testing only. This is an offline method. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public TestCallEmpty() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -627291626;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the received string; for testing only. This is an offline method. Can be called before authorization.
     *
     * <p> Returns {@link TestString TestString} </p>
     */
    public static class TestCallString extends Function<TestString> {
        /**
         * String to return.
         */
        public String x;

        /**
         * Default constructor for a function, which returns the received string; for testing only. This is an offline method. Can be called before authorization.
         *
         * <p> Returns {@link TestString TestString} </p>
         */
        public TestCallString() {
        }

        /**
         * Creates a function, which returns the received string; for testing only. This is an offline method. Can be called before authorization.
         *
         * <p> Returns {@link TestString TestString} </p>
         *
         * @param x String to return.
         */
        public TestCallString(String x) {
            this.x = x;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1732818385;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the received vector of numbers; for testing only. This is an offline method. Can be called before authorization.
     *
     * <p> Returns {@link TestVectorInt TestVectorInt} </p>
     */
    public static class TestCallVectorInt extends Function<TestVectorInt> {
        /**
         * Vector of numbers to return.
         */
        public int[] x;

        /**
         * Default constructor for a function, which returns the received vector of numbers; for testing only. This is an offline method. Can be called before authorization.
         *
         * <p> Returns {@link TestVectorInt TestVectorInt} </p>
         */
        public TestCallVectorInt() {
        }

        /**
         * Creates a function, which returns the received vector of numbers; for testing only. This is an offline method. Can be called before authorization.
         *
         * <p> Returns {@link TestVectorInt TestVectorInt} </p>
         *
         * @param x Vector of numbers to return.
         */
        public TestCallVectorInt(int[] x) {
            this.x = x;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2137277793;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the received vector of objects containing a number; for testing only. This is an offline method. Can be called before authorization.
     *
     * <p> Returns {@link TestVectorIntObject TestVectorIntObject} </p>
     */
    public static class TestCallVectorIntObject extends Function<TestVectorIntObject> {
        /**
         * Vector of objects to return.
         */
        public TestInt[] x;

        /**
         * Default constructor for a function, which returns the received vector of objects containing a number; for testing only. This is an offline method. Can be called before authorization.
         *
         * <p> Returns {@link TestVectorIntObject TestVectorIntObject} </p>
         */
        public TestCallVectorIntObject() {
        }

        /**
         * Creates a function, which returns the received vector of objects containing a number; for testing only. This is an offline method. Can be called before authorization.
         *
         * <p> Returns {@link TestVectorIntObject TestVectorIntObject} </p>
         *
         * @param x Vector of objects to return.
         */
        public TestCallVectorIntObject(TestInt[] x) {
            this.x = x;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1825428218;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the received vector of strings; for testing only. This is an offline method. Can be called before authorization.
     *
     * <p> Returns {@link TestVectorString TestVectorString} </p>
     */
    public static class TestCallVectorString extends Function<TestVectorString> {
        /**
         * Vector of strings to return.
         */
        public String[] x;

        /**
         * Default constructor for a function, which returns the received vector of strings; for testing only. This is an offline method. Can be called before authorization.
         *
         * <p> Returns {@link TestVectorString TestVectorString} </p>
         */
        public TestCallVectorString() {
        }

        /**
         * Creates a function, which returns the received vector of strings; for testing only. This is an offline method. Can be called before authorization.
         *
         * <p> Returns {@link TestVectorString TestVectorString} </p>
         *
         * @param x Vector of strings to return.
         */
        public TestCallVectorString(String[] x) {
            this.x = x;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -408600900;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the received vector of objects containing a string; for testing only. This is an offline method. Can be called before authorization.
     *
     * <p> Returns {@link TestVectorStringObject TestVectorStringObject} </p>
     */
    public static class TestCallVectorStringObject extends Function<TestVectorStringObject> {
        /**
         * Vector of objects to return.
         */
        public TestString[] x;

        /**
         * Default constructor for a function, which returns the received vector of objects containing a string; for testing only. This is an offline method. Can be called before authorization.
         *
         * <p> Returns {@link TestVectorStringObject TestVectorStringObject} </p>
         */
        public TestCallVectorStringObject() {
        }

        /**
         * Creates a function, which returns the received vector of objects containing a string; for testing only. This is an offline method. Can be called before authorization.
         *
         * <p> Returns {@link TestVectorStringObject TestVectorStringObject} </p>
         *
         * @param x Vector of objects to return.
         */
        public TestCallVectorStringObject(TestString[] x) {
            this.x = x;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1527666429;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Forces an updates.getDifference call to the Telegram servers; for testing only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class TestGetDifference extends Function<Ok> {

        /**
         * Default constructor for a function, which forces an updates.getDifference call to the Telegram servers; for testing only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public TestGetDifference() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1747084069;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends a simple network request to the Telegram servers; for testing only. Can be called before authorization.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class TestNetwork extends Function<Ok> {

        /**
         * Default constructor for a function, which sends a simple network request to the Telegram servers; for testing only. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public TestNetwork() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1343998901;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends a simple network request to the Telegram servers via proxy; for testing only. Can be called before authorization.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class TestProxy extends Function<Ok> {
        /**
         * The proxy to test.
         */
        public Proxy proxy;
        /**
         * Identifier of a datacenter with which to test connection.
         */
        public int dcId;
        /**
         * The maximum overall timeout for the request.
         */
        public double timeout;

        /**
         * Default constructor for a function, which sends a simple network request to the Telegram servers via proxy; for testing only. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public TestProxy() {
        }

        /**
         * Creates a function, which sends a simple network request to the Telegram servers via proxy; for testing only. Can be called before authorization.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param proxy The proxy to test.
         * @param dcId Identifier of a datacenter with which to test connection.
         * @param timeout The maximum overall timeout for the request.
         */
        public TestProxy(Proxy proxy, int dcId, double timeout) {
            this.proxy = proxy;
            this.dcId = dcId;
            this.timeout = timeout;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2057109116;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the specified error and ensures that the Error object is used; for testing only. Can be called synchronously.
     *
     * <p> Returns {@link Error Error} </p>
     */
    public static class TestReturnError extends Function<Error> {
        /**
         * The error to be returned.
         */
        public Error error;

        /**
         * Default constructor for a function, which returns the specified error and ensures that the Error object is used; for testing only. Can be called synchronously.
         *
         * <p> Returns {@link Error Error} </p>
         */
        public TestReturnError() {
        }

        /**
         * Creates a function, which returns the specified error and ensures that the Error object is used; for testing only. Can be called synchronously.
         *
         * <p> Returns {@link Error Error} </p>
         *
         * @param error The error to be returned.
         */
        public TestReturnError(Error error) {
            this.error = error;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 455179506;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Returns the squared received number; for testing only. This is an offline method. Can be called before authorization.
     *
     * <p> Returns {@link TestInt TestInt} </p>
     */
    public static class TestSquareInt extends Function<TestInt> {
        /**
         * Number to square.
         */
        public int x;

        /**
         * Default constructor for a function, which returns the squared received number; for testing only. This is an offline method. Can be called before authorization.
         *
         * <p> Returns {@link TestInt TestInt} </p>
         */
        public TestSquareInt() {
        }

        /**
         * Creates a function, which returns the squared received number; for testing only. This is an offline method. Can be called before authorization.
         *
         * <p> Returns {@link TestInt TestInt} </p>
         *
         * @param x Number to square.
         */
        public TestSquareInt(int x) {
            this.x = x;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -60135024;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Does nothing and ensures that the Update object is used; for testing only. This is an offline method. Can be called before authorization.
     *
     * <p> Returns {@link Update Update} </p>
     */
    public static class TestUseUpdate extends Function<Update> {

        /**
         * Default constructor for a function, which does nothing and ensures that the Update object is used; for testing only. This is an offline method. Can be called before authorization.
         *
         * <p> Returns {@link Update Update} </p>
         */
        public TestUseUpdate() {
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 717094686;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes pause state of all files in the file download list.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleAllDownloadsArePaused extends Function<Ok> {
        /**
         * Pass true to pause all downloads; pass false to unpause them.
         */
        public boolean arePaused;

        /**
         * Default constructor for a function, which changes pause state of all files in the file download list.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleAllDownloadsArePaused() {
        }

        /**
         * Creates a function, which changes pause state of all files in the file download list.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param arePaused Pass true to pause all downloads; pass false to unpause them.
         */
        public ToggleAllDownloadsArePaused(boolean arePaused) {
            this.arePaused = arePaused;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1251512322;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether the bot can manage emoji status of the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleBotCanManageEmojiStatus extends Function<Ok> {
        /**
         * User identifier of the bot.
         */
        public long botUserId;
        /**
         * Pass true if the bot is allowed to change emoji status of the user; pass false otherwise.
         */
        public boolean canManageEmojiStatus;

        /**
         * Default constructor for a function, which toggles whether the bot can manage emoji status of the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleBotCanManageEmojiStatus() {
        }

        /**
         * Creates a function, which toggles whether the bot can manage emoji status of the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param botUserId User identifier of the bot.
         * @param canManageEmojiStatus Pass true if the bot is allowed to change emoji status of the user; pass false otherwise.
         */
        public ToggleBotCanManageEmojiStatus(long botUserId, boolean canManageEmojiStatus) {
            this.botUserId = botUserId;
            this.canManageEmojiStatus = canManageEmojiStatus;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 622495770;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Adds or removes a bot to attachment and side menu. Bot can be added to the menu, only if userTypeBot.canBeAddedToAttachmentMenu == true.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleBotIsAddedToAttachmentMenu extends Function<Ok> {
        /**
         * Bot's user identifier.
         */
        public long botUserId;
        /**
         * Pass true to add the bot to attachment menu; pass false to remove the bot from attachment menu.
         */
        public boolean isAdded;
        /**
         * Pass true if the current user allowed the bot to send them messages. Ignored if isAdded is false.
         */
        public boolean allowWriteAccess;

        /**
         * Default constructor for a function, which adds or removes a bot to attachment and side menu. Bot can be added to the menu, only if userTypeBot.canBeAddedToAttachmentMenu == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleBotIsAddedToAttachmentMenu() {
        }

        /**
         * Creates a function, which adds or removes a bot to attachment and side menu. Bot can be added to the menu, only if userTypeBot.canBeAddedToAttachmentMenu == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param botUserId Bot's user identifier.
         * @param isAdded Pass true to add the bot to attachment menu; pass false to remove the bot from attachment menu.
         * @param allowWriteAccess Pass true if the current user allowed the bot to send them messages. Ignored if isAdded is false.
         */
        public ToggleBotIsAddedToAttachmentMenu(long botUserId, boolean isAdded, boolean allowWriteAccess) {
            this.botUserId = botUserId;
            this.isAdded = isAdded;
            this.allowWriteAccess = allowWriteAccess;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1906712934;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes active state for a username of a bot. The editable username can be disabled only if there are other active usernames. May return an error with a message &quot;USERNAMES_ACTIVE_TOO_MUCH&quot; if the maximum number of active usernames has been reached. Can be called only if userTypeBot.canBeEdited == true.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleBotUsernameIsActive extends Function<Ok> {
        /**
         * Identifier of the target bot.
         */
        public long botUserId;
        /**
         * The username to change.
         */
        public String username;
        /**
         * Pass true to activate the username; pass false to disable it.
         */
        public boolean isActive;

        /**
         * Default constructor for a function, which changes active state for a username of a bot. The editable username can be disabled only if there are other active usernames. May return an error with a message &quot;USERNAMES_ACTIVE_TOO_MUCH&quot; if the maximum number of active usernames has been reached. Can be called only if userTypeBot.canBeEdited == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleBotUsernameIsActive() {
        }

        /**
         * Creates a function, which changes active state for a username of a bot. The editable username can be disabled only if there are other active usernames. May return an error with a message &quot;USERNAMES_ACTIVE_TOO_MUCH&quot; if the maximum number of active usernames has been reached. Can be called only if userTypeBot.canBeEdited == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param botUserId Identifier of the target bot.
         * @param username The username to change.
         * @param isActive Pass true to activate the username; pass false to disable it.
         */
        public ToggleBotUsernameIsActive(long botUserId, String username, boolean isActive) {
            this.botUserId = botUserId;
            this.username = username;
            this.isActive = isActive;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2036569097;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Pauses or resumes the connected business bot in a specific chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleBusinessConnectedBotChatIsPaused extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Pass true to pause the connected bot in the chat; pass false to resume the bot.
         */
        public boolean isPaused;

        /**
         * Default constructor for a function, which pauses or resumes the connected business bot in a specific chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleBusinessConnectedBotChatIsPaused() {
        }

        /**
         * Creates a function, which pauses or resumes the connected business bot in a specific chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param isPaused Pass true to pause the connected bot in the chat; pass false to resume the bot.
         */
        public ToggleBusinessConnectedBotChatIsPaused(long chatId, boolean isPaused) {
            this.chatId = chatId;
            this.isPaused = isPaused;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1328957509;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the value of the default disableNotification parameter, used when a message is sent to a chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleChatDefaultDisableNotification extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New value of defaultDisableNotification.
         */
        public boolean defaultDisableNotification;

        /**
         * Default constructor for a function, which changes the value of the default disableNotification parameter, used when a message is sent to a chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleChatDefaultDisableNotification() {
        }

        /**
         * Creates a function, which changes the value of the default disableNotification parameter, used when a message is sent to a chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param defaultDisableNotification New value of defaultDisableNotification.
         */
        public ToggleChatDefaultDisableNotification(long chatId, boolean defaultDisableNotification) {
            this.chatId = chatId;
            this.defaultDisableNotification = defaultDisableNotification;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 314794002;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether chat folder tags are enabled.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleChatFolderTags extends Function<Ok> {
        /**
         * Pass true to enable folder tags; pass false to disable them.
         */
        public boolean areTagsEnabled;

        /**
         * Default constructor for a function, which toggles whether chat folder tags are enabled.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleChatFolderTags() {
        }

        /**
         * Creates a function, which toggles whether chat folder tags are enabled.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param areTagsEnabled Pass true to enable folder tags; pass false to disable them.
         */
        public ToggleChatFolderTags(boolean areTagsEnabled) {
            this.areTagsEnabled = areTagsEnabled;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2092209084;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether notifications for new gifts received by a channel chat are sent to the current user; requires canPostMessages administrator right in the chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleChatGiftNotifications extends Function<Ok> {
        /**
         * Identifier of the channel chat.
         */
        public long chatId;
        /**
         * Pass true to enable notifications about new gifts owned by the channel chat; pass false to disable the notifications.
         */
        public boolean areEnabled;

        /**
         * Default constructor for a function, which toggles whether notifications for new gifts received by a channel chat are sent to the current user; requires canPostMessages administrator right in the chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleChatGiftNotifications() {
        }

        /**
         * Creates a function, which toggles whether notifications for new gifts received by a channel chat are sent to the current user; requires canPostMessages administrator right in the chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the channel chat.
         * @param areEnabled Pass true to enable notifications about new gifts owned by the channel chat; pass false to disable the notifications.
         */
        public ToggleChatGiftNotifications(long chatId, boolean areEnabled) {
            this.chatId = chatId;
            this.areEnabled = areEnabled;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2069429154;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the ability of users to save, forward, or copy chat content. Requires owner privileges in basic groups, supergroups and channels. Requires Telegram Premium to enable protected content in private chats. Not available in Saved Messages and private chats with bots or support accounts.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleChatHasProtectedContent extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New value of hasProtectedContent.
         */
        public boolean hasProtectedContent;

        /**
         * Default constructor for a function, which changes the ability of users to save, forward, or copy chat content. Requires owner privileges in basic groups, supergroups and channels. Requires Telegram Premium to enable protected content in private chats. Not available in Saved Messages and private chats with bots or support accounts.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleChatHasProtectedContent() {
        }

        /**
         * Creates a function, which changes the ability of users to save, forward, or copy chat content. Requires owner privileges in basic groups, supergroups and channels. Requires Telegram Premium to enable protected content in private chats. Not available in Saved Messages and private chats with bots or support accounts.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param hasProtectedContent New value of hasProtectedContent.
         */
        public ToggleChatHasProtectedContent(long chatId, boolean hasProtectedContent) {
            this.chatId = chatId;
            this.hasProtectedContent = hasProtectedContent;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 975231309;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the marked as unread state of a chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleChatIsMarkedAsUnread extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New value of isMarkedAsUnread.
         */
        public boolean isMarkedAsUnread;

        /**
         * Default constructor for a function, which changes the marked as unread state of a chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleChatIsMarkedAsUnread() {
        }

        /**
         * Creates a function, which changes the marked as unread state of a chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param isMarkedAsUnread New value of isMarkedAsUnread.
         */
        public ToggleChatIsMarkedAsUnread(long chatId, boolean isMarkedAsUnread) {
            this.chatId = chatId;
            this.isMarkedAsUnread = isMarkedAsUnread;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -986129697;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the pinned state of a chat. There can be up to getOption(&quot;pinned_chat_count_max&quot;)/getOption(&quot;pinned_archived_chat_count_max&quot;) pinned non-secret chats and the same number of secret chats in the main/archive chat list. The limit can be increased with Telegram Premium.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleChatIsPinned extends Function<Ok> {
        /**
         * Chat list in which to change the pinned state of the chat.
         */
        public ChatList chatList;
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Pass true to pin the chat; pass false to unpin it.
         */
        public boolean isPinned;

        /**
         * Default constructor for a function, which changes the pinned state of a chat. There can be up to getOption(&quot;pinned_chat_count_max&quot;)/getOption(&quot;pinned_archived_chat_count_max&quot;) pinned non-secret chats and the same number of secret chats in the main/archive chat list. The limit can be increased with Telegram Premium.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleChatIsPinned() {
        }

        /**
         * Creates a function, which changes the pinned state of a chat. There can be up to getOption(&quot;pinned_chat_count_max&quot;)/getOption(&quot;pinned_archived_chat_count_max&quot;) pinned non-secret chats and the same number of secret chats in the main/archive chat list. The limit can be increased with Telegram Premium.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatList Chat list in which to change the pinned state of the chat.
         * @param chatId Chat identifier.
         * @param isPinned Pass true to pin the chat; pass false to unpin it.
         */
        public ToggleChatIsPinned(ChatList chatList, long chatId, boolean isPinned) {
            this.chatList = chatList;
            this.chatId = chatId;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1485429186;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the translatable state of a chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleChatIsTranslatable extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New value of isTranslatable.
         */
        public boolean isTranslatable;

        /**
         * Default constructor for a function, which changes the translatable state of a chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleChatIsTranslatable() {
        }

        /**
         * Creates a function, which changes the translatable state of a chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param isTranslatable New value of isTranslatable.
         */
        public ToggleChatIsTranslatable(long chatId, boolean isTranslatable) {
            this.chatId = chatId;
            this.isTranslatable = isTranslatable;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1812345889;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the viewAsTopics setting of a forum chat or Saved Messages.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleChatViewAsTopics extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * New value of viewAsTopics.
         */
        public boolean viewAsTopics;

        /**
         * Default constructor for a function, which changes the viewAsTopics setting of a forum chat or Saved Messages.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleChatViewAsTopics() {
        }

        /**
         * Creates a function, which changes the viewAsTopics setting of a forum chat or Saved Messages.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param viewAsTopics New value of viewAsTopics.
         */
        public ToggleChatViewAsTopics(long chatId, boolean viewAsTopics) {
            this.chatId = chatId;
            this.viewAsTopics = viewAsTopics;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 724009948;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Allows to send unpaid messages to the given topic of the channel direct messages chat administered by the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleDirectMessagesChatTopicCanSendUnpaidMessages extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifier of the topic.
         */
        public long topicId;
        /**
         * Pass true to allow unpaid messages; pass false to disallow unpaid messages.
         */
        public boolean canSendUnpaidMessages;
        /**
         * Pass true to refund the user previously paid messages.
         */
        public boolean refundPayments;

        /**
         * Default constructor for a function, which allows to send unpaid messages to the given topic of the channel direct messages chat administered by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleDirectMessagesChatTopicCanSendUnpaidMessages() {
        }

        /**
         * Creates a function, which allows to send unpaid messages to the given topic of the channel direct messages chat administered by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param topicId Identifier of the topic.
         * @param canSendUnpaidMessages Pass true to allow unpaid messages; pass false to disallow unpaid messages.
         * @param refundPayments Pass true to refund the user previously paid messages.
         */
        public ToggleDirectMessagesChatTopicCanSendUnpaidMessages(long chatId, long topicId, boolean canSendUnpaidMessages, boolean refundPayments) {
            this.chatId = chatId;
            this.topicId = topicId;
            this.canSendUnpaidMessages = canSendUnpaidMessages;
            this.refundPayments = refundPayments;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -335898703;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes pause state of a file in the file download list.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleDownloadIsPaused extends Function<Ok> {
        /**
         * Identifier of the downloaded file.
         */
        public int fileId;
        /**
         * Pass true if the download is paused.
         */
        public boolean isPaused;

        /**
         * Default constructor for a function, which changes pause state of a file in the file download list.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleDownloadIsPaused() {
        }

        /**
         * Creates a function, which changes pause state of a file in the file download list.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param fileId Identifier of the downloaded file.
         * @param isPaused Pass true if the download is paused.
         */
        public ToggleDownloadIsPaused(int fileId, boolean isPaused) {
            this.fileId = fileId;
            this.isPaused = isPaused;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -947493099;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether a topic is closed in a forum supergroup chat; requires canManageTopics administrator right in the supergroup unless the user is creator of the topic.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleForumTopicIsClosed extends Function<Ok> {
        /**
         * Identifier of the chat.
         */
        public long chatId;
        /**
         * Forum topic identifier.
         */
        public int forumTopicId;
        /**
         * Pass true to close the topic; pass false to reopen it.
         */
        public boolean isClosed;

        /**
         * Default constructor for a function, which toggles whether a topic is closed in a forum supergroup chat; requires canManageTopics administrator right in the supergroup unless the user is creator of the topic.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleForumTopicIsClosed() {
        }

        /**
         * Creates a function, which toggles whether a topic is closed in a forum supergroup chat; requires canManageTopics administrator right in the supergroup unless the user is creator of the topic.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat.
         * @param forumTopicId Forum topic identifier.
         * @param isClosed Pass true to close the topic; pass false to reopen it.
         */
        public ToggleForumTopicIsClosed(long chatId, int forumTopicId, boolean isClosed) {
            this.chatId = chatId;
            this.forumTopicId = forumTopicId;
            this.isClosed = isClosed;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 982153376;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the pinned state of a topic in a forum supergroup chat or a chat with a bot with topics; requires canManageTopics administrator right in the supergroup. There can be up to getOption(&quot;pinned_forum_topic_count_max&quot;) pinned forum topics.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleForumTopicIsPinned extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Forum topic identifier.
         */
        public int forumTopicId;
        /**
         * Pass true to pin the topic; pass false to unpin it.
         */
        public boolean isPinned;

        /**
         * Default constructor for a function, which changes the pinned state of a topic in a forum supergroup chat or a chat with a bot with topics; requires canManageTopics administrator right in the supergroup. There can be up to getOption(&quot;pinned_forum_topic_count_max&quot;) pinned forum topics.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleForumTopicIsPinned() {
        }

        /**
         * Creates a function, which changes the pinned state of a topic in a forum supergroup chat or a chat with a bot with topics; requires canManageTopics administrator right in the supergroup. There can be up to getOption(&quot;pinned_forum_topic_count_max&quot;) pinned forum topics.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param forumTopicId Forum topic identifier.
         * @param isPinned Pass true to pin the topic; pass false to unpin it.
         */
        public ToggleForumTopicIsPinned(long chatId, int forumTopicId, boolean isPinned) {
            this.chatId = chatId;
            this.forumTopicId = forumTopicId;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1474651795;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether a General topic is hidden in a forum supergroup chat; requires canManageTopics administrator right in the supergroup.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleGeneralForumTopicIsHidden extends Function<Ok> {
        /**
         * Identifier of the chat.
         */
        public long chatId;
        /**
         * Pass true to hide and close the General topic; pass false to unhide it.
         */
        public boolean isHidden;

        /**
         * Default constructor for a function, which toggles whether a General topic is hidden in a forum supergroup chat; requires canManageTopics administrator right in the supergroup.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleGeneralForumTopicIsHidden() {
        }

        /**
         * Creates a function, which toggles whether a General topic is hidden in a forum supergroup chat; requires canManageTopics administrator right in the supergroup.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat.
         * @param isHidden Pass true to hide and close the General topic; pass false to unhide it.
         */
        public ToggleGeneralForumTopicIsHidden(long chatId, boolean isHidden) {
            this.chatId = chatId;
            this.isHidden = isHidden;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1595741256;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether a gift is shown on the current user's or the channel's profile page; requires canPostMessages administrator right in the channel chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleGiftIsSaved extends Function<Ok> {
        /**
         * Identifier of the gift.
         */
        public String receivedGiftId;
        /**
         * Pass true to display the gift on the user's or the channel's profile page; pass false to remove it from the profile page.
         */
        public boolean isSaved;

        /**
         * Default constructor for a function, which toggles whether a gift is shown on the current user's or the channel's profile page; requires canPostMessages administrator right in the channel chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleGiftIsSaved() {
        }

        /**
         * Creates a function, which toggles whether a gift is shown on the current user's or the channel's profile page; requires canPostMessages administrator right in the channel chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param receivedGiftId Identifier of the gift.
         * @param isSaved Pass true to display the gift on the user's or the channel's profile page; pass false to remove it from the profile page.
         */
        public ToggleGiftIsSaved(String receivedGiftId, boolean isSaved) {
            this.receivedGiftId = receivedGiftId;
            this.isSaved = isSaved;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 693198065;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether participants of a group call can send messages there. Requires groupCall.canToggleAreMessagesAllowed right.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleGroupCallAreMessagesAllowed extends Function<Ok> {
        /**
         * Group call identifier.
         */
        public int groupCallId;
        /**
         * New value of the areMessagesAllowed setting.
         */
        public boolean areMessagesAllowed;

        /**
         * Default constructor for a function, which toggles whether participants of a group call can send messages there. Requires groupCall.canToggleAreMessagesAllowed right.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleGroupCallAreMessagesAllowed() {
        }

        /**
         * Creates a function, which toggles whether participants of a group call can send messages there. Requires groupCall.canToggleAreMessagesAllowed right.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier.
         * @param areMessagesAllowed New value of the areMessagesAllowed setting.
         */
        public ToggleGroupCallAreMessagesAllowed(int groupCallId, boolean areMessagesAllowed) {
            this.groupCallId = groupCallId;
            this.areMessagesAllowed = areMessagesAllowed;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1535668758;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether current user's video is enabled.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleGroupCallIsMyVideoEnabled extends Function<Ok> {
        /**
         * Group call identifier.
         */
        public int groupCallId;
        /**
         * Pass true if the current user's video is enabled.
         */
        public boolean isMyVideoEnabled;

        /**
         * Default constructor for a function, which toggles whether current user's video is enabled.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleGroupCallIsMyVideoEnabled() {
        }

        /**
         * Creates a function, which toggles whether current user's video is enabled.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier.
         * @param isMyVideoEnabled Pass true if the current user's video is enabled.
         */
        public ToggleGroupCallIsMyVideoEnabled(int groupCallId, boolean isMyVideoEnabled) {
            this.groupCallId = groupCallId;
            this.isMyVideoEnabled = isMyVideoEnabled;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1624289030;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether current user's video is paused.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleGroupCallIsMyVideoPaused extends Function<Ok> {
        /**
         * Group call identifier.
         */
        public int groupCallId;
        /**
         * Pass true if the current user's video is paused.
         */
        public boolean isMyVideoPaused;

        /**
         * Default constructor for a function, which toggles whether current user's video is paused.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleGroupCallIsMyVideoPaused() {
        }

        /**
         * Creates a function, which toggles whether current user's video is paused.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier.
         * @param isMyVideoPaused Pass true if the current user's video is paused.
         */
        public ToggleGroupCallIsMyVideoPaused(int groupCallId, boolean isMyVideoPaused) {
            this.groupCallId = groupCallId;
            this.isMyVideoPaused = isMyVideoPaused;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -478875239;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether a group call participant hand is rased; for video chats only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleGroupCallParticipantIsHandRaised extends Function<Ok> {
        /**
         * Group call identifier.
         */
        public int groupCallId;
        /**
         * Participant identifier.
         */
        public MessageSender participantId;
        /**
         * Pass true if the user's hand needs to be raised. Only self hand can be raised. Requires groupCall.canBeManaged right to lower other's hand.
         */
        public boolean isHandRaised;

        /**
         * Default constructor for a function, which toggles whether a group call participant hand is rased; for video chats only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleGroupCallParticipantIsHandRaised() {
        }

        /**
         * Creates a function, which toggles whether a group call participant hand is rased; for video chats only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier.
         * @param participantId Participant identifier.
         * @param isHandRaised Pass true if the user's hand needs to be raised. Only self hand can be raised. Requires groupCall.canBeManaged right to lower other's hand.
         */
        public ToggleGroupCallParticipantIsHandRaised(int groupCallId, MessageSender participantId, boolean isHandRaised) {
            this.groupCallId = groupCallId;
            this.participantId = participantId;
            this.isHandRaised = isHandRaised;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1896127519;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether a participant of an active group call is muted, unmuted, or allowed to unmute themselves; not supported for live stories.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleGroupCallParticipantIsMuted extends Function<Ok> {
        /**
         * Group call identifier.
         */
        public int groupCallId;
        /**
         * Participant identifier.
         */
        public MessageSender participantId;
        /**
         * Pass true to mute the user; pass false to unmute them.
         */
        public boolean isMuted;

        /**
         * Default constructor for a function, which toggles whether a participant of an active group call is muted, unmuted, or allowed to unmute themselves; not supported for live stories.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleGroupCallParticipantIsMuted() {
        }

        /**
         * Creates a function, which toggles whether a participant of an active group call is muted, unmuted, or allowed to unmute themselves; not supported for live stories.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier.
         * @param participantId Participant identifier.
         * @param isMuted Pass true to mute the user; pass false to unmute them.
         */
        public ToggleGroupCallParticipantIsMuted(int groupCallId, MessageSender participantId, boolean isMuted) {
            this.groupCallId = groupCallId;
            this.participantId = participantId;
            this.isMuted = isMuted;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1308093433;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Pauses or unpauses screen sharing in a joined group call; not supported in live stories.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleGroupCallScreenSharingIsPaused extends Function<Ok> {
        /**
         * Group call identifier.
         */
        public int groupCallId;
        /**
         * Pass true to pause screen sharing; pass false to unpause it.
         */
        public boolean isPaused;

        /**
         * Default constructor for a function, which pauses or unpauses screen sharing in a joined group call; not supported in live stories.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleGroupCallScreenSharingIsPaused() {
        }

        /**
         * Creates a function, which pauses or unpauses screen sharing in a joined group call; not supported in live stories.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier.
         * @param isPaused Pass true to pause screen sharing; pass false to unpause it.
         */
        public ToggleGroupCallScreenSharingIsPaused(int groupCallId, boolean isPaused) {
            this.groupCallId = groupCallId;
            this.isPaused = isPaused;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1602530464;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether the current user has sponsored messages enabled. The setting has no effect for users without Telegram Premium for which sponsored messages are always enabled.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleHasSponsoredMessagesEnabled extends Function<Ok> {
        /**
         * Pass true to enable sponsored messages for the current user; false to disable them.
         */
        public boolean hasSponsoredMessagesEnabled;

        /**
         * Default constructor for a function, which toggles whether the current user has sponsored messages enabled. The setting has no effect for users without Telegram Premium for which sponsored messages are always enabled.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleHasSponsoredMessagesEnabled() {
        }

        /**
         * Creates a function, which toggles whether the current user has sponsored messages enabled. The setting has no effect for users without Telegram Premium for which sponsored messages are always enabled.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param hasSponsoredMessagesEnabled Pass true to enable sponsored messages for the current user; false to disable them.
         */
        public ToggleHasSponsoredMessagesEnabled(boolean hasSponsoredMessagesEnabled) {
            this.hasSponsoredMessagesEnabled = hasSponsoredMessagesEnabled;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1963285740;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the pinned state of a Saved Messages topic. There can be up to getOption(&quot;pinned_saved_messages_topic_count_max&quot;) pinned topics. The limit can be increased with Telegram Premium.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleSavedMessagesTopicIsPinned extends Function<Ok> {
        /**
         * Identifier of Saved Messages topic to pin or unpin.
         */
        public long savedMessagesTopicId;
        /**
         * Pass true to pin the topic; pass false to unpin it.
         */
        public boolean isPinned;

        /**
         * Default constructor for a function, which changes the pinned state of a Saved Messages topic. There can be up to getOption(&quot;pinned_saved_messages_topic_count_max&quot;) pinned topics. The limit can be increased with Telegram Premium.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleSavedMessagesTopicIsPinned() {
        }

        /**
         * Creates a function, which changes the pinned state of a Saved Messages topic. There can be up to getOption(&quot;pinned_saved_messages_topic_count_max&quot;) pinned topics. The limit can be increased with Telegram Premium.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param savedMessagesTopicId Identifier of Saved Messages topic to pin or unpin.
         * @param isPinned Pass true to pin the topic; pass false to unpin it.
         */
        public ToggleSavedMessagesTopicIsPinned(long savedMessagesTopicId, boolean isPinned) {
            this.savedMessagesTopicId = savedMessagesTopicId;
            this.isPinned = isPinned;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1588378164;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether a session can accept incoming calls.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleSessionCanAcceptCalls extends Function<Ok> {
        /**
         * Session identifier.
         */
        public long sessionId;
        /**
         * Pass true to allow accepting incoming calls by the session; pass false otherwise.
         */
        public boolean canAcceptCalls;

        /**
         * Default constructor for a function, which toggles whether a session can accept incoming calls.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleSessionCanAcceptCalls() {
        }

        /**
         * Creates a function, which toggles whether a session can accept incoming calls.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param sessionId Session identifier.
         * @param canAcceptCalls Pass true to allow accepting incoming calls by the session; pass false otherwise.
         */
        public ToggleSessionCanAcceptCalls(long sessionId, boolean canAcceptCalls) {
            this.sessionId = sessionId;
            this.canAcceptCalls = canAcceptCalls;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1819027208;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether a session can accept incoming secret chats.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleSessionCanAcceptSecretChats extends Function<Ok> {
        /**
         * Session identifier.
         */
        public long sessionId;
        /**
         * Pass true to allow accepting secret chats by the session; pass false otherwise.
         */
        public boolean canAcceptSecretChats;

        /**
         * Default constructor for a function, which toggles whether a session can accept incoming secret chats.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleSessionCanAcceptSecretChats() {
        }

        /**
         * Creates a function, which toggles whether a session can accept incoming secret chats.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param sessionId Session identifier.
         * @param canAcceptSecretChats Pass true to allow accepting secret chats by the session; pass false otherwise.
         */
        public ToggleSessionCanAcceptSecretChats(long sessionId, boolean canAcceptSecretChats) {
            this.sessionId = sessionId;
            this.canAcceptSecretChats = canAcceptSecretChats;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1000843390;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether a story is accessible after expiration. Can be called only if story.canToggleIsPostedToChatPage == true.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleStoryIsPostedToChatPage extends Function<Ok> {
        /**
         * Identifier of the chat that posted the story.
         */
        public long storyPosterChatId;
        /**
         * Identifier of the story.
         */
        public int storyId;
        /**
         * Pass true to make the story accessible after expiration; pass false to make it private.
         */
        public boolean isPostedToChatPage;

        /**
         * Default constructor for a function, which toggles whether a story is accessible after expiration. Can be called only if story.canToggleIsPostedToChatPage == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleStoryIsPostedToChatPage() {
        }

        /**
         * Creates a function, which toggles whether a story is accessible after expiration. Can be called only if story.canToggleIsPostedToChatPage == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param storyPosterChatId Identifier of the chat that posted the story.
         * @param storyId Identifier of the story.
         * @param isPostedToChatPage Pass true to make the story accessible after expiration; pass false to make it private.
         */
        public ToggleStoryIsPostedToChatPage(long storyPosterChatId, int storyId, boolean isPostedToChatPage) {
            this.storyPosterChatId = storyPosterChatId;
            this.storyId = storyId;
            this.isPostedToChatPage = isPostedToChatPage;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -2141806228;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether sponsored messages are shown in the channel chat; requires owner privileges in the channel. The chat must have at least chatBoostFeatures.minSponsoredMessageDisableBoostLevel boost level to disable sponsored messages.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleSupergroupCanHaveSponsoredMessages extends Function<Ok> {
        /**
         * The identifier of the channel.
         */
        public long supergroupId;
        /**
         * The new value of canHaveSponsoredMessages.
         */
        public boolean canHaveSponsoredMessages;

        /**
         * Default constructor for a function, which toggles whether sponsored messages are shown in the channel chat; requires owner privileges in the channel. The chat must have at least chatBoostFeatures.minSponsoredMessageDisableBoostLevel boost level to disable sponsored messages.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleSupergroupCanHaveSponsoredMessages() {
        }

        /**
         * Creates a function, which toggles whether sponsored messages are shown in the channel chat; requires owner privileges in the channel. The chat must have at least chatBoostFeatures.minSponsoredMessageDisableBoostLevel boost level to disable sponsored messages.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param supergroupId The identifier of the channel.
         * @param canHaveSponsoredMessages The new value of canHaveSponsoredMessages.
         */
        public ToggleSupergroupCanHaveSponsoredMessages(long supergroupId, boolean canHaveSponsoredMessages) {
            this.supergroupId = supergroupId;
            this.canHaveSponsoredMessages = canHaveSponsoredMessages;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1098204302;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether aggressive anti-spam checks are enabled in the supergroup. Can be called only if supergroupFullInfo.canToggleAggressiveAntiSpam == true.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleSupergroupHasAggressiveAntiSpamEnabled extends Function<Ok> {
        /**
         * The identifier of the supergroup, which isn't a broadcast group.
         */
        public long supergroupId;
        /**
         * The new value of hasAggressiveAntiSpamEnabled.
         */
        public boolean hasAggressiveAntiSpamEnabled;

        /**
         * Default constructor for a function, which toggles whether aggressive anti-spam checks are enabled in the supergroup. Can be called only if supergroupFullInfo.canToggleAggressiveAntiSpam == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleSupergroupHasAggressiveAntiSpamEnabled() {
        }

        /**
         * Creates a function, which toggles whether aggressive anti-spam checks are enabled in the supergroup. Can be called only if supergroupFullInfo.canToggleAggressiveAntiSpam == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param supergroupId The identifier of the supergroup, which isn't a broadcast group.
         * @param hasAggressiveAntiSpamEnabled The new value of hasAggressiveAntiSpamEnabled.
         */
        public ToggleSupergroupHasAggressiveAntiSpamEnabled(long supergroupId, boolean hasAggressiveAntiSpamEnabled) {
            this.supergroupId = supergroupId;
            this.hasAggressiveAntiSpamEnabled = hasAggressiveAntiSpamEnabled;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1748956943;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether messages are automatically translated in the channel chat; requires canChangeInfo administrator right in the channel. The chat must have at least chatBoostFeatures.minAutomaticTranslationBoostLevel boost level to enable automatic translation.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleSupergroupHasAutomaticTranslation extends Function<Ok> {
        /**
         * The identifier of the channel.
         */
        public long supergroupId;
        /**
         * The new value of hasAutomaticTranslation.
         */
        public boolean hasAutomaticTranslation;

        /**
         * Default constructor for a function, which toggles whether messages are automatically translated in the channel chat; requires canChangeInfo administrator right in the channel. The chat must have at least chatBoostFeatures.minAutomaticTranslationBoostLevel boost level to enable automatic translation.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleSupergroupHasAutomaticTranslation() {
        }

        /**
         * Creates a function, which toggles whether messages are automatically translated in the channel chat; requires canChangeInfo administrator right in the channel. The chat must have at least chatBoostFeatures.minAutomaticTranslationBoostLevel boost level to enable automatic translation.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param supergroupId The identifier of the channel.
         * @param hasAutomaticTranslation The new value of hasAutomaticTranslation.
         */
        public ToggleSupergroupHasAutomaticTranslation(long supergroupId, boolean hasAutomaticTranslation) {
            this.supergroupId = supergroupId;
            this.hasAutomaticTranslation = hasAutomaticTranslation;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -184993048;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether non-administrators can receive only administrators and bots using getSupergroupMembers or searchChatMembers. Can be called only if supergroupFullInfo.canHideMembers == true.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleSupergroupHasHiddenMembers extends Function<Ok> {
        /**
         * Identifier of the supergroup.
         */
        public long supergroupId;
        /**
         * New value of hasHiddenMembers.
         */
        public boolean hasHiddenMembers;

        /**
         * Default constructor for a function, which toggles whether non-administrators can receive only administrators and bots using getSupergroupMembers or searchChatMembers. Can be called only if supergroupFullInfo.canHideMembers == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleSupergroupHasHiddenMembers() {
        }

        /**
         * Creates a function, which toggles whether non-administrators can receive only administrators and bots using getSupergroupMembers or searchChatMembers. Can be called only if supergroupFullInfo.canHideMembers == true.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param supergroupId Identifier of the supergroup.
         * @param hasHiddenMembers New value of hasHiddenMembers.
         */
        public ToggleSupergroupHasHiddenMembers(long supergroupId, boolean hasHiddenMembers) {
            this.supergroupId = supergroupId;
            this.hasHiddenMembers = hasHiddenMembers;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1537892918;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether the message history of a supergroup is available to new members; requires canChangeInfo member right.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleSupergroupIsAllHistoryAvailable extends Function<Ok> {
        /**
         * The identifier of the supergroup.
         */
        public long supergroupId;
        /**
         * The new value of isAllHistoryAvailable.
         */
        public boolean isAllHistoryAvailable;

        /**
         * Default constructor for a function, which toggles whether the message history of a supergroup is available to new members; requires canChangeInfo member right.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleSupergroupIsAllHistoryAvailable() {
        }

        /**
         * Creates a function, which toggles whether the message history of a supergroup is available to new members; requires canChangeInfo member right.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param supergroupId The identifier of the supergroup.
         * @param isAllHistoryAvailable The new value of isAllHistoryAvailable.
         */
        public ToggleSupergroupIsAllHistoryAvailable(long supergroupId, boolean isAllHistoryAvailable) {
            this.supergroupId = supergroupId;
            this.isAllHistoryAvailable = isAllHistoryAvailable;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1155110478;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Upgrades supergroup to a broadcast group; requires owner privileges in the supergroup.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleSupergroupIsBroadcastGroup extends Function<Ok> {
        /**
         * Identifier of the supergroup.
         */
        public long supergroupId;

        /**
         * Default constructor for a function, which upgrades supergroup to a broadcast group; requires owner privileges in the supergroup.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleSupergroupIsBroadcastGroup() {
        }

        /**
         * Creates a function, which upgrades supergroup to a broadcast group; requires owner privileges in the supergroup.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param supergroupId Identifier of the supergroup.
         */
        public ToggleSupergroupIsBroadcastGroup(long supergroupId) {
            this.supergroupId = supergroupId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 884089365;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether the supergroup is a forum; requires owner privileges in the supergroup. Discussion supergroups can't be converted to forums.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleSupergroupIsForum extends Function<Ok> {
        /**
         * Identifier of the supergroup.
         */
        public long supergroupId;
        /**
         * New value of isForum.
         */
        public boolean isForum;
        /**
         * New value of hasForumTabs; ignored if isForum is false.
         */
        public boolean hasForumTabs;

        /**
         * Default constructor for a function, which toggles whether the supergroup is a forum; requires owner privileges in the supergroup. Discussion supergroups can't be converted to forums.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleSupergroupIsForum() {
        }

        /**
         * Creates a function, which toggles whether the supergroup is a forum; requires owner privileges in the supergroup. Discussion supergroups can't be converted to forums.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param supergroupId Identifier of the supergroup.
         * @param isForum New value of isForum.
         * @param hasForumTabs New value of hasForumTabs; ignored if isForum is false.
         */
        public ToggleSupergroupIsForum(long supergroupId, boolean isForum, boolean hasForumTabs) {
            this.supergroupId = supergroupId;
            this.isForum = isForum;
            this.hasForumTabs = hasForumTabs;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 371064337;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether all users directly joining the supergroup need to be approved by supergroup administrators; requires canRestrictMembers administrator right.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleSupergroupJoinByRequest extends Function<Ok> {
        /**
         * Identifier of the supergroup that isn't a broadcast group and isn't a channel direct message group.
         */
        public long supergroupId;
        /**
         * New value of joinByRequest.
         */
        public boolean joinByRequest;

        /**
         * Default constructor for a function, which toggles whether all users directly joining the supergroup need to be approved by supergroup administrators; requires canRestrictMembers administrator right.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleSupergroupJoinByRequest() {
        }

        /**
         * Creates a function, which toggles whether all users directly joining the supergroup need to be approved by supergroup administrators; requires canRestrictMembers administrator right.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param supergroupId Identifier of the supergroup that isn't a broadcast group and isn't a channel direct message group.
         * @param joinByRequest New value of joinByRequest.
         */
        public ToggleSupergroupJoinByRequest(long supergroupId, boolean joinByRequest) {
            this.supergroupId = supergroupId;
            this.joinByRequest = joinByRequest;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2111807454;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether joining is mandatory to send messages to a discussion supergroup; requires canRestrictMembers administrator right.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleSupergroupJoinToSendMessages extends Function<Ok> {
        /**
         * Identifier of the supergroup that isn't a broadcast group.
         */
        public long supergroupId;
        /**
         * New value of joinToSendMessages.
         */
        public boolean joinToSendMessages;

        /**
         * Default constructor for a function, which toggles whether joining is mandatory to send messages to a discussion supergroup; requires canRestrictMembers administrator right.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleSupergroupJoinToSendMessages() {
        }

        /**
         * Creates a function, which toggles whether joining is mandatory to send messages to a discussion supergroup; requires canRestrictMembers administrator right.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param supergroupId Identifier of the supergroup that isn't a broadcast group.
         * @param joinToSendMessages New value of joinToSendMessages.
         */
        public ToggleSupergroupJoinToSendMessages(long supergroupId, boolean joinToSendMessages) {
            this.supergroupId = supergroupId;
            this.joinToSendMessages = joinToSendMessages;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -182022642;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether sender signature or link to the account is added to sent messages in a channel; requires canChangeInfo member right.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleSupergroupSignMessages extends Function<Ok> {
        /**
         * Identifier of the channel.
         */
        public long supergroupId;
        /**
         * New value of signMessages.
         */
        public boolean signMessages;
        /**
         * New value of showMessageSender.
         */
        public boolean showMessageSender;

        /**
         * Default constructor for a function, which toggles whether sender signature or link to the account is added to sent messages in a channel; requires canChangeInfo member right.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleSupergroupSignMessages() {
        }

        /**
         * Creates a function, which toggles whether sender signature or link to the account is added to sent messages in a channel; requires canChangeInfo member right.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param supergroupId Identifier of the channel.
         * @param signMessages New value of signMessages.
         * @param showMessageSender New value of showMessageSender.
         */
        public ToggleSupergroupSignMessages(long supergroupId, boolean signMessages, boolean showMessageSender) {
            this.supergroupId = supergroupId;
            this.signMessages = signMessages;
            this.showMessageSender = showMessageSender;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 572268491;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes active state for a username of a supergroup or channel, requires owner privileges in the supergroup or channel. The editable username can't be disabled. May return an error with a message &quot;USERNAMES_ACTIVE_TOO_MUCH&quot; if the maximum number of active usernames has been reached.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleSupergroupUsernameIsActive extends Function<Ok> {
        /**
         * Identifier of the supergroup or channel.
         */
        public long supergroupId;
        /**
         * The username to change.
         */
        public String username;
        /**
         * Pass true to activate the username; pass false to disable it.
         */
        public boolean isActive;

        /**
         * Default constructor for a function, which changes active state for a username of a supergroup or channel, requires owner privileges in the supergroup or channel. The editable username can't be disabled. May return an error with a message &quot;USERNAMES_ACTIVE_TOO_MUCH&quot; if the maximum number of active usernames has been reached.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleSupergroupUsernameIsActive() {
        }

        /**
         * Creates a function, which changes active state for a username of a supergroup or channel, requires owner privileges in the supergroup or channel. The editable username can't be disabled. May return an error with a message &quot;USERNAMES_ACTIVE_TOO_MUCH&quot; if the maximum number of active usernames has been reached.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param supergroupId Identifier of the supergroup or channel.
         * @param username The username to change.
         * @param isActive Pass true to activate the username; pass false to disable it.
         */
        public ToggleSupergroupUsernameIsActive(long supergroupId, String username, boolean isActive) {
            this.supergroupId = supergroupId;
            this.username = username;
            this.isActive = isActive;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1500811777;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes active state for a username of the current user. The editable username can't be disabled. May return an error with a message &quot;USERNAMES_ACTIVE_TOO_MUCH&quot; if the maximum number of active usernames has been reached.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleUsernameIsActive extends Function<Ok> {
        /**
         * The username to change.
         */
        public String username;
        /**
         * Pass true to activate the username; pass false to disable it.
         */
        public boolean isActive;

        /**
         * Default constructor for a function, which changes active state for a username of the current user. The editable username can't be disabled. May return an error with a message &quot;USERNAMES_ACTIVE_TOO_MUCH&quot; if the maximum number of active usernames has been reached.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleUsernameIsActive() {
        }

        /**
         * Creates a function, which changes active state for a username of the current user. The editable username can't be disabled. May return an error with a message &quot;USERNAMES_ACTIVE_TOO_MUCH&quot; if the maximum number of active usernames has been reached.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param username The username to change.
         * @param isActive Pass true to activate the username; pass false to disable it.
         */
        public ToggleUsernameIsActive(String username, boolean isActive) {
            this.username = username;
            this.isActive = isActive;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1244098019;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether the current user will receive a notification when the video chat starts; for scheduled video chats only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleVideoChatEnabledStartNotification extends Function<Ok> {
        /**
         * Group call identifier.
         */
        public int groupCallId;
        /**
         * New value of the enabledStartNotification setting.
         */
        public boolean enabledStartNotification;

        /**
         * Default constructor for a function, which toggles whether the current user will receive a notification when the video chat starts; for scheduled video chats only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleVideoChatEnabledStartNotification() {
        }

        /**
         * Creates a function, which toggles whether the current user will receive a notification when the video chat starts; for scheduled video chats only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier.
         * @param enabledStartNotification New value of the enabledStartNotification setting.
         */
        public ToggleVideoChatEnabledStartNotification(int groupCallId, boolean enabledStartNotification) {
            this.groupCallId = groupCallId;
            this.enabledStartNotification = enabledStartNotification;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1851489086;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Toggles whether new participants of a video chat can be unmuted only by administrators of the video chat. Requires groupCall.canToggleMuteNewParticipants right.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ToggleVideoChatMuteNewParticipants extends Function<Ok> {
        /**
         * Group call identifier.
         */
        public int groupCallId;
        /**
         * New value of the muteNewParticipants setting.
         */
        public boolean muteNewParticipants;

        /**
         * Default constructor for a function, which toggles whether new participants of a video chat can be unmuted only by administrators of the video chat. Requires groupCall.canToggleMuteNewParticipants right.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ToggleVideoChatMuteNewParticipants() {
        }

        /**
         * Creates a function, which toggles whether new participants of a video chat can be unmuted only by administrators of the video chat. Requires groupCall.canToggleMuteNewParticipants right.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param groupCallId Group call identifier.
         * @param muteNewParticipants New value of the muteNewParticipants setting.
         */
        public ToggleVideoChatMuteNewParticipants(int groupCallId, boolean muteNewParticipants) {
            this.groupCallId = groupCallId;
            this.muteNewParticipants = muteNewParticipants;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 987023756;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Transfers Telegram Stars from the business account to the business bot; for bots only.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class TransferBusinessAccountStars extends Function<Ok> {
        /**
         * Unique identifier of business connection.
         */
        public String businessConnectionId;
        /**
         * Number of Telegram Stars to transfer.
         */
        public long starCount;

        /**
         * Default constructor for a function, which transfers Telegram Stars from the business account to the business bot; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public TransferBusinessAccountStars() {
        }

        /**
         * Creates a function, which transfers Telegram Stars from the business account to the business bot; for bots only.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param businessConnectionId Unique identifier of business connection.
         * @param starCount Number of Telegram Stars to transfer.
         */
        public TransferBusinessAccountStars(String businessConnectionId, long starCount) {
            this.businessConnectionId = businessConnectionId;
            this.starCount = starCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 732562464;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Changes the owner of a chat; for basic groups, supergroups and channel chats only; requires owner privileges in the chat. Use the method canTransferOwnership to check whether the ownership can be transferred from the current session.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class TransferChatOwnership extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * Identifier of the user to which transfer the ownership. The ownership can't be transferred to a bot or to a deleted user.
         */
        public long userId;
        /**
         * The 2-step verification password of the current user.
         */
        public String password;

        /**
         * Default constructor for a function, which changes the owner of a chat; for basic groups, supergroups and channel chats only; requires owner privileges in the chat. Use the method canTransferOwnership to check whether the ownership can be transferred from the current session.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public TransferChatOwnership() {
        }

        /**
         * Creates a function, which changes the owner of a chat; for basic groups, supergroups and channel chats only; requires owner privileges in the chat. Use the method canTransferOwnership to check whether the ownership can be transferred from the current session.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param userId Identifier of the user to which transfer the ownership. The ownership can't be transferred to a bot or to a deleted user.
         * @param password The 2-step verification password of the current user.
         */
        public TransferChatOwnership(long chatId, long userId, String password) {
            this.chatId = chatId;
            this.userId = userId;
            this.password = password;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2006977043;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Sends an upgraded gift to another user or channel chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class TransferGift extends Function<Ok> {
        /**
         * Unique identifier of business connection on behalf of which to send the request; for bots only.
         */
        public String businessConnectionId;
        /**
         * Identifier of the gift.
         */
        public String receivedGiftId;
        /**
         * Identifier of the user or the channel chat that will receive the gift.
         */
        public MessageSender newOwnerId;
        /**
         * The Telegram Star amount required to pay for the transfer.
         */
        public long starCount;

        /**
         * Default constructor for a function, which sends an upgraded gift to another user or channel chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public TransferGift() {
        }

        /**
         * Creates a function, which sends an upgraded gift to another user or channel chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param businessConnectionId Unique identifier of business connection on behalf of which to send the request; for bots only.
         * @param receivedGiftId Identifier of the gift.
         * @param newOwnerId Identifier of the user or the channel chat that will receive the gift.
         * @param starCount The Telegram Star amount required to pay for the transfer.
         */
        public TransferGift(String businessConnectionId, String receivedGiftId, MessageSender newOwnerId, long starCount) {
            this.businessConnectionId = businessConnectionId;
            this.receivedGiftId = receivedGiftId;
            this.newOwnerId = newOwnerId;
            this.starCount = starCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1167293126;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Extracts text or caption of the given message and translates it to the given language; must not be used in secret chats. If the current user is a Telegram Premium user, then text formatting is preserved.
     *
     * <p> Returns {@link FormattedText FormattedText} </p>
     */
    public static class TranslateMessageText extends Function<FormattedText> {
        /**
         * Identifier of the chat to which the message belongs.
         */
        public long chatId;
        /**
         * Identifier of the message.
         */
        public long messageId;
        /**
         * Language code of the language to which the message is translated. See translateText.toLanguageCode for the list of supported values.
         */
        public String toLanguageCode;
        /**
         * Tone of the translation; see translateText.tone for the list of supported values.
         */
        public String tone;

        /**
         * Default constructor for a function, which extracts text or caption of the given message and translates it to the given language; must not be used in secret chats. If the current user is a Telegram Premium user, then text formatting is preserved.
         *
         * <p> Returns {@link FormattedText FormattedText} </p>
         */
        public TranslateMessageText() {
        }

        /**
         * Creates a function, which extracts text or caption of the given message and translates it to the given language; must not be used in secret chats. If the current user is a Telegram Premium user, then text formatting is preserved.
         *
         * <p> Returns {@link FormattedText FormattedText} </p>
         *
         * @param chatId Identifier of the chat to which the message belongs.
         * @param messageId Identifier of the message.
         * @param toLanguageCode Language code of the language to which the message is translated. See translateText.toLanguageCode for the list of supported values.
         * @param tone Tone of the translation; see translateText.tone for the list of supported values.
         */
        public TranslateMessageText(long chatId, long messageId, String toLanguageCode, String tone) {
            this.chatId = chatId;
            this.messageId = messageId;
            this.toLanguageCode = toLanguageCode;
            this.tone = tone;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1995371403;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Translates a text to the given language; must not be used in secret chats. If the current user is a Telegram Premium user, then text formatting is preserved.
     *
     * <p> Returns {@link FormattedText FormattedText} </p>
     */
    public static class TranslateText extends Function<FormattedText> {
        /**
         * Text to translate.
         */
        public FormattedText text;
        /**
         * Language code of the language to which the message is translated. Must be one of &quot;af&quot;, &quot;sq&quot;, &quot;am&quot;, &quot;ar&quot;, &quot;hy&quot;, &quot;az&quot;, &quot;eu&quot;, &quot;be&quot;, &quot;bn&quot;, &quot;bs&quot;, &quot;bg&quot;, &quot;ca&quot;, &quot;ceb&quot;, &quot;zh-CN&quot;, &quot;zh&quot;, &quot;zh-Hans&quot;, &quot;zh-TW&quot;, &quot;zh-Hant&quot;, &quot;co&quot;, &quot;hr&quot;, &quot;cs&quot;, &quot;da&quot;, &quot;nl&quot;, &quot;en&quot;, &quot;eo&quot;, &quot;et&quot;, &quot;fi&quot;, &quot;fr&quot;, &quot;fy&quot;, &quot;gl&quot;, &quot;ka&quot;, &quot;de&quot;, &quot;el&quot;, &quot;gu&quot;, &quot;ht&quot;, &quot;ha&quot;, &quot;haw&quot;, &quot;he&quot;, &quot;iw&quot;, &quot;hi&quot;, &quot;hmn&quot;, &quot;hu&quot;, &quot;is&quot;, &quot;ig&quot;, &quot;id&quot;, &quot;in&quot;, &quot;ga&quot;, &quot;it&quot;, &quot;ja&quot;, &quot;jv&quot;, &quot;kn&quot;, &quot;kk&quot;, &quot;km&quot;, &quot;rw&quot;, &quot;ko&quot;, &quot;ku&quot;, &quot;ky&quot;, &quot;lo&quot;, &quot;la&quot;, &quot;lv&quot;, &quot;lt&quot;, &quot;lb&quot;, &quot;mk&quot;, &quot;mg&quot;, &quot;ms&quot;, &quot;ml&quot;, &quot;mt&quot;, &quot;mi&quot;, &quot;mr&quot;, &quot;mn&quot;, &quot;my&quot;, &quot;ne&quot;, &quot;no&quot;, &quot;ny&quot;, &quot;or&quot;, &quot;ps&quot;, &quot;fa&quot;, &quot;pl&quot;, &quot;pt&quot;, &quot;pt-BR&quot;, &quot;pa&quot;, &quot;ro&quot;, &quot;ru&quot;, &quot;sm&quot;, &quot;gd&quot;, &quot;sr&quot;, &quot;st&quot;, &quot;sn&quot;, &quot;sd&quot;, &quot;si&quot;, &quot;sk&quot;, &quot;sl&quot;, &quot;so&quot;, &quot;es&quot;, &quot;su&quot;, &quot;sw&quot;, &quot;sv&quot;, &quot;tl&quot;, &quot;tg&quot;, &quot;ta&quot;, &quot;tt&quot;, &quot;te&quot;, &quot;th&quot;, &quot;tr&quot;, &quot;tk&quot;, &quot;uk&quot;, &quot;ur&quot;, &quot;ug&quot;, &quot;uz&quot;, &quot;vi&quot;, &quot;cy&quot;, &quot;xh&quot;, &quot;yi&quot;, &quot;ji&quot;, &quot;yo&quot;, &quot;zu&quot;.
         */
        public String toLanguageCode;
        /**
         * Tone of the translation; must be one of &quot;&quot;, &quot;formal&quot;, &quot;neutral&quot;, &quot;casual&quot;; defaults to &quot;neutral&quot;.
         */
        public String tone;

        /**
         * Default constructor for a function, which translates a text to the given language; must not be used in secret chats. If the current user is a Telegram Premium user, then text formatting is preserved.
         *
         * <p> Returns {@link FormattedText FormattedText} </p>
         */
        public TranslateText() {
        }

        /**
         * Creates a function, which translates a text to the given language; must not be used in secret chats. If the current user is a Telegram Premium user, then text formatting is preserved.
         *
         * <p> Returns {@link FormattedText FormattedText} </p>
         *
         * @param text Text to translate.
         * @param toLanguageCode Language code of the language to which the message is translated. Must be one of &quot;af&quot;, &quot;sq&quot;, &quot;am&quot;, &quot;ar&quot;, &quot;hy&quot;, &quot;az&quot;, &quot;eu&quot;, &quot;be&quot;, &quot;bn&quot;, &quot;bs&quot;, &quot;bg&quot;, &quot;ca&quot;, &quot;ceb&quot;, &quot;zh-CN&quot;, &quot;zh&quot;, &quot;zh-Hans&quot;, &quot;zh-TW&quot;, &quot;zh-Hant&quot;, &quot;co&quot;, &quot;hr&quot;, &quot;cs&quot;, &quot;da&quot;, &quot;nl&quot;, &quot;en&quot;, &quot;eo&quot;, &quot;et&quot;, &quot;fi&quot;, &quot;fr&quot;, &quot;fy&quot;, &quot;gl&quot;, &quot;ka&quot;, &quot;de&quot;, &quot;el&quot;, &quot;gu&quot;, &quot;ht&quot;, &quot;ha&quot;, &quot;haw&quot;, &quot;he&quot;, &quot;iw&quot;, &quot;hi&quot;, &quot;hmn&quot;, &quot;hu&quot;, &quot;is&quot;, &quot;ig&quot;, &quot;id&quot;, &quot;in&quot;, &quot;ga&quot;, &quot;it&quot;, &quot;ja&quot;, &quot;jv&quot;, &quot;kn&quot;, &quot;kk&quot;, &quot;km&quot;, &quot;rw&quot;, &quot;ko&quot;, &quot;ku&quot;, &quot;ky&quot;, &quot;lo&quot;, &quot;la&quot;, &quot;lv&quot;, &quot;lt&quot;, &quot;lb&quot;, &quot;mk&quot;, &quot;mg&quot;, &quot;ms&quot;, &quot;ml&quot;, &quot;mt&quot;, &quot;mi&quot;, &quot;mr&quot;, &quot;mn&quot;, &quot;my&quot;, &quot;ne&quot;, &quot;no&quot;, &quot;ny&quot;, &quot;or&quot;, &quot;ps&quot;, &quot;fa&quot;, &quot;pl&quot;, &quot;pt&quot;, &quot;pt-BR&quot;, &quot;pa&quot;, &quot;ro&quot;, &quot;ru&quot;, &quot;sm&quot;, &quot;gd&quot;, &quot;sr&quot;, &quot;st&quot;, &quot;sn&quot;, &quot;sd&quot;, &quot;si&quot;, &quot;sk&quot;, &quot;sl&quot;, &quot;so&quot;, &quot;es&quot;, &quot;su&quot;, &quot;sw&quot;, &quot;sv&quot;, &quot;tl&quot;, &quot;tg&quot;, &quot;ta&quot;, &quot;tt&quot;, &quot;te&quot;, &quot;th&quot;, &quot;tr&quot;, &quot;tk&quot;, &quot;uk&quot;, &quot;ur&quot;, &quot;ug&quot;, &quot;uz&quot;, &quot;vi&quot;, &quot;cy&quot;, &quot;xh&quot;, &quot;yi&quot;, &quot;ji&quot;, &quot;yo&quot;, &quot;zu&quot;.
         * @param tone Tone of the translation; must be one of &quot;&quot;, &quot;formal&quot;, &quot;neutral&quot;, &quot;casual&quot;; defaults to &quot;neutral&quot;.
         */
        public TranslateText(FormattedText text, String toLanguageCode, String tone) {
            this.text = text;
            this.toLanguageCode = toLanguageCode;
            this.tone = tone;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -617975379;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes all pinned messages from a chat; requires canPinMessages member right if the chat is a basic group or supergroup, or canEditMessages administrator right if the chat is a channel.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class UnpinAllChatMessages extends Function<Ok> {
        /**
         * Identifier of the chat.
         */
        public long chatId;

        /**
         * Default constructor for a function, which removes all pinned messages from a chat; requires canPinMessages member right if the chat is a basic group or supergroup, or canEditMessages administrator right if the chat is a channel.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public UnpinAllChatMessages() {
        }

        /**
         * Creates a function, which removes all pinned messages from a chat; requires canPinMessages member right if the chat is a basic group or supergroup, or canEditMessages administrator right if the chat is a channel.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat.
         */
        public UnpinAllChatMessages(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1437805385;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes all pinned messages from the topic in a channel direct messages chat administered by the current user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class UnpinAllDirectMessagesChatTopicMessages extends Function<Ok> {
        /**
         * Identifier of the chat.
         */
        public long chatId;
        /**
         * Topic identifier.
         */
        public long topicId;

        /**
         * Default constructor for a function, which removes all pinned messages from the topic in a channel direct messages chat administered by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public UnpinAllDirectMessagesChatTopicMessages() {
        }

        /**
         * Creates a function, which removes all pinned messages from the topic in a channel direct messages chat administered by the current user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat.
         * @param topicId Topic identifier.
         */
        public UnpinAllDirectMessagesChatTopicMessages(long chatId, long topicId) {
            this.chatId = chatId;
            this.topicId = topicId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 89671100;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes all pinned messages from a topic in a forum supergroup chat or a chat with a bot with topics; requires canPinMessages member right in the supergroup.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class UnpinAllForumTopicMessages extends Function<Ok> {
        /**
         * Identifier of the chat.
         */
        public long chatId;
        /**
         * Forum topic identifier in which messages will be unpinned.
         */
        public int forumTopicId;

        /**
         * Default constructor for a function, which removes all pinned messages from a topic in a forum supergroup chat or a chat with a bot with topics; requires canPinMessages member right in the supergroup.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public UnpinAllForumTopicMessages() {
        }

        /**
         * Creates a function, which removes all pinned messages from a topic in a forum supergroup chat or a chat with a bot with topics; requires canPinMessages member right in the supergroup.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat.
         * @param forumTopicId Forum topic identifier in which messages will be unpinned.
         */
        public UnpinAllForumTopicMessages(long chatId, int forumTopicId) {
            this.chatId = chatId;
            this.forumTopicId = forumTopicId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1113340771;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Removes a pinned message from a chat; requires canPinMessages member right if the chat is a basic group or supergroup, or canEditMessages administrator right if the chat is a channel.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class UnpinChatMessage extends Function<Ok> {
        /**
         * Identifier of the chat.
         */
        public long chatId;
        /**
         * Identifier of the removed pinned message.
         */
        public long messageId;

        /**
         * Default constructor for a function, which removes a pinned message from a chat; requires canPinMessages member right if the chat is a basic group or supergroup, or canEditMessages administrator right if the chat is a channel.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public UnpinChatMessage() {
        }

        /**
         * Creates a function, which removes a pinned message from a chat; requires canPinMessages member right if the chat is a basic group or supergroup, or canEditMessages administrator right if the chat is a channel.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Identifier of the chat.
         * @param messageId Identifier of the removed pinned message.
         */
        public UnpinChatMessage(long chatId, long messageId) {
            this.chatId = chatId;
            this.messageId = messageId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 2065448670;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Creates a new supergroup from an existing basic group and sends a corresponding messageChatUpgradeTo and messageChatUpgradeFrom; requires owner privileges. Deactivates the original basic group.
     *
     * <p> Returns {@link Chat Chat} </p>
     */
    public static class UpgradeBasicGroupChatToSupergroupChat extends Function<Chat> {
        /**
         * Identifier of the chat to upgrade.
         */
        public long chatId;

        /**
         * Default constructor for a function, which creates a new supergroup from an existing basic group and sends a corresponding messageChatUpgradeTo and messageChatUpgradeFrom; requires owner privileges. Deactivates the original basic group.
         *
         * <p> Returns {@link Chat Chat} </p>
         */
        public UpgradeBasicGroupChatToSupergroupChat() {
        }

        /**
         * Creates a function, which creates a new supergroup from an existing basic group and sends a corresponding messageChatUpgradeTo and messageChatUpgradeFrom; requires owner privileges. Deactivates the original basic group.
         *
         * <p> Returns {@link Chat Chat} </p>
         *
         * @param chatId Identifier of the chat to upgrade.
         */
        public UpgradeBasicGroupChatToSupergroupChat(long chatId) {
            this.chatId = chatId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 300488122;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Upgrades a regular gift.
     *
     * <p> Returns {@link UpgradeGiftResult UpgradeGiftResult} </p>
     */
    public static class UpgradeGift extends Function<UpgradeGiftResult> {
        /**
         * Unique identifier of business connection on behalf of which to send the request; for bots only.
         */
        public String businessConnectionId;
        /**
         * Identifier of the gift.
         */
        public String receivedGiftId;
        /**
         * Pass true to keep the original gift text, sender and receiver in the upgraded gift.
         */
        public boolean keepOriginalDetails;
        /**
         * The Telegram Star amount required to pay for the upgrade. It the gift has prepaidUpgradeStarCount &gt; 0, then pass 0, otherwise, pass gift.upgradeStarCount.
         */
        public long starCount;

        /**
         * Default constructor for a function, which upgrades a regular gift.
         *
         * <p> Returns {@link UpgradeGiftResult UpgradeGiftResult} </p>
         */
        public UpgradeGift() {
        }

        /**
         * Creates a function, which upgrades a regular gift.
         *
         * <p> Returns {@link UpgradeGiftResult UpgradeGiftResult} </p>
         *
         * @param businessConnectionId Unique identifier of business connection on behalf of which to send the request; for bots only.
         * @param receivedGiftId Identifier of the gift.
         * @param keepOriginalDetails Pass true to keep the original gift text, sender and receiver in the upgraded gift.
         * @param starCount The Telegram Star amount required to pay for the upgrade. It the gift has prepaidUpgradeStarCount &gt; 0, then pass 0, otherwise, pass gift.upgradeStarCount.
         */
        public UpgradeGift(String businessConnectionId, String receivedGiftId, boolean keepOriginalDetails, long starCount) {
            this.businessConnectionId = businessConnectionId;
            this.receivedGiftId = receivedGiftId;
            this.keepOriginalDetails = keepOriginalDetails;
            this.starCount = starCount;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1782136103;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Uploads a file with a sticker; returns the uploaded file.
     *
     * <p> Returns {@link File File} </p>
     */
    public static class UploadStickerFile extends Function<File> {
        /**
         * Sticker file owner; ignored for regular users.
         */
        public long userId;
        /**
         * Sticker format.
         */
        public StickerFormat stickerFormat;
        /**
         * File file to upload; must fit in a 512x512 square. For WEBP stickers the file must be in WEBP or PNG format, which will be converted to WEBP server-side. See https://core.telegram.org/animated_stickers#technical-requirements for technical requirements.
         */
        public InputFile sticker;

        /**
         * Default constructor for a function, which uploads a file with a sticker; returns the uploaded file.
         *
         * <p> Returns {@link File File} </p>
         */
        public UploadStickerFile() {
        }

        /**
         * Creates a function, which uploads a file with a sticker; returns the uploaded file.
         *
         * <p> Returns {@link File File} </p>
         *
         * @param userId Sticker file owner; ignored for regular users.
         * @param stickerFormat Sticker format.
         * @param sticker File file to upload; must fit in a 512x512 square. For WEBP stickers the file must be in WEBP or PNG format, which will be converted to WEBP server-side. See https://core.telegram.org/animated_stickers#technical-requirements for technical requirements.
         */
        public UploadStickerFile(long userId, StickerFormat stickerFormat, InputFile sticker) {
            this.userId = userId;
            this.stickerFormat = stickerFormat;
            this.sticker = sticker;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 647385283;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Validates the order information provided by a user and returns the available shipping options for a flexible invoice.
     *
     * <p> Returns {@link ValidatedOrderInfo ValidatedOrderInfo} </p>
     */
    public static class ValidateOrderInfo extends Function<ValidatedOrderInfo> {
        /**
         * The invoice.
         */
        public InputInvoice inputInvoice;
        /**
         * The order information, provided by the user; pass null if empty.
         */
        public OrderInfo orderInfo;
        /**
         * Pass true to save the order information.
         */
        public boolean allowSave;

        /**
         * Default constructor for a function, which validates the order information provided by a user and returns the available shipping options for a flexible invoice.
         *
         * <p> Returns {@link ValidatedOrderInfo ValidatedOrderInfo} </p>
         */
        public ValidateOrderInfo() {
        }

        /**
         * Creates a function, which validates the order information provided by a user and returns the available shipping options for a flexible invoice.
         *
         * <p> Returns {@link ValidatedOrderInfo ValidatedOrderInfo} </p>
         *
         * @param inputInvoice The invoice.
         * @param orderInfo The order information, provided by the user; pass null if empty.
         * @param allowSave Pass true to save the order information.
         */
        public ValidateOrderInfo(InputInvoice inputInvoice, OrderInfo orderInfo, boolean allowSave) {
            this.inputInvoice = inputInvoice;
            this.orderInfo = orderInfo;
            this.allowSave = allowSave;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -1248305201;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs TDLib that messages are being viewed by the user. Sponsored messages must be marked as viewed only when the entire text of the message is shown on the screen (excluding the button). Many useful activities depend on whether the messages are currently being viewed or not (e.g., marking messages as read, incrementing a view counter, updating a view counter, removing deleted messages in supergroups and channels).
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ViewMessages extends Function<Ok> {
        /**
         * Chat identifier.
         */
        public long chatId;
        /**
         * The identifiers of the messages being viewed.
         */
        public long[] messageIds;
        /**
         * Source of the message view; pass null to guess the source based on chat open state.
         */
        public MessageSource source;
        /**
         * Pass true to mark as read the specified messages even if the chat is closed.
         */
        public boolean forceRead;

        /**
         * Default constructor for a function, which informs TDLib that messages are being viewed by the user. Sponsored messages must be marked as viewed only when the entire text of the message is shown on the screen (excluding the button). Many useful activities depend on whether the messages are currently being viewed or not (e.g., marking messages as read, incrementing a view counter, updating a view counter, removing deleted messages in supergroups and channels).
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ViewMessages() {
        }

        /**
         * Creates a function, which informs TDLib that messages are being viewed by the user. Sponsored messages must be marked as viewed only when the entire text of the message is shown on the screen (excluding the button). Many useful activities depend on whether the messages are currently being viewed or not (e.g., marking messages as read, incrementing a view counter, updating a view counter, removing deleted messages in supergroups and channels).
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param chatId Chat identifier.
         * @param messageIds The identifiers of the messages being viewed.
         * @param source Source of the message view; pass null to guess the source based on chat open state.
         * @param forceRead Pass true to mark as read the specified messages even if the chat is closed.
         */
        public ViewMessages(long chatId, long[] messageIds, MessageSource source, boolean forceRead) {
            this.chatId = chatId;
            this.messageIds = messageIds;
            this.source = source;
            this.forceRead = forceRead;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 960236656;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs TDLib that the user viewed detailed information about a Premium feature on the Premium features screen.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ViewPremiumFeature extends Function<Ok> {
        /**
         * The viewed premium feature.
         */
        public PremiumFeature feature;

        /**
         * Default constructor for a function, which informs TDLib that the user viewed detailed information about a Premium feature on the Premium features screen.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ViewPremiumFeature() {
        }

        /**
         * Creates a function, which informs TDLib that the user viewed detailed information about a Premium feature on the Premium features screen.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param feature The viewed premium feature.
         */
        public ViewPremiumFeature(PremiumFeature feature) {
            this.feature = feature;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 192950706;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs TDLib that the user fully viewed a sponsored chat.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ViewSponsoredChat extends Function<Ok> {
        /**
         * Unique identifier of the sponsored chat.
         */
        public long sponsoredChatUniqueId;

        /**
         * Default constructor for a function, which informs TDLib that the user fully viewed a sponsored chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ViewSponsoredChat() {
        }

        /**
         * Creates a function, which informs TDLib that the user fully viewed a sponsored chat.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param sponsoredChatUniqueId Unique identifier of the sponsored chat.
         */
        public ViewSponsoredChat(long sponsoredChatUniqueId) {
            this.sponsoredChatUniqueId = sponsoredChatUniqueId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 1722644778;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs the server that some trending sticker sets have been viewed by the user.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ViewTrendingStickerSets extends Function<Ok> {
        /**
         * Identifiers of viewed trending sticker sets.
         */
        public long[] stickerSetIds;

        /**
         * Default constructor for a function, which informs the server that some trending sticker sets have been viewed by the user.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ViewTrendingStickerSets() {
        }

        /**
         * Creates a function, which informs the server that some trending sticker sets have been viewed by the user.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param stickerSetIds Identifiers of viewed trending sticker sets.
         */
        public ViewTrendingStickerSets(long[] stickerSetIds) {
            this.stickerSetIds = stickerSetIds;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -952416520;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Informs TDLib that the user viewed a video message advertisement.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class ViewVideoMessageAdvertisement extends Function<Ok> {
        /**
         * Unique identifier of the advertisement.
         */
        public long advertisementUniqueId;

        /**
         * Default constructor for a function, which informs TDLib that the user viewed a video message advertisement.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public ViewVideoMessageAdvertisement() {
        }

        /**
         * Creates a function, which informs TDLib that the user viewed a video message advertisement.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param advertisementUniqueId Unique identifier of the advertisement.
         */
        public ViewVideoMessageAdvertisement(long advertisementUniqueId) {
            this.advertisementUniqueId = advertisementUniqueId;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = -808563006;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

    /**
     * Writes a part of a generated file. This method is intended to be used only if the application has no direct access to TDLib's file system, because it is usually slower than a direct write to the destination file.
     *
     * <p> Returns {@link Ok Ok} </p>
     */
    public static class WriteGeneratedFilePart extends Function<Ok> {
        /**
         * The identifier of the generation process.
         */
        public long generationId;
        /**
         * The offset from which to write the data to the file.
         */
        public long offset;
        /**
         * The data to write.
         */
        public byte[] data;

        /**
         * Default constructor for a function, which writes a part of a generated file. This method is intended to be used only if the application has no direct access to TDLib's file system, because it is usually slower than a direct write to the destination file.
         *
         * <p> Returns {@link Ok Ok} </p>
         */
        public WriteGeneratedFilePart() {
        }

        /**
         * Creates a function, which writes a part of a generated file. This method is intended to be used only if the application has no direct access to TDLib's file system, because it is usually slower than a direct write to the destination file.
         *
         * <p> Returns {@link Ok Ok} </p>
         *
         * @param generationId The identifier of the generation process.
         * @param offset The offset from which to write the data to the file.
         * @param data The data to write.
         */
        public WriteGeneratedFilePart(long generationId, long offset, byte[] data) {
            this.generationId = generationId;
            this.offset = offset;
            this.data = data;
        }

        /**
         * Identifier uniquely determining type of the object.
         */
        public static final int CONSTRUCTOR = 214474389;

        /**
         * @return this.CONSTRUCTOR
         */
        @Override
        public int getConstructor() {
            return CONSTRUCTOR;
        }
    }

}
