syntax = "proto2";
package proto;

message ADVSignedKeyIndexList {
    optional bytes details = 1;
    optional bytes accountSignature = 2;
    optional bytes accountSignatureKey = 3;
}

message ADVSignedDeviceIdentity {
    optional bytes details = 1;
    optional bytes accountSignatureKey = 2;
    optional bytes accountSignature = 3;
    optional bytes deviceSignature = 4;
}

message ADVSignedDeviceIdentityHMAC {
    optional bytes details = 1;
    optional bytes hmac = 2;
    optional ADVEncryptionType accountType = 3;
}

message ADVKeyIndexList {
    optional uint32 rawId = 1;
    optional uint64 timestamp = 2;
    optional uint32 currentIndex = 3;
    repeated uint32 validIndexes = 4 [packed=true];
    optional ADVEncryptionType accountType = 5;
}

enum ADVEncryptionType {
    E2EE = 0;
    HOSTED = 1;
}
message ADVDeviceIdentity {
    optional uint32 rawId = 1;
    optional uint64 timestamp = 2;
    optional uint32 keyIndex = 3;
    optional ADVEncryptionType accountType = 4;
    optional ADVEncryptionType deviceType = 5;
}

message DeviceProps {
    enum PlatformType {
        UNKNOWN = 0;
        CHROME = 1;
        FIREFOX = 2;
        IE = 3;
        OPERA = 4;
        SAFARI = 5;
        EDGE = 6;
        DESKTOP = 7;
        IPAD = 8;
        ANDROID_TABLET = 9;
        OHANA = 10;
        ALOHA = 11;
        CATALINA = 12;
        TCL_TV = 13;
        IOS_PHONE = 14;
        IOS_CATALYST = 15;
        ANDROID_PHONE = 16;
        ANDROID_AMBIGUOUS = 17;
        WEAR_OS = 18;
        AR_WRIST = 19;
        AR_DEVICE = 20;
        UWP = 21;
        VR = 22;
    }
    message HistorySyncConfig {
        optional uint32 fullSyncDaysLimit = 1;
        optional uint32 fullSyncSizeMbLimit = 2;
        optional uint32 storageQuotaMb = 3;
        optional bool inlineInitialPayloadInE2EeMsg = 4;
        optional uint32 recentSyncDaysLimit = 5;
        optional bool supportCallLogHistory = 6;
        optional bool supportBotUserAgentChatHistory = 7;
        optional bool supportCagReactionsAndPolls = 8;
        optional bool supportBizHostedMsg = 9;
        optional bool supportRecentSyncChunkMessageCountTuning = 10;
    }
    
    message AppVersion {
        optional uint32 primary = 1;
        optional uint32 secondary = 2;
        optional uint32 tertiary = 3;
        optional uint32 quaternary = 4;
        optional uint32 quinary = 5;
    }
    
    optional string os = 1;
    optional AppVersion version = 2;
    optional PlatformType platformType = 3;
    optional bool requireFullSync = 4;
    optional HistorySyncConfig historySyncConfig = 5;
}

message InitialSecurityNotificationSettingSync {
    optional bool securityNotificationEnabled = 1;
}

message ImageMessage {
    enum ImageSourceType {
        USER_IMAGE = 0;
        AI_GENERATED = 1;
        AI_MODIFIED = 2;
    }
    optional string url = 1;
    optional string mimetype = 2;
    optional string caption = 3;
    optional bytes fileSha256 = 4;
    optional uint64 fileLength = 5;
    optional uint32 height = 6;
    optional uint32 width = 7;
    optional bytes mediaKey = 8;
    optional bytes fileEncSha256 = 9;
    repeated InteractiveAnnotation interactiveAnnotations = 10;
    optional string directPath = 11;
    optional int64 mediaKeyTimestamp = 12;
    optional bytes jpegThumbnail = 16;
    optional ContextInfo contextInfo = 17;
    optional bytes firstScanSidecar = 18;
    optional uint32 firstScanLength = 19;
    optional uint32 experimentGroupId = 20;
    optional bytes scansSidecar = 21;
    repeated uint32 scanLengths = 22;
    optional bytes midQualityFileSha256 = 23;
    optional bytes midQualityFileEncSha256 = 24;
    optional bool viewOnce = 25;
    optional string thumbnailDirectPath = 26;
    optional bytes thumbnailSha256 = 27;
    optional bytes thumbnailEncSha256 = 28;
    optional string staticUrl = 29;
    repeated InteractiveAnnotation annotations = 30;
    optional ImageSourceType imageSourceType = 31;
}

message HistorySyncNotification {
    enum HistorySyncType {
        INITIAL_BOOTSTRAP = 0;
        INITIAL_STATUS_V3 = 1;
        FULL = 2;
        RECENT = 3;
        PUSH_NAME = 4;
        NON_BLOCKING_DATA = 5;
        ON_DEMAND = 6;
    }
    optional bytes fileSha256 = 1;
    optional uint64 fileLength = 2;
    optional bytes mediaKey = 3;
    optional bytes fileEncSha256 = 4;
    optional string directPath = 5;
    optional HistorySyncType syncType = 6;
    optional uint32 chunkOrder = 7;
    optional string originalMessageId = 8;
    optional uint32 progress = 9;
    optional int64 oldestMsgInChunkTimestampSec = 10;
    optional bytes initialHistBootstrapInlinePayload = 11;
    optional string peerDataRequestSessionId = 12;
}

message HighlyStructuredMessage {
    message HSMLocalizableParameter {
        message HSMDateTime {
            message HSMDateTimeUnixEpoch {
                optional int64 timestamp = 1;
            }
            
            message HSMDateTimeComponent {
                enum DayOfWeekType {
                    MONDAY = 1;
                    TUESDAY = 2;
                    WEDNESDAY = 3;
                    THURSDAY = 4;
                    FRIDAY = 5;
                    SATURDAY = 6;
                    SUNDAY = 7;
                }
                enum CalendarType {
                    GREGORIAN = 1;
                    SOLAR_HIJRI = 2;
                }
                optional DayOfWeekType dayOfWeek = 1;
                optional uint32 year = 2;
                optional uint32 month = 3;
                optional uint32 dayOfMonth = 4;
                optional uint32 hour = 5;
                optional uint32 minute = 6;
                optional CalendarType calendar = 7;
            }
            
            oneof datetimeOneof {
                HSMDateTimeComponent component = 1;
                HSMDateTimeUnixEpoch unixEpoch = 2;
            }
        }
        
        message HSMCurrency {
            optional string currencyCode = 1;
            optional int64 amount1000 = 2;
        }
        
        optional string default = 1;
        oneof paramOneof {
            HSMCurrency currency = 2;
            HSMDateTime dateTime = 3;
        }
    }
    
    optional string namespace = 1;
    optional string elementName = 2;
    repeated string params = 3;
    optional string fallbackLg = 4;
    optional string fallbackLc = 5;
    repeated HSMLocalizableParameter localizableParams = 6;
    optional string deterministicLg = 7;
    optional string deterministicLc = 8;
    optional TemplateMessage hydratedHsm = 9;
}

message GroupInviteMessage {
    enum GroupType {
        DEFAULT = 0;
        PARENT = 1;
    }
    optional string groupJid = 1;
    optional string inviteCode = 2;
    optional int64 inviteExpiration = 3;
    optional string groupName = 4;
    optional bytes jpegThumbnail = 5;
    optional string caption = 6;
    optional ContextInfo contextInfo = 7;
    optional GroupType groupType = 8;
}

message FutureProofMessage {
    optional Message message = 1;
}

message ExtendedTextMessage {
    enum PreviewType {
        NONE = 0;
        VIDEO = 1;
        PLACEHOLDER = 4;
        IMAGE = 5;
    }
    enum InviteLinkGroupType {
        DEFAULT = 0;
        PARENT = 1;
        SUB = 2;
        DEFAULT_SUB = 3;
    }
    enum FontType {
        SYSTEM = 0;
        SYSTEM_TEXT = 1;
        FB_SCRIPT = 2;
        SYSTEM_BOLD = 6;
        MORNINGBREEZE_REGULAR = 7;
        CALISTOGA_REGULAR = 8;
        EXO2_EXTRABOLD = 9;
        COURIERPRIME_BOLD = 10;
    }
    optional string text = 1;
    optional string matchedText = 2;
    optional string canonicalUrl = 4;
    optional string description = 5;
    optional string title = 6;
    optional fixed32 textArgb = 7;
    optional fixed32 backgroundArgb = 8;
    optional FontType font = 9;
    optional PreviewType previewType = 10;
    optional bytes jpegThumbnail = 16;
    optional ContextInfo contextInfo = 17;
    optional bool doNotPlayInline = 18;
    optional string thumbnailDirectPath = 19;
    optional bytes thumbnailSha256 = 20;
    optional bytes thumbnailEncSha256 = 21;
    optional bytes mediaKey = 22;
    optional int64 mediaKeyTimestamp = 23;
    optional uint32 thumbnailHeight = 24;
    optional uint32 thumbnailWidth = 25;
    optional InviteLinkGroupType inviteLinkGroupType = 26;
    optional string inviteLinkParentGroupSubjectV2 = 27;
    optional bytes inviteLinkParentGroupThumbnailV2 = 28;
    optional InviteLinkGroupType inviteLinkGroupTypeV2 = 29;
    optional bool viewOnce = 30;
}

message EventResponseMessage {
    enum EventResponseType {
        UNKNOWN = 0;
        GOING = 1;
        NOT_GOING = 2;
    }
    optional EventResponseType response = 1;
    optional int64 timestampMs = 2;
}

message EventMessage {
    optional ContextInfo contextInfo = 1;
    optional bool isCanceled = 2;
    optional string name = 3;
    optional string description = 4;
    optional LocationMessage location = 5;
    optional string joinLink = 6;
    optional int64 startTime = 7;
}

message EncReactionMessage {
    optional MessageKey targetMessageKey = 1;
    optional bytes encPayload = 2;
    optional bytes encIv = 3;
}

message EncEventResponseMessage {
    optional MessageKey eventCreationMessageKey = 1;
    optional bytes encPayload = 2;
    optional bytes encIv = 3;
}

message EncCommentMessage {
    optional MessageKey targetMessageKey = 1;
    optional bytes encPayload = 2;
    optional bytes encIv = 3;
}

message DocumentMessage {
    optional string url = 1;
    optional string mimetype = 2;
    optional string title = 3;
    optional bytes fileSha256 = 4;
    optional uint64 fileLength = 5;
    optional uint32 pageCount = 6;
    optional bytes mediaKey = 7;
    optional string fileName = 8;
    optional bytes fileEncSha256 = 9;
    optional string directPath = 10;
    optional int64 mediaKeyTimestamp = 11;
    optional bool contactVcard = 12;
    optional string thumbnailDirectPath = 13;
    optional bytes thumbnailSha256 = 14;
    optional bytes thumbnailEncSha256 = 15;
    optional bytes jpegThumbnail = 16;
    optional ContextInfo contextInfo = 17;
    optional uint32 thumbnailHeight = 18;
    optional uint32 thumbnailWidth = 19;
    optional string caption = 20;
}

message DeviceSentMessage {
    optional string destinationJid = 1;
    optional Message message = 2;
    optional string phash = 3;
}

message DeclinePaymentRequestMessage {
    optional MessageKey key = 1;
}

message ContactsArrayMessage {
    optional string displayName = 1;
    repeated ContactMessage contacts = 2;
    optional ContextInfo contextInfo = 17;
}

message ContactMessage {
    optional string displayName = 1;
    optional string vcard = 16;
    optional ContextInfo contextInfo = 17;
}

message CommentMessage {
    optional Message message = 1;
    optional MessageKey targetMessageKey = 2;
}

message Chat {
    optional string displayName = 1;
    optional string id = 2;
}

message CancelPaymentRequestMessage {
    optional MessageKey key = 1;
}

message Call {
    optional bytes callKey = 1;
    optional string conversionSource = 2;
    optional bytes conversionData = 3;
    optional uint32 conversionDelaySeconds = 4;
}

message CallLogMessage {
    enum CallType {
        REGULAR = 0;
        SCHEDULED_CALL = 1;
        VOICE_CHAT = 2;
    }
    message CallParticipant {
        optional string jid = 1;
        optional CallOutcome callOutcome = 2;
    }
    
    enum CallOutcome {
        CONNECTED = 0;
        MISSED = 1;
        FAILED = 2;
        REJECTED = 3;
        ACCEPTED_ELSEWHERE = 4;
        ONGOING = 5;
        SILENCED_BY_DND = 6;
        SILENCED_UNKNOWN_CALLER = 7;
    }
    optional bool isVideo = 1;
    optional CallOutcome callOutcome = 2;
    optional int64 durationSecs = 3;
    optional CallType callType = 4;
    repeated CallParticipant participants = 5;
}

message ButtonsResponseMessage {
    enum Type {
        UNKNOWN = 0;
        DISPLAY_TEXT = 1;
    }
    optional string selectedButtonId = 1;
    optional ContextInfo contextInfo = 3;
    optional Type type = 4;
    oneof response {
        string selectedDisplayText = 2;
    }
}

message ButtonsMessage {
    enum HeaderType {
        UNKNOWN = 0;
        EMPTY = 1;
        TEXT = 2;
        DOCUMENT = 3;
        IMAGE = 4;
        VIDEO = 5;
        LOCATION = 6;
    }
    message Button {
        enum Type {
            UNKNOWN = 0;
            RESPONSE = 1;
            NATIVE_FLOW = 2;
        }
        message NativeFlowInfo {
            optional string name = 1;
            optional string paramsJson = 2;
        }
        
        message ButtonText {
            optional string displayText = 1;
        }
        
        optional string buttonId = 1;
        optional ButtonText buttonText = 2;
        optional Type type = 3;
        optional NativeFlowInfo nativeFlowInfo = 4;
    }
    
    optional string contentText = 6;
    optional string footerText = 7;
    optional ContextInfo contextInfo = 8;
    repeated Button buttons = 9;
    optional HeaderType headerType = 10;
    oneof header {
        string text = 1;
        DocumentMessage documentMessage = 2;
        ImageMessage imageMessage = 3;
        VideoMessage videoMessage = 4;
        LocationMessage locationMessage = 5;
    }
}

message BotFeedbackMessage {
    enum BotFeedbackKindMultiplePositive {
        BOT_FEEDBACK_MULTIPLE_POSITIVE_GENERIC = 1;
    }
    enum BotFeedbackKindMultipleNegative {
        BOT_FEEDBACK_MULTIPLE_NEGATIVE_GENERIC = 1;
        BOT_FEEDBACK_MULTIPLE_NEGATIVE_HELPFUL = 2;
        BOT_FEEDBACK_MULTIPLE_NEGATIVE_INTERESTING = 4;
        BOT_FEEDBACK_MULTIPLE_NEGATIVE_ACCURATE = 8;
        BOT_FEEDBACK_MULTIPLE_NEGATIVE_SAFE = 16;
        BOT_FEEDBACK_MULTIPLE_NEGATIVE_OTHER = 32;
        BOT_FEEDBACK_MULTIPLE_NEGATIVE_REFUSED = 64;
        BOT_FEEDBACK_MULTIPLE_NEGATIVE_NOT_VISUALLY_APPEALING = 128;
        BOT_FEEDBACK_MULTIPLE_NEGATIVE_NOT_RELEVANT_TO_TEXT = 256;
    }
    enum BotFeedbackKind {
        BOT_FEEDBACK_POSITIVE = 0;
        BOT_FEEDBACK_NEGATIVE_GENERIC = 1;
        BOT_FEEDBACK_NEGATIVE_HELPFUL = 2;
        BOT_FEEDBACK_NEGATIVE_INTERESTING = 3;
        BOT_FEEDBACK_NEGATIVE_ACCURATE = 4;
        BOT_FEEDBACK_NEGATIVE_SAFE = 5;
        BOT_FEEDBACK_NEGATIVE_OTHER = 6;
        BOT_FEEDBACK_NEGATIVE_REFUSED = 7;
        BOT_FEEDBACK_NEGATIVE_NOT_VISUALLY_APPEALING = 8;
        BOT_FEEDBACK_NEGATIVE_NOT_RELEVANT_TO_TEXT = 9;
    }
    optional MessageKey messageKey = 1;
    optional BotFeedbackKind kind = 2;
    optional string text = 3;
    optional uint64 kindNegative = 4;
    optional uint64 kindPositive = 5;
}

message BCallMessage {
    enum MediaType {
        UNKNOWN = 0;
        AUDIO = 1;
        VIDEO = 2;
    }
    optional string sessionId = 1;
    optional MediaType mediaType = 2;
    optional bytes masterKey = 3;
    optional string caption = 4;
}

message AudioMessage {
    optional string url = 1;
    optional string mimetype = 2;
    optional bytes fileSha256 = 3;
    optional uint64 fileLength = 4;
    optional uint32 seconds = 5;
    optional bool ptt = 6;
    optional bytes mediaKey = 7;
    optional bytes fileEncSha256 = 8;
    optional string directPath = 9;
    optional int64 mediaKeyTimestamp = 10;
    optional ContextInfo contextInfo = 17;
    optional bytes streamingSidecar = 18;
    optional bytes waveform = 19;
    optional fixed32 backgroundArgb = 20;
    optional bool viewOnce = 21;
}

message AppStateSyncKey {
    optional AppStateSyncKeyId keyId = 1;
    optional AppStateSyncKeyData keyData = 2;
}

message AppStateSyncKeyShare {
    repeated AppStateSyncKey keys = 1;
}

message AppStateSyncKeyRequest {
    repeated AppStateSyncKeyId keyIds = 1;
}

message AppStateSyncKeyId {
    optional bytes keyId = 1;
}

message AppStateSyncKeyFingerprint {
    optional uint32 rawId = 1;
    optional uint32 currentIndex = 2;
    repeated uint32 deviceIndexes = 3 [packed=true];
}

message AppStateSyncKeyData {
    optional bytes keyData = 1;
    optional AppStateSyncKeyFingerprint fingerprint = 2;
    optional int64 timestamp = 3;
}

message AppStateFatalExceptionNotification {
    repeated string collectionNames = 1;
    optional int64 timestamp = 2;
}

message MediaNotifyMessage {
    optional string expressPathUrl = 1;
    optional bytes fileEncSha256 = 2;
    optional uint64 fileLength = 3;
}

message Location {
    optional double degreesLatitude = 1;
    optional double degreesLongitude = 2;
    optional string name = 3;
}

enum KeepType {
    UNKNOWN = 0;
    KEEP_FOR_ALL = 1;
    UNDO_KEEP_FOR_ALL = 2;
}
message InteractiveAnnotation {
    repeated Point polygonVertices = 1;
    optional bool shouldSkipConfirmation = 4;
    oneof action {
        Location location = 2;
        ForwardedNewsletterMessageInfo newsletter = 3;
    }
}

message HydratedTemplateButton {
    message HydratedURLButton {
        enum WebviewPresentationType {
            FULL = 1;
            TALL = 2;
            COMPACT = 3;
        }
        optional string displayText = 1;
        optional string url = 2;
        optional string consentedUsersUrl = 3;
        optional WebviewPresentationType webviewPresentation = 4;
    }
    
    message HydratedQuickReplyButton {
        optional string displayText = 1;
        optional string id = 2;
    }
    
    message HydratedCallButton {
        optional string displayText = 1;
        optional string phoneNumber = 2;
    }
    
    optional uint32 index = 4;
    oneof hydratedButton {
        HydratedQuickReplyButton quickReplyButton = 1;
        HydratedURLButton urlButton = 2;
        HydratedCallButton callButton = 3;
    }
}

message GroupMention {
    optional string groupJid = 1;
    optional string groupSubject = 2;
}

message DisappearingMode {
    enum Trigger {
        UNKNOWN = 0;
        CHAT_SETTING = 1;
        ACCOUNT_SETTING = 2;
        BULK_CHANGE = 3;
        BIZ_SUPPORTS_FB_HOSTING = 4;
    }
    enum Initiator {
        CHANGED_IN_CHAT = 0;
        INITIATED_BY_ME = 1;
        INITIATED_BY_OTHER = 2;
        BIZ_UPGRADE_FB_HOSTING = 3;
    }
    optional Initiator initiator = 1;
    optional Trigger trigger = 2;
    optional string initiatorDeviceJid = 3;
    optional bool initiatedByMe = 4;
}

message DeviceListMetadata {
    optional bytes senderKeyHash = 1;
    optional uint64 senderTimestamp = 2;
    repeated uint32 senderKeyIndexes = 3 [packed=true];
    optional ADVEncryptionType senderAccountType = 4;
    optional ADVEncryptionType receiverAccountType = 5;
    optional bytes recipientKeyHash = 8;
    optional uint64 recipientTimestamp = 9;
    repeated uint32 recipientKeyIndexes = 10 [packed=true];
}

message ContextInfo {
    message UTMInfo {
        optional string utmSource = 1;
        optional string utmCampaign = 2;
    }
    
    message ExternalAdReplyInfo {
        enum MediaType {
            NONE = 0;
            IMAGE = 1;
            VIDEO = 2;
        }
        optional string title = 1;
        optional string body = 2;
        optional MediaType mediaType = 3;
        optional string thumbnailUrl = 4;
        optional string mediaUrl = 5;
        optional bytes thumbnail = 6;
        optional string sourceType = 7;
        optional string sourceId = 8;
        optional string sourceUrl = 9;
        optional bool containsAutoReply = 10;
        optional bool renderLargerThumbnail = 11;
        optional bool showAdAttribution = 12;
        optional string ctwaClid = 13;
        optional string ref = 14;
    }
    
    message DataSharingContext {
        optional bool showMmDisclosure = 1;
    }
    
    message BusinessMessageForwardInfo {
        optional string businessOwnerJid = 1;
    }
    
    message AdReplyInfo {
        enum MediaType {
            NONE = 0;
            IMAGE = 1;
            VIDEO = 2;
        }
        optional string advertiserName = 1;
        optional MediaType mediaType = 2;
        optional bytes jpegThumbnail = 16;
        optional string caption = 17;
    }
    
    optional string stanzaId = 1;
    optional string participant = 2;
    optional Message quotedMessage = 3;
    optional string remoteJid = 4;
    repeated string mentionedJid = 15;
    optional string conversionSource = 18;
    optional bytes conversionData = 19;
    optional uint32 conversionDelaySeconds = 20;
    optional uint32 forwardingScore = 21;
    optional bool isForwarded = 22;
    optional AdReplyInfo quotedAd = 23;
    optional MessageKey placeholderKey = 24;
    optional uint32 expiration = 25;
    optional int64 ephemeralSettingTimestamp = 26;
    optional bytes ephemeralSharedSecret = 27;
    optional ExternalAdReplyInfo externalAdReply = 28;
    optional string entryPointConversionSource = 29;
    optional string entryPointConversionApp = 30;
    optional uint32 entryPointConversionDelaySeconds = 31;
    optional DisappearingMode disappearingMode = 32;
    optional ActionLink actionLink = 33;
    optional string groupSubject = 34;
    optional string parentGroupJid = 35;
    optional string trustBannerType = 37;
    optional uint32 trustBannerAction = 38;
    optional bool isSampled = 39;
    repeated GroupMention groupMentions = 40;
    optional UTMInfo utm = 41;
    optional ForwardedNewsletterMessageInfo forwardedNewsletterMessageInfo = 43;
    optional BusinessMessageForwardInfo businessMessageForwardInfo = 44;
    optional string smbClientCampaignId = 45;
    optional string smbServerCampaignId = 46;
    optional DataSharingContext dataSharingContext = 47;
    optional bool alwaysShowAdAttribution = 48;
}

message ForwardedNewsletterMessageInfo {
    enum ContentType {
        UPDATE = 1;
        UPDATE_CARD = 2;
        LINK_CARD = 3;
    }
    optional string newsletterJid = 1;
    optional int32 serverMessageId = 2;
    optional string newsletterName = 3;
    optional ContentType contentType = 4;
    optional string accessibilityText = 5;
}

message BotSuggestedPromptMetadata {
    repeated string suggestedPrompts = 1;
    optional uint32 selectedPromptIndex = 2;
}

message BotSearchMetadata {
    optional string sessionId = 1;
}

message BotPluginMetadata {
    enum SearchProvider {
        BING = 1;
        GOOGLE = 2;
    }
    enum PluginType {
        REELS = 1;
        SEARCH = 2;
    }
    optional SearchProvider provider = 1;
    optional PluginType pluginType = 2;
    optional string thumbnailCdnUrl = 3;
    optional string profilePhotoCdnUrl = 4;
    optional string searchProviderUrl = 5;
    optional uint32 referenceIndex = 6;
    optional uint32 expectedLinksCount = 7;
    optional string searchQuery = 9;
    optional MessageKey parentPluginMessageKey = 10;
}

message BotMetadata {
    optional BotAvatarMetadata avatarMetadata = 1;
    optional string personaId = 2;
    optional BotPluginMetadata pluginMetadata = 3;
    optional BotSuggestedPromptMetadata suggestedPromptMetadata = 4;
    optional string invokerJid = 5;
    optional BotSearchMetadata searchMetadata = 6;
}

message BotAvatarMetadata {
    optional uint32 sentiment = 1;
    optional string behaviorGraph = 2;
    optional uint32 action = 3;
    optional uint32 intensity = 4;
    optional uint32 wordCount = 5;
}

message ActionLink {
    optional string url = 1;
    optional string buttonTitle = 2;
}

message TemplateButton {
    message URLButton {
        optional HighlyStructuredMessage displayText = 1;
        optional HighlyStructuredMessage url = 2;
    }
    
    message QuickReplyButton {
        optional HighlyStructuredMessage displayText = 1;
        optional string id = 2;
    }
    
    message CallButton {
        optional HighlyStructuredMessage displayText = 1;
        optional HighlyStructuredMessage phoneNumber = 2;
    }
    
    optional uint32 index = 4;
    oneof button {
        QuickReplyButton quickReplyButton = 1;
        URLButton urlButton = 2;
        CallButton callButton = 3;
    }
}

message Point {
    optional int32 xDeprecated = 1;
    optional int32 yDeprecated = 2;
    optional double x = 3;
    optional double y = 4;
}

message PaymentBackground {
    enum Type {
        UNKNOWN = 0;
        DEFAULT = 1;
    }
    message MediaData {
        optional bytes mediaKey = 1;
        optional int64 mediaKeyTimestamp = 2;
        optional bytes fileSha256 = 3;
        optional bytes fileEncSha256 = 4;
        optional string directPath = 5;
    }
    
    optional string id = 1;
    optional uint64 fileLength = 2;
    optional uint32 width = 3;
    optional uint32 height = 4;
    optional string mimetype = 5;
    optional fixed32 placeholderArgb = 6;
    optional fixed32 textArgb = 7;
    optional fixed32 subtextArgb = 8;
    optional MediaData mediaData = 9;
    optional Type type = 10;
}

message Money {
    optional int64 value = 1;
    optional uint32 offset = 2;
    optional string currencyCode = 3;
}

message Message {
    optional string conversation = 1;
    optional SenderKeyDistributionMessage senderKeyDistributionMessage = 2;
    optional ImageMessage imageMessage = 3;
    optional ContactMessage contactMessage = 4;
    optional LocationMessage locationMessage = 5;
    optional ExtendedTextMessage extendedTextMessage = 6;
    optional DocumentMessage documentMessage = 7;
    optional AudioMessage audioMessage = 8;
    optional VideoMessage videoMessage = 9;
    optional Call call = 10;
    optional Chat chat = 11;
    optional ProtocolMessage protocolMessage = 12;
    optional ContactsArrayMessage contactsArrayMessage = 13;
    optional HighlyStructuredMessage highlyStructuredMessage = 14;
    optional SenderKeyDistributionMessage fastRatchetKeySenderKeyDistributionMessage = 15;
    optional SendPaymentMessage sendPaymentMessage = 16;
    optional LiveLocationMessage liveLocationMessage = 18;
    optional RequestPaymentMessage requestPaymentMessage = 22;
    optional DeclinePaymentRequestMessage declinePaymentRequestMessage = 23;
    optional CancelPaymentRequestMessage cancelPaymentRequestMessage = 24;
    optional TemplateMessage templateMessage = 25;
    optional StickerMessage stickerMessage = 26;
    optional GroupInviteMessage groupInviteMessage = 28;
    optional TemplateButtonReplyMessage templateButtonReplyMessage = 29;
    optional ProductMessage productMessage = 30;
    optional DeviceSentMessage deviceSentMessage = 31;
    optional MessageContextInfo messageContextInfo = 35;
    optional ListMessage listMessage = 36;
    optional FutureProofMessage viewOnceMessage = 37;
    optional OrderMessage orderMessage = 38;
    optional ListResponseMessage listResponseMessage = 39;
    optional FutureProofMessage ephemeralMessage = 40;
    optional InvoiceMessage invoiceMessage = 41;
    optional ButtonsMessage buttonsMessage = 42;
    optional ButtonsResponseMessage buttonsResponseMessage = 43;
    optional PaymentInviteMessage paymentInviteMessage = 44;
    optional InteractiveMessage interactiveMessage = 45;
    optional ReactionMessage reactionMessage = 46;
    optional StickerSyncRMRMessage stickerSyncRmrMessage = 47;
    optional InteractiveResponseMessage interactiveResponseMessage = 48;
    optional PollCreationMessage pollCreationMessage = 49;
    optional PollUpdateMessage pollUpdateMessage = 50;
    optional KeepInChatMessage keepInChatMessage = 51;
    optional FutureProofMessage documentWithCaptionMessage = 53;
    optional RequestPhoneNumberMessage requestPhoneNumberMessage = 54;
    optional FutureProofMessage viewOnceMessageV2 = 55;
    optional EncReactionMessage encReactionMessage = 56;
    optional FutureProofMessage editedMessage = 58;
    optional FutureProofMessage viewOnceMessageV2Extension = 59;
    optional PollCreationMessage pollCreationMessageV2 = 60;
    optional ScheduledCallCreationMessage scheduledCallCreationMessage = 61;
    optional FutureProofMessage groupMentionedMessage = 62;
    optional PinInChatMessage pinInChatMessage = 63;
    optional PollCreationMessage pollCreationMessageV3 = 64;
    optional ScheduledCallEditMessage scheduledCallEditMessage = 65;
    optional VideoMessage ptvMessage = 66;
    optional FutureProofMessage botInvokeMessage = 67;
    optional CallLogMessage callLogMesssage = 69;
    optional MessageHistoryBundle messageHistoryBundle = 70;
    optional EncCommentMessage encCommentMessage = 71;
    optional BCallMessage bcallMessage = 72;
    optional FutureProofMessage lottieStickerMessage = 74;
    optional EventMessage eventMessage = 75;
    optional EncEventResponseMessage encEventResponseMessage = 76;
    optional CommentMessage commentMessage = 77;
    optional NewsletterAdminInviteMessage newsletterAdminInviteMessage = 78;
    optional PlaceholderMessage placeholderMessage = 80;
    optional SecretEncryptedMessage secretEncryptedMessage = 82;
}

message MessageSecretMessage {
    optional sfixed32 version = 1;
    optional bytes encIv = 2;
    optional bytes encPayload = 3;
}

message MessageContextInfo {
    optional DeviceListMetadata deviceListMetadata = 1;
    optional int32 deviceListMetadataVersion = 2;
    optional bytes messageSecret = 3;
    optional bytes paddingBytes = 4;
    optional uint32 messageAddOnDurationInSecs = 5;
    optional bytes botMessageSecret = 6;
    optional BotMetadata botMetadata = 7;
    optional int32 reportingTokenVersion = 8;
}

message VideoMessage {
    enum Attribution {
        NONE = 0;
        GIPHY = 1;
        TENOR = 2;
    }
    optional string url = 1;
    optional string mimetype = 2;
    optional bytes fileSha256 = 3;
    optional uint64 fileLength = 4;
    optional uint32 seconds = 5;
    optional bytes mediaKey = 6;
    optional string caption = 7;
    optional bool gifPlayback = 8;
    optional uint32 height = 9;
    optional uint32 width = 10;
    optional bytes fileEncSha256 = 11;
    repeated InteractiveAnnotation interactiveAnnotations = 12;
    optional string directPath = 13;
    optional int64 mediaKeyTimestamp = 14;
    optional bytes jpegThumbnail = 16;
    optional ContextInfo contextInfo = 17;
    optional bytes streamingSidecar = 18;
    optional Attribution gifAttribution = 19;
    optional bool viewOnce = 20;
    optional string thumbnailDirectPath = 21;
    optional bytes thumbnailSha256 = 22;
    optional bytes thumbnailEncSha256 = 23;
    optional string staticUrl = 24;
    repeated InteractiveAnnotation annotations = 25;
}

message TemplateMessage {
    message HydratedFourRowTemplate {
        optional string hydratedContentText = 6;
        optional string hydratedFooterText = 7;
        repeated HydratedTemplateButton hydratedButtons = 8;
        optional string templateId = 9;
        optional bool maskLinkedDevices = 10;
        oneof title {
            DocumentMessage documentMessage = 1;
            string hydratedTitleText = 2;
            ImageMessage imageMessage = 3;
            VideoMessage videoMessage = 4;
            LocationMessage locationMessage = 5;
        }
    }
    
    message FourRowTemplate {
        optional HighlyStructuredMessage content = 6;
        optional HighlyStructuredMessage footer = 7;
        repeated TemplateButton buttons = 8;
        oneof title {
            DocumentMessage documentMessage = 1;
            HighlyStructuredMessage highlyStructuredMessage = 2;
            ImageMessage imageMessage = 3;
            VideoMessage videoMessage = 4;
            LocationMessage locationMessage = 5;
        }
    }
    
    optional ContextInfo contextInfo = 3;
    optional HydratedFourRowTemplate hydratedTemplate = 4;
    optional string templateId = 9;
    oneof format {
        FourRowTemplate fourRowTemplate = 1;
        HydratedFourRowTemplate hydratedFourRowTemplate = 2;
        InteractiveMessage interactiveMessageTemplate = 5;
    }
}

message TemplateButtonReplyMessage {
    optional string selectedId = 1;
    optional string selectedDisplayText = 2;
    optional ContextInfo contextInfo = 3;
    optional uint32 selectedIndex = 4;
    optional uint32 selectedCarouselCardIndex = 5;
}

message StickerSyncRMRMessage {
    repeated string filehash = 1;
    optional string rmrSource = 2;
    optional int64 requestTimestamp = 3;
}

message StickerMessage {
    optional string url = 1;
    optional bytes fileSha256 = 2;
    optional bytes fileEncSha256 = 3;
    optional bytes mediaKey = 4;
    optional string mimetype = 5;
    optional uint32 height = 6;
    optional uint32 width = 7;
    optional string directPath = 8;
    optional uint64 fileLength = 9;
    optional int64 mediaKeyTimestamp = 10;
    optional uint32 firstFrameLength = 11;
    optional bytes firstFrameSidecar = 12;
    optional bool isAnimated = 13;
    optional bytes pngThumbnail = 16;
    optional ContextInfo contextInfo = 17;
    optional int64 stickerSentTs = 18;
    optional bool isAvatar = 19;
    optional bool isAiSticker = 20;
    optional bool isLottie = 21;
}

message SenderKeyDistributionMessage {
    optional string groupId = 1;
    optional bytes axolotlSenderKeyDistributionMessage = 2;
}

message SendPaymentMessage {
    optional Message noteMessage = 2;
    optional MessageKey requestMessageKey = 3;
    optional PaymentBackground background = 4;
}

message SecretEncryptedMessage {
    enum SecretEncType {
        UNKNOWN = 0;
        EVENT_EDIT = 1;
    }
    optional MessageKey targetMessageKey = 1;
    optional bytes encPayload = 2;
    optional bytes encIv = 3;
    optional SecretEncType secretEncType = 4;
}

message ScheduledCallEditMessage {
    enum EditType {
        UNKNOWN = 0;
        CANCEL = 1;
    }
    optional MessageKey key = 1;
    optional EditType editType = 2;
}

message ScheduledCallCreationMessage {
    enum CallType {
        UNKNOWN = 0;
        VOICE = 1;
        VIDEO = 2;
    }
    optional int64 scheduledTimestampMs = 1;
    optional CallType callType = 2;
    optional string title = 3;
}

message RequestWelcomeMessageMetadata {
    enum LocalChatState {
        EMPTY = 0;
        NON_EMPTY = 1;
    }
    optional LocalChatState localChatState = 1;
}

message RequestPhoneNumberMessage {
    optional ContextInfo contextInfo = 1;
}

message RequestPaymentMessage {
    optional Message noteMessage = 4;
    optional string currencyCodeIso4217 = 1;
    optional uint64 amount1000 = 2;
    optional string requestFrom = 3;
    optional int64 expiryTimestamp = 5;
    optional Money amount = 6;
    optional PaymentBackground background = 7;
}

message ReactionMessage {
    optional MessageKey key = 1;
    optional string text = 2;
    optional string groupingKey = 3;
    optional int64 senderTimestampMs = 4;
}

message ProtocolMessage {
    enum Type {
        REVOKE = 0;
        EPHEMERAL_SETTING = 3;
        EPHEMERAL_SYNC_RESPONSE = 4;
        HISTORY_SYNC_NOTIFICATION = 5;
        APP_STATE_SYNC_KEY_SHARE = 6;
        APP_STATE_SYNC_KEY_REQUEST = 7;
        MSG_FANOUT_BACKFILL_REQUEST = 8;
        INITIAL_SECURITY_NOTIFICATION_SETTING_SYNC = 9;
        APP_STATE_FATAL_EXCEPTION_NOTIFICATION = 10;
        SHARE_PHONE_NUMBER = 11;
        MESSAGE_EDIT = 14;
        PEER_DATA_OPERATION_REQUEST_MESSAGE = 16;
        PEER_DATA_OPERATION_REQUEST_RESPONSE_MESSAGE = 17;
        REQUEST_WELCOME_MESSAGE = 18;
        BOT_FEEDBACK_MESSAGE = 19;
        MEDIA_NOTIFY_MESSAGE = 20;
    }
    optional MessageKey key = 1;
    optional Type type = 2;
    optional uint32 ephemeralExpiration = 4;
    optional int64 ephemeralSettingTimestamp = 5;
    optional HistorySyncNotification historySyncNotification = 6;
    optional AppStateSyncKeyShare appStateSyncKeyShare = 7;
    optional AppStateSyncKeyRequest appStateSyncKeyRequest = 8;
    optional InitialSecurityNotificationSettingSync initialSecurityNotificationSettingSync = 9;
    optional AppStateFatalExceptionNotification appStateFatalExceptionNotification = 10;
    optional DisappearingMode disappearingMode = 11;
    optional Message editedMessage = 14;
    optional int64 timestampMs = 15;
    optional PeerDataOperationRequestMessage peerDataOperationRequestMessage = 16;
    optional PeerDataOperationRequestResponseMessage peerDataOperationRequestResponseMessage = 17;
    optional BotFeedbackMessage botFeedbackMessage = 18;
    optional string invokerJid = 19;
    optional RequestWelcomeMessageMetadata requestWelcomeMessageMetadata = 20;
    optional MediaNotifyMessage mediaNotifyMessage = 21;
}

message ProductMessage {
    message ProductSnapshot {
        optional ImageMessage productImage = 1;
        optional string productId = 2;
        optional string title = 3;
        optional string description = 4;
        optional string currencyCode = 5;
        optional int64 priceAmount1000 = 6;
        optional string retailerId = 7;
        optional string url = 8;
        optional uint32 productImageCount = 9;
        optional string firstImageId = 11;
        optional int64 salePriceAmount1000 = 12;
    }
    
    message CatalogSnapshot {
        optional ImageMessage catalogImage = 1;
        optional string title = 2;
        optional string description = 3;
    }
    
    optional ProductSnapshot product = 1;
    optional string businessOwnerJid = 2;
    optional CatalogSnapshot catalog = 4;
    optional string body = 5;
    optional string footer = 6;
    optional ContextInfo contextInfo = 17;
}

message PollVoteMessage {
    repeated bytes selectedOptions = 1;
}

message PollUpdateMessage {
    optional MessageKey pollCreationMessageKey = 1;
    optional PollEncValue vote = 2;
    optional PollUpdateMessageMetadata metadata = 3;
    optional int64 senderTimestampMs = 4;
}

message PollUpdateMessageMetadata {
}

message PollEncValue {
    optional bytes encPayload = 1;
    optional bytes encIv = 2;
}

message PollCreationMessage {
    message Option {
        optional string optionName = 1;
    }
    
    optional bytes encKey = 1;
    optional string name = 2;
    repeated Option options = 3;
    optional uint32 selectableOptionsCount = 4;
    optional ContextInfo contextInfo = 5;
}

message PlaceholderMessage {
    enum PlaceholderType {
        MASK_LINKED_DEVICES = 0;
    }
    optional PlaceholderType type = 1;
}

message PinInChatMessage {
    enum Type {
        UNKNOWN_TYPE = 0;
        PIN_FOR_ALL = 1;
        UNPIN_FOR_ALL = 2;
    }
    optional MessageKey key = 1;
    optional Type type = 2;
    optional int64 senderTimestampMs = 3;
}

enum PeerDataOperationRequestType {
    UPLOAD_STICKER = 0;
    SEND_RECENT_STICKER_BOOTSTRAP = 1;
    GENERATE_LINK_PREVIEW = 2;
    HISTORY_SYNC_ON_DEMAND = 3;
    PLACEHOLDER_MESSAGE_RESEND = 4;
}
message PeerDataOperationRequestResponseMessage {
    message PeerDataOperationResult {
        message PlaceholderMessageResendResponse {
            optional bytes webMessageInfoBytes = 1;
        }
        
        message LinkPreviewResponse {
            message LinkPreviewHighQualityThumbnail {
                optional string directPath = 1;
                optional string thumbHash = 2;
                optional string encThumbHash = 3;
                optional bytes mediaKey = 4;
                optional int64 mediaKeyTimestampMs = 5;
                optional int32 thumbWidth = 6;
                optional int32 thumbHeight = 7;
            }
            
            optional string url = 1;
            optional string title = 2;
            optional string description = 3;
            optional bytes thumbData = 4;
            optional string canonicalUrl = 5;
            optional string matchText = 6;
            optional string previewType = 7;
            optional LinkPreviewHighQualityThumbnail hqThumbnail = 8;
        }
        
        optional MediaRetryNotification.ResultType mediaUploadResult = 1;
        optional StickerMessage stickerMessage = 2;
        optional LinkPreviewResponse linkPreviewResponse = 3;
        optional PlaceholderMessageResendResponse placeholderMessageResendResponse = 4;
    }
    
    optional PeerDataOperationRequestType peerDataOperationRequestType = 1;
    optional string stanzaId = 2;
    repeated PeerDataOperationResult peerDataOperationResult = 3;
}

message PeerDataOperationRequestMessage {
    message RequestUrlPreview {
        optional string url = 1;
        optional bool includeHqThumbnail = 2;
    }
    
    message RequestStickerReupload {
        optional string fileSha256 = 1;
    }
    
    message PlaceholderMessageResendRequest {
        optional MessageKey messageKey = 1;
    }
    
    message HistorySyncOnDemandRequest {
        optional string chatJid = 1;
        optional string oldestMsgId = 2;
        optional bool oldestMsgFromMe = 3;
        optional int32 onDemandMsgCount = 4;
        optional int64 oldestMsgTimestampMs = 5;
    }
    
    optional PeerDataOperationRequestType peerDataOperationRequestType = 1;
    repeated RequestStickerReupload requestStickerReupload = 2;
    repeated RequestUrlPreview requestUrlPreview = 3;
    optional HistorySyncOnDemandRequest historySyncOnDemandRequest = 4;
    repeated PlaceholderMessageResendRequest placeholderMessageResendRequest = 5;
}

message PaymentInviteMessage {
    enum ServiceType {
        UNKNOWN = 0;
        FBPAY = 1;
        NOVI = 2;
        UPI = 3;
    }
    optional ServiceType serviceType = 1;
    optional int64 expiryTimestamp = 2;
}

message OrderMessage {
    enum OrderSurface {
        CATALOG = 1;
    }
    enum OrderStatus {
        INQUIRY = 1;
        ACCEPTED = 2;
        DECLINED = 3;
    }
    optional string orderId = 1;
    optional bytes thumbnail = 2;
    optional int32 itemCount = 3;
    optional OrderStatus status = 4;
    optional OrderSurface surface = 5;
    optional string message = 6;
    optional string orderTitle = 7;
    optional string sellerJid = 8;
    optional string token = 9;
    optional int64 totalAmount1000 = 10;
    optional string totalCurrencyCode = 11;
    optional ContextInfo contextInfo = 17;
    optional int32 messageVersion = 12;
    optional MessageKey orderRequestMessageId = 13;
}

message NewsletterAdminInviteMessage {
    optional string newsletterJid = 1;
    optional string newsletterName = 2;
    optional bytes jpegThumbnail = 3;
    optional string caption = 4;
    optional int64 inviteExpiration = 5;
    optional ContextInfo contextInfo = 6;
}

message MessageHistoryBundle {
    optional string mimetype = 2;
    optional bytes fileSha256 = 3;
    optional bytes mediaKey = 5;
    optional bytes fileEncSha256 = 6;
    optional string directPath = 7;
    optional int64 mediaKeyTimestamp = 8;
    optional ContextInfo contextInfo = 9;
    repeated string participants = 10;
}

message LocationMessage {
    optional double degreesLatitude = 1;
    optional double degreesLongitude = 2;
    optional string name = 3;
    optional string address = 4;
    optional string url = 5;
    optional bool isLive = 6;
    optional uint32 accuracyInMeters = 7;
    optional float speedInMps = 8;
    optional uint32 degreesClockwiseFromMagneticNorth = 9;
    optional string comment = 11;
    optional bytes jpegThumbnail = 16;
    optional ContextInfo contextInfo = 17;
}

message LiveLocationMessage {
    optional double degreesLatitude = 1;
    optional double degreesLongitude = 2;
    optional uint32 accuracyInMeters = 3;
    optional float speedInMps = 4;
    optional uint32 degreesClockwiseFromMagneticNorth = 5;
    optional string caption = 6;
    optional int64 sequenceNumber = 7;
    optional uint32 timeOffset = 8;
    optional bytes jpegThumbnail = 16;
    optional ContextInfo contextInfo = 17;
}

message ListResponseMessage {
    message SingleSelectReply {
        optional string selectedRowId = 1;
    }
    
    enum ListType {
        UNKNOWN = 0;
        SINGLE_SELECT = 1;
    }
    optional string title = 1;
    optional ListType listType = 2;
    optional SingleSelectReply singleSelectReply = 3;
    optional ContextInfo contextInfo = 4;
    optional string description = 5;
}

message ListMessage {
    message Section {
        optional string title = 1;
        repeated Row rows = 2;
    }
    
    message Row {
        optional string title = 1;
        optional string description = 2;
        optional string rowId = 3;
    }
    
    message Product {
        optional string productId = 1;
    }
    
    message ProductSection {
        optional string title = 1;
        repeated Product products = 2;
    }
    
    message ProductListInfo {
        repeated ProductSection productSections = 1;
        optional ProductListHeaderImage headerImage = 2;
        optional string businessOwnerJid = 3;
    }
    
    message ProductListHeaderImage {
        optional string productId = 1;
        optional bytes jpegThumbnail = 2;
    }
    
    enum ListType {
        UNKNOWN = 0;
        SINGLE_SELECT = 1;
        PRODUCT_LIST = 2;
    }
    optional string title = 1;
    optional string description = 2;
    optional string buttonText = 3;
    optional ListType listType = 4;
    repeated Section sections = 5;
    optional ProductListInfo productListInfo = 6;
    optional string footerText = 7;
    optional ContextInfo contextInfo = 8;
}

message KeepInChatMessage {
    optional MessageKey key = 1;
    optional KeepType keepType = 2;
    optional int64 timestampMs = 3;
}

message InvoiceMessage {
    enum AttachmentType {
        IMAGE = 0;
        PDF = 1;
    }
    optional string note = 1;
    optional string token = 2;
    optional AttachmentType attachmentType = 3;
    optional string attachmentMimetype = 4;
    optional bytes attachmentMediaKey = 5;
    optional int64 attachmentMediaKeyTimestamp = 6;
    optional bytes attachmentFileSha256 = 7;
    optional bytes attachmentFileEncSha256 = 8;
    optional string attachmentDirectPath = 9;
    optional bytes attachmentJpegThumbnail = 10;
}

message InteractiveResponseMessage {
    message NativeFlowResponseMessage {
        optional string name = 1;
        optional string paramsJson = 2;
        optional int32 version = 3;
    }
    
    message Body {
        enum Format {
            DEFAULT = 0;
            EXTENSIONS_1 = 1;
        }
        optional string text = 1;
        optional Format format = 2;
    }
    
    optional Body body = 1;
    optional ContextInfo contextInfo = 15;
    oneof interactiveResponseMessage {
        NativeFlowResponseMessage nativeFlowResponseMessage = 2;
    }
}

message InteractiveMessage {
    message NativeFlowMessage {
        message NativeFlowButton {
            optional string name = 1;
            optional string buttonParamsJson = 2;
        }
        
        repeated NativeFlowButton buttons = 1;
        optional string messageParamsJson = 2;
        optional int32 messageVersion = 3;
    }
    
    message Header {
        optional string title = 1;
        optional string subtitle = 2;
        optional bool hasMediaAttachment = 5;
        oneof media {
            DocumentMessage documentMessage = 3;
            ImageMessage imageMessage = 4;
            bytes jpegThumbnail = 6;
            VideoMessage videoMessage = 7;
            LocationMessage locationMessage = 8;
            ProductMessage productMessage = 9;
        }
    }
    
    message Footer {
        optional string text = 1;
    }
    
    message CollectionMessage {
        optional string bizJid = 1;
        optional string id = 2;
        optional int32 messageVersion = 3;
    }
    
    message CarouselMessage {
        repeated InteractiveMessage cards = 1;
        optional int32 messageVersion = 2;
    }
    
    message Body {
        optional string text = 1;
    }
    
    message ShopMessage {
        enum Surface {
            UNKNOWN_SURFACE = 0;
            FB = 1;
            IG = 2;
            WA = 3;
        }
        optional string id = 1;
        optional Surface surface = 2;
        optional int32 messageVersion = 3;
    }
    
    optional Header header = 1;
    optional Body body = 2;
    optional Footer footer = 3;
    optional ContextInfo contextInfo = 15;
    oneof interactiveMessage {
        ShopMessage shopStorefrontMessage = 4;
        CollectionMessage collectionMessage = 5;
        NativeFlowMessage nativeFlowMessage = 6;
        CarouselMessage carouselMessage = 7;
    }
}

message EphemeralSetting {
    optional sfixed32 duration = 1;
    optional sfixed64 timestamp = 2;
}

message WallpaperSettings {
    optional string filename = 1;
    optional uint32 opacity = 2;
}

message StickerMetadata {
    optional string url = 1;
    optional bytes fileSha256 = 2;
    optional bytes fileEncSha256 = 3;
    optional bytes mediaKey = 4;
    optional string mimetype = 5;
    optional uint32 height = 6;
    optional uint32 width = 7;
    optional string directPath = 8;
    optional uint64 fileLength = 9;
    optional float weight = 10;
    optional int64 lastStickerSentTs = 11;
}

message Pushname {
    optional string id = 1;
    optional string pushname = 2;
}

message PhoneNumberToLIDMapping {
    optional string pnJid = 1;
    optional string lidJid = 2;
}

message PastParticipants {
    optional string groupJid = 1;
    repeated PastParticipant pastParticipants = 2;
}

message PastParticipant {
    enum LeaveReason {
        LEFT = 0;
        REMOVED = 1;
    }
    optional string userJid = 1;
    optional LeaveReason leaveReason = 2;
    optional uint64 leaveTs = 3;
}

message NotificationSettings {
    optional string messageVibrate = 1;
    optional string messagePopup = 2;
    optional string messageLight = 3;
    optional bool lowPriorityNotifications = 4;
    optional bool reactionsMuted = 5;
    optional string callVibrate = 6;
}

enum MediaVisibility {
    DEFAULT = 0;
    OFF = 1;
    ON = 2;
}
message HistorySync {
    enum HistorySyncType {
        INITIAL_BOOTSTRAP = 0;
        INITIAL_STATUS_V3 = 1;
        FULL = 2;
        RECENT = 3;
        PUSH_NAME = 4;
        NON_BLOCKING_DATA = 5;
        ON_DEMAND = 6;
    }
    enum BotAIWaitListState {
        IN_WAITLIST = 0;
        AI_AVAILABLE = 1;
    }
    required HistorySyncType syncType = 1;
    repeated Conversation conversations = 2;
    repeated WebMessageInfo statusV3Messages = 3;
    optional uint32 chunkOrder = 5;
    optional uint32 progress = 6;
    repeated Pushname pushnames = 7;
    optional GlobalSettings globalSettings = 8;
    optional bytes threadIdUserSecret = 9;
    optional uint32 threadDsTimeframeOffset = 10;
    repeated StickerMetadata recentStickers = 11;
    repeated PastParticipants pastParticipants = 12;
    repeated CallLogRecord callLogRecords = 13;
    optional BotAIWaitListState aiWaitListState = 14;
    repeated PhoneNumberToLIDMapping phoneNumberToLidMappings = 15;
}

message HistorySyncMsg {
    optional WebMessageInfo message = 1;
    optional uint64 msgOrderId = 2;
}

message GroupParticipant {
    enum Rank {
        REGULAR = 0;
        ADMIN = 1;
        SUPERADMIN = 2;
    }
    required string userJid = 1;
    optional Rank rank = 2;
}

message GlobalSettings {
    optional WallpaperSettings lightThemeWallpaper = 1;
    optional MediaVisibility mediaVisibility = 2;
    optional WallpaperSettings darkThemeWallpaper = 3;
    optional AutoDownloadSettings autoDownloadWiFi = 4;
    optional AutoDownloadSettings autoDownloadCellular = 5;
    optional AutoDownloadSettings autoDownloadRoaming = 6;
    optional bool showIndividualNotificationsPreview = 7;
    optional bool showGroupNotificationsPreview = 8;
    optional int32 disappearingModeDuration = 9;
    optional int64 disappearingModeTimestamp = 10;
    optional AvatarUserSettings avatarUserSettings = 11;
    optional int32 fontSize = 12;
    optional bool securityNotifications = 13;
    optional bool autoUnarchiveChats = 14;
    optional int32 videoQualityMode = 15;
    optional int32 photoQualityMode = 16;
    optional NotificationSettings individualNotificationSettings = 17;
    optional NotificationSettings groupNotificationSettings = 18;
    optional ChatLockSettings chatLockSettings = 19;
}

message Conversation {
    enum EndOfHistoryTransferType {
        COMPLETE_BUT_MORE_MESSAGES_REMAIN_ON_PRIMARY = 0;
        COMPLETE_AND_NO_MORE_MESSAGE_REMAIN_ON_PRIMARY = 1;
        COMPLETE_ON_DEMAND_SYNC_BUT_MORE_MSG_REMAIN_ON_PRIMARY = 2;
    }
    required string id = 1;
    repeated HistorySyncMsg messages = 2;
    optional string newJid = 3;
    optional string oldJid = 4;
    optional uint64 lastMsgTimestamp = 5;
    optional uint32 unreadCount = 6;
    optional bool readOnly = 7;
    optional bool endOfHistoryTransfer = 8;
    optional uint32 ephemeralExpiration = 9;
    optional int64 ephemeralSettingTimestamp = 10;
    optional EndOfHistoryTransferType endOfHistoryTransferType = 11;
    optional uint64 conversationTimestamp = 12;
    optional string name = 13;
    optional string pHash = 14;
    optional bool notSpam = 15;
    optional bool archived = 16;
    optional DisappearingMode disappearingMode = 17;
    optional uint32 unreadMentionCount = 18;
    optional bool markedAsUnread = 19;
    repeated GroupParticipant participant = 20;
    optional bytes tcToken = 21;
    optional uint64 tcTokenTimestamp = 22;
    optional bytes contactPrimaryIdentityKey = 23;
    optional uint32 pinned = 24;
    optional uint64 muteEndTime = 25;
    optional WallpaperSettings wallpaper = 26;
    optional MediaVisibility mediaVisibility = 27;
    optional uint64 tcTokenSenderTimestamp = 28;
    optional bool suspended = 29;
    optional bool terminated = 30;
    optional uint64 createdAt = 31;
    optional string createdBy = 32;
    optional string description = 33;
    optional bool support = 34;
    optional bool isParentGroup = 35;
    optional string parentGroupId = 37;
    optional bool isDefaultSubgroup = 36;
    optional string displayName = 38;
    optional string pnJid = 39;
    optional bool shareOwnPn = 40;
    optional bool pnhDuplicateLidThread = 41;
    optional string lidJid = 42;
    optional string username = 43;
    optional string lidOriginType = 44;
    optional uint32 commentsCount = 45;
    optional bool locked = 46;
}

message AvatarUserSettings {
    optional string fbid = 1;
    optional string password = 2;
}

message AutoDownloadSettings {
    optional bool downloadImages = 1;
    optional bool downloadAudio = 2;
    optional bool downloadVideo = 3;
    optional bool downloadDocuments = 4;
}

message ServerErrorReceipt {
    optional string stanzaId = 1;
}

message MediaRetryNotification {
    enum ResultType {
        GENERAL_ERROR = 0;
        SUCCESS = 1;
        NOT_FOUND = 2;
        DECRYPTION_ERROR = 3;
    }
    optional string stanzaId = 1;
    optional string directPath = 2;
    optional ResultType result = 3;
}

message MessageKey {
    optional string remoteJid = 1;
    optional bool fromMe = 2;
    optional string id = 3;
    optional string participant = 4;
}

// Duplicate type omitted
//message MessageKey {
//    optional string remoteJid = 1;
//    optional bool fromMe = 2;
//    optional string id = 3;
//    optional string participant = 4;
//}

message SyncdVersion {
    optional uint64 version = 1;
}

message SyncdValue {
    optional bytes blob = 1;
}

message SyncdSnapshot {
    optional SyncdVersion version = 1;
    repeated SyncdRecord records = 2;
    optional bytes mac = 3;
    optional KeyId keyId = 4;
}

message SyncdRecord {
    optional SyncdIndex index = 1;
    optional SyncdValue value = 2;
    optional KeyId keyId = 3;
}

message SyncdPatch {
    optional SyncdVersion version = 1;
    repeated SyncdMutation mutations = 2;
    optional ExternalBlobReference externalMutations = 3;
    optional bytes snapshotMac = 4;
    optional bytes patchMac = 5;
    optional KeyId keyId = 6;
    optional ExitCode exitCode = 7;
    optional uint32 deviceIndex = 8;
    optional bytes clientDebugData = 9;
}

message SyncdMutations {
    repeated SyncdMutation mutations = 1;
}

message SyncdMutation {
    enum SyncdOperation {
        SET = 0;
        REMOVE = 1;
    }
    optional SyncdOperation operation = 1;
    optional SyncdRecord record = 2;
}

message SyncdIndex {
    optional bytes blob = 1;
}

message KeyId {
    optional bytes id = 1;
}

message ExternalBlobReference {
    optional bytes mediaKey = 1;
    optional string directPath = 2;
    optional string handle = 3;
    optional uint64 fileSizeBytes = 4;
    optional bytes fileSha256 = 5;
    optional bytes fileEncSha256 = 6;
}

message ExitCode {
    optional uint64 code = 1;
    optional string text = 2;
}

message SyncActionValue {
    optional int64 timestamp = 1;
    optional StarAction starAction = 2;
    optional ContactAction contactAction = 3;
    optional MuteAction muteAction = 4;
    optional PinAction pinAction = 5;
    optional SecurityNotificationSetting securityNotificationSetting = 6;
    optional PushNameSetting pushNameSetting = 7;
    optional QuickReplyAction quickReplyAction = 8;
    optional RecentEmojiWeightsAction recentEmojiWeightsAction = 11;
    optional LabelEditAction labelEditAction = 14;
    optional LabelAssociationAction labelAssociationAction = 15;
    optional LocaleSetting localeSetting = 16;
    optional ArchiveChatAction archiveChatAction = 17;
    optional DeleteMessageForMeAction deleteMessageForMeAction = 18;
    optional KeyExpiration keyExpiration = 19;
    optional MarkChatAsReadAction markChatAsReadAction = 20;
    optional ClearChatAction clearChatAction = 21;
    optional DeleteChatAction deleteChatAction = 22;
    optional UnarchiveChatsSetting unarchiveChatsSetting = 23;
    optional PrimaryFeature primaryFeature = 24;
    optional AndroidUnsupportedActions androidUnsupportedActions = 26;
    optional AgentAction agentAction = 27;
    optional SubscriptionAction subscriptionAction = 28;
    optional UserStatusMuteAction userStatusMuteAction = 29;
    optional TimeFormatAction timeFormatAction = 30;
    optional NuxAction nuxAction = 31;
    optional PrimaryVersionAction primaryVersionAction = 32;
    optional StickerAction stickerAction = 33;
    optional RemoveRecentStickerAction removeRecentStickerAction = 34;
    optional ChatAssignmentAction chatAssignment = 35;
    optional ChatAssignmentOpenedStatusAction chatAssignmentOpenedStatus = 36;
    optional PnForLidChatAction pnForLidChatAction = 37;
    optional MarketingMessageAction marketingMessageAction = 38;
    optional MarketingMessageBroadcastAction marketingMessageBroadcastAction = 39;
    optional ExternalWebBetaAction externalWebBetaAction = 40;
    optional PrivacySettingRelayAllCalls privacySettingRelayAllCalls = 41;
    optional CallLogAction callLogAction = 42;
    optional StatusPrivacyAction statusPrivacy = 44;
    optional BotWelcomeRequestAction botWelcomeRequestAction = 45;
    optional DeleteIndividualCallLogAction deleteIndividualCallLog = 46;
    optional LabelReorderingAction labelReorderingAction = 47;
    optional PaymentInfoAction paymentInfoAction = 48;
    optional CustomPaymentMethodsAction customPaymentMethodsAction = 49;
    optional LockChatAction lockChatAction = 50;
    optional ChatLockSettings chatLockSettings = 51;
    optional WamoUserIdentifierAction wamoUserIdentifierAction = 52;
    optional PrivacySettingDisableLinkPreviewsAction privacySettingDisableLinkPreviewsAction = 53;
    optional DeviceCapabilities deviceCapabilities = 54;
}

message WamoUserIdentifierAction {
    optional string identifier = 1;
}

message UserStatusMuteAction {
    optional bool muted = 1;
}

message UnarchiveChatsSetting {
    optional bool unarchiveChats = 1;
}

message TimeFormatAction {
    optional bool isTwentyFourHourFormatEnabled = 1;
}

message SyncActionMessage {
    optional MessageKey key = 1;
    optional int64 timestamp = 2;
}

message SyncActionMessageRange {
    optional int64 lastMessageTimestamp = 1;
    optional int64 lastSystemMessageTimestamp = 2;
    repeated SyncActionMessage messages = 3;
}

message SubscriptionAction {
    optional bool isDeactivated = 1;
    optional bool isAutoRenewing = 2;
    optional int64 expirationDate = 3;
}

message StickerAction {
    optional string url = 1;
    optional bytes fileEncSha256 = 2;
    optional bytes mediaKey = 3;
    optional string mimetype = 4;
    optional uint32 height = 5;
    optional uint32 width = 6;
    optional string directPath = 7;
    optional uint64 fileLength = 8;
    optional bool isFavorite = 9;
    optional uint32 deviceIdHint = 10;
}

message StatusPrivacyAction {
    enum StatusDistributionMode {
        ALLOW_LIST = 0;
        DENY_LIST = 1;
        CONTACTS = 2;
    }
    optional StatusDistributionMode mode = 1;
    repeated string userJid = 2;
}

message StarAction {
    optional bool starred = 1;
}

message SecurityNotificationSetting {
    optional bool showNotification = 1;
}

message RemoveRecentStickerAction {
    optional int64 lastStickerSentTs = 1;
}

message RecentEmojiWeightsAction {
    repeated RecentEmojiWeight weights = 1;
}

message QuickReplyAction {
    optional string shortcut = 1;
    optional string message = 2;
    repeated string keywords = 3;
    optional int32 count = 4;
    optional bool deleted = 5;
}

message PushNameSetting {
    optional string name = 1;
}

message PrivacySettingRelayAllCalls {
    optional bool isEnabled = 1;
}

message PrivacySettingDisableLinkPreviewsAction {
    optional bool isPreviewsDisabled = 1;
}

message PrimaryVersionAction {
    optional string version = 1;
}

message PrimaryFeature {
    repeated string flags = 1;
}

message PnForLidChatAction {
    optional string pnJid = 1;
}

message PinAction {
    optional bool pinned = 1;
}

message PaymentInfoAction {
    optional string cpi = 1;
}

message NuxAction {
    optional bool acknowledged = 1;
}

message MuteAction {
    optional bool muted = 1;
    optional int64 muteEndTimestamp = 2;
    optional bool autoMuted = 3;
}

message MarketingMessageBroadcastAction {
    optional int32 repliedCount = 1;
}

message MarketingMessageAction {
    enum MarketingMessagePrototypeType {
        PERSONALIZED = 0;
    }
    optional string name = 1;
    optional string message = 2;
    optional MarketingMessagePrototypeType type = 3;
    optional int64 createdAt = 4;
    optional int64 lastSentAt = 5;
    optional bool isDeleted = 6;
    optional string mediaId = 7;
}

message MarkChatAsReadAction {
    optional bool read = 1;
    optional SyncActionMessageRange messageRange = 2;
}

message LockChatAction {
    optional bool locked = 1;
}

message LocaleSetting {
    optional string locale = 1;
}

message LabelReorderingAction {
    repeated int32 sortedLabelIds = 1;
}

message LabelEditAction {
    optional string name = 1;
    optional int32 color = 2;
    optional int32 predefinedId = 3;
    optional bool deleted = 4;
    optional int32 orderIndex = 5;
}

message LabelAssociationAction {
    optional bool labeled = 1;
}

message KeyExpiration {
    optional int32 expiredKeyEpoch = 1;
}

message ExternalWebBetaAction {
    optional bool isOptIn = 1;
}

message DeleteMessageForMeAction {
    optional bool deleteMedia = 1;
    optional int64 messageTimestamp = 2;
}

message DeleteIndividualCallLogAction {
    optional string peerJid = 1;
    optional bool isIncoming = 2;
}

message DeleteChatAction {
    optional SyncActionMessageRange messageRange = 1;
}

message CustomPaymentMethodsAction {
    repeated CustomPaymentMethod customPaymentMethods = 1;
}

message CustomPaymentMethod {
    required string credentialId = 1;
    required string country = 2;
    required string type = 3;
    repeated CustomPaymentMethodMetadata metadata = 4;
}

message CustomPaymentMethodMetadata {
    required string key = 1;
    required string value = 2;
}

message ContactAction {
    optional string fullName = 1;
    optional string firstName = 2;
    optional string lidJid = 3;
    optional bool saveOnPrimaryAddressbook = 4;
}

message ClearChatAction {
    optional SyncActionMessageRange messageRange = 1;
}

message ChatAssignmentOpenedStatusAction {
    optional bool chatOpened = 1;
}

message ChatAssignmentAction {
    optional string deviceAgentID = 1;
}

message CallLogAction {
    optional CallLogRecord callLogRecord = 1;
}

message BotWelcomeRequestAction {
    optional bool isSent = 1;
}

message ArchiveChatAction {
    optional bool archived = 1;
    optional SyncActionMessageRange messageRange = 2;
}

message AndroidUnsupportedActions {
    optional bool allowed = 1;
}

message AgentAction {
    optional string name = 1;
    optional int32 deviceID = 2;
    optional bool isDeleted = 3;
}

message SyncActionData {
    optional bytes index = 1;
    optional SyncActionValue value = 2;
    optional bytes padding = 3;
    optional int32 version = 4;
}

message RecentEmojiWeight {
    optional string emoji = 1;
    optional float weight = 2;
}

message PatchDebugData {
    enum Platform {
        ANDROID = 0;
        SMBA = 1;
        IPHONE = 2;
        SMBI = 3;
        WEB = 4;
        UWP = 5;
        DARWIN = 6;
    }
    optional bytes currentLthash = 1;
    optional bytes newLthash = 2;
    optional bytes patchVersion = 3;
    optional bytes collectionName = 4;
    optional bytes firstFourBytesFromAHashOfSnapshotMacKey = 5;
    optional bytes newLthashSubtract = 6;
    optional int32 numberAdd = 7;
    optional int32 numberRemove = 8;
    optional int32 numberOverride = 9;
    optional Platform senderPlatform = 10;
    optional bool isSenderPrimary = 11;
}

message CallLogRecord {
    enum SilenceReason {
        NONE = 0;
        SCHEDULED = 1;
        PRIVACY = 2;
        LIGHTWEIGHT = 3;
    }
    message ParticipantInfo {
        optional string userJid = 1;
        optional CallResult callResult = 2;
    }
    
    enum CallType {
        REGULAR = 0;
        SCHEDULED_CALL = 1;
        VOICE_CHAT = 2;
    }
    enum CallResult {
        CONNECTED = 0;
        REJECTED = 1;
        CANCELLED = 2;
        ACCEPTEDELSEWHERE = 3;
        MISSED = 4;
        INVALID = 5;
        UNAVAILABLE = 6;
        UPCOMING = 7;
        FAILED = 8;
        ABANDONED = 9;
        ONGOING = 10;
    }
    optional CallResult callResult = 1;
    optional bool isDndMode = 2;
    optional SilenceReason silenceReason = 3;
    optional int64 duration = 4;
    optional int64 startTime = 5;
    optional bool isIncoming = 6;
    optional bool isVideo = 7;
    optional bool isCallLink = 8;
    optional string callLinkToken = 9;
    optional string scheduledCallId = 10;
    optional string callId = 11;
    optional string callCreatorJid = 12;
    optional string groupJid = 13;
    repeated ParticipantInfo participants = 14;
    optional CallType callType = 15;
}

message VerifiedNameCertificate {
    message Details {
        optional uint64 serial = 1;
        optional string issuer = 2;
        optional string verifiedName = 4;
        repeated LocalizedName localizedNames = 8;
        optional uint64 issueTime = 10;
    }
    
    optional bytes details = 1;
    optional bytes signature = 2;
    optional bytes serverSignature = 3;
}

message LocalizedName {
    optional string lg = 1;
    optional string lc = 2;
    optional string verifiedName = 3;
}

message BizIdentityInfo {
    enum VerifiedLevelValue {
        UNKNOWN = 0;
        LOW = 1;
        HIGH = 2;
    }
    enum HostStorageType {
        ON_PREMISE = 0;
        FACEBOOK = 1;
    }
    enum ActualActorsType {
        SELF = 0;
        BSP = 1;
    }
    optional VerifiedLevelValue vlevel = 1;
    optional VerifiedNameCertificate vnameCert = 2;
    optional bool signed = 3;
    optional bool revoked = 4;
    optional HostStorageType hostStorage = 5;
    optional ActualActorsType actualActors = 6;
    optional uint64 privacyModeTs = 7;
    optional uint64 featureControls = 8;
}

message BizAccountPayload {
    optional VerifiedNameCertificate vnameCert = 1;
    optional bytes bizAcctLinkInfo = 2;
}

message BizAccountLinkInfo {
    enum HostStorageType {
        ON_PREMISE = 0;
        FACEBOOK = 1;
    }
    enum AccountType {
        ENTERPRISE = 0;
    }
    optional uint64 whatsappBizAcctFbid = 1;
    optional string whatsappAcctNumber = 2;
    optional uint64 issueTime = 3;
    optional HostStorageType hostStorage = 4;
    optional AccountType accountType = 5;
}

message HandshakeMessage {
    optional HandshakeClientHello clientHello = 2;
    optional HandshakeServerHello serverHello = 3;
    optional HandshakeClientFinish clientFinish = 4;
}

message HandshakeServerHello {
    optional bytes ephemeral = 1;
    optional bytes static = 2;
    optional bytes payload = 3;
}

message HandshakeClientHello {
    optional bytes ephemeral = 1;
    optional bytes static = 2;
    optional bytes payload = 3;
}

message HandshakeClientFinish {
    optional bytes static = 1;
    optional bytes payload = 2;
}

message ClientPayload {
    message WebInfo {
        message WebdPayload {
            optional bool usesParticipantInKey = 1;
            optional bool supportsStarredMessages = 2;
            optional bool supportsDocumentMessages = 3;
            optional bool supportsUrlMessages = 4;
            optional bool supportsMediaRetry = 5;
            optional bool supportsE2EImage = 6;
            optional bool supportsE2EVideo = 7;
            optional bool supportsE2EAudio = 8;
            optional bool supportsE2EDocument = 9;
            optional string documentTypes = 10;
            optional bytes features = 11;
        }
        
        enum WebSubPlatform {
            WEB_BROWSER = 0;
            APP_STORE = 1;
            WIN_STORE = 2;
            DARWIN = 3;
            WIN32 = 4;
        }
        optional string refToken = 1;
        optional string version = 2;
        optional WebdPayload webdPayload = 3;
        optional WebSubPlatform webSubPlatform = 4;
    }
    
    message UserAgent {
        enum ReleaseChannel {
            RELEASE = 0;
            BETA = 1;
            ALPHA = 2;
            DEBUG = 3;
        }
        enum Platform {
            ANDROID = 0;
            IOS = 1;
            WINDOWS_PHONE = 2;
            BLACKBERRY = 3;
            BLACKBERRYX = 4;
            S40 = 5;
            S60 = 6;
            PYTHON_CLIENT = 7;
            TIZEN = 8;
            ENTERPRISE = 9;
            SMB_ANDROID = 10;
            KAIOS = 11;
            SMB_IOS = 12;
            WINDOWS = 13;
            WEB = 14;
            PORTAL = 15;
            GREEN_ANDROID = 16;
            GREEN_IPHONE = 17;
            BLUE_ANDROID = 18;
            BLUE_IPHONE = 19;
            FBLITE_ANDROID = 20;
            MLITE_ANDROID = 21;
            IGLITE_ANDROID = 22;
            PAGE = 23;
            MACOS = 24;
            OCULUS_MSG = 25;
            OCULUS_CALL = 26;
            MILAN = 27;
            CAPI = 28;
            WEAROS = 29;
            ARDEVICE = 30;
            VRDEVICE = 31;
            BLUE_WEB = 32;
            IPAD = 33;
            TEST = 34;
            SMART_GLASSES = 35;
        }
        enum DeviceType {
            PHONE = 0;
            TABLET = 1;
            DESKTOP = 2;
            WEARABLE = 3;
            VR = 4;
        }
        message AppVersion {
            optional uint32 primary = 1;
            optional uint32 secondary = 2;
            optional uint32 tertiary = 3;
            optional uint32 quaternary = 4;
            optional uint32 quinary = 5;
        }
        
        optional Platform platform = 1;
        optional AppVersion appVersion = 2;
        optional string mcc = 3;
        optional string mnc = 4;
        optional string osVersion = 5;
        optional string manufacturer = 6;
        optional string device = 7;
        optional string osBuildNumber = 8;
        optional string phoneId = 9;
        optional ReleaseChannel releaseChannel = 10;
        optional string localeLanguageIso6391 = 11;
        optional string localeCountryIso31661Alpha2 = 12;
        optional string deviceBoard = 13;
        optional string deviceExpId = 14;
        optional DeviceType deviceType = 15;
        optional string deviceModelType = 16;
    }
    
    enum Product {
        WHATSAPP = 0;
        MESSENGER = 1;
        INTEROP = 2;
        INTEROP_MSGR = 3;
    }
    message InteropData {
        optional uint64 accountId = 1;
        optional bytes token = 2;
    }
    
    enum IOSAppExtension {
        SHARE_EXTENSION = 0;
        SERVICE_EXTENSION = 1;
        INTENTS_EXTENSION = 2;
    }
    message DevicePairingRegistrationData {
        optional bytes eRegid = 1;
        optional bytes eKeytype = 2;
        optional bytes eIdent = 3;
        optional bytes eSkeyId = 4;
        optional bytes eSkeyVal = 5;
        optional bytes eSkeySig = 6;
        optional bytes buildHash = 7;
        optional bytes deviceProps = 8;
    }
    
    message DNSSource {
        enum DNSResolutionMethod {
            SYSTEM = 0;
            GOOGLE = 1;
            HARDCODED = 2;
            OVERRIDE = 3;
            FALLBACK = 4;
        }
        optional DNSResolutionMethod dnsMethod = 15;
        optional bool appCached = 16;
    }
    
    enum ConnectType {
        CELLULAR_UNKNOWN = 0;
        WIFI_UNKNOWN = 1;
        CELLULAR_EDGE = 100;
        CELLULAR_IDEN = 101;
        CELLULAR_UMTS = 102;
        CELLULAR_EVDO = 103;
        CELLULAR_GPRS = 104;
        CELLULAR_HSDPA = 105;
        CELLULAR_HSUPA = 106;
        CELLULAR_HSPA = 107;
        CELLULAR_CDMA = 108;
        CELLULAR_1XRTT = 109;
        CELLULAR_EHRPD = 110;
        CELLULAR_LTE = 111;
        CELLULAR_HSPAP = 112;
    }
    enum ConnectReason {
        PUSH = 0;
        USER_ACTIVATED = 1;
        SCHEDULED = 2;
        ERROR_RECONNECT = 3;
        NETWORK_SWITCH = 4;
        PING_RECONNECT = 5;
        UNKNOWN = 6;
    }
    optional uint64 username = 1;
    optional bool passive = 3;
    optional UserAgent userAgent = 5;
    optional WebInfo webInfo = 6;
    optional string pushName = 7;
    optional sfixed32 sessionId = 9;
    optional bool shortConnect = 10;
    optional ConnectType connectType = 12;
    optional ConnectReason connectReason = 13;
    repeated int32 shards = 14;
    optional DNSSource dnsSource = 15;
    optional uint32 connectAttemptCount = 16;
    optional uint32 device = 18;
    optional DevicePairingRegistrationData devicePairingData = 19;
    optional Product product = 20;
    optional bytes fbCat = 21;
    optional bytes fbUserAgent = 22;
    optional bool oc = 23;
    optional int32 lc = 24;
    optional IOSAppExtension iosAppExtension = 30;
    optional uint64 fbAppId = 31;
    optional bytes fbDeviceId = 32;
    optional bool pull = 33;
    optional bytes paddingBytes = 34;
    optional int32 yearClass = 36;
    optional int32 memClass = 37;
    optional InteropData interopData = 38;
}

message WebNotificationsInfo {
    optional uint64 timestamp = 2;
    optional uint32 unreadChats = 3;
    optional uint32 notifyMessageCount = 4;
    repeated WebMessageInfo notifyMessages = 5;
}

message WebMessageInfo {
    enum StubType {
        UNKNOWN = 0;
        REVOKE = 1;
        CIPHERTEXT = 2;
        FUTUREPROOF = 3;
        NON_VERIFIED_TRANSITION = 4;
        UNVERIFIED_TRANSITION = 5;
        VERIFIED_TRANSITION = 6;
        VERIFIED_LOW_UNKNOWN = 7;
        VERIFIED_HIGH = 8;
        VERIFIED_INITIAL_UNKNOWN = 9;
        VERIFIED_INITIAL_LOW = 10;
        VERIFIED_INITIAL_HIGH = 11;
        VERIFIED_TRANSITION_ANY_TO_NONE = 12;
        VERIFIED_TRANSITION_ANY_TO_HIGH = 13;
        VERIFIED_TRANSITION_HIGH_TO_LOW = 14;
        VERIFIED_TRANSITION_HIGH_TO_UNKNOWN = 15;
        VERIFIED_TRANSITION_UNKNOWN_TO_LOW = 16;
        VERIFIED_TRANSITION_LOW_TO_UNKNOWN = 17;
        VERIFIED_TRANSITION_NONE_TO_LOW = 18;
        VERIFIED_TRANSITION_NONE_TO_UNKNOWN = 19;
        GROUP_CREATE = 20;
        GROUP_CHANGE_SUBJECT = 21;
        GROUP_CHANGE_ICON = 22;
        GROUP_CHANGE_INVITE_LINK = 23;
        GROUP_CHANGE_DESCRIPTION = 24;
        GROUP_CHANGE_RESTRICT = 25;
        GROUP_CHANGE_ANNOUNCE = 26;
        GROUP_PARTICIPANT_ADD = 27;
        GROUP_PARTICIPANT_REMOVE = 28;
        GROUP_PARTICIPANT_PROMOTE = 29;
        GROUP_PARTICIPANT_DEMOTE = 30;
        GROUP_PARTICIPANT_INVITE = 31;
        GROUP_PARTICIPANT_LEAVE = 32;
        GROUP_PARTICIPANT_CHANGE_NUMBER = 33;
        BROADCAST_CREATE = 34;
        BROADCAST_ADD = 35;
        BROADCAST_REMOVE = 36;
        GENERIC_NOTIFICATION = 37;
        E2E_IDENTITY_CHANGED = 38;
        E2E_ENCRYPTED = 39;
        CALL_MISSED_VOICE = 40;
        CALL_MISSED_VIDEO = 41;
        INDIVIDUAL_CHANGE_NUMBER = 42;
        GROUP_DELETE = 43;
        GROUP_ANNOUNCE_MODE_MESSAGE_BOUNCE = 44;
        CALL_MISSED_GROUP_VOICE = 45;
        CALL_MISSED_GROUP_VIDEO = 46;
        PAYMENT_CIPHERTEXT = 47;
        PAYMENT_FUTUREPROOF = 48;
        PAYMENT_TRANSACTION_STATUS_UPDATE_FAILED = 49;
        PAYMENT_TRANSACTION_STATUS_UPDATE_REFUNDED = 50;
        PAYMENT_TRANSACTION_STATUS_UPDATE_REFUND_FAILED = 51;
        PAYMENT_TRANSACTION_STATUS_RECEIVER_PENDING_SETUP = 52;
        PAYMENT_TRANSACTION_STATUS_RECEIVER_SUCCESS_AFTER_HICCUP = 53;
        PAYMENT_ACTION_ACCOUNT_SETUP_REMINDER = 54;
        PAYMENT_ACTION_SEND_PAYMENT_REMINDER = 55;
        PAYMENT_ACTION_SEND_PAYMENT_INVITATION = 56;
        PAYMENT_ACTION_REQUEST_DECLINED = 57;
        PAYMENT_ACTION_REQUEST_EXPIRED = 58;
        PAYMENT_ACTION_REQUEST_CANCELLED = 59;
        BIZ_VERIFIED_TRANSITION_TOP_TO_BOTTOM = 60;
        BIZ_VERIFIED_TRANSITION_BOTTOM_TO_TOP = 61;
        BIZ_INTRO_TOP = 62;
        BIZ_INTRO_BOTTOM = 63;
        BIZ_NAME_CHANGE = 64;
        BIZ_MOVE_TO_CONSUMER_APP = 65;
        BIZ_TWO_TIER_MIGRATION_TOP = 66;
        BIZ_TWO_TIER_MIGRATION_BOTTOM = 67;
        OVERSIZED = 68;
        GROUP_CHANGE_NO_FREQUENTLY_FORWARDED = 69;
        GROUP_V4_ADD_INVITE_SENT = 70;
        GROUP_PARTICIPANT_ADD_REQUEST_JOIN = 71;
        CHANGE_EPHEMERAL_SETTING = 72;
        E2E_DEVICE_CHANGED = 73;
        VIEWED_ONCE = 74;
        E2E_ENCRYPTED_NOW = 75;
        BLUE_MSG_BSP_FB_TO_BSP_PREMISE = 76;
        BLUE_MSG_BSP_FB_TO_SELF_FB = 77;
        BLUE_MSG_BSP_FB_TO_SELF_PREMISE = 78;
        BLUE_MSG_BSP_FB_UNVERIFIED = 79;
        BLUE_MSG_BSP_FB_UNVERIFIED_TO_SELF_PREMISE_VERIFIED = 80;
        BLUE_MSG_BSP_FB_VERIFIED = 81;
        BLUE_MSG_BSP_FB_VERIFIED_TO_SELF_PREMISE_UNVERIFIED = 82;
        BLUE_MSG_BSP_PREMISE_TO_SELF_PREMISE = 83;
        BLUE_MSG_BSP_PREMISE_UNVERIFIED = 84;
        BLUE_MSG_BSP_PREMISE_UNVERIFIED_TO_SELF_PREMISE_VERIFIED = 85;
        BLUE_MSG_BSP_PREMISE_VERIFIED = 86;
        BLUE_MSG_BSP_PREMISE_VERIFIED_TO_SELF_PREMISE_UNVERIFIED = 87;
        BLUE_MSG_CONSUMER_TO_BSP_FB_UNVERIFIED = 88;
        BLUE_MSG_CONSUMER_TO_BSP_PREMISE_UNVERIFIED = 89;
        BLUE_MSG_CONSUMER_TO_SELF_FB_UNVERIFIED = 90;
        BLUE_MSG_CONSUMER_TO_SELF_PREMISE_UNVERIFIED = 91;
        BLUE_MSG_SELF_FB_TO_BSP_PREMISE = 92;
        BLUE_MSG_SELF_FB_TO_SELF_PREMISE = 93;
        BLUE_MSG_SELF_FB_UNVERIFIED = 94;
        BLUE_MSG_SELF_FB_UNVERIFIED_TO_SELF_PREMISE_VERIFIED = 95;
        BLUE_MSG_SELF_FB_VERIFIED = 96;
        BLUE_MSG_SELF_FB_VERIFIED_TO_SELF_PREMISE_UNVERIFIED = 97;
        BLUE_MSG_SELF_PREMISE_TO_BSP_PREMISE = 98;
        BLUE_MSG_SELF_PREMISE_UNVERIFIED = 99;
        BLUE_MSG_SELF_PREMISE_VERIFIED = 100;
        BLUE_MSG_TO_BSP_FB = 101;
        BLUE_MSG_TO_CONSUMER = 102;
        BLUE_MSG_TO_SELF_FB = 103;
        BLUE_MSG_UNVERIFIED_TO_BSP_FB_VERIFIED = 104;
        BLUE_MSG_UNVERIFIED_TO_BSP_PREMISE_VERIFIED = 105;
        BLUE_MSG_UNVERIFIED_TO_SELF_FB_VERIFIED = 106;
        BLUE_MSG_UNVERIFIED_TO_VERIFIED = 107;
        BLUE_MSG_VERIFIED_TO_BSP_FB_UNVERIFIED = 108;
        BLUE_MSG_VERIFIED_TO_BSP_PREMISE_UNVERIFIED = 109;
        BLUE_MSG_VERIFIED_TO_SELF_FB_UNVERIFIED = 110;
        BLUE_MSG_VERIFIED_TO_UNVERIFIED = 111;
        BLUE_MSG_BSP_FB_UNVERIFIED_TO_BSP_PREMISE_VERIFIED = 112;
        BLUE_MSG_BSP_FB_UNVERIFIED_TO_SELF_FB_VERIFIED = 113;
        BLUE_MSG_BSP_FB_VERIFIED_TO_BSP_PREMISE_UNVERIFIED = 114;
        BLUE_MSG_BSP_FB_VERIFIED_TO_SELF_FB_UNVERIFIED = 115;
        BLUE_MSG_SELF_FB_UNVERIFIED_TO_BSP_PREMISE_VERIFIED = 116;
        BLUE_MSG_SELF_FB_VERIFIED_TO_BSP_PREMISE_UNVERIFIED = 117;
        E2E_IDENTITY_UNAVAILABLE = 118;
        GROUP_CREATING = 119;
        GROUP_CREATE_FAILED = 120;
        GROUP_BOUNCED = 121;
        BLOCK_CONTACT = 122;
        EPHEMERAL_SETTING_NOT_APPLIED = 123;
        SYNC_FAILED = 124;
        SYNCING = 125;
        BIZ_PRIVACY_MODE_INIT_FB = 126;
        BIZ_PRIVACY_MODE_INIT_BSP = 127;
        BIZ_PRIVACY_MODE_TO_FB = 128;
        BIZ_PRIVACY_MODE_TO_BSP = 129;
        DISAPPEARING_MODE = 130;
        E2E_DEVICE_FETCH_FAILED = 131;
        ADMIN_REVOKE = 132;
        GROUP_INVITE_LINK_GROWTH_LOCKED = 133;
        COMMUNITY_LINK_PARENT_GROUP = 134;
        COMMUNITY_LINK_SIBLING_GROUP = 135;
        COMMUNITY_LINK_SUB_GROUP = 136;
        COMMUNITY_UNLINK_PARENT_GROUP = 137;
        COMMUNITY_UNLINK_SIBLING_GROUP = 138;
        COMMUNITY_UNLINK_SUB_GROUP = 139;
        GROUP_PARTICIPANT_ACCEPT = 140;
        GROUP_PARTICIPANT_LINKED_GROUP_JOIN = 141;
        COMMUNITY_CREATE = 142;
        EPHEMERAL_KEEP_IN_CHAT = 143;
        GROUP_MEMBERSHIP_JOIN_APPROVAL_REQUEST = 144;
        GROUP_MEMBERSHIP_JOIN_APPROVAL_MODE = 145;
        INTEGRITY_UNLINK_PARENT_GROUP = 146;
        COMMUNITY_PARTICIPANT_PROMOTE = 147;
        COMMUNITY_PARTICIPANT_DEMOTE = 148;
        COMMUNITY_PARENT_GROUP_DELETED = 149;
        COMMUNITY_LINK_PARENT_GROUP_MEMBERSHIP_APPROVAL = 150;
        GROUP_PARTICIPANT_JOINED_GROUP_AND_PARENT_GROUP = 151;
        MASKED_THREAD_CREATED = 152;
        MASKED_THREAD_UNMASKED = 153;
        BIZ_CHAT_ASSIGNMENT = 154;
        CHAT_PSA = 155;
        CHAT_POLL_CREATION_MESSAGE = 156;
        CAG_MASKED_THREAD_CREATED = 157;
        COMMUNITY_PARENT_GROUP_SUBJECT_CHANGED = 158;
        CAG_INVITE_AUTO_ADD = 159;
        BIZ_CHAT_ASSIGNMENT_UNASSIGN = 160;
        CAG_INVITE_AUTO_JOINED = 161;
        SCHEDULED_CALL_START_MESSAGE = 162;
        COMMUNITY_INVITE_RICH = 163;
        COMMUNITY_INVITE_AUTO_ADD_RICH = 164;
        SUB_GROUP_INVITE_RICH = 165;
        SUB_GROUP_PARTICIPANT_ADD_RICH = 166;
        COMMUNITY_LINK_PARENT_GROUP_RICH = 167;
        COMMUNITY_PARTICIPANT_ADD_RICH = 168;
        SILENCED_UNKNOWN_CALLER_AUDIO = 169;
        SILENCED_UNKNOWN_CALLER_VIDEO = 170;
        GROUP_MEMBER_ADD_MODE = 171;
        GROUP_MEMBERSHIP_JOIN_APPROVAL_REQUEST_NON_ADMIN_ADD = 172;
        COMMUNITY_CHANGE_DESCRIPTION = 173;
        SENDER_INVITE = 174;
        RECEIVER_INVITE = 175;
        COMMUNITY_ALLOW_MEMBER_ADDED_GROUPS = 176;
        PINNED_MESSAGE_IN_CHAT = 177;
        PAYMENT_INVITE_SETUP_INVITER = 178;
        PAYMENT_INVITE_SETUP_INVITEE_RECEIVE_ONLY = 179;
        PAYMENT_INVITE_SETUP_INVITEE_SEND_AND_RECEIVE = 180;
        LINKED_GROUP_CALL_START = 181;
        REPORT_TO_ADMIN_ENABLED_STATUS = 182;
        EMPTY_SUBGROUP_CREATE = 183;
        SCHEDULED_CALL_CANCEL = 184;
        SUBGROUP_ADMIN_TRIGGERED_AUTO_ADD_RICH = 185;
        GROUP_CHANGE_RECENT_HISTORY_SHARING = 186;
        PAID_MESSAGE_SERVER_CAMPAIGN_ID = 187;
        GENERAL_CHAT_CREATE = 188;
        GENERAL_CHAT_ADD = 189;
        GENERAL_CHAT_AUTO_ADD_DISABLED = 190;
        SUGGESTED_SUBGROUP_ANNOUNCE = 191;
        BIZ_BOT_1P_MESSAGING_ENABLED = 192;
        CHANGE_USERNAME = 193;
        BIZ_COEX_PRIVACY_INIT_SELF = 194;
        BIZ_COEX_PRIVACY_TRANSITION_SELF = 195;
        SUPPORT_AI_EDUCATION = 196;
        BIZ_BOT_3P_MESSAGING_ENABLED = 197;
        REMINDER_SETUP_MESSAGE = 198;
        REMINDER_SENT_MESSAGE = 199;
        REMINDER_CANCEL_MESSAGE = 200;
        BIZ_COEX_PRIVACY_INIT = 201;
        BIZ_COEX_PRIVACY_TRANSITION = 202;
        GROUP_DEACTIVATED = 203;
        COMMUNITY_DEACTIVATE_SIBLING_GROUP = 204;
    }
    enum Status {
        ERROR = 0;
        PENDING = 1;
        SERVER_ACK = 2;
        DELIVERY_ACK = 3;
        READ = 4;
        PLAYED = 5;
    }
    enum BizPrivacyStatus {
        E2EE = 0;
        FB = 2;
        BSP = 1;
        BSP_AND_FB = 3;
    }
    required MessageKey key = 1;
    optional Message message = 2;
    optional uint64 messageTimestamp = 3;
    optional Status status = 4;
    optional string participant = 5;
    optional uint64 messageC2STimestamp = 6;
    optional bool ignore = 16;
    optional bool starred = 17;
    optional bool broadcast = 18;
    optional string pushName = 19;
    optional bytes mediaCiphertextSha256 = 20;
    optional bool multicast = 21;
    optional bool urlText = 22;
    optional bool urlNumber = 23;
    optional StubType messageStubType = 24;
    optional bool clearMedia = 25;
    repeated string messageStubParameters = 26;
    optional uint32 duration = 27;
    repeated string labels = 28;
    optional PaymentInfo paymentInfo = 29;
    optional LiveLocationMessage finalLiveLocation = 30;
    optional PaymentInfo quotedPaymentInfo = 31;
    optional uint64 ephemeralStartTimestamp = 32;
    optional uint32 ephemeralDuration = 33;
    optional bool ephemeralOffToOn = 34;
    optional bool ephemeralOutOfSync = 35;
    optional BizPrivacyStatus bizPrivacyStatus = 36;
    optional string verifiedBizName = 37;
    optional MediaData mediaData = 38;
    optional PhotoChange photoChange = 39;
    repeated UserReceipt userReceipt = 40;
    repeated Reaction reactions = 41;
    optional MediaData quotedStickerData = 42;
    optional bytes futureproofData = 43;
    optional StatusPSA statusPsa = 44;
    repeated PollUpdate pollUpdates = 45;
    optional PollAdditionalMetadata pollAdditionalMetadata = 46;
    optional string agentId = 47;
    optional bool statusAlreadyViewed = 48;
    optional bytes messageSecret = 49;
    optional KeepInChat keepInChat = 50;
    optional string originalSelfAuthorUserJidString = 51;
    optional uint64 revokeMessageTimestamp = 52;
    optional PinInChat pinInChat = 54;
    optional PremiumMessageInfo premiumMessageInfo = 55;
    optional bool is1PBizBotMessage = 56;
    optional bool isGroupHistoryMessage = 57;
    optional string botMessageInvokerJid = 58;
    optional CommentMetadata commentMetadata = 59;
    repeated EventResponse eventResponses = 61;
    optional ReportingTokenInfo reportingTokenInfo = 62;
    optional uint64 newsletterServerId = 63;
    optional EventAdditionalMetadata eventAdditionalMetadata = 64;
}

message WebFeatures {
    enum Flag {
        NOT_STARTED = 0;
        FORCE_UPGRADE = 1;
        DEVELOPMENT = 2;
        PRODUCTION = 3;
    }
    optional Flag labelsDisplay = 1;
    optional Flag voipIndividualOutgoing = 2;
    optional Flag groupsV3 = 3;
    optional Flag groupsV3Create = 4;
    optional Flag changeNumberV2 = 5;
    optional Flag queryStatusV3Thumbnail = 6;
    optional Flag liveLocations = 7;
    optional Flag queryVname = 8;
    optional Flag voipIndividualIncoming = 9;
    optional Flag quickRepliesQuery = 10;
    optional Flag payments = 11;
    optional Flag stickerPackQuery = 12;
    optional Flag liveLocationsFinal = 13;
    optional Flag labelsEdit = 14;
    optional Flag mediaUpload = 15;
    optional Flag mediaUploadRichQuickReplies = 18;
    optional Flag vnameV2 = 19;
    optional Flag videoPlaybackUrl = 20;
    optional Flag statusRanking = 21;
    optional Flag voipIndividualVideo = 22;
    optional Flag thirdPartyStickers = 23;
    optional Flag frequentlyForwardedSetting = 24;
    optional Flag groupsV4JoinPermission = 25;
    optional Flag recentStickers = 26;
    optional Flag catalog = 27;
    optional Flag starredStickers = 28;
    optional Flag voipGroupCall = 29;
    optional Flag templateMessage = 30;
    optional Flag templateMessageInteractivity = 31;
    optional Flag ephemeralMessages = 32;
    optional Flag e2ENotificationSync = 33;
    optional Flag recentStickersV2 = 34;
    optional Flag recentStickersV3 = 36;
    optional Flag userNotice = 37;
    optional Flag support = 39;
    optional Flag groupUiiCleanup = 40;
    optional Flag groupDogfoodingInternalOnly = 41;
    optional Flag settingsSync = 42;
    optional Flag archiveV2 = 43;
    optional Flag ephemeralAllowGroupMembers = 44;
    optional Flag ephemeral24HDuration = 45;
    optional Flag mdForceUpgrade = 46;
    optional Flag disappearingMode = 47;
    optional Flag externalMdOptInAvailable = 48;
    optional Flag noDeleteMessageTimeLimit = 49;
}

message UserReceipt {
    required string userJid = 1;
    optional int64 receiptTimestamp = 2;
    optional int64 readTimestamp = 3;
    optional int64 playedTimestamp = 4;
    repeated string pendingDeviceJid = 5;
    repeated string deliveredDeviceJid = 6;
}

message StatusPSA {
    required uint64 campaignId = 44;
    optional uint64 campaignExpirationTimestamp = 45;
}

message ReportingTokenInfo {
    optional bytes reportingTag = 1;
}

message Reaction {
    optional MessageKey key = 1;
    optional string text = 2;
    optional string groupingKey = 3;
    optional int64 senderTimestampMs = 4;
    optional bool unread = 5;
}

message PremiumMessageInfo {
    optional string serverCampaignId = 1;
}

message PollUpdate {
    optional MessageKey pollUpdateMessageKey = 1;
    optional PollVoteMessage vote = 2;
    optional int64 senderTimestampMs = 3;
    optional int64 serverTimestampMs = 4;
    optional bool unread = 5;
}

message PollAdditionalMetadata {
    optional bool pollInvalidated = 1;
}

message PinInChat {
    enum Type {
        UNKNOWN_TYPE = 0;
        PIN_FOR_ALL = 1;
        UNPIN_FOR_ALL = 2;
    }
    optional Type type = 1;
    optional MessageKey key = 2;
    optional int64 senderTimestampMs = 3;
    optional int64 serverTimestampMs = 4;
    optional MessageAddOnContextInfo messageAddOnContextInfo = 5;
}

message PhotoChange {
    optional bytes oldPhoto = 1;
    optional bytes newPhoto = 2;
    optional uint32 newPhotoId = 3;
}

message PaymentInfo {
    enum TxnStatus {
        UNKNOWN = 0;
        PENDING_SETUP = 1;
        PENDING_RECEIVER_SETUP = 2;
        INIT = 3;
        SUCCESS = 4;
        COMPLETED = 5;
        FAILED = 6;
        FAILED_RISK = 7;
        FAILED_PROCESSING = 8;
        FAILED_RECEIVER_PROCESSING = 9;
        FAILED_DA = 10;
        FAILED_DA_FINAL = 11;
        REFUNDED_TXN = 12;
        REFUND_FAILED = 13;
        REFUND_FAILED_PROCESSING = 14;
        REFUND_FAILED_DA = 15;
        EXPIRED_TXN = 16;
        AUTH_CANCELED = 17;
        AUTH_CANCEL_FAILED_PROCESSING = 18;
        AUTH_CANCEL_FAILED = 19;
        COLLECT_INIT = 20;
        COLLECT_SUCCESS = 21;
        COLLECT_FAILED = 22;
        COLLECT_FAILED_RISK = 23;
        COLLECT_REJECTED = 24;
        COLLECT_EXPIRED = 25;
        COLLECT_CANCELED = 26;
        COLLECT_CANCELLING = 27;
        IN_REVIEW = 28;
        REVERSAL_SUCCESS = 29;
        REVERSAL_PENDING = 30;
        REFUND_PENDING = 31;
    }
    enum Status {
        UNKNOWN_STATUS = 0;
        PROCESSING = 1;
        SENT = 2;
        NEED_TO_ACCEPT = 3;
        COMPLETE = 4;
        COULD_NOT_COMPLETE = 5;
        REFUNDED = 6;
        EXPIRED = 7;
        REJECTED = 8;
        CANCELLED = 9;
        WAITING_FOR_PAYER = 10;
        WAITING = 11;
    }
    enum Currency {
        UNKNOWN_CURRENCY = 0;
        INR = 1;
    }
    optional Currency currencyDeprecated = 1;
    optional uint64 amount1000 = 2;
    optional string receiverJid = 3;
    optional Status status = 4;
    optional uint64 transactionTimestamp = 5;
    optional MessageKey requestMessageKey = 6;
    optional uint64 expiryTimestamp = 7;
    optional bool futureproofed = 8;
    optional string currency = 9;
    optional TxnStatus txnStatus = 10;
    optional bool useNoviFiatFormat = 11;
    optional Money primaryAmount = 12;
    optional Money exchangeAmount = 13;
}

message NotificationMessageInfo {
    optional MessageKey key = 1;
    optional Message message = 2;
    optional uint64 messageTimestamp = 3;
    optional string participant = 4;
}

message MessageAddOnContextInfo {
    optional uint32 messageAddOnDurationInSecs = 1;
}

message MediaData {
    optional string localPath = 1;
}

message KeepInChat {
    optional KeepType keepType = 1;
    optional int64 serverTimestamp = 2;
    optional MessageKey key = 3;
    optional string deviceJid = 4;
    optional int64 clientTimestampMs = 5;
    optional int64 serverTimestampMs = 6;
}

message EventResponse {
    optional MessageKey eventResponseMessageKey = 1;
    optional int64 timestampMs = 2;
    optional EventResponseMessage eventResponseMessage = 3;
    optional bool unread = 4;
}

message EventAdditionalMetadata {
    optional bool isStale = 1;
}

message CommentMetadata {
    optional MessageKey commentParentKey = 1;
    optional uint32 replyCount = 2;
}

message NoiseCertificate {
    message Details {
        optional uint32 serial = 1;
        optional string issuer = 2;
        optional uint64 expires = 3;
        optional string subject = 4;
        optional bytes key = 5;
    }
    
    optional bytes details = 1;
    optional bytes signature = 2;
}

message CertChain {
    message NoiseCertificate {
        message Details {
            optional uint32 serial = 1;
            optional uint32 issuerSerial = 2;
            optional bytes key = 3;
            optional uint64 notBefore = 4;
            optional uint64 notAfter = 5;
        }
        
        optional bytes details = 1;
        optional bytes signature = 2;
    }
    
    optional NoiseCertificate leaf = 1;
    optional NoiseCertificate intermediate = 2;
}

message QP {
    message Filter {
        required string filterName = 1;
        repeated FilterParameters parameters = 2;
        optional FilterResult filterResult = 3;
        required FilterClientNotSupportedConfig clientNotSupportedConfig = 4;
    }
    
    enum FilterResult {
        TRUE = 1;
        FALSE = 2;
        UNKNOWN = 3;
    }
    message FilterParameters {
        optional string key = 1;
        optional string value = 2;
    }
    
    enum FilterClientNotSupportedConfig {
        PASS_BY_DEFAULT = 1;
        FAIL_BY_DEFAULT = 2;
    }
    message FilterClause {
        required ClauseType clauseType = 1;
        repeated FilterClause clauses = 2;
        repeated Filter filters = 3;
    }
    
    enum ClauseType {
        AND = 1;
        OR = 2;
        NOR = 3;
    }
}

message ChatLockSettings {
    optional bool hideLockedChats = 1;
    optional UserPassword secretCode = 2;
}

message DeviceCapabilities {
    enum ChatLockSupportLevel {
        NONE = 0;
        MINIMAL = 1;
        FULL = 2;
    }
    optional ChatLockSupportLevel chatLockSupportLevel = 1;
}

message UserPassword {
    message TransformerArg {
        message Value {
            oneof value {
                bytes asBlob = 1;
                uint32 asUnsignedInteger = 2;
            }
        }
        
        optional string key = 1;
        optional Value value = 2;
    }
    
    enum Transformer {
        NONE = 0;
        PBKDF2_HMAC_SHA512 = 1;
        PBKDF2_HMAC_SHA384 = 2;
    }
    enum Encoding {
        UTF8 = 0;
    }
    optional Encoding encoding = 1;
    optional Transformer transformer = 2;
    repeated TransformerArg transformerArg = 3;
    optional bytes transformedData = 4;
}