From b6d4e75cf199287a94c7ca76fea13efc0f05af64 Mon Sep 17 00:00:00 2001 From: frank Date: Sat, 10 Jun 2023 10:00:17 +0800 Subject: [PATCH] Feat/sync activity center notification (#3535) fix flaky test: TestRetrieveBlockedContact resolve conflict when rebase origin/develop Feat/sync activity center notification (#3581) * feat: sync activity center notification * add test * fix lint issue * fix failed test * addressed feedback from sale * fix failed test * addressed feedback from ilmotta go generate ./protocol/migrations/sqlite/... feat: add updated_at for syncing activity center notification --- VERSION | 2 +- protocol/activity_center.go | 6 +- protocol/activity_center_persistence.go | 499 ++++++++--- protocol/activity_center_persistence_test.go | 97 +- protocol/messenger.go | 66 +- protocol/messenger_activity_center.go | 235 ++++- protocol/messenger_communities.go | 28 +- protocol/messenger_contact_verification.go | 7 + protocol/messenger_contacts.go | 27 +- protocol/messenger_group_chat.go | 16 +- protocol/messenger_handler.go | 52 +- ...ssenger_sync_activity_notification_test.go | 153 ++++ protocol/messenger_test.go | 9 +- protocol/migrations/migrations.go | 212 +++-- ..._sync_activity_center_notifications.up.sql | 2 + ...sistence_collapsed_community_categories.go | 10 +- .../application_metadata_message.pb.go | 129 +-- .../application_metadata_message.proto | 2 + protocol/protobuf/pairing.pb.go | 827 +++++++++++++----- protocol/protobuf/pairing.proto | 55 ++ protocol/v1/status_message.go | 4 + services/ext/api.go | 6 +- 22 files changed, 1838 insertions(+), 606 deletions(-) create mode 100644 protocol/messenger_sync_activity_notification_test.go create mode 100644 protocol/migrations/sqlite/1684979808_sync_activity_center_notifications.up.sql diff --git a/VERSION b/VERSION index a95410b17..4f58d4880 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.157.0 +0.157.1 diff --git a/protocol/activity_center.go b/protocol/activity_center.go index c2f59baf9..2219f9786 100644 --- a/protocol/activity_center.go +++ b/protocol/activity_center.go @@ -66,6 +66,9 @@ type ActivityCenterNotification struct { Deleted bool `json:"deleted"` Accepted bool `json:"accepted"` ContactVerificationStatus verification.RequestStatus `json:"contactVerificationStatus"` + //Used for synchronization. Each update should increment the UpdatedAt. + //The value should represent the time when the update occurred. + UpdatedAt uint64 `json:"updatedAt"` } type ActivityCenterNotificationsRequest struct { @@ -88,7 +91,8 @@ type ActivityCenterPaginationResponse struct { type ActivityCenterCountResponse = map[ActivityCenterType]uint64 type ActivityCenterState struct { - HasSeen bool `json:"hasSeen"` + HasSeen bool `json:"hasSeen"` + UpdatedAt uint64 `json:"updatedAt"` } func (n *ActivityCenterNotification) Valid() error { diff --git a/protocol/activity_center_persistence.go b/protocol/activity_center_persistence.go index fd4765a39..d533cd8a0 100644 --- a/protocol/activity_center_persistence.go +++ b/protocol/activity_center_persistence.go @@ -11,18 +11,21 @@ import ( "github.com/status-im/status-go/protocol/common" ) -func (db sqlitePersistence) DeleteActivityCenterNotification(id []byte) error { - _, err := db.db.Exec(`DELETE FROM activity_center_notifications WHERE id = ?`, id) +const allFieldsForTableActivityCenterNotification = `id, timestamp, notification_type, chat_id, read, dismissed, accepted, message, author, + reply_message, community_id, membership_status, contact_verification_status, deleted, updated_at` + +func (db sqlitePersistence) DeleteActivityCenterNotificationByID(id []byte, updatedAt uint64) error { + _, err := db.db.Exec(`UPDATE activity_center_notifications SET deleted = 1, updated_at = ? WHERE id = ? AND NOT deleted`, updatedAt, id) return err } -func (db sqlitePersistence) DeleteActivityCenterNotificationForMessage(chatID string, messageID string) error { +func (db sqlitePersistence) DeleteActivityCenterNotificationForMessage(chatID string, messageID string, updatedAt uint64) ([]*ActivityCenterNotification, error) { var tx *sql.Tx var err error tx, err = db.db.BeginTx(context.Background(), &sql.TxOptions{}) if err != nil { - return err + return nil, err } defer func() { if err == nil { @@ -40,48 +43,58 @@ func (db sqlitePersistence) DeleteActivityCenterNotificationForMessage(chatID st _, notifications, err := db.buildActivityCenterQuery(tx, params) if err != nil { - return err + return nil, err } var ids []types.HexBytes + var matchNotifications []*ActivityCenterNotification + withNotification := func(a *ActivityCenterNotification) { + a.Read = true + a.Dismissed = true + a.Deleted = true + a.UpdatedAt = updatedAt + ids = append(ids, a.ID) + matchNotifications = append(matchNotifications, a) + } for _, notification := range notifications { if notification.LastMessage != nil && notification.LastMessage.ID == messageID { - ids = append(ids, notification.ID) + withNotification(notification) } if notification.Message != nil && notification.Message.ID == messageID { - ids = append(ids, notification.ID) + withNotification(notification) } } if len(ids) > 0 { - idsArgs := make([]interface{}, 0, len(ids)) + args := make([]interface{}, 0, len(ids)+1) + args = append(args, updatedAt) for _, id := range ids { - idsArgs = append(idsArgs, id) + args = append(args, id) } inVector := strings.Repeat("?, ", len(ids)-1) + "?" - query := "UPDATE activity_center_notifications SET read = 1, dismissed = 1, deleted = 1 WHERE id IN (" + inVector + ")" // nolint: gosec - _, err = tx.Exec(query, idsArgs...) - return err + query := "UPDATE activity_center_notifications SET read = 1, dismissed = 1, deleted = 1, updated_at = ? WHERE id IN (" + inVector + ")" // nolint: gosec + _, err = tx.Exec(query, args...) + return matchNotifications, err } - return nil + return matchNotifications, nil } -func (db sqlitePersistence) SaveActivityCenterNotification(notification *ActivityCenterNotification) error { +func (db sqlitePersistence) SaveActivityCenterNotification(notification *ActivityCenterNotification, updateState bool) (int64, error) { var tx *sql.Tx var err error err = notification.Valid() if err != nil { - return err + return 0, err } tx, err = db.db.BeginTx(context.Background(), &sql.TxOptions{}) if err != nil { - return err + return 0, err } defer func() { if err == nil { @@ -92,21 +105,12 @@ func (db sqlitePersistence) SaveActivityCenterNotification(notification *Activit _ = tx.Rollback() }() - if notification.Type == ActivityCenterNotificationTypeNewOneToOne || - notification.Type == ActivityCenterNotificationTypeNewPrivateGroupChat { - // Delete other notifications, so it pops us again if it was not dismissed - _, err = tx.Exec(`DELETE FROM activity_center_notifications WHERE id = ? AND (dismissed OR accepted)`, notification.ID) - if err != nil { - return err - } - } - // encode message var encodedMessage []byte if notification.Message != nil { encodedMessage, err = json.Marshal(notification.Message) if err != nil { - return err + return 0, err } } @@ -115,11 +119,11 @@ func (db sqlitePersistence) SaveActivityCenterNotification(notification *Activit if notification.ReplyMessage != nil { encodedReplyMessage, err = json.Marshal(notification.ReplyMessage) if err != nil { - return err + return 0, err } } - _, err = tx.Exec(` + result, err := tx.Exec(` INSERT OR REPLACE INTO activity_center_notifications ( id, @@ -135,9 +139,10 @@ func (db sqlitePersistence) SaveActivityCenterNotification(notification *Activit read, accepted, dismissed, - deleted + deleted, + updated_at ) - VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?) + SELECT ?,?,?,?,?,?,?,?,?,?,?,?,?,?,? WHERE NOT EXISTS (SELECT 1 FROM activity_center_notifications WHERE id = ? AND updated_at >= ?) `, notification.ID, notification.Timestamp, @@ -153,14 +158,90 @@ func (db sqlitePersistence) SaveActivityCenterNotification(notification *Activit notification.Accepted, notification.Dismissed, notification.Deleted, + notification.UpdatedAt, + notification.ID, + notification.UpdatedAt, ) - - // When we have inserted or updated unread notification - mark whole activity_center_settings as unseen - if err == nil && !notification.Read { - _, err = tx.Exec(`UPDATE activity_center_states SET has_seen = 0`) + if err != nil { + return 0, err + } + n, err := result.RowsAffected() + if err != nil { + return n, err } - return err + // When we have inserted or updated unread notification - mark whole activity_center_settings as unseen + if updateState && n > 0 && !notification.Read { + _, err = tx.Exec(`UPDATE activity_center_states SET has_seen = 0, updated_at = ?`, notification.UpdatedAt) + } + + return n, nil +} + +func (db sqlitePersistence) parseRowFromTableActivityCenterNotification(rows *sql.Rows, withNotification func(notification *ActivityCenterNotification)) ([]*ActivityCenterNotification, error) { + var notifications []*ActivityCenterNotification + defer rows.Close() + for rows.Next() { + var chatID sql.NullString + var communityID sql.NullString + var messageBytes []byte + var replyMessageBytes []byte + var author sql.NullString + notification := &ActivityCenterNotification{} + err := rows.Scan( + ¬ification.ID, + ¬ification.Timestamp, + ¬ification.Type, + &chatID, + ¬ification.Read, + ¬ification.Dismissed, + ¬ification.Accepted, + &messageBytes, + &author, + &replyMessageBytes, + &communityID, + ¬ification.MembershipStatus, + ¬ification.ContactVerificationStatus, + ¬ification.Deleted, + ¬ification.UpdatedAt, + ) + if err != nil { + return nil, err + } + + if chatID.Valid { + notification.ChatID = chatID.String + } + + if communityID.Valid { + notification.CommunityID = communityID.String + } + + if author.Valid { + notification.Author = author.String + } + + if len(messageBytes) > 0 { + err = json.Unmarshal(messageBytes, ¬ification.Message) + if err != nil { + return nil, err + } + } + + if len(replyMessageBytes) > 0 { + err = json.Unmarshal(replyMessageBytes, ¬ification.ReplyMessage) + if err != nil { + return nil, err + } + } + + if withNotification != nil { + withNotification(notification) + } + notifications = append(notifications, notification) + } + + return notifications, nil } func (db sqlitePersistence) unmarshalActivityCenterNotificationRow(row *sql.Row) (*ActivityCenterNotification, error) { @@ -188,7 +269,8 @@ func (db sqlitePersistence) unmarshalActivityCenterNotificationRow(row *sql.Row) &replyMessageBytes, ¬ification.ContactVerificationStatus, &name, - &author) + &author, + ¬ification.UpdatedAt) if err != nil { return nil, err @@ -268,7 +350,8 @@ func (db sqlitePersistence) unmarshalActivityCenterNotificationRows(rows *sql.Ro ¬ification.ContactVerificationStatus, &name, &author, - &latestCursor) + &latestCursor, + ¬ification.UpdatedAt) if err != nil { return "", nil, err } @@ -419,7 +502,8 @@ func (db sqlitePersistence) buildActivityCenterQuery(tx *sql.Tx, params activity a.contact_verification_status, c.name, a.author, - substr('0000000000000000000000000000000000000000000000000000000000000000' || a.timestamp, -64, 64) || hex(a.id) as cursor + substr('0000000000000000000000000000000000000000000000000000000000000000' || a.timestamp, -64, 64) || hex(a.id) as cursor, + a.updated_at FROM activity_center_notifications a LEFT JOIN chats c ON @@ -436,6 +520,7 @@ func (db sqlitePersistence) buildActivityCenterQuery(tx *sql.Tx, params activity if err != nil { return "", nil, err } + defer rows.Close() return db.unmarshalActivityCenterNotificationRows(rows) } @@ -474,14 +559,14 @@ func (db sqlitePersistence) runActivityCenterIDQuery(query string) ([][]byte, er } func (db sqlitePersistence) GetNotReadActivityCenterNotificationIds() ([][]byte, error) { - return db.runActivityCenterIDQuery("SELECT a.id FROM activity_center_notifications a WHERE NOT a.read") + return db.runActivityCenterIDQuery("SELECT a.id FROM activity_center_notifications a WHERE NOT a.read AND NOT a.deleted") } func (db sqlitePersistence) GetToProcessActivityCenterNotificationIds() ([][]byte, error) { return db.runActivityCenterIDQuery(` SELECT a.id FROM activity_center_notifications a - WHERE NOT a.deleted AND NOT a.dismissed AND NOT a.accepted + WHERE NOT a.dismissed AND NOT a.accepted AND NOT a.deleted `) } @@ -515,7 +600,7 @@ func (db sqlitePersistence) GetActivityCenterNotificationsByID(ids []types.HexBy } inVector := strings.Repeat("?, ", len(ids)-1) + "?" - rows, err := db.db.Query("SELECT a.id, a.read, a.accepted, a.dismissed FROM activity_center_notifications a WHERE a.id IN ("+inVector+")", idsArgs...) // nolint: gosec + rows, err := db.db.Query("SELECT a.id, a.read, a.accepted, a.dismissed FROM activity_center_notifications a WHERE a.id IN ("+inVector+") AND NOT a.deleted", idsArgs...) // nolint: gosec if err != nil { return nil, err @@ -540,6 +625,7 @@ func (db sqlitePersistence) GetActivityCenterNotificationsByID(ids []types.HexBy return notifications, nil } +// GetActivityCenterNotificationByID returns a notification by its ID even it's deleted logically func (db sqlitePersistence) GetActivityCenterNotificationByID(id types.HexBytes) (*ActivityCenterNotification, error) { row := db.db.QueryRow(` SELECT @@ -558,7 +644,8 @@ func (db sqlitePersistence) GetActivityCenterNotificationByID(id types.HexBytes) a.reply_message, a.contact_verification_status, c.name, - a.author + a.author, + a.updated_at FROM activity_center_notifications a LEFT JOIN chats c ON @@ -606,97 +693,168 @@ func (db sqlitePersistence) activityCenterNotifications(params activityCenterQue return latestCursor, notifications, nil } -func (db sqlitePersistence) DismissAllActivityCenterNotifications() error { - _, err := db.db.Exec(`UPDATE activity_center_notifications SET read = 1, dismissed = 1 WHERE NOT dismissed AND NOT accepted`) +func (db sqlitePersistence) DismissAllActivityCenterNotifications(updatedAt uint64) error { + _, err := db.db.Exec(`UPDATE activity_center_notifications SET read = 1, dismissed = 1, updated_at = ? WHERE NOT dismissed AND NOT accepted AND NOT deleted`, updatedAt) return err } -func (db sqlitePersistence) DismissAllActivityCenterNotificationsFromUser(userPublicKey string) error { - _, err := db.db.Exec(` +func (db sqlitePersistence) DismissAllActivityCenterNotificationsFromUser(userPublicKey string, updatedAt uint64) ([]*ActivityCenterNotification, error) { + query := fmt.Sprintf(`SELECT %s FROM activity_center_notifications WHERE + author = ? AND + NOT deleted AND + NOT dismissed AND + NOT accepted`, allFieldsForTableActivityCenterNotification) + rows, err := db.db.Query(query, userPublicKey) + if err != nil { + return nil, err + } + var notifications []*ActivityCenterNotification + notifications, err = db.parseRowFromTableActivityCenterNotification(rows, func(notification *ActivityCenterNotification) { + notification.Read = true + notification.Dismissed = true + notification.UpdatedAt = updatedAt + }) + if err != nil { + return nil, err + } + + _, err = db.db.Exec(` UPDATE activity_center_notifications - SET read = 1, dismissed = 1 + SET read = 1, dismissed = 1, updated_at = ? WHERE author = ? AND NOT deleted AND NOT dismissed AND NOT accepted `, - userPublicKey) - return err + updatedAt, userPublicKey) + return notifications, err } -func (db sqlitePersistence) DeleteActivityCenterNotifications(ids []types.HexBytes) error { +func (db sqlitePersistence) DeleteActivityCenterNotifications(ids []types.HexBytes, updatedAt uint64) ([]*ActivityCenterNotification, error) { + if len(ids) == 0 { + return nil, nil + } + + inVector := strings.Repeat("?, ", len(ids)-1) + "?" + args := make([]interface{}, 0, len(ids)+1) + args = append(args, updatedAt) + for _, id := range ids { + args = append(args, id) + } + + // nolint: gosec + query := fmt.Sprintf(`SELECT %s FROM activity_center_notifications WHERE id IN (%s) AND NOT deleted`, + allFieldsForTableActivityCenterNotification, + inVector) + rows, err := db.db.Query(query, args[1:]...) + if err != nil { + return nil, err + } + notifications, err := db.parseRowFromTableActivityCenterNotification(rows, func(notification *ActivityCenterNotification) { + notification.Deleted = true + notification.UpdatedAt = updatedAt + }) + if err != nil { + return nil, err + } + + update := "UPDATE activity_center_notifications SET deleted = 1, updated_at = ? WHERE id IN (" + inVector + ") AND NOT deleted" + _, err = db.db.Exec(update, args...) + + return notifications, err +} + +func (db sqlitePersistence) DismissActivityCenterNotifications(ids []types.HexBytes, updatedAt uint64) error { if len(ids) == 0 { return nil } - idsArgs := make([]interface{}, 0, len(ids)) + args := make([]interface{}, 0, len(ids)+1) + args = append(args, updatedAt) for _, id := range ids { - idsArgs = append(idsArgs, id) + args = append(args, id) } + args = append(args, updatedAt) inVector := strings.Repeat("?, ", len(ids)-1) + "?" - query := "UPDATE activity_center_notifications SET deleted = 1 WHERE id IN (" + inVector + ")" - _, err := db.db.Exec(query, idsArgs...) - + query := "UPDATE activity_center_notifications SET read = 1, dismissed = 1, updated_at = ? WHERE id IN (" + inVector + ") AND not deleted AND updated_at < ?" // nolint: gosec + _, err := db.db.Exec(query, args...) return err } -func (db sqlitePersistence) DismissActivityCenterNotifications(ids []types.HexBytes) error { - if len(ids) == 0 { - return nil - } - - idsArgs := make([]interface{}, 0, len(ids)) - for _, id := range ids { - idsArgs = append(idsArgs, id) - } - - inVector := strings.Repeat("?, ", len(ids)-1) + "?" - query := "UPDATE activity_center_notifications SET read = 1, dismissed = 1 WHERE id IN (" + inVector + ")" // nolint: gosec - _, err := db.db.Exec(query, idsArgs...) - return err -} - -func (db sqlitePersistence) DismissAllActivityCenterNotificationsFromCommunity(communityID string) error { +func (db sqlitePersistence) DismissAllActivityCenterNotificationsFromCommunity(communityID string, updatedAt uint64) ([]*ActivityCenterNotification, error) { chatIDs, err := db.AllChatIDsByCommunity(communityID) if err != nil { - return err + return nil, err } chatIDsCount := len(chatIDs) if chatIDsCount == 0 { - return nil + return nil, nil } - chatIDsArgs := make([]interface{}, 0, chatIDsCount) + args := make([]interface{}, 0, chatIDsCount+1) + args = append(args, updatedAt) for _, chatID := range chatIDs { - chatIDsArgs = append(chatIDsArgs, chatID) + args = append(args, chatID) } inVector := strings.Repeat("?, ", chatIDsCount-1) + "?" - query := "UPDATE activity_center_notifications SET read = 1, dismissed = 1 WHERE chat_id IN (" + inVector + ")" // nolint: gosec - _, err = db.db.Exec(query, chatIDsArgs...) - return err + // nolint: gosec + query := fmt.Sprintf(`SELECT %s FROM activity_center_notifications WHERE chat_id IN (%s) AND NOT deleted`, allFieldsForTableActivityCenterNotification, inVector) + rows, err := db.db.Query(query, args[1:]...) + if err != nil { + return nil, err + } + notifications, err := db.parseRowFromTableActivityCenterNotification(rows, func(notification *ActivityCenterNotification) { + notification.Read = true + notification.Dismissed = true + notification.UpdatedAt = updatedAt + }) + if err != nil { + return nil, err + } + query = "UPDATE activity_center_notifications SET read = 1, dismissed = 1, updated_at = ? WHERE chat_id IN (" + inVector + ") AND NOT deleted" // nolint: gosec + _, err = db.db.Exec(query, args...) + return notifications, err } -func (db sqlitePersistence) DismissAllActivityCenterNotificationsFromChatID(chatID string) error { +func (db sqlitePersistence) DismissAllActivityCenterNotificationsFromChatID(chatID string, updatedAt uint64) ([]*ActivityCenterNotification, error) { + query := fmt.Sprintf(`SELECT %s FROM activity_center_notifications + WHERE chat_id = ? + AND NOT deleted + AND NOT accepted + AND notification_type != ?`, allFieldsForTableActivityCenterNotification) + rows, err := db.db.Query(query, chatID, ActivityCenterNotificationTypeContactRequest) + if err != nil { + return nil, err + } + notifications, err := db.parseRowFromTableActivityCenterNotification(rows, func(notification *ActivityCenterNotification) { + notification.Read = true + notification.Dismissed = true + notification.UpdatedAt = updatedAt + }) + if err != nil { + return nil, err + } + // We exclude notifications related to contacts, since those we don't want to // be cleared. - query := ` + query = ` UPDATE activity_center_notifications - SET read = 1, dismissed = 1 - WHERE NOT deleted + SET read = 1, dismissed = 1, updated_at = ? + WHERE chat_id = ? + AND NOT deleted AND NOT accepted - AND chat_id = ? AND notification_type != ? ` - _, err := db.db.Exec(query, chatID, ActivityCenterNotificationTypeContactRequest) - return err + _, err = db.db.Exec(query, updatedAt, chatID, ActivityCenterNotificationTypeContactRequest) + return notifications, err } -func (db sqlitePersistence) AcceptAllActivityCenterNotifications() ([]*ActivityCenterNotification, error) { +func (db sqlitePersistence) AcceptAllActivityCenterNotifications(updatedAt uint64) ([]*ActivityCenterNotification, error) { var tx *sql.Tx var err error @@ -714,15 +872,15 @@ func (db sqlitePersistence) AcceptAllActivityCenterNotifications() ([]*ActivityC }() _, notifications, err := db.buildActivityCenterQuery(tx, activityCenterQueryParams{}) - - _, err = tx.Exec(`UPDATE activity_center_notifications SET read = 1, accepted = 1 WHERE NOT accepted AND NOT dismissed`) if err != nil { return nil, err } - return notifications, nil + + _, err = tx.Exec(`UPDATE activity_center_notifications SET read = 1, accepted = 1, updated_at = ? WHERE NOT dismissed AND NOT accepted AND NOT deleted`, updatedAt) + return notifications, err } -func (db sqlitePersistence) AcceptActivityCenterNotifications(ids []types.HexBytes) ([]*ActivityCenterNotification, error) { +func (db sqlitePersistence) AcceptActivityCenterNotifications(ids []types.HexBytes, updatedAt uint64) ([]*ActivityCenterNotification, error) { var tx *sql.Tx var err error @@ -740,28 +898,38 @@ func (db sqlitePersistence) AcceptActivityCenterNotifications(ids []types.HexByt _ = tx.Rollback() }() + args := make([]interface{}, 0, len(ids)+1) + args = append(args, updatedAt) + for _, id := range ids { + args = append(args, id) + } + args = append(args, updatedAt) + params := activityCenterQueryParams{ ids: ids, } - _, notifications, err := db.buildActivityCenterQuery(tx, params) - if err != nil { return nil, err } - - idsArgs := make([]interface{}, 0, len(ids)) - for _, id := range ids { - idsArgs = append(idsArgs, id) + var updateNotifications []*ActivityCenterNotification + for _, n := range notifications { + if n.UpdatedAt >= updatedAt { + continue + } + n.Read = true + n.Accepted = true + n.UpdatedAt = updatedAt + updateNotifications = append(updateNotifications, n) } inVector := strings.Repeat("?, ", len(ids)-1) + "?" - query := "UPDATE activity_center_notifications SET read = 1, accepted = 1 WHERE id IN (" + inVector + ")" // nolint: gosec - _, err = tx.Exec(query, idsArgs...) - return notifications, err + query := "UPDATE activity_center_notifications SET read = 1, accepted = 1, updated_at = ? WHERE id IN (" + inVector + ") AND NOT deleted AND updated_at < ?" // nolint: gosec + _, err = tx.Exec(query, args...) + return updateNotifications, err } -func (db sqlitePersistence) AcceptActivityCenterNotificationsForInvitesFromUser(userPublicKey string) ([]*ActivityCenterNotification, error) { +func (db sqlitePersistence) AcceptActivityCenterNotificationsForInvitesFromUser(userPublicKey string, updatedAt uint64) ([]*ActivityCenterNotification, error) { var tx *sql.Tx var err error @@ -778,27 +946,35 @@ func (db sqlitePersistence) AcceptActivityCenterNotificationsForInvitesFromUser( _ = tx.Rollback() }() - params := activityCenterQueryParams{ - author: userPublicKey, - activityCenterTypes: []ActivityCenterType{ActivityCenterNotificationTypeNewPrivateGroupChat}, + query := fmt.Sprintf(`SELECT %s FROM activity_center_notifications + WHERE author = ? + AND NOT deleted + AND NOT dismissed + AND NOT accepted + AND notification_type = ?`, allFieldsForTableActivityCenterNotification) + rows, err := tx.Query(query, userPublicKey, ActivityCenterNotificationTypeNewPrivateGroupChat) + if err != nil { + return nil, err } - - _, notifications, err := db.buildActivityCenterQuery(tx, params) - + notifications, err := db.parseRowFromTableActivityCenterNotification(rows, func(notification *ActivityCenterNotification) { + notification.Read = true + notification.Accepted = true + notification.UpdatedAt = updatedAt + }) if err != nil { return nil, err } _, err = tx.Exec(` UPDATE activity_center_notifications - SET read = 1, accepted = 1 - WHERE NOT accepted - AND NOT dismissed + SET read = 1, accepted = 1, updated_at = ? + WHERE author = ? AND NOT deleted - AND author = ? + AND NOT dismissed + AND NOT accepted AND notification_type = ? `, - userPublicKey, ActivityCenterNotificationTypeNewPrivateGroupChat) + updatedAt, userPublicKey, ActivityCenterNotificationTypeNewPrivateGroupChat) if err != nil { return nil, err @@ -807,36 +983,53 @@ func (db sqlitePersistence) AcceptActivityCenterNotificationsForInvitesFromUser( return notifications, nil } -func (db sqlitePersistence) MarkAllActivityCenterNotificationsRead() error { - _, err := db.db.Exec(`UPDATE activity_center_notifications SET read = 1 WHERE NOT read`) +func (db sqlitePersistence) MarkAllActivityCenterNotificationsRead(updatedAt uint64) error { + _, err := db.db.Exec(`UPDATE activity_center_notifications SET read = 1, updated_at = ? WHERE NOT read AND NOT deleted`, updatedAt) return err } -func (db sqlitePersistence) MarkActivityCenterNotificationsRead(ids []types.HexBytes) error { +func (db sqlitePersistence) MarkActivityCenterNotificationsRead(ids []types.HexBytes, updatedAt uint64) error { - idsArgs := make([]interface{}, 0, len(ids)) + args := make([]interface{}, 0, len(ids)+1) + args = append(args, updatedAt) for _, id := range ids { - idsArgs = append(idsArgs, id) + args = append(args, id) } + args = append(args, updatedAt) inVector := strings.Repeat("?, ", len(ids)-1) + "?" - query := "UPDATE activity_center_notifications SET read = 1 WHERE id IN (" + inVector + ")" // nolint: gosec - _, err := db.db.Exec(query, idsArgs...) + query := "UPDATE activity_center_notifications SET read = 1, updated_at = ? WHERE id IN (" + inVector + ") AND NOT deleted AND updated_at < ?" // nolint: gosec + _, err := db.db.Exec(query, args...) return err } -func (db sqlitePersistence) MarkActivityCenterNotificationsUnread(ids []types.HexBytes) error { +func (db sqlitePersistence) MarkActivityCenterNotificationsUnread(ids []types.HexBytes, updatedAt uint64) ([]*ActivityCenterNotification, error) { - idsArgs := make([]interface{}, 0, len(ids)) + args := make([]interface{}, 0, len(ids)+1) + args = append(args, updatedAt) for _, id := range ids { - idsArgs = append(idsArgs, id) + args = append(args, id) } inVector := strings.Repeat("?, ", len(ids)-1) + "?" - query := "UPDATE activity_center_notifications SET read = 0 WHERE id IN (" + inVector + ")" // nolint: gosec - _, err := db.db.Exec(query, idsArgs...) - return err + // nolint: gosec + query := fmt.Sprintf("SELECT %s FROM activity_center_notifications WHERE id IN (%s) AND NOT deleted", allFieldsForTableActivityCenterNotification, inVector) + rows, err := db.db.Query(query, args[1:]...) + if err != nil { + return nil, err + } + notifications, err := db.parseRowFromTableActivityCenterNotification(rows, func(notification *ActivityCenterNotification) { + notification.Read = false + notification.UpdatedAt = updatedAt + }) + if err != nil { + return nil, err + } + + query = "UPDATE activity_center_notifications SET read = 0, updated_at = ? WHERE id IN (" + inVector + ") AND NOT deleted" // nolint: gosec + _, err = db.db.Exec(query, args...) + return notifications, err } func (db sqlitePersistence) ActivityCenterNotifications(cursor string, limit uint64, activityTypes []ActivityCenterType, readType ActivityCenterQueryParamsRead, accepted bool) (string, []*ActivityCenterNotification, error) { @@ -880,18 +1073,19 @@ func (db sqlitePersistence) ActiveContactRequestNotification(contactID string) ( a.reply_message, a.contact_verification_status, c.name, - a.author + a.author, + a.updated_at FROM activity_center_notifications a LEFT JOIN chats c ON c.id = a.chat_id - WHERE NOT a.deleted + WHERE a.author = ? + AND NOT a.deleted AND NOT a.dismissed AND NOT a.accepted AND a.notification_type = ? - AND a.author = ? ORDER BY a.timestamp DESC LIMIT 1 ` - row := db.db.QueryRow(query, ActivityCenterNotificationTypeContactRequest, contactID) + row := db.db.QueryRow(query, contactID, ActivityCenterNotificationTypeContactRequest) notification, err := db.unmarshalActivityCenterNotificationRow(row) if err == sql.ErrNoRows { return nil, nil @@ -899,36 +1093,55 @@ func (db sqlitePersistence) ActiveContactRequestNotification(contactID string) ( return notification, err } -func (db sqlitePersistence) HardDeleteChatContactRequestActivityCenterNotifications(chatID string) error { - _, err := db.db.Exec(` - DELETE FROM activity_center_notifications +func (db sqlitePersistence) DeleteChatContactRequestActivityCenterNotifications(chatID string, updatedAt uint64) ([]*ActivityCenterNotification, error) { + query := fmt.Sprintf(`SELECT %s FROM activity_center_notifications WHERE chat_id = ? AND NOT deleted AND notification_type = ?`, allFieldsForTableActivityCenterNotification) + rows, err := db.db.Query(query, chatID, ActivityCenterNotificationTypeContactRequest) + if err != nil { + return nil, err + } + notifications, err := db.parseRowFromTableActivityCenterNotification(rows, func(notification *ActivityCenterNotification) { + notification.Deleted = true + notification.UpdatedAt = updatedAt + }) + if err != nil { + return nil, err + } + + _, err = db.db.Exec(` + UPDATE activity_center_notifications SET deleted = 1, updated_at = ? WHERE chat_id = ? + AND NOT deleted AND notification_type = ? - `, chatID, ActivityCenterNotificationTypeContactRequest) - return err + `, updatedAt, chatID, ActivityCenterNotificationTypeContactRequest) + return notifications, err } -func (db sqlitePersistence) HasUnseenActivityCenterNotifications() (bool, error) { - row := db.db.QueryRow(`SELECT has_seen FROM activity_center_states`) +func (db sqlitePersistence) HasUnseenActivityCenterNotifications() (bool, uint64, error) { + row := db.db.QueryRow(`SELECT has_seen, updated_at FROM activity_center_states`) hasSeen := true - err := row.Scan(&hasSeen) - return !hasSeen, err + updatedAt := uint64(0) + err := row.Scan(&hasSeen, &updatedAt) + return !hasSeen, updatedAt, err } -func (db sqlitePersistence) MarkAsSeenActivityCenterNotifications() error { - _, err := db.db.Exec(`UPDATE activity_center_states SET has_seen = 1`) - return err +func (db sqlitePersistence) UpdateActivityCenterNotificationState(state *ActivityCenterState) (int64, error) { + result, err := db.db.Exec(`UPDATE activity_center_states SET has_seen = ?, updated_at = ? WHERE updated_at < ?`, state.HasSeen, state.UpdatedAt, state.UpdatedAt) + if err != nil { + return 0, err + } + return result.RowsAffected() } func (db sqlitePersistence) GetActivityCenterState() (*ActivityCenterState, error) { - unseen, err := db.HasUnseenActivityCenterNotifications() + unseen, updatedAt, err := db.HasUnseenActivityCenterNotifications() if err != nil { return nil, err } state := &ActivityCenterState{ - HasSeen: !unseen, + HasSeen: !unseen, + UpdatedAt: updatedAt, } return state, nil } diff --git a/protocol/activity_center_persistence_test.go b/protocol/activity_center_persistence_test.go index da0f2e036..e4e09679e 100644 --- a/protocol/activity_center_persistence_test.go +++ b/protocol/activity_center_persistence_test.go @@ -3,6 +3,7 @@ package protocol import ( "strconv" "testing" + "time" "github.com/stretchr/testify/require" @@ -10,15 +11,24 @@ import ( "github.com/status-im/status-go/protocol/common" ) +func currentMilliseconds() uint64 { + c := time.Now().UnixMilli() + return uint64(c) +} + func createNotifications(t *testing.T, p *sqlitePersistence, notifications []*ActivityCenterNotification) []*ActivityCenterNotification { + now := currentMilliseconds() for index, notif := range notifications { if notif.Timestamp == 0 { - notif.Timestamp = 1 + notif.Timestamp = now } if len(notif.ID) == 0 { notif.ID = types.HexBytes(strconv.Itoa(index)) } - err := p.SaveActivityCenterNotification(notif) + if notif.UpdatedAt == 0 { + notif.UpdatedAt = now + } + _, err := p.SaveActivityCenterNotification(notif, true) require.NoError(t, err, notif.ID) } @@ -26,7 +36,7 @@ func createNotifications(t *testing.T, p *sqlitePersistence, notifications []*Ac var createdNotifications []*ActivityCenterNotification for _, notif := range notifications { n, err := p.GetActivityCenterNotificationByID(notif.ID) - require.NoError(t, err, n.ID) + require.NoError(t, err, notif.ID) createdNotifications = append(createdNotifications, n) } @@ -55,7 +65,7 @@ func TestDeleteActivityCenterNotificationsWhenEmpty(t *testing.T) { count, _ = p.ActivityCenterNotificationsCount([]ActivityCenterType{}, ActivityCenterQueryParamsReadUnread, false) require.Equal(t, uint64(1), count) - err = p.DeleteActivityCenterNotifications([]types.HexBytes{}) + _, err = p.DeleteActivityCenterNotifications([]types.HexBytes{}, currentMilliseconds()) require.NoError(t, err) count, _ = p.ActivityCenterNotificationsCount([]ActivityCenterType{}, ActivityCenterQueryParamsReadUnread, false) @@ -84,7 +94,7 @@ func TestDeleteActivityCenterNotificationsWithMultipleIds(t *testing.T) { count, _ = p.ActivityCenterNotificationsCount([]ActivityCenterType{}, ActivityCenterQueryParamsReadUnread, false) require.Equal(t, uint64(3), count) - err = p.DeleteActivityCenterNotifications([]types.HexBytes{notifications[1].ID, notifications[2].ID}) + _, err = p.DeleteActivityCenterNotifications([]types.HexBytes{notifications[1].ID, notifications[2].ID}, currentMilliseconds()) require.NoError(t, err) count, _ = p.ActivityCenterNotificationsCount([]ActivityCenterType{}, ActivityCenterQueryParamsReadUnread, false) @@ -158,7 +168,7 @@ func TestDeleteActivityCenterNotificationsForMessage(t *testing.T) { }) // Test: soft delete only the notifications that have Message.ID == messages[0].ID. - err = p.DeleteActivityCenterNotificationForMessage(chat.ID, messages[0].ID) + _, err = p.DeleteActivityCenterNotificationForMessage(chat.ID, messages[0].ID, currentMilliseconds()) require.NoError(t, err) notif, err := p.GetActivityCenterNotificationByID(nID1) @@ -178,7 +188,7 @@ func TestDeleteActivityCenterNotificationsForMessage(t *testing.T) { // Test: soft delete the notifications that have Message.ID == messages[1].ID // or LastMessage.ID == chat.LastMessage. - err = p.DeleteActivityCenterNotificationForMessage(chat.ID, messages[1].ID) + _, err = p.DeleteActivityCenterNotificationForMessage(chat.ID, messages[1].ID, currentMilliseconds()) require.NoError(t, err) for _, id := range []types.HexBytes{nID2, nID3} { @@ -196,7 +206,7 @@ func TestDeleteActivityCenterNotificationsForMessage(t *testing.T) { require.False(t, notif.Read) // Test: don't do anything if passed a chat and message without notifications. - err = p.DeleteActivityCenterNotificationForMessage(chat2.ID, messages[2].ID) + _, err = p.DeleteActivityCenterNotificationForMessage(chat2.ID, messages[2].ID, currentMilliseconds()) require.NoError(t, err) } @@ -239,7 +249,7 @@ func TestAcceptActivityCenterNotificationsForInvitesFromUser(t *testing.T) { var notif *ActivityCenterNotification for _, notif = range notifications { - err = p.SaveActivityCenterNotification(notif) + _, err = p.SaveActivityCenterNotification(notif, true) require.NoError(t, err, notif.ID) } @@ -250,7 +260,7 @@ func TestAcceptActivityCenterNotificationsForInvitesFromUser(t *testing.T) { require.False(t, notifications[0].Accepted) require.False(t, notifications[0].Read) - notifications, err = p.AcceptActivityCenterNotificationsForInvitesFromUser(userPublicKey) + notifications, err = p.AcceptActivityCenterNotificationsForInvitesFromUser(userPublicKey, 1) require.NoError(t, err) require.Len(t, notifications, 1) require.Equal(t, nID2, notifications[0].ID) @@ -268,9 +278,9 @@ func TestAcceptActivityCenterNotificationsForInvitesFromUser(t *testing.T) { Author: userPublicKey, Deleted: true, } - err = p.SaveActivityCenterNotification(notif) + _, err = p.SaveActivityCenterNotification(notif, true) require.NoError(t, err) - _, err = p.AcceptActivityCenterNotificationsForInvitesFromUser(userPublicKey) + _, err = p.AcceptActivityCenterNotificationsForInvitesFromUser(userPublicKey, currentMilliseconds()) require.NoError(t, err) notif, err = p.GetActivityCenterNotificationByID(notif.ID) require.NoError(t, err) @@ -286,9 +296,9 @@ func TestAcceptActivityCenterNotificationsForInvitesFromUser(t *testing.T) { Author: userPublicKey, Dismissed: true, } - err = p.SaveActivityCenterNotification(notif) + _, err = p.SaveActivityCenterNotification(notif, true) require.NoError(t, err) - _, err = p.AcceptActivityCenterNotificationsForInvitesFromUser(userPublicKey) + _, err = p.AcceptActivityCenterNotificationsForInvitesFromUser(userPublicKey, currentMilliseconds()) require.NoError(t, err) notif, err = p.GetActivityCenterNotificationByID(notif.ID) require.NoError(t, err) @@ -371,7 +381,7 @@ func TestHasPendingNotificationsForChat(t *testing.T) { Type: ActivityCenterNotificationTypeCommunityRequest, Timestamp: 1, } - err = p.SaveActivityCenterNotification(notif) + _, err = p.SaveActivityCenterNotification(notif, true) require.NoError(t, err) result, err = p.HasPendingNotificationsForChat(chat.ID) @@ -412,7 +422,7 @@ func TestDismissAllActivityCenterNotificationsFromUser(t *testing.T) { }, }) - err = p.DismissAllActivityCenterNotificationsFromUser(publicKey) + _, err = p.DismissAllActivityCenterNotificationsFromUser(publicKey, 1) require.NoError(t, err) // Ignores already soft deleted. @@ -492,7 +502,7 @@ func TestDismissAllActivityCenterNotificationsFromChatID(t *testing.T) { }, }) - err = p.DismissAllActivityCenterNotificationsFromChatID(chatID) + _, err = p.DismissAllActivityCenterNotificationsFromChatID(chatID, currentMilliseconds()) require.NoError(t, err) // Ignores already soft deleted. @@ -615,17 +625,19 @@ func TestActiveContactRequestNotification(t *testing.T) { // one according to the notification's timestamp. expectedID := types.HexBytes("667") + t1 := currentMilliseconds() + t2 := currentMilliseconds() createNotifications(t, p, []*ActivityCenterNotification{ { ID: expectedID, - Timestamp: 3, + Timestamp: t2 + 1, ChatID: chat.ID, Author: contactID, Type: ActivityCenterNotificationTypeContactRequest, }, { ID: types.HexBytes("666"), - Timestamp: 2, + Timestamp: t1, ChatID: chat.ID, Author: contactID, Type: ActivityCenterNotificationTypeContactRequest, @@ -705,7 +717,7 @@ func TestActivityCenterPersistence(t *testing.T) { ChatID: chat.ID, Timestamp: 1, } - err = p.SaveActivityCenterNotification(notification) + _, err = p.SaveActivityCenterNotification(notification, true) require.NoError(t, err) cursor, notifications, err := p.ActivityCenterNotifications("", 2, []ActivityCenterType{}, ActivityCenterQueryParamsReadAll, false) @@ -722,7 +734,7 @@ func TestActivityCenterPersistence(t *testing.T) { Type: ActivityCenterNotificationTypeNewOneToOne, Timestamp: 2, } - err = p.SaveActivityCenterNotification(notification) + _, err = p.SaveActivityCenterNotification(notification, true) require.NoError(t, err) cursor, notifications, err = p.ActivityCenterNotifications("", 1, []ActivityCenterType{}, ActivityCenterQueryParamsReadAll, false) @@ -745,20 +757,24 @@ func TestActivityCenterPersistence(t *testing.T) { require.NoError(t, err) require.Equal(t, uint64(2), count) + var updatedAt uint64 = 1 // Mark first one as read - require.NoError(t, p.MarkActivityCenterNotificationsRead([]types.HexBytes{nID1})) + require.NoError(t, p.MarkActivityCenterNotificationsRead([]types.HexBytes{nID1}, updatedAt)) count, err = p.ActivityCenterNotificationsCount([]ActivityCenterType{}, ActivityCenterQueryParamsReadUnread, false) require.NoError(t, err) require.Equal(t, uint64(1), count) // Mark first one as unread - require.NoError(t, p.MarkActivityCenterNotificationsUnread([]types.HexBytes{nID1})) + updatedAt++ + _, err = p.MarkActivityCenterNotificationsUnread([]types.HexBytes{nID1}, updatedAt) + require.NoError(t, err) count, err = p.ActivityCenterNotificationsCount([]ActivityCenterType{}, ActivityCenterQueryParamsReadUnread, false) require.NoError(t, err) require.Equal(t, uint64(2), count) // Mark all read - require.NoError(t, p.MarkAllActivityCenterNotificationsRead()) + updatedAt++ + require.NoError(t, p.MarkAllActivityCenterNotificationsRead(updatedAt)) _, notifications, err = p.ActivityCenterNotifications(cursor, 2, []ActivityCenterType{}, ActivityCenterQueryParamsReadAll, false) require.NoError(t, err) require.Len(t, notifications, 2) @@ -772,8 +788,8 @@ func TestActivityCenterPersistence(t *testing.T) { require.Equal(t, uint64(0), count) // Mark first one as accepted - - notifications, err = p.AcceptActivityCenterNotifications([]types.HexBytes{nID1}) + updatedAt++ + notifications, err = p.AcceptActivityCenterNotifications([]types.HexBytes{nID1}, updatedAt) require.NoError(t, err) require.Len(t, notifications, 1) _, notifications, err = p.ActivityCenterNotifications("", 2, []ActivityCenterType{}, ActivityCenterQueryParamsReadAll, false) @@ -782,7 +798,8 @@ func TestActivityCenterPersistence(t *testing.T) { require.Len(t, notifications, 1) // Mark last one as dismissed - require.NoError(t, p.DismissActivityCenterNotifications([]types.HexBytes{nID2})) + updatedAt++ + require.NoError(t, p.DismissActivityCenterNotifications([]types.HexBytes{nID2}, updatedAt)) _, notifications, err = p.ActivityCenterNotifications("", 2, []ActivityCenterType{}, ActivityCenterQueryParamsReadAll, false) require.NoError(t, err) @@ -795,11 +812,12 @@ func TestActivityCenterPersistence(t *testing.T) { Type: ActivityCenterNotificationTypeNewOneToOne, Timestamp: 3, } - err = p.SaveActivityCenterNotification(notification) + _, err = p.SaveActivityCenterNotification(notification, true) require.NoError(t, err) // Mark all as accepted - notifications, err = p.AcceptAllActivityCenterNotifications() + updatedAt++ + notifications, err = p.AcceptAllActivityCenterNotifications(updatedAt) require.NoError(t, err) require.Len(t, notifications, 2) @@ -814,11 +832,12 @@ func TestActivityCenterPersistence(t *testing.T) { Type: ActivityCenterNotificationTypeNewOneToOne, Timestamp: 4, } - err = p.SaveActivityCenterNotification(notification) + _, err = p.SaveActivityCenterNotification(notification, true) require.NoError(t, err) // Mark all as dismissed - require.NoError(t, p.DismissAllActivityCenterNotifications()) + updatedAt++ + require.NoError(t, p.DismissAllActivityCenterNotifications(updatedAt)) _, notifications, err = p.ActivityCenterNotifications("", 2, []ActivityCenterType{}, ActivityCenterQueryParamsReadAll, false) require.NoError(t, err) @@ -881,14 +900,14 @@ func TestActivityCenterReadUnreadPagination(t *testing.T) { } for _, notification := range allNotifications { - err = p.SaveActivityCenterNotification(notification) + _, err = p.SaveActivityCenterNotification(notification, true) require.NoError(t, err) } // Mark the notification as read - err = p.MarkActivityCenterNotificationsRead([]types.HexBytes{nID2}) + err = p.MarkActivityCenterNotificationsRead([]types.HexBytes{nID2}, currentMilliseconds()) require.NoError(t, err) - err = p.MarkActivityCenterNotificationsRead([]types.HexBytes{nID4}) + err = p.MarkActivityCenterNotificationsRead([]types.HexBytes{nID4}, currentMilliseconds()) require.NoError(t, err) // Fetch UNREAD notifications, first page. @@ -997,7 +1016,7 @@ func TestActivityCenterReadUnreadFilterByTypes(t *testing.T) { } for _, notification := range allNotifications { - err = p.SaveActivityCenterNotification(notification) + _, err = p.SaveActivityCenterNotification(notification, true) require.NoError(t, err) } @@ -1053,7 +1072,7 @@ func TestActivityCenterReadUnreadFilterByTypes(t *testing.T) { // Mark all notifications as read. for _, notification := range allNotifications { - err = p.MarkActivityCenterNotificationsRead([]types.HexBytes{notification.ID}) + err = p.MarkActivityCenterNotificationsRead([]types.HexBytes{notification.ID}, currentMilliseconds()) require.NoError(t, err) } @@ -1103,7 +1122,7 @@ func TestActivityCenterReadUnread(t *testing.T) { Timestamp: 1, } - err = p.SaveActivityCenterNotification(notification) + _, err = p.SaveActivityCenterNotification(notification, true) require.NoError(t, err) notification = &ActivityCenterNotification{ @@ -1113,11 +1132,11 @@ func TestActivityCenterReadUnread(t *testing.T) { Timestamp: 1, } - err = p.SaveActivityCenterNotification(notification) + _, err = p.SaveActivityCenterNotification(notification, true) require.NoError(t, err) // Mark the notification as read - err = p.MarkActivityCenterNotificationsRead([]types.HexBytes{nID2}) + err = p.MarkActivityCenterNotificationsRead([]types.HexBytes{nID2}, currentMilliseconds()) require.NoError(t, err) cursor, notifications, err := p.ActivityCenterNotifications( diff --git a/protocol/messenger.go b/protocol/messenger.go index 915302875..502b51540 100644 --- a/protocol/messenger.go +++ b/protocol/messenger.go @@ -3119,6 +3119,7 @@ func (r *ReceivedMessageState) updateExistingActivityCenterNotification(publicKe notification.Message = message notification.ReplyMessage = responseTo + notification.UpdatedAt = m.getCurrentTimeInMillis() err = m.addActivityCenterNotification(r.Response, notification) if err != nil { @@ -3152,12 +3153,10 @@ func (r *ReceivedMessageState) addNewActivityCenterNotification(publicKey ecdsa. ChatID: chat.ID, CommunityID: chat.CommunityID, Author: message.From, + UpdatedAt: m.getCurrentTimeInMillis(), } - err := m.addActivityCenterNotification(r.Response, notification) - if err != nil { - return err - } + return m.addActivityCenterNotification(r.Response, notification) } return nil @@ -3792,6 +3791,40 @@ func (m *Messenger) handleRetrievedMessages(chatWithMessages map[transport.Filte continue } + case protobuf.SyncActivityCenterNotifications: + if !common.IsPubKeyEqual(messageState.CurrentMessageState.PublicKey, &m.identity.PublicKey) { + logger.Warn("not coming from us, ignoring") + continue + } + + a := msg.ParsedMessage.Interface().(protobuf.SyncActivityCenterNotifications) + m.outputToCSV(msg.TransportMessage.Timestamp, msg.ID, senderID, filter.Topic, filter.ChatID, msg.Type, a) + logger.Debug("Handling SyncActivityCenterNotification", zap.Any("message", a)) + + err = m.handleSyncActivityCenterNotifications(messageState, &a) + if err != nil { + logger.Warn("failed to handle SyncActivityCenterNotification", zap.Error(err)) + allMessagesProcessed = false + continue + } + + case protobuf.SyncActivityCenterNotificationState: + if !common.IsPubKeyEqual(messageState.CurrentMessageState.PublicKey, &m.identity.PublicKey) { + logger.Warn("not coming from us, ignoring") + continue + } + + a := msg.ParsedMessage.Interface().(protobuf.SyncActivityCenterNotificationState) + m.outputToCSV(msg.TransportMessage.Timestamp, msg.ID, senderID, filter.Topic, filter.ChatID, msg.Type, a) + logger.Debug("Handling SyncActivityCenterNotificationState", zap.Any("message", a)) + + err = m.handleSyncActivityCenterNotificationState(messageState, &a) + if err != nil { + logger.Warn("failed to handle SyncActivityCenterNotificationState", zap.Error(err)) + allMessagesProcessed = false + continue + } + case protobuf.SyncSetting: if !common.IsPubKeyEqual(messageState.CurrentMessageState.PublicKey, &m.identity.PublicKey) { logger.Warn("not coming from us, ignoring") @@ -4328,12 +4361,14 @@ func (m *Messenger) handleRetrievedMessages(chatWithMessages map[transport.Filte } // Activity Center notification + now := m.getCurrentTimeInMillis() notification := &ActivityCenterNotification{ ID: types.FromHex(uuid.New().String()), Type: ActivityCenterNotificationTypeCommunityKicked, - Timestamp: m.getTimesource().GetCurrentTime(), + Timestamp: now, CommunityID: changes.Community.IDString(), Read: false, + UpdatedAt: now, } err = m.addActivityCenterNotification(response, notification) @@ -4767,10 +4802,15 @@ func (m *Messenger) markAllRead(chatID string, clock uint64, shouldBeSynced bool } func (m *Messenger) MarkAllRead(chatID string) error { - err := m.persistence.DismissAllActivityCenterNotificationsFromChatID(chatID) + notifications, err := m.persistence.DismissAllActivityCenterNotificationsFromChatID(chatID, m.getCurrentTimeInMillis()) if err != nil { return err } + err = m.syncActivityCenterNotifications(notifications) + if err != nil { + m.logger.Error("MarkAllRead, failed to sync activity center notifications", zap.Error(err)) + return err + } clock, _ := m.latestIncomingMessageClock(chatID) @@ -4786,7 +4826,7 @@ func (m *Messenger) MarkAllRead(chatID string) error { } func (m *Messenger) MarkAllReadInCommunity(communityID string) ([]string, error) { - err := m.persistence.DismissAllActivityCenterNotificationsFromCommunity(communityID) + notifications, err := m.persistence.DismissAllActivityCenterNotificationsFromCommunity(communityID, m.getCurrentTimeInMillis()) if err != nil { return nil, err } @@ -4812,6 +4852,14 @@ func (m *Messenger) MarkAllReadInCommunity(communityID string) ([]string, error) err = errors.New(fmt.Sprintf("chat with chatID %s not found", chatID)) } } + if err != nil { + return chatIDs, err + } + + err = m.syncActivityCenterNotifications(notifications) + if err != nil { + m.logger.Error("MarkAllReadInCommunity, error syncing activity center notifications", zap.Error(err)) + } return chatIDs, err } @@ -5680,6 +5728,10 @@ func (m *Messenger) getTimesource() common.TimeSource { return m.transport } +func (m *Messenger) getCurrentTimeInMillis() uint64 { + return m.getTimesource().GetCurrentTime() +} + // AddPushNotificationsServer adds a push notification server func (m *Messenger) AddPushNotificationsServer(ctx context.Context, publicKey *ecdsa.PublicKey, serverType pushnotificationclient.ServerType) error { if m.pushNotificationClient == nil { diff --git a/protocol/messenger_activity_center.go b/protocol/messenger_activity_center.go index 3de40760f..4146eac00 100644 --- a/protocol/messenger_activity_center.go +++ b/protocol/messenger_activity_center.go @@ -2,6 +2,9 @@ package protocol import ( "context" + "encoding/json" + + "github.com/status-im/status-go/protocol/verification" "github.com/golang/protobuf/proto" "github.com/pkg/errors" @@ -60,16 +63,67 @@ func (m *Messenger) ActivityCenterNotificationsCount(request ActivityCenterCount } func (m *Messenger) HasUnseenActivityCenterNotifications() (bool, error) { - return m.persistence.HasUnseenActivityCenterNotifications() + seen, _, err := m.persistence.HasUnseenActivityCenterNotifications() + return seen, err } func (m *Messenger) GetActivityCenterState() (*ActivityCenterState, error) { return m.persistence.GetActivityCenterState() } +func (m *Messenger) syncActivityCenterNotificationState(state *ActivityCenterState) error { + if state == nil { + return nil + } + syncStateMessage := &protobuf.SyncActivityCenterNotificationState{ + UpdatedAt: state.UpdatedAt, + HasSeen: state.HasSeen, + } + encodedMessage, err := proto.Marshal(syncStateMessage) + if err != nil { + return err + } + return m.sendToPairedDevices(context.TODO(), common.RawMessage{ + Payload: encodedMessage, + MessageType: protobuf.ApplicationMetadataMessage_SYNC_ACTIVITY_CENTER_NOTIFICATION_STATE, + ResendAutomatically: true, + }) +} + +func (m *Messenger) syncActivityCenterNotifications(notifications []*ActivityCenterNotification) (err error) { + if notifications == nil { + return nil + } + var s []*protobuf.SyncActivityCenterNotification + for _, n := range notifications { + var p *protobuf.SyncActivityCenterNotification + p, err = convertActivityCenterNotificationToProtobuf(*n) + if err != nil { + return + } + s = append(s, p) + } + var encodedMessage []byte + encodedMessage, err = proto.Marshal(&protobuf.SyncActivityCenterNotifications{ + ActivityCenterNotifications: s, + }) + if err != nil { + return + } + return m.sendToPairedDevices(context.TODO(), common.RawMessage{ + Payload: encodedMessage, + MessageType: protobuf.ApplicationMetadataMessage_SYNC_ACTIVITY_CENTER_NOTIFICATION, + ResendAutomatically: true, + }) +} + func (m *Messenger) MarkAsSeenActivityCenterNotifications() (*MessengerResponse, error) { response := &MessengerResponse{} - err := m.persistence.MarkAsSeenActivityCenterNotifications() + s := &ActivityCenterState{ + UpdatedAt: m.getCurrentTimeInMillis(), + HasSeen: true, + } + n, err := m.persistence.UpdateActivityCenterNotificationState(s) if err != nil { return nil, err } @@ -80,22 +134,26 @@ func (m *Messenger) MarkAsSeenActivityCenterNotifications() (*MessengerResponse, } response.SetActivityCenterState(state) + if n > 0 { + return response, m.syncActivityCenterNotificationState(state) + } return response, nil } func (m *Messenger) MarkAllActivityCenterNotificationsRead(ctx context.Context) (*MessengerResponse, error) { response := &MessengerResponse{} + updateAt := m.getCurrentTimeInMillis() if m.hasPairedDevices() { ids, err := m.persistence.GetNotReadActivityCenterNotificationIds() if err != nil { return nil, err } - _, err = m.MarkActivityCenterNotificationsRead(ctx, toHexBytes(ids), true) + _, err = m.MarkActivityCenterNotificationsRead(ctx, toHexBytes(ids), updateAt, true) return nil, err } - err := m.persistence.MarkAllActivityCenterNotificationsRead() + err := m.persistence.MarkAllActivityCenterNotificationsRead(updateAt) if err != nil { return nil, err } @@ -109,9 +167,12 @@ func (m *Messenger) MarkAllActivityCenterNotificationsRead(ctx context.Context) return response, nil } -func (m *Messenger) MarkActivityCenterNotificationsRead(ctx context.Context, ids []types.HexBytes, sync bool) (*MessengerResponse, error) { +func (m *Messenger) MarkActivityCenterNotificationsRead(ctx context.Context, ids []types.HexBytes, updatedAt uint64, sync bool) (*MessengerResponse, error) { response := &MessengerResponse{} - err := m.persistence.MarkActivityCenterNotificationsRead(ids) + if updatedAt == 0 { + updatedAt = m.getCurrentTimeInMillis() + } + err := m.persistence.MarkActivityCenterNotificationsRead(ids, updatedAt) if err != nil { return nil, err } @@ -125,7 +186,7 @@ func (m *Messenger) MarkActivityCenterNotificationsRead(ctx context.Context, ids } syncMessage := &protobuf.SyncActivityCenterRead{ - Clock: m.getTimesource().GetCurrentTime(), + Clock: updatedAt, Ids: fromHexBytes(ids), } @@ -154,10 +215,15 @@ func (m *Messenger) MarkActivityCenterNotificationsRead(ctx context.Context, ids func (m *Messenger) MarkActivityCenterNotificationsUnread(ids []types.HexBytes) (*MessengerResponse, error) { response := &MessengerResponse{} - err := m.persistence.MarkActivityCenterNotificationsUnread(ids) + notifications, err := m.persistence.MarkActivityCenterNotificationsUnread(ids, m.getCurrentTimeInMillis()) if err != nil { return nil, err } + err = m.syncActivityCenterNotifications(notifications) + if err != nil { + m.logger.Error("MarkActivityCenterNotificationsUnread, failed to sync activity center notifications", zap.Error(err)) + return nil, err + } state, err := m.persistence.GetActivityCenterState() if err != nil { @@ -212,13 +278,11 @@ func (m *Messenger) processAcceptedActivityCenterNotifications(ctx context.Conte for i := range notifications { ids[i] = notifications[i].ID - notifications[i].Accepted = true - notifications[i].Read = true } if sync { syncMessage := &protobuf.SyncActivityCenterAccepted{ - Clock: m.getTimesource().GetCurrentTime(), + Clock: m.getCurrentTimeInMillis(), Ids: ids, } @@ -241,13 +305,16 @@ func (m *Messenger) processAcceptedActivityCenterNotifications(ctx context.Conte return m.processActivityCenterNotifications(notifications, !sync) } -func (m *Messenger) AcceptActivityCenterNotifications(ctx context.Context, ids []types.HexBytes, sync bool) (*MessengerResponse, error) { - +func (m *Messenger) AcceptActivityCenterNotifications(ctx context.Context, ids []types.HexBytes, updatedAt uint64, sync bool) (*MessengerResponse, error) { if len(ids) == 0 { return nil, errors.New("notifications ids are not provided") } - notifications, err := m.persistence.AcceptActivityCenterNotifications(ids) + if updatedAt == 0 { + updatedAt = m.getCurrentTimeInMillis() + } + + notifications, err := m.persistence.AcceptActivityCenterNotifications(ids, updatedAt) if err != nil { return nil, err } @@ -255,8 +322,11 @@ func (m *Messenger) AcceptActivityCenterNotifications(ctx context.Context, ids [ return m.processAcceptedActivityCenterNotifications(ctx, notifications, sync) } -func (m *Messenger) DismissActivityCenterNotifications(ctx context.Context, ids []types.HexBytes, sync bool) (*MessengerResponse, error) { - err := m.persistence.DismissActivityCenterNotifications(ids) +func (m *Messenger) DismissActivityCenterNotifications(ctx context.Context, ids []types.HexBytes, updatedAt uint64, sync bool) (*MessengerResponse, error) { + if updatedAt == 0 { + updatedAt = m.getCurrentTimeInMillis() + } + err := m.persistence.DismissActivityCenterNotifications(ids, updatedAt) if err != nil { return nil, err } @@ -271,7 +341,7 @@ func (m *Messenger) DismissActivityCenterNotifications(ctx context.Context, ids } syncMessage := &protobuf.SyncActivityCenterDismissed{ - Clock: m.getTimesource().GetCurrentTime(), + Clock: updatedAt, Ids: fromHexBytes(ids), } @@ -290,7 +360,15 @@ func (m *Messenger) DismissActivityCenterNotifications(ctx context.Context, ids } func (m *Messenger) DeleteActivityCenterNotifications(ctx context.Context, ids []types.HexBytes, sync bool) error { - return m.persistence.DeleteActivityCenterNotifications(ids) + notifications, err := m.persistence.DeleteActivityCenterNotifications(ids, m.getCurrentTimeInMillis()) + if err != nil { + return err + } + err = m.syncActivityCenterNotifications(notifications) + if err != nil { + m.logger.Error("DeleteActivityCenterNotifications, failed to sync activity center notifications", zap.Error(err)) + } + return err } func (m *Messenger) ActivityCenterNotification(id types.HexBytes) (*ActivityCenterNotification, error) { @@ -298,7 +376,7 @@ func (m *Messenger) ActivityCenterNotification(id types.HexBytes) (*ActivityCent } func (m *Messenger) handleActivityCenterRead(state *ReceivedMessageState, message protobuf.SyncActivityCenterRead) error { - resp, err := m.MarkActivityCenterNotificationsRead(context.TODO(), toHexBytes(message.Ids), false) + resp, err := m.MarkActivityCenterNotificationsRead(context.TODO(), toHexBytes(message.Ids), message.Clock, false) if err != nil { return err @@ -308,7 +386,7 @@ func (m *Messenger) handleActivityCenterRead(state *ReceivedMessageState, messag } func (m *Messenger) handleActivityCenterAccepted(state *ReceivedMessageState, message protobuf.SyncActivityCenterAccepted) error { - resp, err := m.AcceptActivityCenterNotifications(context.TODO(), toHexBytes(message.Ids), false) + resp, err := m.AcceptActivityCenterNotifications(context.TODO(), toHexBytes(message.Ids), message.Clock, false) if err != nil { return err @@ -318,7 +396,7 @@ func (m *Messenger) handleActivityCenterAccepted(state *ReceivedMessageState, me } func (m *Messenger) handleActivityCenterDismissed(state *ReceivedMessageState, message protobuf.SyncActivityCenterDismissed) error { - resp, err := m.DismissActivityCenterNotifications(context.TODO(), toHexBytes(message.Ids), false) + resp, err := m.DismissActivityCenterNotifications(context.TODO(), toHexBytes(message.Ids), message.Clock, false) if err != nil { return err @@ -326,3 +404,118 @@ func (m *Messenger) handleActivityCenterDismissed(state *ReceivedMessageState, m return state.Response.Merge(resp) } + +func (m *Messenger) handleSyncActivityCenterNotificationState(state *ReceivedMessageState, a *protobuf.SyncActivityCenterNotificationState) error { + s := &ActivityCenterState{ + HasSeen: a.HasSeen, + UpdatedAt: a.UpdatedAt, + } + n, err := m.persistence.UpdateActivityCenterNotificationState(s) + if err != nil { + return err + } + if n > 0 { + state.Response.SetActivityCenterState(s) + } + return nil +} + +func (m *Messenger) handleSyncActivityCenterNotifications(state *ReceivedMessageState, a *protobuf.SyncActivityCenterNotifications) error { + var notifications []*ActivityCenterNotification + for _, n := range a.ActivityCenterNotifications { + notification, err := convertActivityCenterNotificationFromProtobuf(n) + if err != nil { + return err + } + affectedNum, err := m.persistence.SaveActivityCenterNotification(notification, false) + if err != nil { + return err + } + if affectedNum > 0 { + notifications = append(notifications, notification) + } + } + response, err := m.processActivityCenterNotifications(notifications, true) + if err != nil { + return err + } + return state.Response.Merge(response) +} + +func convertActivityCenterNotificationToProtobuf(n ActivityCenterNotification) (syncActivityCenterNotification *protobuf.SyncActivityCenterNotification, err error) { + var ( + message []byte + replyMessage []byte + ) + if n.Message != nil { + message, err = json.Marshal(n.Message) + if err != nil { + return + } + } + if n.ReplyMessage != nil { + replyMessage, err = json.Marshal(n.ReplyMessage) + if err != nil { + return + } + } + syncActivityCenterNotification = &protobuf.SyncActivityCenterNotification{ + Id: n.ID, + Timestamp: n.Timestamp, + NotificationType: protobuf.SyncActivityCenterNotification_NotificationType(n.Type), + ChatId: n.ChatID, + Read: n.Read, + Dismissed: n.Dismissed, + Accepted: n.Accepted, + Message: message, + Author: n.Author, + ReplyMessage: replyMessage, + CommunityId: n.CommunityID, + MembershipStatus: protobuf.SyncActivityCenterNotification_MembershipStatus(n.MembershipStatus), + ContactVerificationStatus: protobuf.SyncActivityCenterNotification_ContactVerificationStatus(n.ContactVerificationStatus), + Deleted: n.Deleted, + UpdatedAt: n.UpdatedAt, + } + return +} + +func convertActivityCenterNotificationFromProtobuf(proto *protobuf.SyncActivityCenterNotification) (*ActivityCenterNotification, error) { + if proto == nil { + return nil, errors.New("convertActivityCenterNotificationFromProtobuf, proto is nil") + } + + a := &ActivityCenterNotification{ + ID: proto.Id, + ChatID: proto.ChatId, + CommunityID: proto.CommunityId, + MembershipStatus: ActivityCenterMembershipStatus(proto.MembershipStatus), + Author: proto.Author, + Type: ActivityCenterType(proto.NotificationType), + Timestamp: proto.Timestamp, + Read: proto.Read, + Accepted: proto.Accepted, + Dismissed: proto.Dismissed, + Deleted: proto.Deleted, + ContactVerificationStatus: verification.RequestStatus(proto.ContactVerificationStatus), + UpdatedAt: proto.UpdatedAt, + } + + if len(proto.Message) > 0 { + message := &common.Message{} + err := json.Unmarshal(proto.Message, &message) + if err != nil { + return nil, err + } + a.Message = message + } + if len(proto.ReplyMessage) > 0 { + replyMessage := &common.Message{} + err := json.Unmarshal(proto.ReplyMessage, &replyMessage) + if err != nil { + return nil, err + } + a.ReplyMessage = replyMessage + } + + return a, nil +} diff --git a/protocol/messenger_communities.go b/protocol/messenger_communities.go index 850bccecb..d66a33633 100644 --- a/protocol/messenger_communities.go +++ b/protocol/messenger_communities.go @@ -689,6 +689,7 @@ func (m *Messenger) RequestToJoinCommunity(request *requests.RequestToJoinCommun MembershipStatus: ActivityCenterMembershipStatusPending, Read: true, Deleted: false, + UpdatedAt: m.getCurrentTimeInMillis(), } err = m.addActivityCenterNotification(response, notification) @@ -830,7 +831,8 @@ func (m *Messenger) CancelRequestToJoinCommunity(request *requests.CancelRequest } if notification != nil { - err = m.persistence.DeleteActivityCenterNotification(types.FromHex(requestToJoin.ID.String())) + notification.UpdatedAt = m.getCurrentTimeInMillis() + err = m.persistence.DeleteActivityCenterNotificationByID(types.FromHex(requestToJoin.ID.String()), notification.UpdatedAt) if err != nil { m.logger.Error("failed to delete notification from Activity Center", zap.Error(err)) return nil, err @@ -838,6 +840,11 @@ func (m *Messenger) CancelRequestToJoinCommunity(request *requests.CancelRequest // set notification as deleted, so that the client will remove the activity center notification from UI notification.Deleted = true + err = m.syncActivityCenterNotifications([]*ActivityCenterNotification{notification}) + if err != nil { + m.logger.Error("CancelRequestToJoinCommunity, failed to sync activity center notifications", zap.Error(err)) + return nil, err + } response.AddActivityCenterNotification(notification) } @@ -921,6 +928,7 @@ func (m *Messenger) AcceptRequestToJoinCommunity(request *requests.AcceptRequest notification.MembershipStatus = ActivityCenterMembershipStatusAccepted notification.Read = true notification.Accepted = true + notification.UpdatedAt = m.getCurrentTimeInMillis() err = m.addActivityCenterNotification(response, notification) if err != nil { @@ -954,6 +962,7 @@ func (m *Messenger) DeclineRequestToJoinCommunity(request *requests.DeclineReque notification.MembershipStatus = ActivityCenterMembershipStatusDeclined notification.Read = true notification.Dismissed = true + notification.UpdatedAt = m.getCurrentTimeInMillis() err = m.addActivityCenterNotification(response, notification) if err != nil { @@ -966,7 +975,7 @@ func (m *Messenger) DeclineRequestToJoinCommunity(request *requests.DeclineReque } func (m *Messenger) LeaveCommunity(communityID types.HexBytes) (*MessengerResponse, error) { - err := m.persistence.DismissAllActivityCenterNotificationsFromCommunity(communityID.String()) + notifications, err := m.persistence.DismissAllActivityCenterNotificationsFromCommunity(communityID.String(), m.getCurrentTimeInMillis()) if err != nil { return nil, err } @@ -1018,6 +1027,12 @@ func (m *Messenger) LeaveCommunity(communityID types.HexBytes) (*MessengerRespon } } + err = m.syncActivityCenterNotifications(notifications) + if err != nil { + m.logger.Error("LeaveCommunity, failed to sync activity center notifications", zap.Error(err)) + return nil, err + } + return mr, nil } @@ -1094,12 +1109,18 @@ func (m *Messenger) CheckAndDeletePendingRequestToJoinCommunity(sendResponse boo if notification != nil { // Delete activity centre notification for community admin if notification.Type == ActivityCenterNotificationTypeCommunityMembershipRequest { - err = m.persistence.DeleteActivityCenterNotification(types.FromHex(requestToJoin.ID.String())) + notification.UpdatedAt = m.getCurrentTimeInMillis() + err = m.persistence.DeleteActivityCenterNotificationByID(types.FromHex(requestToJoin.ID.String()), notification.UpdatedAt) if err != nil { m.logger.Error("failed to delete notification from activity center", zap.Error(err)) return nil, err } notification.Deleted = true + err = m.syncActivityCenterNotifications([]*ActivityCenterNotification{notification}) + if err != nil { + m.logger.Error("CheckAndDeletePendingRequestToJoinCommunity, failed to sync activity center notifications", zap.Error(err)) + return nil, err + } response.AddActivityCenterNotification(notification) } // Update activity centre notification for requester @@ -1107,6 +1128,7 @@ func (m *Messenger) CheckAndDeletePendingRequestToJoinCommunity(sendResponse boo notification.MembershipStatus = ActivityCenterMembershipStatusIdle notification.Read = false notification.Deleted = false + notification.UpdatedAt = m.getCurrentTimeInMillis() err = m.addActivityCenterNotification(response, notification) if err != nil { m.logger.Error("failed to update notification in activity center", zap.Error(err)) diff --git a/protocol/messenger_contact_verification.go b/protocol/messenger_contact_verification.go index fb8b43ee5..e8e6e0a00 100644 --- a/protocol/messenger_contact_verification.go +++ b/protocol/messenger_contact_verification.go @@ -246,6 +246,7 @@ func (m *Messenger) CancelVerificationRequest(ctx context.Context, id string) (* message := notification.Message message.ContactVerificationState = common.ContactVerificationStateCanceled notification.Read = true + notification.UpdatedAt = m.getCurrentTimeInMillis() err = m.addActivityCenterNotification(response, notification) if err != nil { @@ -356,6 +357,7 @@ func (m *Messenger) AcceptContactVerificationRequest(ctx context.Context, id str notification.ReplyMessage = replyMessage notification.Read = true notification.Accepted = true + notification.UpdatedAt = m.getCurrentTimeInMillis() err = m.addActivityCenterNotification(resp, notification) if err != nil { @@ -452,6 +454,7 @@ func (m *Messenger) VerifiedTrusted(ctx context.Context, request *requests.Verif notification.Message.ContactVerificationState = common.ContactVerificationStateTrusted notification.Read = true notification.Accepted = true + notification.UpdatedAt = m.getCurrentTimeInMillis() err = m.addActivityCenterNotification(response, notification) if err != nil { @@ -558,6 +561,7 @@ func (m *Messenger) VerifiedUntrustworthy(ctx context.Context, request *requests notification.Message.ContactVerificationState = common.ContactVerificationStateUntrustworthy notification.Read = true notification.Accepted = true + notification.UpdatedAt = m.getCurrentTimeInMillis() err = m.addActivityCenterNotification(response, notification) if err != nil { @@ -666,6 +670,7 @@ func (m *Messenger) DeclineContactVerificationRequest(ctx context.Context, id st notification.ContactVerificationStatus = verification.RequestStatusDECLINED notification.Read = true notification.Dismissed = true + notification.UpdatedAt = m.getCurrentTimeInMillis() message := notification.Message message.ContactVerificationState = common.ContactVerificationStateDeclined @@ -1043,6 +1048,7 @@ func (m *Messenger) createOrUpdateOutgoingContactVerificationNotification(contac Read: vr.RequestStatus != verification.RequestStatusACCEPTED, // Mark as Unread Accepted notification because we are waiting for the asnwer Accepted: vr.RequestStatus == verification.RequestStatusTRUSTED || vr.RequestStatus == verification.RequestStatusUNTRUSTWORTHY, Dismissed: vr.RequestStatus == verification.RequestStatusDECLINED, + UpdatedAt: m.getCurrentTimeInMillis(), } return m.addActivityCenterNotification(response, notification) @@ -1062,6 +1068,7 @@ func (m *Messenger) createOrUpdateIncomingContactVerificationNotification(contac Read: vr.RequestStatus != verification.RequestStatusPENDING, // Unread only for pending incomming Accepted: vr.RequestStatus == verification.RequestStatusACCEPTED || vr.RequestStatus == verification.RequestStatusTRUSTED || vr.RequestStatus == verification.RequestStatusUNTRUSTWORTHY, Dismissed: vr.RequestStatus == verification.RequestStatusDECLINED, + UpdatedAt: m.getCurrentTimeInMillis(), } return m.addActivityCenterNotification(messageState.Response, notification) diff --git a/protocol/messenger_contacts.go b/protocol/messenger_contacts.go index fcb490f54..253ad692c 100644 --- a/protocol/messenger_contacts.go +++ b/protocol/messenger_contacts.go @@ -210,6 +210,7 @@ func (m *Messenger) declineContactRequest(requestID string, syncing bool) (*Mess notification.Message = contactRequest notification.Read = true notification.Dismissed = true + notification.UpdatedAt = m.getCurrentTimeInMillis() err = m.addActivityCenterNotification(response, notification) if err != nil { @@ -320,6 +321,7 @@ func (m *Messenger) updateAcceptedContactRequest(response *MessengerResponse, co notification.Message = contactRequest notification.Read = true notification.Accepted = true + notification.UpdatedAt = m.getCurrentTimeInMillis() err = m.addActivityCenterNotification(response, notification) if err != nil { @@ -591,6 +593,7 @@ func (m *Messenger) generateOutgoingContactRequestNotification(contact *Contact, contactRequest.ContactRequestState == common.ContactRequestStatePending, Accepted: contactRequest.ContactRequestState == common.ContactRequestStateAccepted, Dismissed: contactRequest.ContactRequestState == common.ContactRequestStateDismissed, + UpdatedAt: m.getCurrentTimeInMillis(), } } @@ -860,11 +863,17 @@ func (m *Messenger) blockContact(response *MessengerResponse, contactID string, } // We remove anything that's related to this contact request - err = m.persistence.HardDeleteChatContactRequestActivityCenterNotifications(contact.ID) + notifications, err := m.persistence.DeleteChatContactRequestActivityCenterNotifications(contact.ID, m.getCurrentTimeInMillis()) if err != nil { return nil, nil, err } + err = m.syncActivityCenterNotifications(notifications) + if err != nil { + m.logger.Error("BlockContact, error syncing activity center notifications", zap.Error(err)) + return nil, nil, err + } + return contact, chats, nil } @@ -883,11 +892,17 @@ func (m *Messenger) BlockContact(contactID string) (*MessengerResponse, error) { return nil, err } - err = m.persistence.DismissAllActivityCenterNotificationsFromUser(contactID) + notifications, err := m.persistence.DismissAllActivityCenterNotificationsFromUser(contactID, m.getCurrentTimeInMillis()) if err != nil { return nil, err } + err = m.syncActivityCenterNotifications(notifications) + if err != nil { + m.logger.Error("BlockContact, error syncing activity center notifications", zap.Error(err)) + return nil, err + } + return response, nil } @@ -907,11 +922,17 @@ func (m *Messenger) BlockContactDesktop(contactID string) (*MessengerResponse, e return nil, err } - err = m.persistence.DismissAllActivityCenterNotificationsFromUser(contactID) + notifications, err := m.persistence.DismissAllActivityCenterNotificationsFromUser(contactID, m.getCurrentTimeInMillis()) if err != nil { return nil, err } + err = m.syncActivityCenterNotifications(notifications) + if err != nil { + m.logger.Error("BlockContactDesktop, error syncing activity center notifications", zap.Error(err)) + return nil, err + } + return response, nil } diff --git a/protocol/messenger_group_chat.go b/protocol/messenger_group_chat.go index 7123ef279..33b9d69bf 100644 --- a/protocol/messenger_group_chat.go +++ b/protocol/messenger_group_chat.go @@ -747,10 +747,15 @@ func (m *Messenger) leaveGroupChat(ctx context.Context, response *MessengerRespo } func (m *Messenger) LeaveGroupChat(ctx context.Context, chatID string, remove bool) (*MessengerResponse, error) { - err := m.persistence.DismissAllActivityCenterNotificationsFromChatID(chatID) + notifications, err := m.persistence.DismissAllActivityCenterNotificationsFromChatID(chatID, m.getCurrentTimeInMillis()) if err != nil { return nil, err } + err = m.syncActivityCenterNotifications(notifications) + if err != nil { + m.logger.Error("LeaveGroupChat, Failed to sync activity center notifications", zap.Error(err)) + return nil, err + } var response MessengerResponse return m.leaveGroupChat(ctx, &response, chatID, remove, true) @@ -778,7 +783,7 @@ func (m *Messenger) DeclineAllPendingGroupInvitesFromUser(response *MessengerRes } // Decline group invites from activity center notifications - notifications, err := m.persistence.AcceptActivityCenterNotificationsForInvitesFromUser(userPublicKey) + notifications, err := m.persistence.AcceptActivityCenterNotificationsForInvitesFromUser(userPublicKey, m.getCurrentTimeInMillis()) if err != nil { return nil, err } @@ -789,5 +794,12 @@ func (m *Messenger) DeclineAllPendingGroupInvitesFromUser(response *MessengerRes return nil, err } } + + err = m.syncActivityCenterNotifications(notifications) + if err != nil { + m.logger.Error("DeclineAllPendingGroupInvitesFromUser, Failed to sync activity center notifications", zap.Error(err)) + return nil, err + } + return response, nil } diff --git a/protocol/messenger_handler.go b/protocol/messenger_handler.go index b0d2d2ec1..cc497df98 100644 --- a/protocol/messenger_handler.go +++ b/protocol/messenger_handler.go @@ -262,6 +262,7 @@ func (m *Messenger) createMessageNotification(chat *Chat, messageState *Received Timestamp: messageState.CurrentMessageState.WhisperTimestamp, ChatID: chat.ID, CommunityID: chat.CommunityID, + UpdatedAt: m.getCurrentTimeInMillis(), } err := m.addActivityCenterNotification(messageState.Response, notification) @@ -313,12 +314,19 @@ func (m *Messenger) createIncomingContactRequestNotification(contact *Contact, m notification.Read = true notification.Accepted = true notification.Dismissed = false - err = m.persistence.SaveActivityCenterNotification(notification) + notification.UpdatedAt = m.getCurrentTimeInMillis() + _, err = m.persistence.SaveActivityCenterNotification(notification, true) if err != nil { return err } messageState.Response.AddMessage(contactRequest) messageState.Response.AddActivityCenterNotification(notification) + + err = m.syncActivityCenterNotifications([]*ActivityCenterNotification{notification}) + if err != nil { + m.logger.Error("createIncomingContactRequestNotification, failed to sync activity center notifications", zap.Error(err)) + return err + } } return nil } @@ -338,6 +346,7 @@ func (m *Messenger) createIncomingContactRequestNotification(contact *Contact, m Read: contactRequest.ContactRequestState == common.ContactRequestStateAccepted || contactRequest.ContactRequestState == common.ContactRequestStateDismissed, Accepted: contactRequest.ContactRequestState == common.ContactRequestStateAccepted, Dismissed: contactRequest.ContactRequestState == common.ContactRequestStateDismissed, + UpdatedAt: m.getCurrentTimeInMillis(), } return m.addActivityCenterNotification(messageState.Response, notification) @@ -1014,6 +1023,7 @@ func (m *Messenger) handleRetractContactRequest(response *MessengerResponse, con Timestamp: m.getTimesource().GetCurrentTime(), ChatID: contact.ID, Read: false, + UpdatedAt: m.getCurrentTimeInMillis(), } err = m.addActivityCenterNotification(response, notification) @@ -1362,7 +1372,8 @@ func (m *Messenger) HandleCommunityCancelRequestToJoin(state *ReceivedMessageSta } if notification != nil { - err = m.persistence.DeleteActivityCenterNotification(types.FromHex(requestToJoin.ID.String())) + notification.UpdatedAt = m.getCurrentTimeInMillis() + err = m.persistence.DeleteActivityCenterNotificationByID(types.FromHex(requestToJoin.ID.String()), notification.UpdatedAt) if err != nil { m.logger.Error("failed to delete notification from Activity Center", zap.Error(err)) return err @@ -1371,6 +1382,11 @@ func (m *Messenger) HandleCommunityCancelRequestToJoin(state *ReceivedMessageSta // sending signal to client to remove the activity center notification from UI response := &MessengerResponse{} notification.Deleted = true + err = m.syncActivityCenterNotifications([]*ActivityCenterNotification{notification}) + if err != nil { + m.logger.Error("HandleCommunityCancelRequestToJoin, failed to sync activity center notifications", zap.Error(err)) + return err + } response.AddActivityCenterNotification(notification) signal.SendNewMessages(response) @@ -1452,6 +1468,7 @@ func (m *Messenger) HandleCommunityRequestToJoin(state *ReceivedMessageState, si CommunityID: community.IDString(), MembershipStatus: ActivityCenterMembershipStatusPending, Deleted: false, + UpdatedAt: m.getCurrentTimeInMillis(), } err = m.addActivityCenterNotification(state.Response, notification) @@ -1472,6 +1489,7 @@ func (m *Messenger) HandleCommunityRequestToJoin(state *ReceivedMessageState, si } else { notification.MembershipStatus = ActivityCenterMembershipStatusDeclined } + notification.UpdatedAt = m.getCurrentTimeInMillis() err = m.addActivityCenterNotification(state.Response, notification) if err != nil { m.logger.Error("failed to save notification", zap.Error(err)) @@ -1557,6 +1575,7 @@ func (m *Messenger) HandleCommunityRequestToJoinResponse(state *ReceivedMessageS } else { notification.MembershipStatus = ActivityCenterMembershipStatusDeclined } + notification.UpdatedAt = m.getCurrentTimeInMillis() err = m.addActivityCenterNotification(state.Response, notification) if err != nil { m.logger.Warn("failed to update notification", zap.Error(err)) @@ -1747,7 +1766,7 @@ func (m *Messenger) HandleDeleteMessage(state *ReceivedMessageState, deleteMessa } m.logger.Debug("deleting activity center notification for message", zap.String("chatID", chat.ID), zap.String("messageID", messageToDelete.ID)) - err = m.persistence.DeleteActivityCenterNotificationForMessage(chat.ID, messageToDelete.ID) + notifications, err := m.persistence.DeleteActivityCenterNotificationForMessage(chat.ID, messageToDelete.ID, m.getCurrentTimeInMillis()) if err != nil { m.logger.Warn("failed to delete notifications for deleted message", zap.Error(err)) @@ -1769,6 +1788,12 @@ func (m *Messenger) HandleDeleteMessage(state *ReceivedMessageState, deleteMessa } } + err = m.syncActivityCenterNotifications(notifications) + if err != nil { + m.logger.Error("HandleDeleteMessage, failed to sync activity center notifications", zap.Error(err)) + return err + } + state.Response.AddRemovedMessage(&RemovedMessage{MessageID: messageToDelete.ID, ChatID: chat.ID, DeletedBy: deleteMessage.DeleteMessage.DeletedBy}) state.Response.AddNotification(DeletedMessageNotification(messageToDelete.ID, chat)) state.Response.AddActivityCenterNotification(&ActivityCenterNotification{ @@ -1853,7 +1878,7 @@ func (m *Messenger) HandleDeleteForMeMessage(state *ReceivedMessageState, delete m.logger.Debug("deleting activity center notification for message", zap.String("chatID", chat.ID), zap.String("messageID", messageToDelete.ID)) - err = m.persistence.DeleteActivityCenterNotificationForMessage(chat.ID, messageToDelete.ID) + notifications, err := m.persistence.DeleteActivityCenterNotificationForMessage(chat.ID, messageToDelete.ID, m.getCurrentTimeInMillis()) if err != nil { m.logger.Warn("failed to delete notifications for deleted message", zap.Error(err)) return err @@ -1867,6 +1892,12 @@ func (m *Messenger) HandleDeleteForMeMessage(state *ReceivedMessageState, delete } } + err = m.syncActivityCenterNotifications(notifications) + if err != nil { + m.logger.Error("HandleDeleteForMeMessage, failed to sync activity center notifications", zap.Error(err)) + return err + } + state.Response.AddMessage(messageToDelete) } state.Response.AddChat(chat) @@ -2161,20 +2192,29 @@ func (m *Messenger) HandleImportedChatMessage(state *ReceivedMessageState) error } func (m *Messenger) addActivityCenterNotification(response *MessengerResponse, notification *ActivityCenterNotification) error { - err := m.persistence.SaveActivityCenterNotification(notification) + _, err := m.persistence.SaveActivityCenterNotification(notification, true) if err != nil { m.logger.Error("failed to save notification", zap.Error(err)) return err } + err = m.syncActivityCenterNotifications([]*ActivityCenterNotification{notification}) + if err != nil { + m.logger.Error("addActivityCenterNotification, failed to sync activity center notifications", zap.Error(err)) + return err + } + state, err := m.persistence.GetActivityCenterState() if err != nil { m.logger.Error("failed to obtain activity center state", zap.Error(err)) return err } - response.AddActivityCenterNotification(notification) response.SetActivityCenterState(state) + + if !notification.Read { + return m.syncActivityCenterNotificationState(state) + } return nil } diff --git a/protocol/messenger_sync_activity_notification_test.go b/protocol/messenger_sync_activity_notification_test.go new file mode 100644 index 000000000..5ee3f315e --- /dev/null +++ b/protocol/messenger_sync_activity_notification_test.go @@ -0,0 +1,153 @@ +package protocol + +import ( + "context" + "crypto/ecdsa" + "errors" + "testing" + + "github.com/stretchr/testify/require" + + gethbridge "github.com/status-im/status-go/eth-node/bridge/geth" + "github.com/status-im/status-go/eth-node/crypto" + "github.com/status-im/status-go/protocol/encryption/multidevice" + "github.com/status-im/status-go/protocol/tt" + "github.com/status-im/status-go/waku" + + "github.com/stretchr/testify/suite" + "go.uber.org/zap" + + "github.com/status-im/status-go/eth-node/types" +) + +func TestMessengerSyncActivityCenterNotificationSuite(t *testing.T) { + suite.Run(t, new(MessengerSyncActivityCenterNotificationSuite)) +} + +type MessengerSyncActivityCenterNotificationSuite struct { + suite.Suite + m *Messenger // main instance of Messenger + theirMessenger *Messenger + privateKey *ecdsa.PrivateKey // private key for the main instance of Messenger + + // If one wants to send messages between different instances of Messenger, + // a single Waku service should be shared. + shh types.Waku + + logger *zap.Logger +} + +func (s *MessengerSyncActivityCenterNotificationSuite) SetupTest() { + s.logger = tt.MustCreateTestLogger() + + config := waku.DefaultConfig + config.MinimumAcceptedPoW = 0 + shh := waku.New(&config, s.logger) + s.shh = gethbridge.NewGethWakuWrapper(shh) + s.Require().NoError(shh.Start()) + + s.m = s.newMessenger() + s.privateKey = s.m.identity + // We start the messenger in order to receive installations + _, err := s.m.Start() + s.Require().NoError(err) + + // pair + s.theirMessenger, err = newMessengerWithKey(s.shh, s.privateKey, s.logger, nil) + s.Require().NoError(err) + err = s.theirMessenger.SetInstallationMetadata(s.theirMessenger.installationID, &multidevice.InstallationMetadata{ + Name: "their-name", + DeviceType: "their-device-type", + }) + s.Require().NoError(err) + _, err = s.theirMessenger.SendPairInstallation(context.Background(), nil) + s.Require().NoError(err) + // Wait for the message to reach its destination + _, err = WaitOnMessengerResponse( + s.m, + func(r *MessengerResponse) bool { return len(r.Installations) > 0 }, + "installation not received", + ) + s.Require().NoError(err) + err = s.m.EnableInstallation(s.theirMessenger.installationID) + s.Require().NoError(err) +} + +func (s *MessengerSyncActivityCenterNotificationSuite) TearDownTest() { + s.Require().NoError(s.m.Shutdown()) + s.Require().NoError(s.theirMessenger.Shutdown()) +} + +func (s *MessengerSyncActivityCenterNotificationSuite) newMessenger() *Messenger { + privateKey, err := crypto.GenerateKey() + s.Require().NoError(err) + + messenger, err := newMessengerWithKey(s.shh, privateKey, s.logger, nil) + s.Require().NoError(err) + + return messenger +} + +func (s *MessengerSyncActivityCenterNotificationSuite) TestSyncActivityCenterNotification() { + // add notification + now := currentMilliseconds() + notificationID := types.HexBytes("123") + expectedNotification := &ActivityCenterNotification{ + ID: notificationID, + Author: "author", + Type: ActivityCenterNotificationTypeContactRequest, + Timestamp: now, + UpdatedAt: now, + } + err := s.m.addActivityCenterNotification(&MessengerResponse{}, expectedNotification) + s.Require().NoError(err) + + // Wait for the message to reach its destination + err = tt.RetryWithBackOff(func() error { + response, err := s.theirMessenger.RetrieveAll() + if err != nil { + return err + } + if len(response.ActivityCenterNotifications()) == 1 { + require.Equal(s.T(), expectedNotification, response.ActivityCenterNotifications()[0]) + return nil + } + return errors.New("not received notifications") + }) + s.Require().NoError(err) + + notification, err := s.theirMessenger.ActivityCenterNotification(notificationID) + s.Require().NoError(err) + s.Require().Equal(expectedNotification, notification) + + // check state + s1, err := s.m.GetActivityCenterState() + s.Require().NoError(err) + s.Require().NotNil(s1) + s.Require().False(s1.HasSeen) + s2, err := s.theirMessenger.GetActivityCenterState() + s.Require().NoError(err) + s.Require().NotNil(s2) + s.Require().False(s2.HasSeen) + s.Require().Equal(s1.UpdatedAt, s2.UpdatedAt) + + // mark as seen + _, err = s.m.MarkAsSeenActivityCenterNotifications() + s.Require().NoError(err) + err = tt.RetryWithBackOff(func() error { + response, err := s.theirMessenger.RetrieveAll() + if err != nil { + return err + } + if response.ActivityCenterState() != nil { + require.True(s.T(), response.ActivityCenterState().HasSeen) + return nil + } + return errors.New("not received notification state") + }) + s.Require().NoError(err) + s3, err := s.theirMessenger.GetActivityCenterState() + s.Require().NoError(err) + s.Require().NotNil(s3) + s.Require().True(s3.HasSeen) +} diff --git a/protocol/messenger_test.go b/protocol/messenger_test.go index c087c9786..7aced8b37 100644 --- a/protocol/messenger_test.go +++ b/protocol/messenger_test.go @@ -628,7 +628,14 @@ func (s *MessengerSuite) TestRetrieveBlockedContact() { response, err := receiver.RetrieveAll() s.Require().NoError(err) if require { - s.Require().Len(response.Messages(), 1) + containTextMsg := false + for _, msg := range response.Messages() { + if msg.ContentType == protobuf.ChatMessage_TEXT_PLAIN && msg.Text == "text-input-message" { + containTextMsg = true + break + } + } + s.Require().True(containTextMsg) } else { s.Require().Len(response.Messages(), 0) } diff --git a/protocol/migrations/migrations.go b/protocol/migrations/migrations.go index e6498c34c..84f0105b5 100644 --- a/protocol/migrations/migrations.go +++ b/protocol/migrations/migrations.go @@ -90,6 +90,7 @@ // 1683725607_mark_discord_messages_as_seen.up.sql (108B) // 1684174617_add_url_previews_to_user_messages.up.sql (58B) // 1684175608_add_token_balances.up.sql (467B) +// 1684979808_sync_activity_center_notifications.up.sql (169B) // README.md (554B) // doc.go (850B) @@ -175,7 +176,7 @@ func _000001_initDownDbSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "000001_init.down.db.sql", size: 65, mode: os.FileMode(0644), modTime: time.Unix(1607354881, 0)} + info := bindataFileInfo{name: "000001_init.down.db.sql", size: 65, mode: os.FileMode(0644), modTime: time.Unix(1645429416, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x5e, 0xbb, 0x3f, 0x1, 0x75, 0x19, 0x70, 0x86, 0xa7, 0x34, 0x40, 0x17, 0x34, 0x3e, 0x18, 0x51, 0x79, 0xd4, 0x22, 0xad, 0x8f, 0x80, 0xcc, 0xa6, 0xcc, 0x6, 0x2b, 0x62, 0x2, 0x47, 0xba, 0xf9}} return a, nil } @@ -195,7 +196,7 @@ func _000001_initUpDbSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "000001_init.up.db.sql", size: 2719, mode: os.FileMode(0644), modTime: time.Unix(1607354881, 0)} + info := bindataFileInfo{name: "000001_init.up.db.sql", size: 2719, mode: os.FileMode(0644), modTime: time.Unix(1645429416, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x60, 0xdc, 0xeb, 0xe, 0xc2, 0x4f, 0x75, 0xa, 0xf6, 0x3e, 0xc7, 0xc4, 0x4, 0xe2, 0xe1, 0xa4, 0x73, 0x2f, 0x4a, 0xad, 0x1a, 0x0, 0xc3, 0x93, 0x9d, 0x77, 0x3e, 0x31, 0x91, 0x77, 0x2e, 0xc8}} return a, nil } @@ -215,7 +216,7 @@ func _000002_add_last_ens_clock_valueUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "000002_add_last_ens_clock_value.up.sql", size: 77, mode: os.FileMode(0644), modTime: time.Unix(1607354881, 0)} + info := bindataFileInfo{name: "000002_add_last_ens_clock_value.up.sql", size: 77, mode: os.FileMode(0644), modTime: time.Unix(1645429416, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x4d, 0x3, 0x8f, 0xd5, 0x85, 0x83, 0x47, 0xbe, 0xf9, 0x82, 0x7e, 0x81, 0xa4, 0xbd, 0xaa, 0xd5, 0x98, 0x18, 0x5, 0x2d, 0x82, 0x42, 0x3b, 0x3, 0x50, 0xc3, 0x1e, 0x84, 0x35, 0xf, 0xb6, 0x2b}} return a, nil } @@ -235,7 +236,7 @@ func _1586358095_add_replaceUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1586358095_add_replace.up.sql", size: 224, mode: os.FileMode(0644), modTime: time.Unix(1607354881, 0)} + info := bindataFileInfo{name: "1586358095_add_replace.up.sql", size: 224, mode: os.FileMode(0644), modTime: time.Unix(1645429416, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd2, 0xb3, 0xa9, 0xc7, 0x7f, 0x9d, 0x8f, 0x43, 0x8c, 0x9e, 0x58, 0x8d, 0x44, 0xbc, 0xfa, 0x6b, 0x5f, 0x3f, 0x5a, 0xbe, 0xe8, 0xb1, 0x16, 0xf, 0x91, 0x2a, 0xa0, 0x71, 0xbb, 0x8d, 0x6b, 0xcb}} return a, nil } @@ -255,7 +256,7 @@ func _1588665364_add_image_dataUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1588665364_add_image_data.up.sql", size: 186, mode: os.FileMode(0644), modTime: time.Unix(1607354881, 0)} + info := bindataFileInfo{name: "1588665364_add_image_data.up.sql", size: 186, mode: os.FileMode(0644), modTime: time.Unix(1645429416, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd6, 0xc6, 0x35, 0xb4, 0x4c, 0x39, 0x96, 0x29, 0x30, 0xda, 0xf4, 0x8f, 0xcb, 0xf1, 0x9f, 0x84, 0xdc, 0x88, 0xd4, 0xd5, 0xbc, 0xb6, 0x5b, 0x46, 0x78, 0x67, 0x76, 0x1a, 0x5, 0x36, 0xdc, 0xe5}} return a, nil } @@ -275,7 +276,7 @@ func _1589365189_add_pow_targetUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1589365189_add_pow_target.up.sql", size: 66, mode: os.FileMode(0644), modTime: time.Unix(1607354881, 0)} + info := bindataFileInfo{name: "1589365189_add_pow_target.up.sql", size: 66, mode: os.FileMode(0644), modTime: time.Unix(1645429416, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x4e, 0x3a, 0xe2, 0x2e, 0x7d, 0xaf, 0xbb, 0xcc, 0x21, 0xa1, 0x7a, 0x41, 0x9a, 0xd0, 0xbb, 0xa9, 0xc8, 0x35, 0xf9, 0x32, 0x34, 0x46, 0x44, 0x9a, 0x86, 0x40, 0x7c, 0xb9, 0x23, 0xc7, 0x3, 0x3f}} return a, nil } @@ -295,7 +296,7 @@ func _1591277220_add_index_messagesUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1591277220_add_index_messages.up.sql", size: 240, mode: os.FileMode(0644), modTime: time.Unix(1607354881, 0)} + info := bindataFileInfo{name: "1591277220_add_index_messages.up.sql", size: 240, mode: os.FileMode(0644), modTime: time.Unix(1645429416, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x9c, 0xfe, 0xbe, 0xd5, 0xb8, 0x8f, 0xdd, 0xef, 0xbb, 0xa8, 0xad, 0x7f, 0xed, 0x5b, 0x5b, 0x2f, 0xe6, 0x82, 0x27, 0x78, 0x1f, 0xb9, 0x57, 0xdc, 0x8, 0xc2, 0xb2, 0xa9, 0x9a, 0x4, 0xe1, 0x7a}} return a, nil } @@ -315,7 +316,7 @@ func _1593087212_add_mute_chat_and_raw_message_fieldsUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1593087212_add_mute_chat_and_raw_message_fields.up.sql", size: 215, mode: os.FileMode(0644), modTime: time.Unix(1607354881, 0)} + info := bindataFileInfo{name: "1593087212_add_mute_chat_and_raw_message_fields.up.sql", size: 215, mode: os.FileMode(0644), modTime: time.Unix(1645429416, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x73, 0x99, 0x61, 0xd1, 0xaa, 0xb4, 0xbf, 0xaf, 0xd7, 0x20, 0x17, 0x40, 0xf9, 0x2, 0xfb, 0xcc, 0x40, 0x2a, 0xd, 0x86, 0x36, 0x30, 0x88, 0x89, 0x25, 0x80, 0x42, 0xb0, 0x5b, 0xe9, 0x73, 0x78}} return a, nil } @@ -335,7 +336,7 @@ func _1595862781_add_audio_dataUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1595862781_add_audio_data.up.sql", size: 246, mode: os.FileMode(0644), modTime: time.Unix(1607354881, 0)} + info := bindataFileInfo{name: "1595862781_add_audio_data.up.sql", size: 246, mode: os.FileMode(0644), modTime: time.Unix(1645429416, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xae, 0xd2, 0xee, 0x55, 0xfb, 0x36, 0xa4, 0x92, 0x66, 0xe, 0x81, 0x62, 0x1e, 0x7a, 0x69, 0xa, 0xd5, 0x4b, 0xa5, 0x6a, 0x8d, 0x1d, 0xce, 0xf3, 0x3e, 0xc0, 0x5f, 0x9c, 0x66, 0x1b, 0xb4, 0xed}} return a, nil } @@ -355,7 +356,7 @@ func _1595865249_create_emoji_reactions_tableUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1595865249_create_emoji_reactions_table.up.sql", size: 300, mode: os.FileMode(0644), modTime: time.Unix(1607354881, 0)} + info := bindataFileInfo{name: "1595865249_create_emoji_reactions_table.up.sql", size: 300, mode: os.FileMode(0644), modTime: time.Unix(1645429416, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3e, 0xc5, 0x43, 0x5c, 0x3d, 0x53, 0x43, 0x2c, 0x1a, 0xa5, 0xb6, 0xbf, 0x7, 0x4, 0x5a, 0x3e, 0x40, 0x8b, 0xa4, 0x57, 0x12, 0x58, 0xbc, 0x42, 0xe2, 0xc3, 0xde, 0x76, 0x98, 0x80, 0xe2, 0xbe}} return a, nil } @@ -375,7 +376,7 @@ func _1596805115_create_group_chat_invitations_tableUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1596805115_create_group_chat_invitations_table.up.sql", size: 231, mode: os.FileMode(0644), modTime: time.Unix(1607354881, 0)} + info := bindataFileInfo{name: "1596805115_create_group_chat_invitations_table.up.sql", size: 231, mode: os.FileMode(0644), modTime: time.Unix(1645429416, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x6d, 0xb1, 0x14, 0x6d, 0x54, 0x28, 0x67, 0xc3, 0x23, 0x6a, 0xfc, 0x80, 0xdf, 0x9e, 0x4c, 0x35, 0x36, 0xf, 0xf8, 0xf3, 0x5f, 0xae, 0xad, 0xb, 0xc1, 0x51, 0x8e, 0x17, 0x7, 0xe5, 0x7f, 0x91}} return a, nil } @@ -395,7 +396,7 @@ func _1597322655_add_invitation_admin_chat_fieldUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1597322655_add_invitation_admin_chat_field.up.sql", size: 54, mode: os.FileMode(0644), modTime: time.Unix(1607354881, 0)} + info := bindataFileInfo{name: "1597322655_add_invitation_admin_chat_field.up.sql", size: 54, mode: os.FileMode(0644), modTime: time.Unix(1645429416, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa9, 0x7a, 0xa0, 0xf2, 0xdb, 0x13, 0x91, 0x91, 0xa8, 0x34, 0x1a, 0xa1, 0x49, 0x68, 0xd5, 0xae, 0x2c, 0xd8, 0xd5, 0xea, 0x8f, 0x8c, 0xc7, 0x2, 0x4e, 0x58, 0x2c, 0x3a, 0x14, 0xd4, 0x4f, 0x2c}} return a, nil } @@ -415,7 +416,7 @@ func _1597757544_add_nicknameUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1597757544_add_nickname.up.sql", size: 52, mode: os.FileMode(0644), modTime: time.Unix(1607354881, 0)} + info := bindataFileInfo{name: "1597757544_add_nickname.up.sql", size: 52, mode: os.FileMode(0644), modTime: time.Unix(1645429416, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf4, 0xa2, 0x64, 0x50, 0xc5, 0x4, 0xb9, 0x8b, 0xd1, 0x18, 0x9b, 0xc3, 0x91, 0x36, 0x2a, 0x1f, 0xc3, 0x6c, 0x2d, 0x92, 0xf8, 0x5e, 0xff, 0xb1, 0x59, 0x61, 0x2, 0x1c, 0xe1, 0x85, 0x90, 0xa4}} return a, nil } @@ -435,7 +436,7 @@ func _1598955122_add_mentionsUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1598955122_add_mentions.up.sql", size: 52, mode: os.FileMode(0644), modTime: time.Unix(1607354881, 0)} + info := bindataFileInfo{name: "1598955122_add_mentions.up.sql", size: 52, mode: os.FileMode(0644), modTime: time.Unix(1645429416, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x8d, 0x22, 0x17, 0x92, 0xd2, 0x11, 0x4e, 0x7, 0x93, 0x9a, 0x55, 0xfd, 0xb, 0x97, 0xc4, 0x63, 0x6a, 0x81, 0x97, 0xcd, 0xb2, 0xf8, 0x4b, 0x5f, 0x3c, 0xfa, 0x3a, 0x38, 0x53, 0x10, 0xed, 0x9d}} return a, nil } @@ -455,7 +456,7 @@ func _1599641390_add_emoji_reactions_indexUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1599641390_add_emoji_reactions_index.up.sql", size: 126, mode: os.FileMode(0644), modTime: time.Unix(1607354881, 0)} + info := bindataFileInfo{name: "1599641390_add_emoji_reactions_index.up.sql", size: 126, mode: os.FileMode(0644), modTime: time.Unix(1645429416, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf9, 0xd8, 0xdc, 0xa7, 0xb, 0x92, 0x7a, 0x61, 0x37, 0x24, 0x1c, 0x77, 0x5e, 0xe, 0x7e, 0xfc, 0x9f, 0x98, 0x7b, 0x65, 0xe7, 0xf9, 0x71, 0x57, 0x89, 0x2d, 0x90, 0x1b, 0xf6, 0x5e, 0x37, 0xe8}} return a, nil } @@ -475,7 +476,7 @@ func _1599720851_add_seen_index_remove_long_messagesUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1599720851_add_seen_index_remove_long_messages.up.sql", size: 150, mode: os.FileMode(0644), modTime: time.Unix(1607354881, 0)} + info := bindataFileInfo{name: "1599720851_add_seen_index_remove_long_messages.up.sql", size: 150, mode: os.FileMode(0644), modTime: time.Unix(1645429416, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x24, 0x1c, 0xc4, 0x78, 0x91, 0xc7, 0xeb, 0xfe, 0xc8, 0xa0, 0xd8, 0x13, 0x27, 0x97, 0xc8, 0x96, 0x56, 0x97, 0x33, 0x2c, 0x1e, 0x16, 0x8a, 0xd3, 0x49, 0x99, 0x3, 0xe9, 0xbb, 0xc4, 0x5, 0x3c}} return a, nil } @@ -495,7 +496,7 @@ func _1603198582_add_profile_chat_fieldUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1603198582_add_profile_chat_field.up.sql", size: 45, mode: os.FileMode(0644), modTime: time.Unix(1607354881, 0)} + info := bindataFileInfo{name: "1603198582_add_profile_chat_field.up.sql", size: 45, mode: os.FileMode(0644), modTime: time.Unix(1645429416, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xaa, 0xca, 0xe, 0x46, 0xa0, 0x9, 0x9d, 0x47, 0x57, 0xe9, 0xfb, 0x17, 0xeb, 0x9c, 0xf6, 0xb8, 0x1d, 0xe9, 0xd, 0x0, 0xd5, 0xe5, 0xd8, 0x9e, 0x60, 0xa, 0xbf, 0x32, 0x2c, 0x52, 0x7f, 0x6a}} return a, nil } @@ -515,7 +516,7 @@ func _1603816533_add_linksUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1603816533_add_links.up.sql", size: 48, mode: os.FileMode(0644), modTime: time.Unix(1607354881, 0)} + info := bindataFileInfo{name: "1603816533_add_links.up.sql", size: 48, mode: os.FileMode(0644), modTime: time.Unix(1645429416, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc9, 0x24, 0xd6, 0x1d, 0xa, 0x83, 0x1e, 0x4d, 0xf, 0xae, 0x4d, 0x8c, 0x51, 0x32, 0xa8, 0x37, 0xb0, 0x14, 0xfb, 0x32, 0x34, 0xc8, 0xc, 0x4e, 0x5b, 0xc5, 0x15, 0x65, 0x73, 0x0, 0x0, 0x1d}} return a, nil } @@ -535,7 +536,7 @@ func _1603888149_create_chat_identity_last_published_tableUpSql() (*asset, error return nil, err } - info := bindataFileInfo{name: "1603888149_create_chat_identity_last_published_table.up.sql", size: 407, mode: os.FileMode(0644), modTime: time.Unix(1608652331, 0)} + info := bindataFileInfo{name: "1603888149_create_chat_identity_last_published_table.up.sql", size: 407, mode: os.FileMode(0644), modTime: time.Unix(1645429416, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x7f, 0x9, 0xf, 0xfb, 0xdb, 0x3c, 0x86, 0x70, 0x82, 0xda, 0x10, 0x25, 0xe2, 0x4e, 0x40, 0x45, 0xab, 0x8b, 0x1c, 0x91, 0x7c, 0xf1, 0x70, 0x2e, 0x81, 0xf3, 0x71, 0x45, 0xda, 0xe2, 0xa4, 0x57}} return a, nil } @@ -555,7 +556,7 @@ func _1605075346_add_communitiesUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1605075346_add_communities.up.sql", size: 6971, mode: os.FileMode(0644), modTime: time.Unix(1610388501, 0)} + info := bindataFileInfo{name: "1605075346_add_communities.up.sql", size: 6971, mode: os.FileMode(0644), modTime: time.Unix(1645429416, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1f, 0x64, 0xea, 0xb4, 0xae, 0x9e, 0xdb, 0x9, 0x58, 0xb6, 0x5c, 0x7a, 0x50, 0xc5, 0xfe, 0x93, 0x5d, 0x36, 0x85, 0x5d, 0x6a, 0xba, 0xc9, 0x7e, 0x84, 0xd7, 0xbf, 0x2a, 0x53, 0xf3, 0x97, 0xf1}} return a, nil } @@ -575,7 +576,7 @@ func _1610117927_add_message_cacheUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1610117927_add_message_cache.up.sql", size: 142, mode: os.FileMode(0644), modTime: time.Unix(1611563400, 0)} + info := bindataFileInfo{name: "1610117927_add_message_cache.up.sql", size: 142, mode: os.FileMode(0644), modTime: time.Unix(1645429416, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x34, 0xf1, 0xf0, 0x82, 0x79, 0x28, 0x19, 0xc2, 0x39, 0x6a, 0xa5, 0x96, 0x59, 0x23, 0xa0, 0xed, 0x60, 0x58, 0x86, 0x9, 0xb9, 0xad, 0xfb, 0xa, 0xe3, 0x47, 0x6e, 0xa1, 0x18, 0xe8, 0x39, 0x2c}} return a, nil } @@ -595,7 +596,7 @@ func _1610959908_add_dont_wrap_to_raw_messagesUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1610959908_add_dont_wrap_to_raw_messages.up.sql", size: 83, mode: os.FileMode(0644), modTime: time.Unix(1611825589, 0)} + info := bindataFileInfo{name: "1610959908_add_dont_wrap_to_raw_messages.up.sql", size: 83, mode: os.FileMode(0644), modTime: time.Unix(1645429416, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x71, 0x2, 0x9a, 0xca, 0xd4, 0x38, 0x44, 0x30, 0x2b, 0xa8, 0x27, 0x32, 0x63, 0x53, 0x22, 0x60, 0x59, 0x84, 0x23, 0x96, 0x77, 0xf0, 0x56, 0xd7, 0x94, 0xe0, 0x95, 0x28, 0x6, 0x1d, 0x4e, 0xb1}} return a, nil } @@ -615,7 +616,7 @@ func _1610960912_add_send_on_personal_topicUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1610960912_add_send_on_personal_topic.up.sql", size: 82, mode: os.FileMode(0644), modTime: time.Unix(1611825589, 0)} + info := bindataFileInfo{name: "1610960912_add_send_on_personal_topic.up.sql", size: 82, mode: os.FileMode(0644), modTime: time.Unix(1645429416, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x77, 0xac, 0x2f, 0xc4, 0xd, 0xa7, 0x1b, 0x37, 0x30, 0xc2, 0x68, 0xee, 0xde, 0x54, 0x5e, 0xbf, 0x3f, 0xa0, 0xd6, 0xc6, 0x9f, 0xd4, 0x34, 0x12, 0x76, 0x1e, 0x66, 0x4a, 0xfc, 0xf, 0xee, 0xc9}} return a, nil } @@ -635,7 +636,7 @@ func _1612870480_add_datasync_idUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1612870480_add_datasync_id.up.sql", size: 111, mode: os.FileMode(0644), modTime: time.Unix(1614251236, 0)} + info := bindataFileInfo{name: "1612870480_add_datasync_id.up.sql", size: 111, mode: os.FileMode(0644), modTime: time.Unix(1645666387, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x34, 0x9a, 0xbc, 0xfa, 0xaa, 0x8c, 0x9c, 0x37, 0x67, 0x15, 0x9c, 0x7e, 0x78, 0x75, 0x66, 0x82, 0x18, 0x72, 0x10, 0xbc, 0xd4, 0xab, 0x44, 0xfe, 0x57, 0x85, 0x6d, 0x19, 0xf5, 0x96, 0x8a, 0xbe}} return a, nil } @@ -655,7 +656,7 @@ func _1614152139_add_communities_request_to_joinUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1614152139_add_communities_request_to_join.up.sql", size: 831, mode: os.FileMode(0644), modTime: time.Unix(1614608661, 0)} + info := bindataFileInfo{name: "1614152139_add_communities_request_to_join.up.sql", size: 831, mode: os.FileMode(0644), modTime: time.Unix(1645666387, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x11, 0x3, 0x26, 0xf9, 0x29, 0x50, 0x4f, 0xcd, 0x46, 0xe5, 0xb1, 0x6b, 0xb9, 0x2, 0x40, 0xb1, 0xdf, 0x4a, 0x4c, 0x7a, 0xda, 0x3, 0x35, 0xcd, 0x2d, 0xcc, 0x80, 0x7d, 0x57, 0x5f, 0x3, 0x5c}} return a, nil } @@ -675,7 +676,7 @@ func _1615374373_add_confirmationsUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1615374373_add_confirmations.up.sql", size: 227, mode: os.FileMode(0644), modTime: time.Unix(1615904318, 0)} + info := bindataFileInfo{name: "1615374373_add_confirmations.up.sql", size: 227, mode: os.FileMode(0644), modTime: time.Unix(1645666387, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xdd, 0xa6, 0x65, 0xc5, 0x1d, 0xb2, 0x77, 0x36, 0xe3, 0x79, 0xda, 0xe8, 0x7a, 0xa4, 0xdf, 0x45, 0xae, 0xd8, 0xb4, 0xba, 0x90, 0xfd, 0x74, 0x71, 0x14, 0x75, 0x73, 0x72, 0xb9, 0x9e, 0x1, 0x81}} return a, nil } @@ -695,7 +696,7 @@ func _1617694931_add_notification_centerUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1617694931_add_notification_center.up.sql", size: 572, mode: os.FileMode(0644), modTime: time.Unix(1618824585, 0)} + info := bindataFileInfo{name: "1617694931_add_notification_center.up.sql", size: 572, mode: os.FileMode(0644), modTime: time.Unix(1645666387, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x10, 0x45, 0xc6, 0xc9, 0x73, 0xbb, 0x1f, 0xda, 0xa3, 0x4d, 0x19, 0x98, 0x85, 0x2d, 0xca, 0xda, 0xcc, 0x3b, 0x32, 0xff, 0xc7, 0x7b, 0xe3, 0x9f, 0x9b, 0x2a, 0x93, 0xf5, 0xdf, 0x65, 0x38, 0x91}} return a, nil } @@ -715,7 +716,7 @@ func _1618923660_create_pin_messagesUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1618923660_create_pin_messages.up.sql", size: 265, mode: os.FileMode(0644), modTime: time.Unix(1621413223, 0)} + info := bindataFileInfo{name: "1618923660_create_pin_messages.up.sql", size: 265, mode: os.FileMode(0644), modTime: time.Unix(1645666387, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x61, 0x44, 0x3a, 0xbe, 0x30, 0xd2, 0x7e, 0xc0, 0xe2, 0x8e, 0x65, 0x53, 0x54, 0xbb, 0x7a, 0x1c, 0xb3, 0x5d, 0xd2, 0xa6, 0xa9, 0x28, 0xb7, 0xa4, 0x5f, 0x8b, 0x9, 0x5f, 0x17, 0xc1, 0x85, 0x21}} return a, nil } @@ -735,7 +736,7 @@ func _1619094007_add_joined_chat_fieldUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1619094007_add_joined_chat_field.up.sql", size: 101, mode: os.FileMode(0644), modTime: time.Unix(1621413223, 0)} + info := bindataFileInfo{name: "1619094007_add_joined_chat_field.up.sql", size: 101, mode: os.FileMode(0644), modTime: time.Unix(1645666387, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xfa, 0x30, 0x81, 0x3a, 0x2f, 0x9f, 0xb3, 0x0, 0x55, 0x8e, 0x1d, 0xa8, 0xb0, 0x68, 0xf0, 0x40, 0x1a, 0x6c, 0xaa, 0xfc, 0x33, 0xd1, 0xd1, 0x55, 0x3f, 0xf2, 0xbd, 0x54, 0xa1, 0x2b, 0x40, 0x95}} return a, nil } @@ -755,7 +756,7 @@ func _1619099821_add_last_synced_fieldUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1619099821_add_last_synced_field.up.sql", size: 226, mode: os.FileMode(0644), modTime: time.Unix(1621576592, 0)} + info := bindataFileInfo{name: "1619099821_add_last_synced_field.up.sql", size: 226, mode: os.FileMode(0644), modTime: time.Unix(1645666387, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf, 0x52, 0x22, 0xe, 0x2f, 0xd7, 0x93, 0x5f, 0x42, 0xc2, 0x93, 0x4, 0x35, 0x6f, 0xc9, 0x19, 0xed, 0x6b, 0x52, 0x6f, 0xae, 0x99, 0xe2, 0x68, 0x3d, 0x4f, 0x40, 0xe, 0xe1, 0xa, 0x47, 0x21}} return a, nil } @@ -775,7 +776,7 @@ func _1621933219_add_mentionedUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1621933219_add_mentioned.up.sql", size: 70, mode: os.FileMode(0644), modTime: time.Unix(1623420243, 0)} + info := bindataFileInfo{name: "1621933219_add_mentioned.up.sql", size: 70, mode: os.FileMode(0644), modTime: time.Unix(1645666387, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x36, 0x76, 0x8a, 0xc9, 0x7, 0x8f, 0xa5, 0xcb, 0x12, 0x21, 0x4e, 0xfe, 0x96, 0x77, 0xcf, 0x7f, 0x76, 0x75, 0x36, 0x2c, 0xf8, 0x1d, 0x13, 0xcb, 0xcd, 0x6e, 0x70, 0xbf, 0xf5, 0x93, 0x67, 0xd1}} return a, nil } @@ -795,7 +796,7 @@ func _1622010048_add_unviewed_mentions_countUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1622010048_add_unviewed_mentions_count.up.sql", size: 114, mode: os.FileMode(0644), modTime: time.Unix(1623420243, 0)} + info := bindataFileInfo{name: "1622010048_add_unviewed_mentions_count.up.sql", size: 114, mode: os.FileMode(0644), modTime: time.Unix(1645666387, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x7c, 0x16, 0x85, 0xa6, 0x5b, 0xe1, 0x66, 0xb9, 0x84, 0xbe, 0x7f, 0xa, 0x77, 0x23, 0xb9, 0xef, 0x8e, 0x2, 0x8, 0xfc, 0x61, 0xb2, 0x43, 0xa9, 0x63, 0xae, 0xb4, 0xdf, 0x30, 0xb1, 0x61, 0x4b}} return a, nil } @@ -815,7 +816,7 @@ func _1622061278_add_message_activity_center_notification_fieldUpSql() (*asset, return nil, err } - info := bindataFileInfo{name: "1622061278_add_message_activity_center_notification_field.up.sql", size: 80, mode: os.FileMode(0644), modTime: time.Unix(1623420243, 0)} + info := bindataFileInfo{name: "1622061278_add_message_activity_center_notification_field.up.sql", size: 80, mode: os.FileMode(0644), modTime: time.Unix(1645666387, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x8, 0xc, 0xa6, 0x1f, 0xa5, 0xc6, 0x7c, 0x6f, 0xab, 0x2c, 0x2d, 0xb5, 0xa4, 0xdd, 0xc1, 0xd6, 0x44, 0x83, 0xf9, 0xb1, 0xa5, 0xce, 0x34, 0x3d, 0x2, 0xa9, 0x35, 0xcf, 0xc6, 0xb2, 0x43, 0x37}} return a, nil } @@ -835,7 +836,7 @@ func _1622464518_set_synced_to_fromUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1622464518_set_synced_to_from.up.sql", size: 105, mode: os.FileMode(0644), modTime: time.Unix(1623420243, 0)} + info := bindataFileInfo{name: "1622464518_set_synced_to_from.up.sql", size: 105, mode: os.FileMode(0644), modTime: time.Unix(1645666387, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x33, 0x3e, 0x2b, 0xa, 0x1e, 0xc7, 0x6d, 0x6f, 0xd1, 0x1d, 0xe8, 0x4b, 0xdd, 0x92, 0x76, 0xea, 0xf2, 0x3e, 0x15, 0x85, 0xc4, 0xc3, 0x31, 0xf1, 0xc0, 0xa2, 0xd7, 0x47, 0xde, 0x4e, 0xfd, 0xc6}} return a, nil } @@ -855,7 +856,7 @@ func _1622464519_add_chat_descriptionUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1622464519_add_chat_description.up.sql", size: 93, mode: os.FileMode(0644), modTime: time.Unix(1623420243, 0)} + info := bindataFileInfo{name: "1622464519_add_chat_description.up.sql", size: 93, mode: os.FileMode(0644), modTime: time.Unix(1645666387, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x36, 0x2e, 0x89, 0x31, 0xec, 0xef, 0xeb, 0x43, 0xf5, 0x96, 0x6d, 0xce, 0x91, 0x8a, 0x37, 0x2a, 0x11, 0x7a, 0x3f, 0xd9, 0x10, 0xbb, 0xa1, 0xbc, 0x7, 0xe0, 0x3b, 0xa5, 0xf4, 0xa6, 0xf4, 0xa1}} return a, nil } @@ -875,7 +876,7 @@ func _1622622253_add_pinned_by_to_pin_messagesUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1622622253_add_pinned_by_to_pin_messages.up.sql", size: 52, mode: os.FileMode(0644), modTime: time.Unix(1623420243, 0)} + info := bindataFileInfo{name: "1622622253_add_pinned_by_to_pin_messages.up.sql", size: 52, mode: os.FileMode(0644), modTime: time.Unix(1645666387, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x9b, 0x94, 0xa3, 0x45, 0x91, 0x1e, 0x66, 0xd1, 0x96, 0x5a, 0xaf, 0xfa, 0x29, 0x39, 0xa8, 0x3a, 0x97, 0x4c, 0x65, 0x6, 0x96, 0x90, 0x4c, 0xfe, 0xce, 0x7d, 0x5d, 0xd4, 0xb3, 0x8, 0x6d, 0x5f}} return a, nil } @@ -895,7 +896,7 @@ func _1623938329_add_author_activity_center_notification_fieldUpSql() (*asset, e return nil, err } - info := bindataFileInfo{name: "1623938329_add_author_activity_center_notification_field.up.sql", size: 66, mode: os.FileMode(0644), modTime: time.Unix(1624017080, 0)} + info := bindataFileInfo{name: "1623938329_add_author_activity_center_notification_field.up.sql", size: 66, mode: os.FileMode(0644), modTime: time.Unix(1645666387, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x36, 0xe6, 0xa7, 0xd5, 0x26, 0xff, 0xab, 0x92, 0x88, 0xf0, 0xd3, 0x34, 0xd9, 0x2f, 0xe7, 0x18, 0x1a, 0x40, 0xf9, 0xbe, 0x8e, 0xfc, 0xd0, 0x4f, 0x1f, 0x4a, 0xb9, 0x83, 0x3f, 0xa9, 0xde, 0xb}} return a, nil } @@ -915,7 +916,7 @@ func _1623938330_add_edit_messagesUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1623938330_add_edit_messages.up.sql", size: 369, mode: os.FileMode(0644), modTime: time.Unix(1628358694, 0)} + info := bindataFileInfo{name: "1623938330_add_edit_messages.up.sql", size: 369, mode: os.FileMode(0644), modTime: time.Unix(1645666387, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x7e, 0xd2, 0xce, 0xe, 0x5c, 0x19, 0xbe, 0x5e, 0x29, 0xbe, 0x9b, 0x31, 0x53, 0x76, 0xb2, 0xc8, 0x56, 0xf0, 0x82, 0xfe, 0x7d, 0x6c, 0xe8, 0x5c, 0xe9, 0x7a, 0x5d, 0x5, 0xc4, 0x92, 0x38, 0xe3}} return a, nil } @@ -935,7 +936,7 @@ func _1624978434_add_muted_communityUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1624978434_add_muted_community.up.sql", size: 82, mode: os.FileMode(0644), modTime: time.Unix(1628358694, 0)} + info := bindataFileInfo{name: "1624978434_add_muted_community.up.sql", size: 82, mode: os.FileMode(0644), modTime: time.Unix(1645666387, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x6, 0xdc, 0x6e, 0x6f, 0x97, 0xc7, 0x3d, 0x50, 0xab, 0x80, 0x87, 0x44, 0x43, 0x38, 0xe6, 0xc5, 0xc1, 0x91, 0x26, 0xf, 0x16, 0xe, 0xd9, 0x32, 0x37, 0x25, 0x96, 0x25, 0x6, 0xc8, 0xb5, 0x4a}} return a, nil } @@ -955,7 +956,7 @@ func _1625018910_add_repply_message_activity_center_notification_fieldUpSql() (* return nil, err } - info := bindataFileInfo{name: "1625018910_add_repply_message_activity_center_notification_field.up.sql", size: 86, mode: os.FileMode(0644), modTime: time.Unix(1628358694, 0)} + info := bindataFileInfo{name: "1625018910_add_repply_message_activity_center_notification_field.up.sql", size: 86, mode: os.FileMode(0644), modTime: time.Unix(1645666387, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf2, 0x52, 0x12, 0x40, 0xd8, 0x6f, 0x71, 0x97, 0x46, 0x39, 0xaa, 0x74, 0x41, 0xcd, 0x45, 0x4c, 0xe8, 0xd9, 0xe2, 0x56, 0x8e, 0x78, 0x18, 0x62, 0xf6, 0xa8, 0x36, 0xe9, 0x9a, 0x1f, 0xc, 0xb1}} return a, nil } @@ -975,7 +976,7 @@ func _1625762506_add_deleted_messagesUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1625762506_add_deleted_messages.up.sql", size: 357, mode: os.FileMode(0644), modTime: time.Unix(1628358701, 0)} + info := bindataFileInfo{name: "1625762506_add_deleted_messages.up.sql", size: 357, mode: os.FileMode(0644), modTime: time.Unix(1645666387, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd5, 0x61, 0x42, 0xb6, 0x8c, 0x7f, 0x2d, 0xec, 0xa9, 0x6d, 0x3d, 0x0, 0xa3, 0x32, 0xd8, 0x4a, 0x38, 0x5c, 0x97, 0xfc, 0x68, 0xde, 0xa9, 0xb7, 0xd8, 0xde, 0xb, 0x29, 0x93, 0xdc, 0x81, 0xf8}} return a, nil } @@ -995,7 +996,7 @@ func _1627388946_add_communities_synced_atUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1627388946_add_communities_synced_at.up.sql", size: 87, mode: os.FileMode(0644), modTime: time.Unix(1628358701, 0)} + info := bindataFileInfo{name: "1627388946_add_communities_synced_at.up.sql", size: 87, mode: os.FileMode(0644), modTime: time.Unix(1645666387, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc1, 0xbd, 0x9b, 0x6a, 0xc9, 0x1a, 0x7a, 0x34, 0xcf, 0x5f, 0x80, 0x9e, 0x8c, 0x1c, 0xc0, 0xec, 0x4e, 0x78, 0xb0, 0x2d, 0x15, 0x77, 0x38, 0x4a, 0x6a, 0x5, 0x84, 0xf5, 0x8d, 0x8b, 0xbe, 0x9}} return a, nil } @@ -1015,7 +1016,7 @@ func _1628280060_createUsermessagesIndexSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1628280060_create-usermessages-index.sql", size: 80, mode: os.FileMode(0644), modTime: time.Unix(1628783235, 0)} + info := bindataFileInfo{name: "1628280060_create-usermessages-index.sql", size: 80, mode: os.FileMode(0644), modTime: time.Unix(1645666387, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x10, 0x6f, 0x70, 0x47, 0x40, 0xab, 0xa8, 0x60, 0xe0, 0xf9, 0x8, 0x7e, 0x19, 0x9d, 0xba, 0x33, 0x16, 0xfc, 0x3c, 0xdc, 0xa8, 0xa6, 0x53, 0x61, 0x39, 0x82, 0x91, 0xcf, 0x69, 0xd8, 0xf2, 0xcf}} return a, nil } @@ -1035,7 +1036,7 @@ func _1632303896_modify_contacts_tableUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1632303896_modify_contacts_table.up.sql", size: 1574, mode: os.FileMode(0644), modTime: time.Unix(1633515512, 0)} + info := bindataFileInfo{name: "1632303896_modify_contacts_table.up.sql", size: 1574, mode: os.FileMode(0644), modTime: time.Unix(1645666387, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x81, 0x1e, 0x6c, 0x3c, 0xd, 0xd7, 0x7d, 0xbb, 0x19, 0xbc, 0xe4, 0x7, 0xfd, 0xf8, 0x66, 0x6d, 0x78, 0xf6, 0x4, 0xe6, 0x51, 0xe4, 0xe6, 0xdc, 0xe, 0x5a, 0x2e, 0xac, 0xe6, 0xe7, 0x24, 0x69}} return a, nil } @@ -1055,7 +1056,7 @@ func _1633349838_add_emoji_column_in_chatsUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1633349838_add_emoji_column_in_chats.up.sql", size: 52, mode: os.FileMode(0644), modTime: time.Unix(1633515512, 0)} + info := bindataFileInfo{name: "1633349838_add_emoji_column_in_chats.up.sql", size: 52, mode: os.FileMode(0644), modTime: time.Unix(1645666387, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xcb, 0x33, 0xcb, 0x3b, 0xa9, 0x99, 0x77, 0x6a, 0xea, 0xc4, 0x39, 0xd7, 0xa1, 0x49, 0xa7, 0xdf, 0xff, 0x72, 0xda, 0x34, 0x21, 0x67, 0x66, 0xca, 0x65, 0x46, 0x1, 0xa6, 0x4e, 0xf9, 0x38, 0x86}} return a, nil } @@ -1075,7 +1076,7 @@ func _1634831235_add_highlight_column_in_chatsUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1634831235_add_highlight_column_in_chats.up.sql", size: 62, mode: os.FileMode(0644), modTime: time.Unix(1635162188, 0)} + info := bindataFileInfo{name: "1634831235_add_highlight_column_in_chats.up.sql", size: 62, mode: os.FileMode(0644), modTime: time.Unix(1645666387, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xaa, 0x63, 0x5c, 0x73, 0x19, 0x83, 0xbd, 0x35, 0x80, 0x9f, 0x66, 0xec, 0x4c, 0xbc, 0x9d, 0x2d, 0x52, 0x91, 0x6d, 0xb3, 0x2b, 0x87, 0xde, 0x24, 0x46, 0x5c, 0xd, 0xfd, 0x78, 0xf5, 0xe3, 0xe9}} return a, nil } @@ -1095,7 +1096,7 @@ func _1634896007_add_last_updated_locally_and_removedUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1634896007_add_last_updated_locally_and_removed.up.sql", size: 131, mode: os.FileMode(0644), modTime: time.Unix(1637051072, 0)} + info := bindataFileInfo{name: "1634896007_add_last_updated_locally_and_removed.up.sql", size: 131, mode: os.FileMode(0644), modTime: time.Unix(1645666387, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x2e, 0xa8, 0x34, 0xe2, 0xc0, 0x62, 0xc8, 0xd6, 0x5a, 0x87, 0xe3, 0x70, 0xe1, 0xc4, 0x16, 0x9c, 0x60, 0x2e, 0x98, 0xf0, 0x91, 0x84, 0xbe, 0xe0, 0xdf, 0x3e, 0x4d, 0x24, 0xc4, 0x6c, 0x40, 0x17}} return a, nil } @@ -1115,7 +1116,7 @@ func _1635840039_add_clock_read_at_column_in_chatsUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1635840039_add_clock_read_at_column_in_chats.up.sql", size: 245, mode: os.FileMode(0644), modTime: time.Unix(1636362489, 0)} + info := bindataFileInfo{name: "1635840039_add_clock_read_at_column_in_chats.up.sql", size: 245, mode: os.FileMode(0644), modTime: time.Unix(1645666387, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x6c, 0xba, 0x3f, 0xba, 0x1a, 0x71, 0xa8, 0x9, 0x19, 0xbe, 0x1e, 0x38, 0x50, 0x30, 0x3a, 0x52, 0x15, 0x29, 0xee, 0x49, 0x19, 0x6f, 0x53, 0xc2, 0xc6, 0x6c, 0xd9, 0x80, 0x7e, 0xb9, 0x58, 0x7a}} return a, nil } @@ -1135,7 +1136,7 @@ func _1637852321_add_received_invitation_admin_column_in_chatsUpSql() (*asset, e return nil, err } - info := bindataFileInfo{name: "1637852321_add_received_invitation_admin_column_in_chats.up.sql", size: 72, mode: os.FileMode(0644), modTime: time.Unix(1638003948, 0)} + info := bindataFileInfo{name: "1637852321_add_received_invitation_admin_column_in_chats.up.sql", size: 72, mode: os.FileMode(0644), modTime: time.Unix(1645666387, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x70, 0x8b, 0x92, 0x56, 0x83, 0x70, 0x7f, 0x6, 0xb2, 0xd, 0x1c, 0x2f, 0xcc, 0x93, 0xc3, 0x85, 0x8c, 0xc2, 0x38, 0x94, 0x7e, 0x88, 0x3f, 0x39, 0x34, 0xf8, 0x90, 0xcf, 0x83, 0x68, 0x3d, 0xe5}} return a, nil } @@ -1155,7 +1156,7 @@ func _1645034601_display_nameUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1645034601_display_name.up.sql", size: 110, mode: os.FileMode(0644), modTime: time.Unix(1669629376, 0)} + info := bindataFileInfo{name: "1645034601_display_name.up.sql", size: 110, mode: os.FileMode(0644), modTime: time.Unix(1675323803, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x15, 0xfc, 0xda, 0x70, 0x53, 0x19, 0x90, 0x20, 0x4, 0x1c, 0x99, 0x42, 0x53, 0x1a, 0xd6, 0xb8, 0xbb, 0x8a, 0xe8, 0xbe, 0xcc, 0xb7, 0xc, 0x7f, 0x73, 0x50, 0x18, 0xf1, 0x8b, 0x18, 0x54, 0x64}} return a, nil } @@ -1175,7 +1176,7 @@ func _1645034602_add_mutual_contact_requestUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1645034602_add_mutual_contact_request.up.sql", size: 454, mode: os.FileMode(0644), modTime: time.Unix(1684838089, 0)} + info := bindataFileInfo{name: "1645034602_add_mutual_contact_request.up.sql", size: 454, mode: os.FileMode(0644), modTime: time.Unix(1675323803, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1a, 0xe0, 0x5d, 0x68, 0xb8, 0x50, 0xa4, 0xbb, 0x3e, 0x4f, 0x2, 0x87, 0xad, 0x87, 0x6e, 0x38, 0xdf, 0xc8, 0x4c, 0xe2, 0x5f, 0xd1, 0x6, 0xdc, 0xe7, 0xbd, 0x4a, 0x9c, 0xf3, 0x91, 0xa1, 0x51}} return a, nil } @@ -1195,7 +1196,7 @@ func _1650373957_add_contact_request_stateUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1650373957_add_contact_request_state.up.sql", size: 59, mode: os.FileMode(0644), modTime: time.Unix(1684838089, 0)} + info := bindataFileInfo{name: "1650373957_add_contact_request_state.up.sql", size: 59, mode: os.FileMode(0644), modTime: time.Unix(1675323803, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x5e, 0xc1, 0x3f, 0x29, 0xe, 0x19, 0x86, 0x1a, 0x4c, 0x6c, 0x2a, 0x90, 0x9d, 0xdf, 0xb1, 0xb, 0x72, 0x25, 0xcd, 0x6c, 0x5f, 0xd, 0x51, 0x9e, 0x85, 0xc0, 0x9, 0xb7, 0xbc, 0x87, 0x23, 0xec}} return a, nil } @@ -1215,7 +1216,7 @@ func _1656958989_contact_verificationUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1656958989_contact_verification.up.sql", size: 624, mode: os.FileMode(0644), modTime: time.Unix(1684838089, 0)} + info := bindataFileInfo{name: "1656958989_contact_verification.up.sql", size: 624, mode: os.FileMode(0644), modTime: time.Unix(1675323803, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3a, 0x3f, 0x28, 0x38, 0x33, 0xdb, 0xe9, 0x4d, 0xc0, 0x54, 0x8c, 0x2a, 0x73, 0xc4, 0xdd, 0x5c, 0xc5, 0x1a, 0x93, 0x4b, 0x6, 0x13, 0xbe, 0x42, 0xd2, 0x7f, 0xd4, 0xc, 0xc5, 0x4e, 0x6d, 0xce}} return a, nil } @@ -1235,7 +1236,7 @@ func _1658236268_add_discord_message_authors_tableUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1658236268_add_discord_message_authors_table.up.sql", size: 191, mode: os.FileMode(0644), modTime: time.Unix(1684838089, 0)} + info := bindataFileInfo{name: "1658236268_add_discord_message_authors_table.up.sql", size: 191, mode: os.FileMode(0644), modTime: time.Unix(1675323803, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3d, 0xb7, 0xdb, 0x79, 0x1, 0x15, 0xe7, 0x76, 0x5d, 0x22, 0x54, 0x82, 0x9a, 0xbe, 0x24, 0xc1, 0x82, 0xcf, 0x67, 0x91, 0x53, 0xcc, 0xac, 0x74, 0x18, 0x61, 0x69, 0x68, 0x19, 0xca, 0x2b, 0xa8}} return a, nil } @@ -1255,7 +1256,7 @@ func _1659619997_add_discord_messages_tableUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1659619997_add_discord_messages_table.up.sql", size: 371, mode: os.FileMode(0644), modTime: time.Unix(1684838089, 0)} + info := bindataFileInfo{name: "1659619997_add_discord_messages_table.up.sql", size: 371, mode: os.FileMode(0644), modTime: time.Unix(1675323803, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xde, 0x12, 0x9c, 0x96, 0xe2, 0x42, 0x3f, 0x94, 0x62, 0xc2, 0x76, 0xab, 0x3b, 0x4c, 0x85, 0x36, 0x48, 0xcc, 0x73, 0x60, 0x93, 0x5a, 0xd6, 0x7, 0xd6, 0x0, 0xee, 0x1b, 0x1e, 0x34, 0x58, 0x99}} return a, nil } @@ -1275,7 +1276,7 @@ func _1660226788_create_chat_identity_social_linksUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1660226788_create_chat_identity_social_links.up.sql", size: 318, mode: os.FileMode(0644), modTime: time.Unix(1684838089, 0)} + info := bindataFileInfo{name: "1660226788_create_chat_identity_social_links.up.sql", size: 318, mode: os.FileMode(0644), modTime: time.Unix(1675323803, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3c, 0x76, 0x40, 0xe9, 0x85, 0xc4, 0x38, 0xf8, 0xe5, 0x5d, 0xe8, 0x13, 0x46, 0x1b, 0xc, 0x1, 0xe9, 0x2f, 0x74, 0xd1, 0x79, 0x59, 0xa4, 0xdb, 0x4a, 0x4a, 0xf4, 0x98, 0x58, 0x3c, 0x57, 0xd3}} return a, nil } @@ -1295,7 +1296,7 @@ func _1660226789_add_walletconnectsessions_tableUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1660226789_add_walletconnectsessions_table.up.sql", size: 215, mode: os.FileMode(0644), modTime: time.Unix(1684838089, 0)} + info := bindataFileInfo{name: "1660226789_add_walletconnectsessions_table.up.sql", size: 215, mode: os.FileMode(0644), modTime: time.Unix(1675323803, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf8, 0x5c, 0x72, 0x2, 0xed, 0x36, 0x19, 0x91, 0x4d, 0x1a, 0xc1, 0xab, 0x84, 0xfa, 0x41, 0xb1, 0x46, 0xa5, 0xdb, 0x3f, 0x76, 0x47, 0xd3, 0x75, 0x3c, 0x6a, 0x8e, 0x78, 0xe6, 0x41, 0xdc, 0x7f}} return a, nil } @@ -1315,7 +1316,7 @@ func _1661242854_add_communities_requests_to_leaveUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1661242854_add_communities_requests_to_leave.up.sql", size: 204, mode: os.FileMode(0644), modTime: time.Unix(1684838089, 0)} + info := bindataFileInfo{name: "1661242854_add_communities_requests_to_leave.up.sql", size: 204, mode: os.FileMode(0644), modTime: time.Unix(1675323803, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x49, 0x2e, 0x7d, 0x14, 0xef, 0x6e, 0x95, 0x4b, 0x6, 0x70, 0x2e, 0xd1, 0xf6, 0x59, 0xf9, 0xe, 0x56, 0xa, 0x9c, 0x80, 0x18, 0xca, 0xb9, 0x49, 0x19, 0xf, 0x89, 0x94, 0x36, 0x6d, 0x93, 0x9a}} return a, nil } @@ -1335,7 +1336,7 @@ func _1662044232_add_chat_imageUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1662044232_add_chat_image.up.sql", size: 49, mode: os.FileMode(0644), modTime: time.Unix(1684838089, 0)} + info := bindataFileInfo{name: "1662044232_add_chat_image.up.sql", size: 49, mode: os.FileMode(0644), modTime: time.Unix(1675323803, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb3, 0x74, 0xdf, 0x50, 0x79, 0x73, 0x9e, 0xd0, 0xff, 0xa4, 0xd3, 0x87, 0xc3, 0x48, 0x31, 0x6c, 0xdf, 0xa6, 0x20, 0x85, 0xe6, 0x4e, 0x19, 0x9d, 0xef, 0xcc, 0x84, 0x2b, 0x5d, 0x44, 0x34, 0x6}} return a, nil } @@ -1355,7 +1356,7 @@ func _1662106895_add_chat_first_message_timestampUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1662106895_add_chat_first_message_timestamp.up.sql", size: 113, mode: os.FileMode(0644), modTime: time.Unix(1684838089, 0)} + info := bindataFileInfo{name: "1662106895_add_chat_first_message_timestamp.up.sql", size: 113, mode: os.FileMode(0644), modTime: time.Unix(1675323803, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x8b, 0x55, 0x74, 0xfa, 0xf5, 0x51, 0x85, 0x19, 0xfd, 0xfb, 0x6, 0x79, 0x4d, 0x1d, 0xd, 0x3, 0x46, 0x66, 0x34, 0x1e, 0xce, 0x91, 0x21, 0x29, 0xf6, 0x71, 0xe7, 0x31, 0x39, 0x8f, 0x9d, 0x5}} return a, nil } @@ -1375,7 +1376,7 @@ func _1662723928_add_discord_author_image_fieldsUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1662723928_add_discord_author_image_fields.up.sql", size: 75, mode: os.FileMode(0644), modTime: time.Unix(1684838089, 0)} + info := bindataFileInfo{name: "1662723928_add_discord_author_image_fields.up.sql", size: 75, mode: os.FileMode(0644), modTime: time.Unix(1675323803, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1e, 0x5b, 0x48, 0x57, 0x98, 0x55, 0x9a, 0xf1, 0x75, 0xf7, 0xb5, 0x41, 0x5e, 0x96, 0xc5, 0xce, 0xfc, 0x30, 0x5c, 0x15, 0x35, 0x9e, 0x4e, 0x4a, 0x3b, 0x38, 0x42, 0xc4, 0x27, 0x3c, 0x87, 0xbf}} return a, nil } @@ -1395,7 +1396,7 @@ func _1664195977_add_deleted_for_mesUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1664195977_add_deleted_for_mes.up.sql", size: 352, mode: os.FileMode(0644), modTime: time.Unix(1684838089, 0)} + info := bindataFileInfo{name: "1664195977_add_deleted_for_mes.up.sql", size: 352, mode: os.FileMode(0644), modTime: time.Unix(1675323803, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x7d, 0x9d, 0x13, 0x9, 0xaa, 0x44, 0x14, 0x93, 0xe2, 0xf5, 0x53, 0xb7, 0x79, 0xa8, 0x18, 0xf0, 0x6c, 0xa4, 0x9c, 0x73, 0xc1, 0xaa, 0xc5, 0x2e, 0xc5, 0x41, 0xd7, 0x24, 0xb0, 0xd7, 0xb8, 0xdf}} return a, nil } @@ -1415,7 +1416,7 @@ func _1664367420_add_discord_attachments_tableUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1664367420_add_discord_attachments_table.up.sql", size: 350, mode: os.FileMode(0644), modTime: time.Unix(1684838089, 0)} + info := bindataFileInfo{name: "1664367420_add_discord_attachments_table.up.sql", size: 350, mode: os.FileMode(0644), modTime: time.Unix(1675323803, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x48, 0xe1, 0xb6, 0x4f, 0x6f, 0x92, 0x0, 0xb4, 0xf, 0x55, 0x12, 0x1c, 0x98, 0x6d, 0xbc, 0x1e, 0xfd, 0xae, 0x1c, 0xce, 0xd1, 0x3d, 0x2, 0x21, 0x2e, 0xc0, 0x13, 0xa, 0xb2, 0xec, 0x81, 0x13}} return a, nil } @@ -1435,7 +1436,7 @@ func _1665079662_add_spectated_column_in_communitiesUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1665079662_add_spectated_column_in_communities.up.sql", size: 86, mode: os.FileMode(0644), modTime: time.Unix(1684838089, 0)} + info := bindataFileInfo{name: "1665079662_add_spectated_column_in_communities.up.sql", size: 86, mode: os.FileMode(0644), modTime: time.Unix(1675323803, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa0, 0x5d, 0xfe, 0xe2, 0xbe, 0xdf, 0xba, 0x45, 0xe9, 0xfc, 0xa7, 0x5f, 0xda, 0x19, 0xdb, 0x40, 0x96, 0x59, 0x78, 0xa, 0xd7, 0x4a, 0xca, 0x1a, 0x93, 0xfb, 0xae, 0x6d, 0x74, 0x7, 0x36, 0xdd}} return a, nil } @@ -1455,7 +1456,7 @@ func _1665479047_add_community_id_in_notificationsUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1665479047_add_community_id_in_notifications.up.sql", size: 169, mode: os.FileMode(0644), modTime: time.Unix(1684838089, 0)} + info := bindataFileInfo{name: "1665479047_add_community_id_in_notifications.up.sql", size: 169, mode: os.FileMode(0644), modTime: time.Unix(1675323803, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd9, 0x8f, 0x8b, 0x1c, 0xaa, 0x6a, 0x56, 0xd6, 0xa5, 0x88, 0x57, 0x13, 0x8f, 0xea, 0xb9, 0x23, 0x82, 0x50, 0xb7, 0x65, 0x1f, 0xab, 0xfa, 0x23, 0x6f, 0x0, 0x7, 0xb6, 0x6e, 0xb5, 0x85, 0x44}} return a, nil } @@ -1475,7 +1476,7 @@ func _1665484435_add_encrypted_messagesUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1665484435_add_encrypted_messages.up.sql", size: 402, mode: os.FileMode(0644), modTime: time.Unix(1684838089, 0)} + info := bindataFileInfo{name: "1665484435_add_encrypted_messages.up.sql", size: 402, mode: os.FileMode(0644), modTime: time.Unix(1675323803, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x8f, 0x5c, 0x1e, 0x1c, 0x7f, 0xae, 0x5f, 0xeb, 0x3c, 0x6c, 0xcd, 0xc2, 0x99, 0x48, 0x5c, 0x83, 0xa0, 0xa2, 0x97, 0x5, 0x39, 0x82, 0x71, 0x90, 0x47, 0x21, 0x84, 0x29, 0x19, 0xa4, 0x7a, 0x90}} return a, nil } @@ -1495,7 +1496,7 @@ func _1665560200_add_contact_verification_individualUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1665560200_add_contact_verification_individual.up.sql", size: 509, mode: os.FileMode(0644), modTime: time.Unix(1684838089, 0)} + info := bindataFileInfo{name: "1665560200_add_contact_verification_individual.up.sql", size: 509, mode: os.FileMode(0644), modTime: time.Unix(1675323803, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc5, 0xbb, 0x61, 0xfd, 0xbf, 0x33, 0x1d, 0x4e, 0x5f, 0xbd, 0x86, 0x42, 0xb0, 0x6c, 0xf7, 0x39, 0x19, 0x6e, 0x72, 0x35, 0xfd, 0x1b, 0xd6, 0xbd, 0xf6, 0x81, 0x21, 0xc4, 0xaa, 0x6, 0x62, 0x40}} return a, nil } @@ -1515,7 +1516,7 @@ func _1670921937_add_album_idUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1670921937_add_album_id.up.sql", size: 55, mode: os.FileMode(0644), modTime: time.Unix(1684838089, 0)} + info := bindataFileInfo{name: "1670921937_add_album_id.up.sql", size: 55, mode: os.FileMode(0644), modTime: time.Unix(1675323803, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x7e, 0xae, 0x83, 0x58, 0xb7, 0x77, 0x5, 0xca, 0xe3, 0xda, 0x32, 0x8f, 0x7b, 0xa4, 0x2f, 0x4c, 0xaf, 0x5f, 0xfa, 0x94, 0x36, 0xe4, 0xf9, 0x7, 0xc6, 0xd6, 0xb7, 0x90, 0xf3, 0xe5, 0xb5, 0x3}} return a, nil } @@ -1535,7 +1536,7 @@ func _1673373000_add_repliedUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1673373000_add_replied.up.sql", size: 67, mode: os.FileMode(0644), modTime: time.Unix(1684838089, 0)} + info := bindataFileInfo{name: "1673373000_add_replied.up.sql", size: 67, mode: os.FileMode(0644), modTime: time.Unix(1675323803, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd5, 0x1c, 0xae, 0xf2, 0xf, 0xb4, 0xc2, 0xba, 0x3c, 0xfe, 0x7b, 0xb0, 0xf, 0xf, 0xd5, 0xbc, 0xe2, 0xa7, 0xad, 0x50, 0xd9, 0x5a, 0xe8, 0x96, 0x22, 0x65, 0x89, 0xcf, 0x4a, 0x9a, 0x1b, 0x94}} return a, nil } @@ -1555,7 +1556,7 @@ func _1673428910_add_image_width_heightUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1673428910_add_image_width_height.up.sql", size: 117, mode: os.FileMode(0644), modTime: time.Unix(1684838089, 0)} + info := bindataFileInfo{name: "1673428910_add_image_width_height.up.sql", size: 117, mode: os.FileMode(0644), modTime: time.Unix(1675323803, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x74, 0xda, 0x93, 0x2a, 0x9b, 0x6b, 0xb7, 0x96, 0xcd, 0xac, 0xf, 0xaf, 0x54, 0x89, 0x9e, 0x91, 0x5b, 0xd0, 0x4a, 0xa, 0x8d, 0x9e, 0x80, 0x66, 0x26, 0x9e, 0xb5, 0xa9, 0x8, 0xec, 0x2d, 0x6c}} return a, nil } @@ -1575,7 +1576,7 @@ func _1674210659_add_contact_request_local_clockUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1674210659_add_contact_request_local_clock.up.sql", size: 691, mode: os.FileMode(0644), modTime: time.Unix(1684838089, 0)} + info := bindataFileInfo{name: "1674210659_add_contact_request_local_clock.up.sql", size: 691, mode: os.FileMode(0644), modTime: time.Unix(1675323904, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x92, 0x72, 0x39, 0xfe, 0x72, 0x98, 0xfc, 0x91, 0x20, 0x10, 0xe8, 0xf5, 0xac, 0x79, 0xa8, 0x1c, 0xca, 0x7b, 0x35, 0xa, 0xc1, 0x56, 0x49, 0x9a, 0xfc, 0xbd, 0x64, 0x9d, 0xdf, 0xd2, 0x60, 0x70}} return a, nil } @@ -1595,7 +1596,7 @@ func _1675212323_add_deleted_byUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1675212323_add_deleted_by.up.sql", size: 57, mode: os.FileMode(0644), modTime: time.Unix(1684838089, 0)} + info := bindataFileInfo{name: "1675212323_add_deleted_by.up.sql", size: 57, mode: os.FileMode(0644), modTime: time.Unix(1675323904, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x85, 0x37, 0x29, 0x2f, 0xd, 0x5a, 0xb6, 0xdb, 0xa7, 0x8, 0x86, 0xfc, 0x7a, 0x70, 0xd8, 0x4d, 0xe6, 0xf0, 0x57, 0xe7, 0xd1, 0x95, 0xd5, 0x4, 0x40, 0x2f, 0x7a, 0x5, 0x4f, 0xc2, 0x97, 0xbc}} return a, nil } @@ -1615,7 +1616,7 @@ func _1675247084_add_activity_center_statesUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1675247084_add_activity_center_states.up.sql", size: 136, mode: os.FileMode(0644), modTime: time.Unix(1684838089, 0)} + info := bindataFileInfo{name: "1675247084_add_activity_center_states.up.sql", size: 136, mode: os.FileMode(0644), modTime: time.Unix(1677122376, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xba, 0x90, 0x7d, 0x55, 0xc7, 0x40, 0x29, 0x26, 0x97, 0x45, 0x5c, 0xdf, 0xba, 0x61, 0xb, 0xfc, 0x3d, 0x7a, 0x6c, 0x42, 0xe4, 0x95, 0x78, 0xb0, 0xc5, 0x1f, 0x73, 0xe9, 0x33, 0x51, 0xc8, 0x81}} return a, nil } @@ -1635,7 +1636,7 @@ func _1675272329_fix_protocol_migrationUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1675272329_fix_protocol_migration.up.sql", size: 183, mode: os.FileMode(0644), modTime: time.Unix(1684838089, 0)} + info := bindataFileInfo{name: "1675272329_fix_protocol_migration.up.sql", size: 183, mode: os.FileMode(0644), modTime: time.Unix(1675323904, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb6, 0xe0, 0x11, 0x4c, 0x66, 0x55, 0x72, 0xd3, 0xe6, 0x98, 0xa4, 0xe7, 0x44, 0xf9, 0x3b, 0x3a, 0x3f, 0xd9, 0x91, 0x1e, 0x4f, 0xfc, 0x56, 0x63, 0xe5, 0xa4, 0x83, 0xfc, 0x7c, 0xcf, 0x18, 0x99}} return a, nil } @@ -1655,7 +1656,7 @@ func _1676998418_fix_activity_center_migrationUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1676998418_fix_activity_center_migration.up.sql", size: 178, mode: os.FileMode(0644), modTime: time.Unix(1684838089, 0)} + info := bindataFileInfo{name: "1676998418_fix_activity_center_migration.up.sql", size: 178, mode: os.FileMode(0644), modTime: time.Unix(1677468108, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x8a, 0xdc, 0x64, 0xb1, 0x47, 0x67, 0xda, 0x2c, 0x26, 0x29, 0x6b, 0x6f, 0xb, 0xfa, 0x45, 0xf3, 0xad, 0x8b, 0x1a, 0x5f, 0x1c, 0xed, 0xd7, 0xea, 0x54, 0xf5, 0x3f, 0xb8, 0xf6, 0xf9, 0x44, 0x53}} return a, nil } @@ -1675,7 +1676,7 @@ func _1677278861_add_deleted_column_to_activity_center_notifications_tableUpSql( return nil, err } - info := bindataFileInfo{name: "1677278861_add_deleted_column_to_activity_center_notifications_table.up.sql", size: 381, mode: os.FileMode(0644), modTime: time.Unix(1684838089, 0)} + info := bindataFileInfo{name: "1677278861_add_deleted_column_to_activity_center_notifications_table.up.sql", size: 381, mode: os.FileMode(0644), modTime: time.Unix(1677468108, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x38, 0x3a, 0x95, 0xaf, 0x81, 0xb0, 0x85, 0x8d, 0x73, 0xda, 0x7b, 0x2a, 0x35, 0xa6, 0xaa, 0xcc, 0x4c, 0x35, 0xa3, 0xa8, 0xbd, 0xd1, 0x37, 0xe8, 0x5d, 0x83, 0xa4, 0x33, 0x1f, 0x10, 0xe4, 0xe6}} return a, nil } @@ -1695,7 +1696,7 @@ func _1677486338_add_community_tokens_tableUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1677486338_add_community_tokens_table.up.sql", size: 527, mode: os.FileMode(0644), modTime: time.Unix(1684838089, 0)} + info := bindataFileInfo{name: "1677486338_add_community_tokens_table.up.sql", size: 527, mode: os.FileMode(0644), modTime: time.Unix(1677564198, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xfb, 0x7b, 0x3d, 0x7e, 0x79, 0xc4, 0x3a, 0xf1, 0xda, 0x4b, 0xc6, 0xd1, 0xd, 0xfb, 0xb2, 0xb9, 0x7f, 0x81, 0x29, 0xab, 0xd8, 0x1, 0x20, 0xd7, 0xe1, 0xaf, 0x3e, 0x67, 0x1b, 0xdb, 0xf9, 0xd5}} return a, nil } @@ -1715,7 +1716,7 @@ func _1678292329_add_collapsed_categoriesUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1678292329_add_collapsed_categories.up.sql", size: 170, mode: os.FileMode(0644), modTime: time.Unix(1684838089, 0)} + info := bindataFileInfo{name: "1678292329_add_collapsed_categories.up.sql", size: 170, mode: os.FileMode(0644), modTime: time.Unix(1679051421, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x46, 0x63, 0x86, 0xd5, 0x7, 0xe2, 0x25, 0x15, 0x1b, 0xfe, 0xf3, 0xe, 0x50, 0x48, 0x11, 0x3c, 0x7c, 0xc6, 0xe5, 0xab, 0x8d, 0x1f, 0xe8, 0x3c, 0xcb, 0xf0, 0x8d, 0xa7, 0x49, 0x4c, 0x16, 0x4f}} return a, nil } @@ -1735,7 +1736,7 @@ func _1678800760_add_index_to_raw_messagesUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1678800760_add_index_to_raw_messages.up.sql", size: 88, mode: os.FileMode(0644), modTime: time.Unix(1684838089, 0)} + info := bindataFileInfo{name: "1678800760_add_index_to_raw_messages.up.sql", size: 88, mode: os.FileMode(0644), modTime: time.Unix(1679302848, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x9d, 0xd9, 0x8d, 0x22, 0x46, 0xae, 0x7b, 0x53, 0x3e, 0x51, 0x39, 0xad, 0xad, 0x38, 0x50, 0x6, 0xfa, 0xb9, 0xc4, 0x9f, 0x8d, 0xd2, 0x67, 0x0, 0xef, 0x58, 0x13, 0xab, 0x6a, 0x67, 0xf3, 0x7e}} return a, nil } @@ -1755,7 +1756,7 @@ func _1678877478_add_communities_requests_to_join_revealed_addresses_tableUpSql( return nil, err } - info := bindataFileInfo{name: "1678877478_add_communities_requests_to_join_revealed_addresses_table.up.sql", size: 168, mode: os.FileMode(0644), modTime: time.Unix(1684838089, 0)} + info := bindataFileInfo{name: "1678877478_add_communities_requests_to_join_revealed_addresses_table.up.sql", size: 168, mode: os.FileMode(0644), modTime: time.Unix(1679652393, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x82, 0x1, 0xb4, 0xb2, 0x94, 0x25, 0xd5, 0x2e, 0x45, 0xc3, 0xb1, 0x2c, 0xeb, 0x1a, 0x52, 0xe0, 0x4b, 0x9b, 0x46, 0xf4, 0xc, 0xac, 0x1, 0x1e, 0x90, 0xbc, 0x64, 0x38, 0x10, 0xf1, 0xaf, 0xac}} return a, nil } @@ -1775,7 +1776,7 @@ func _1679326850_add_community_token_ownersUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1679326850_add_community_token_owners.up.sql", size: 206, mode: os.FileMode(0644), modTime: time.Unix(1684838089, 0)} + info := bindataFileInfo{name: "1679326850_add_community_token_owners.up.sql", size: 206, mode: os.FileMode(0644), modTime: time.Unix(1680000580, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xe9, 0xe6, 0x25, 0x67, 0xd1, 0xd6, 0x54, 0x88, 0xb1, 0x80, 0x1e, 0x2d, 0x9c, 0xfa, 0x1c, 0xc7, 0x63, 0x6e, 0xf9, 0x66, 0xb1, 0x68, 0xc6, 0xf8, 0x51, 0xb6, 0xd5, 0x4e, 0x93, 0x39, 0x5e, 0xc0}} return a, nil } @@ -1795,7 +1796,7 @@ func _1680011500_add_album_images_countUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1680011500_add_album_images_count.up.sql", size: 71, mode: os.FileMode(0644), modTime: time.Unix(1684838089, 0)} + info := bindataFileInfo{name: "1680011500_add_album_images_count.up.sql", size: 71, mode: os.FileMode(0644), modTime: time.Unix(1680260624, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x2e, 0x55, 0x99, 0x31, 0xcc, 0x80, 0x78, 0xc3, 0x51, 0x13, 0x63, 0x6f, 0x1a, 0xfd, 0x53, 0xd2, 0xf4, 0x13, 0x4b, 0xb2, 0x4f, 0x99, 0xb8, 0x7b, 0x7, 0x99, 0xb6, 0xab, 0x88, 0x2e, 0x7, 0x8}} return a, nil } @@ -1815,7 +1816,7 @@ func _1680114896_add_index_on_album_idUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1680114896_add_index_on_album_id.up.sql", size: 83, mode: os.FileMode(0644), modTime: time.Unix(1684838089, 0)} + info := bindataFileInfo{name: "1680114896_add_index_on_album_id.up.sql", size: 83, mode: os.FileMode(0644), modTime: time.Unix(1680260624, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb3, 0x7e, 0xd5, 0xcd, 0x2d, 0xab, 0xd4, 0x32, 0x26, 0x50, 0x3a, 0x5b, 0x8e, 0x1c, 0xcc, 0x35, 0xf8, 0xa1, 0x2a, 0xc1, 0x23, 0xf6, 0x90, 0xfe, 0x84, 0x3, 0xde, 0x5a, 0xee, 0xc6, 0xfc, 0x2a}} return a, nil } @@ -1835,7 +1836,7 @@ func _1681655289_add_mute_tillUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1681655289_add_mute_till.up.sql", size: 51, mode: os.FileMode(0644), modTime: time.Unix(1684838089, 0)} + info := bindataFileInfo{name: "1681655289_add_mute_till.up.sql", size: 51, mode: os.FileMode(0644), modTime: time.Unix(1681955252, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd1, 0xbe, 0xce, 0xb8, 0xe1, 0x30, 0xe7, 0xa7, 0xe0, 0x7d, 0x97, 0xf4, 0x26, 0xb8, 0x57, 0x1d, 0x2a, 0xed, 0x18, 0xf2, 0xa, 0xe3, 0x77, 0x29, 0x18, 0x55, 0x9, 0x74, 0x2c, 0x24, 0x5a, 0x19}} return a, nil } @@ -1855,7 +1856,7 @@ func _1681934966_add_index_response_toUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1681934966_add_index_response_to.up.sql", size: 70, mode: os.FileMode(0644), modTime: time.Unix(1684838089, 0)} + info := bindataFileInfo{name: "1681934966_add_index_response_to.up.sql", size: 70, mode: os.FileMode(0644), modTime: time.Unix(1682560340, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3b, 0xed, 0xa6, 0x7e, 0x51, 0xf2, 0xa1, 0x3c, 0x78, 0x9a, 0xa7, 0x7a, 0x51, 0x25, 0x7d, 0xdd, 0x4b, 0xf3, 0x45, 0xeb, 0x3f, 0xad, 0x23, 0x3e, 0xac, 0x16, 0x28, 0x62, 0x7, 0x8c, 0xe0, 0xa0}} return a, nil } @@ -1875,7 +1876,7 @@ func _1682528339_add_index_user_messages_unseenUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1682528339_add_index_user_messages_unseen.up.sql", size: 104, mode: os.FileMode(0644), modTime: time.Unix(1684838089, 0)} + info := bindataFileInfo{name: "1682528339_add_index_user_messages_unseen.up.sql", size: 104, mode: os.FileMode(0644), modTime: time.Unix(1683172161, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x35, 0xfa, 0x98, 0xdd, 0x74, 0x5e, 0x21, 0x1f, 0xf2, 0x56, 0x17, 0x96, 0xfe, 0xbb, 0x44, 0x4c, 0xa1, 0xd8, 0x9f, 0x2e, 0x6, 0x2f, 0xd8, 0x23, 0xec, 0x94, 0x8c, 0x53, 0xf3, 0xf0, 0x40, 0xe7}} return a, nil } @@ -1895,7 +1896,7 @@ func _1683707289_recreate_deleted_for_mesUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1683707289_recreate_deleted_for_mes.up.sql", size: 408, mode: os.FileMode(0644), modTime: time.Unix(1684838089, 0)} + info := bindataFileInfo{name: "1683707289_recreate_deleted_for_mes.up.sql", size: 408, mode: os.FileMode(0644), modTime: time.Unix(1683811675, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x5b, 0x9d, 0xd6, 0x45, 0x41, 0x29, 0x44, 0xf6, 0x14, 0x38, 0xeb, 0xdf, 0x6b, 0x5d, 0x9c, 0x45, 0x4b, 0xc3, 0xa8, 0xbd, 0x38, 0x14, 0xd9, 0x73, 0xf1, 0x51, 0xbb, 0x9f, 0x14, 0x36, 0xf2, 0x11}} return a, nil } @@ -1915,7 +1916,7 @@ func _1683725607_mark_discord_messages_as_seenUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1683725607_mark_discord_messages_as_seen.up.sql", size: 108, mode: os.FileMode(0644), modTime: time.Unix(1684838089, 0)} + info := bindataFileInfo{name: "1683725607_mark_discord_messages_as_seen.up.sql", size: 108, mode: os.FileMode(0644), modTime: time.Unix(1683810836, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd7, 0x2a, 0xc3, 0x43, 0xea, 0x5e, 0x3, 0x2e, 0xce, 0x79, 0xea, 0xa5, 0x67, 0x61, 0x8c, 0xe4, 0xb9, 0xb7, 0x4d, 0xd5, 0xd5, 0xb0, 0x35, 0xc8, 0x2b, 0xa0, 0x3f, 0xd8, 0xde, 0xea, 0x4e, 0x16}} return a, nil } @@ -1935,7 +1936,7 @@ func _1684174617_add_url_previews_to_user_messagesUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1684174617_add_url_previews_to_user_messages.up.sql", size: 58, mode: os.FileMode(0644), modTime: time.Unix(1684838089, 0)} + info := bindataFileInfo{name: "1684174617_add_url_previews_to_user_messages.up.sql", size: 58, mode: os.FileMode(0644), modTime: time.Unix(1684505071, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xdc, 0xb0, 0x72, 0xe3, 0xe4, 0xa9, 0x63, 0x82, 0xea, 0x52, 0x70, 0xb6, 0xa0, 0x73, 0x55, 0x7a, 0x78, 0xa8, 0xd2, 0xb0, 0xf4, 0x78, 0x8a, 0xd, 0x5a, 0xa2, 0x9d, 0x92, 0xdc, 0xce, 0x1c, 0x71}} return a, nil } @@ -1955,11 +1956,31 @@ func _1684175608_add_token_balancesUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1684175608_add_token_balances.up.sql", size: 467, mode: os.FileMode(0644), modTime: time.Unix(1684838089, 0)} + info := bindataFileInfo{name: "1684175608_add_token_balances.up.sql", size: 467, mode: os.FileMode(0644), modTime: time.Unix(1684755650, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1b, 0x4e, 0xe0, 0x48, 0x34, 0x1, 0x4d, 0x88, 0x11, 0x54, 0x20, 0x52, 0x5c, 0x57, 0x14, 0xa9, 0xa9, 0x36, 0xa4, 0x28, 0x59, 0x48, 0xa8, 0xa, 0x76, 0xec, 0x37, 0xee, 0x9e, 0xd2, 0x20, 0xaa}} return a, nil } +var __1684979808_sync_activity_center_notificationsUpSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x94\xcc\xc1\x09\x02\x31\x10\x05\xd0\xbb\x55\xfc\x12\xbc\x7b\x8a\x26\x82\x30\x66\x41\x26\xe7\x30\x64\x23\xcc\x25\x2b\xe6\x2b\xd8\xbd\x1d\x08\x36\xf0\x82\x68\xba\x41\xc3\x51\x12\xac\xd1\xdf\xce\x4f\x6d\x7d\xb0\x3f\xeb\xa4\xb1\x4f\x84\x18\x71\x5a\xa4\x5c\x33\x5e\x8f\xd5\xd8\xd7\x6a\xc4\x25\x2b\xf2\xa2\xc8\x45\x04\x31\x9d\x43\x11\xc5\xfe\xb0\xfb\x05\x8e\x8d\x7e\xf7\x66\xf4\x6d\xfc\xeb\x7e\x03\x00\x00\xff\xff\x09\xb8\x1a\x7c\xa9\x00\x00\x00") + +func _1684979808_sync_activity_center_notificationsUpSqlBytes() ([]byte, error) { + return bindataRead( + __1684979808_sync_activity_center_notificationsUpSql, + "1684979808_sync_activity_center_notifications.up.sql", + ) +} + +func _1684979808_sync_activity_center_notificationsUpSql() (*asset, error) { + bytes, err := _1684979808_sync_activity_center_notificationsUpSqlBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "1684979808_sync_activity_center_notifications.up.sql", size: 169, mode: os.FileMode(0644), modTime: time.Unix(1686047555, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd8, 0xf5, 0xf7, 0x94, 0xa9, 0xa1, 0x60, 0x26, 0x9d, 0xca, 0x31, 0xf, 0x14, 0xd, 0x70, 0xf8, 0xab, 0x40, 0x29, 0x73, 0x61, 0xbd, 0x1b, 0xb6, 0xc4, 0x31, 0x77, 0x9e, 0x32, 0xa8, 0xce, 0x6d}} + return a, nil +} + var _readmeMd = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x54\x91\xc1\xce\xd3\x30\x10\x84\xef\x7e\x8a\x91\x7a\x01\xa9\x2a\x8f\xc0\x0d\x71\x82\x03\x48\x1c\xc9\x36\x9e\x36\x96\x1c\x6f\xf0\xae\x93\xe6\xed\x91\xa3\xc2\xdf\xff\x66\xed\xd8\x33\xdf\x78\x4f\xa7\x13\xbe\xea\x06\x57\x6c\x35\x39\x31\xa7\x7b\x15\x4f\x5a\xec\x73\x08\xbf\x08\x2d\x79\x7f\x4a\x43\x5b\x86\x17\xfd\x8c\x21\xea\x56\x5e\x47\x90\x4a\x14\x75\x48\xde\x64\x37\x2c\x6a\x96\xae\x99\x48\x05\xf6\x27\x77\x13\xad\x08\xae\x8a\x51\xe7\x25\xf3\xf1\xa9\x9f\xf9\x58\x58\x2c\xad\xbc\xe0\x8b\x56\xf0\x21\x5d\xeb\x4c\x95\xb3\xae\x84\x60\xd4\xdc\xe6\x82\x5d\x1b\x36\x6d\x39\x62\x92\xf5\xb8\x11\xdb\x92\xd3\x28\xce\xe0\x13\xe1\x72\xcd\x3c\x63\xd4\x65\x87\xae\xac\xe8\xc3\x28\x2e\x67\x44\x66\x3a\x21\x25\xa2\x72\xac\x14\x67\xbc\x84\x9f\x53\x32\x8c\x52\x70\x25\x56\xd6\xfd\x8d\x05\x37\xad\x30\x9d\x9f\xa6\x86\x0f\xcd\x58\x7f\xcf\x34\x93\x3b\xed\x90\x9f\xa4\x1f\xcf\x30\x85\x4d\x07\x58\xaf\x7f\x25\xc4\x9d\xf3\x72\x64\x84\xd0\x7f\xf9\x9b\x3a\x2d\x84\xef\x85\x48\x66\x8d\xd8\x88\x9b\x8c\x8c\x98\x5b\xf6\x74\x14\x4e\x33\x0d\xc9\xe0\x93\x38\xda\x12\xc5\x69\xbd\xe4\xf0\x2e\x7a\x78\x07\x1c\xfe\x13\x9f\x91\x29\x31\x95\x7b\x7f\x62\x59\x37\xb4\xe5\x5e\x25\xfe\x33\xee\xd5\x53\x71\xd6\xda\x3a\xd8\xcb\xde\x2e\xf8\xa1\x90\x55\x53\x0c\xc7\xaa\x0d\xe9\x76\x14\x29\x1c\x7b\x68\xdd\x2f\xe1\x6f\x00\x00\x00\xff\xff\x3c\x0a\xc2\xfe\x2a\x02\x00\x00") func readmeMdBytes() ([]byte, error) { @@ -1975,7 +1996,7 @@ func readmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "README.md", size: 554, mode: os.FileMode(0644), modTime: time.Unix(1610388501, 0)} + info := bindataFileInfo{name: "README.md", size: 554, mode: os.FileMode(0644), modTime: time.Unix(1645429416, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1c, 0x6e, 0xfb, 0xcc, 0x81, 0x94, 0x4d, 0x8c, 0xa0, 0x3b, 0x5, 0xb0, 0x18, 0xd6, 0xbb, 0xb3, 0x79, 0xc8, 0x8f, 0xff, 0xc1, 0x10, 0xf9, 0xf, 0x20, 0x1b, 0x4a, 0x74, 0x96, 0x42, 0xd7, 0xa8}} return a, nil } @@ -1995,7 +2016,7 @@ func docGo() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "doc.go", size: 850, mode: os.FileMode(0644), modTime: time.Unix(1607354881, 0)} + info := bindataFileInfo{name: "doc.go", size: 850, mode: os.FileMode(0644), modTime: time.Unix(1645429416, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa0, 0xcc, 0x41, 0xe1, 0x61, 0x12, 0x97, 0xe, 0x36, 0x8c, 0xa7, 0x9e, 0xe0, 0x6e, 0x59, 0x9e, 0xee, 0xd5, 0x4a, 0xcf, 0x1e, 0x60, 0xd6, 0xc3, 0x3a, 0xc9, 0x6c, 0xf2, 0x86, 0x5a, 0xb4, 0x1e}} return a, nil } @@ -2271,6 +2292,8 @@ var _bindata = map[string]func() (*asset, error){ "1684175608_add_token_balances.up.sql": _1684175608_add_token_balancesUpSql, + "1684979808_sync_activity_center_notifications.up.sql": _1684979808_sync_activity_center_notificationsUpSql, + "README.md": readmeMd, "doc.go": docGo, @@ -2407,8 +2430,9 @@ var _bintree = &bintree{nil, map[string]*bintree{ "1683725607_mark_discord_messages_as_seen.up.sql": &bintree{_1683725607_mark_discord_messages_as_seenUpSql, map[string]*bintree{}}, "1684174617_add_url_previews_to_user_messages.up.sql": &bintree{_1684174617_add_url_previews_to_user_messagesUpSql, map[string]*bintree{}}, "1684175608_add_token_balances.up.sql": &bintree{_1684175608_add_token_balancesUpSql, map[string]*bintree{}}, - "README.md": &bintree{readmeMd, map[string]*bintree{}}, - "doc.go": &bintree{docGo, map[string]*bintree{}}, + "1684979808_sync_activity_center_notifications.up.sql": &bintree{_1684979808_sync_activity_center_notificationsUpSql, map[string]*bintree{}}, + "README.md": &bintree{readmeMd, map[string]*bintree{}}, + "doc.go": &bintree{docGo, map[string]*bintree{}}, }} // RestoreAsset restores an asset under the given directory. diff --git a/protocol/migrations/sqlite/1684979808_sync_activity_center_notifications.up.sql b/protocol/migrations/sqlite/1684979808_sync_activity_center_notifications.up.sql new file mode 100644 index 000000000..ad8ce784a --- /dev/null +++ b/protocol/migrations/sqlite/1684979808_sync_activity_center_notifications.up.sql @@ -0,0 +1,2 @@ +ALTER TABLE activity_center_states ADD COLUMN updated_at INT NOT NULL DEFAULT 0; +ALTER TABLE activity_center_notifications ADD COLUMN updated_at INT NOT NULL DEFAULT 0; diff --git a/protocol/persistence_collapsed_community_categories.go b/protocol/persistence_collapsed_community_categories.go index 69572e287..a63a71fb4 100644 --- a/protocol/persistence_collapsed_community_categories.go +++ b/protocol/persistence_collapsed_community_categories.go @@ -1,19 +1,19 @@ package protocol -func (p *sqlitePersistence) UpsertCollapsedCommunityCategory(category CollapsedCommunityCategory) error { +func (db *sqlitePersistence) UpsertCollapsedCommunityCategory(category CollapsedCommunityCategory) error { var err error if category.Collapsed { - _, err = p.db.Exec("INSERT INTO collapsed_community_categories(community_id, category_id) VALUES(?,?)", category.CommunityID, category.CategoryID) + _, err = db.db.Exec("INSERT INTO collapsed_community_categories(community_id, category_id) VALUES(?,?)", category.CommunityID, category.CategoryID) } else { - _, err = p.db.Exec("DELETE FROM collapsed_community_categories WHERE community_id = ? AND category_id = ?", category.CommunityID, category.CategoryID) + _, err = db.db.Exec("DELETE FROM collapsed_community_categories WHERE community_id = ? AND category_id = ?", category.CommunityID, category.CategoryID) } return err } -func (p *sqlitePersistence) CollapsedCommunityCategories() ([]CollapsedCommunityCategory, error) { +func (db *sqlitePersistence) CollapsedCommunityCategories() ([]CollapsedCommunityCategory, error) { var categories []CollapsedCommunityCategory - rows, err := p.db.Query(` + rows, err := db.db.Query(` SELECT community_id, category_id diff --git a/protocol/protobuf/application_metadata_message.pb.go b/protocol/protobuf/application_metadata_message.pb.go index dc2bc1661..91436990b 100644 --- a/protocol/protobuf/application_metadata_message.pb.go +++ b/protocol/protobuf/application_metadata_message.pb.go @@ -89,6 +89,8 @@ const ( ApplicationMetadataMessage_SYNC_SOCIAL_LINKS ApplicationMetadataMessage_Type = 64 ApplicationMetadataMessage_SYNC_ENS_USERNAME_DETAIL ApplicationMetadataMessage_Type = 65 ApplicationMetadataMessage_SYNC_FULL_KEYPAIR ApplicationMetadataMessage_Type = 66 + ApplicationMetadataMessage_SYNC_ACTIVITY_CENTER_NOTIFICATION ApplicationMetadataMessage_Type = 67 + ApplicationMetadataMessage_SYNC_ACTIVITY_CENTER_NOTIFICATION_STATE ApplicationMetadataMessage_Type = 68 ) var ApplicationMetadataMessage_Type_name = map[int32]string{ @@ -158,6 +160,8 @@ var ApplicationMetadataMessage_Type_name = map[int32]string{ 64: "SYNC_SOCIAL_LINKS", 65: "SYNC_ENS_USERNAME_DETAIL", 66: "SYNC_FULL_KEYPAIR", + 67: "SYNC_ACTIVITY_CENTER_NOTIFICATION", + 68: "SYNC_ACTIVITY_CENTER_NOTIFICATION_STATE", } var ApplicationMetadataMessage_Type_value = map[string]int32{ @@ -227,6 +231,8 @@ var ApplicationMetadataMessage_Type_value = map[string]int32{ "SYNC_SOCIAL_LINKS": 64, "SYNC_ENS_USERNAME_DETAIL": 65, "SYNC_FULL_KEYPAIR": 66, + "SYNC_ACTIVITY_CENTER_NOTIFICATION": 67, + "SYNC_ACTIVITY_CENTER_NOTIFICATION_STATE": 68, } func (x ApplicationMetadataMessage_Type) String() string { @@ -305,65 +311,66 @@ func init() { } var fileDescriptor_ad09a6406fcf24c7 = []byte{ - // 959 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x55, 0x6b, 0x73, 0x53, 0x37, - 0x13, 0x7e, 0x03, 0x79, 0x13, 0x50, 0x6e, 0x8a, 0xc8, 0xc5, 0xb9, 0x1b, 0x43, 0x43, 0x80, 0xd6, - 0xb4, 0xd0, 0x76, 0xda, 0x52, 0xda, 0xca, 0xd2, 0xc6, 0x16, 0x3e, 0x47, 0x3a, 0x48, 0x3a, 0xee, - 0xb8, 0x5f, 0x34, 0xa6, 0xb8, 0x4c, 0x66, 0x80, 0x78, 0x88, 0xf9, 0x90, 0x7f, 0xd8, 0x5f, 0xd1, - 0xdf, 0xd2, 0xd1, 0xb9, 0xe8, 0x38, 0x89, 0x53, 0x3e, 0x25, 0xde, 0x7d, 0x76, 0x57, 0xfb, 0xec, - 0xb3, 0x7b, 0x50, 0x63, 0x30, 0x1a, 0xbd, 0x3b, 0xf9, 0x73, 0x30, 0x3e, 0x39, 0xfd, 0xe0, 0xde, - 0x0f, 0xc7, 0x83, 0x37, 0x83, 0xf1, 0xc0, 0xbd, 0x1f, 0x9e, 0x9d, 0x0d, 0xde, 0x0e, 0x9b, 0xa3, - 0x8f, 0xa7, 0xe3, 0x53, 0x72, 0x2b, 0xfb, 0xf3, 0xfa, 0xd3, 0x5f, 0x8d, 0x7f, 0x56, 0xd0, 0x36, - 0xad, 0x02, 0xe2, 0x02, 0x1f, 0xe7, 0x70, 0xb2, 0x8b, 0x6e, 0x9f, 0x9d, 0xbc, 0xfd, 0x30, 0x18, - 0x7f, 0xfa, 0x38, 0xac, 0xcd, 0xd4, 0x67, 0x8e, 0x16, 0x75, 0x65, 0x20, 0x35, 0x34, 0x3f, 0x1a, - 0x9c, 0xbf, 0x3b, 0x1d, 0xbc, 0xa9, 0xdd, 0xc8, 0x7c, 0xe5, 0x4f, 0xf2, 0x02, 0xcd, 0x8e, 0xcf, - 0x47, 0xc3, 0xda, 0xcd, 0xfa, 0xcc, 0xd1, 0xf2, 0xd3, 0x87, 0xcd, 0xb2, 0x5e, 0xf3, 0xfa, 0x5a, - 0x4d, 0x7b, 0x3e, 0x1a, 0xea, 0x2c, 0xac, 0xf1, 0xf7, 0x32, 0x9a, 0xf5, 0x3f, 0xc9, 0x02, 0x9a, - 0x4f, 0x65, 0x57, 0xaa, 0xdf, 0x25, 0xfe, 0x1f, 0xc1, 0x68, 0x91, 0x75, 0xa8, 0x75, 0x31, 0x18, - 0x43, 0xdb, 0x80, 0x67, 0x08, 0x41, 0xcb, 0x4c, 0x49, 0x4b, 0x99, 0x75, 0x69, 0xc2, 0xa9, 0x05, - 0x7c, 0x83, 0xec, 0xa1, 0xad, 0x18, 0xe2, 0x16, 0x68, 0xd3, 0x11, 0x49, 0x61, 0x0e, 0x21, 0x37, - 0xc9, 0x3a, 0x5a, 0x4d, 0xa8, 0xd0, 0x4e, 0x48, 0x63, 0x69, 0x14, 0x51, 0x2b, 0x94, 0xc4, 0xb3, - 0xde, 0x6c, 0xfa, 0x92, 0x5d, 0x34, 0xff, 0x9f, 0xdc, 0x43, 0x07, 0x1a, 0x5e, 0xa5, 0x60, 0xac, - 0xa3, 0x9c, 0x6b, 0x30, 0xc6, 0x1d, 0x2b, 0xed, 0xac, 0xa6, 0xd2, 0x50, 0x96, 0x81, 0xe6, 0xc8, - 0x23, 0x74, 0x48, 0x19, 0x83, 0xc4, 0xba, 0xcf, 0x61, 0xe7, 0xc9, 0x63, 0xf4, 0x80, 0x03, 0x8b, - 0x84, 0x84, 0xcf, 0x82, 0x6f, 0x91, 0x4d, 0x74, 0xa7, 0x04, 0x4d, 0x3a, 0x6e, 0x93, 0x35, 0x84, - 0x0d, 0x48, 0x7e, 0xc1, 0x8a, 0xc8, 0x01, 0xda, 0xb9, 0x9c, 0x7b, 0x12, 0xb0, 0xe0, 0xa9, 0xb9, - 0xd2, 0xa4, 0x2b, 0x08, 0xc4, 0x8b, 0xd3, 0xdd, 0x94, 0x31, 0x95, 0x4a, 0x8b, 0x97, 0xc8, 0x5d, - 0xb4, 0x77, 0xd5, 0x9d, 0xa4, 0xad, 0x48, 0x30, 0xe7, 0xe7, 0x82, 0x97, 0xc9, 0x3e, 0xda, 0x2e, - 0xe7, 0xc1, 0x14, 0x07, 0x47, 0x79, 0x0f, 0xb4, 0x15, 0x06, 0x62, 0x90, 0x16, 0xaf, 0x90, 0x06, - 0xda, 0x4f, 0x52, 0xd3, 0x71, 0x52, 0x59, 0x71, 0x2c, 0x58, 0x9e, 0x42, 0x43, 0x5b, 0x18, 0xab, - 0x73, 0xca, 0xb1, 0x67, 0xe8, 0xbf, 0x31, 0x4e, 0x83, 0x49, 0x94, 0x34, 0x80, 0x57, 0xc9, 0x0e, - 0xda, 0xbc, 0x0a, 0x7e, 0x95, 0x82, 0xee, 0x63, 0x42, 0xee, 0xa3, 0xfa, 0x35, 0xce, 0x2a, 0xc5, - 0x1d, 0xdf, 0xf5, 0xb4, 0x7a, 0x19, 0x7f, 0x78, 0xcd, 0xb7, 0x34, 0xcd, 0x5d, 0x84, 0xaf, 0x7b, - 0x09, 0x42, 0xac, 0x5e, 0x0a, 0xa7, 0xa1, 0xe0, 0x79, 0x83, 0x6c, 0xa1, 0xf5, 0xb6, 0x56, 0x69, - 0x92, 0xd1, 0xe2, 0x84, 0xec, 0x09, 0x9b, 0x77, 0xb7, 0x49, 0x56, 0xd1, 0x52, 0x6e, 0xe4, 0x20, - 0xad, 0xb0, 0x7d, 0x5c, 0xf3, 0x68, 0xa6, 0xe2, 0x38, 0x95, 0xc2, 0xf6, 0x1d, 0x07, 0xc3, 0xb4, - 0x48, 0x32, 0xf4, 0x16, 0xa9, 0xa1, 0xb5, 0xca, 0x35, 0x91, 0x67, 0xdb, 0xbf, 0xba, 0xf2, 0x84, - 0x69, 0x2b, 0xf7, 0x52, 0x09, 0x89, 0x77, 0xc8, 0x0a, 0x5a, 0x48, 0x84, 0x0c, 0xb2, 0xdf, 0xf5, - 0xbb, 0x03, 0x5c, 0x54, 0xbb, 0xb3, 0xe7, 0x5f, 0x62, 0x2c, 0xb5, 0xa9, 0x29, 0x57, 0x67, 0xdf, - 0xf7, 0xc2, 0x21, 0x82, 0x89, 0x7d, 0x39, 0xf0, 0xa2, 0x9a, 0xa6, 0x99, 0xa2, 0x34, 0xae, 0x93, - 0x6d, 0xb4, 0x41, 0xa5, 0x92, 0xfd, 0x58, 0xa5, 0xc6, 0xc5, 0x60, 0xb5, 0x60, 0xae, 0x45, 0x2d, - 0xeb, 0xe0, 0xbb, 0x61, 0xab, 0xb2, 0x96, 0x35, 0xc4, 0xaa, 0x07, 0x1c, 0x37, 0xfc, 0xd4, 0x2a, - 0x73, 0x51, 0xca, 0x78, 0x02, 0x39, 0xbe, 0x47, 0x10, 0x9a, 0x6b, 0x51, 0xd6, 0x4d, 0x13, 0x7c, - 0x3f, 0x28, 0xd2, 0x33, 0xdb, 0xf3, 0x9d, 0x32, 0x90, 0x16, 0x74, 0x0e, 0xfd, 0x22, 0x28, 0xf2, - 0xb2, 0x3b, 0xdf, 0x46, 0xe0, 0xf8, 0xd0, 0x2b, 0x6e, 0x2a, 0x84, 0x0b, 0x13, 0x0b, 0x63, 0x80, - 0xe3, 0x07, 0x19, 0x13, 0x1e, 0xd3, 0x52, 0xaa, 0x1b, 0x53, 0xdd, 0xc5, 0x47, 0x64, 0x03, 0x91, - 0xfc, 0x85, 0x11, 0x50, 0xed, 0x3a, 0xc2, 0x58, 0xa5, 0xfb, 0xf8, 0xa1, 0xa7, 0x31, 0xb3, 0x1b, - 0xb0, 0x56, 0xc8, 0x36, 0x7e, 0x44, 0xea, 0x68, 0xb7, 0x1a, 0x04, 0xd5, 0xac, 0x23, 0x7a, 0xe0, - 0x62, 0xda, 0x96, 0x60, 0x23, 0x21, 0xbb, 0xf8, 0xb1, 0x1f, 0x62, 0x16, 0x93, 0x68, 0x75, 0x2c, - 0x22, 0x70, 0x89, 0x60, 0x36, 0xd5, 0x80, 0xbf, 0x0c, 0xd9, 0xca, 0x1d, 0xfb, 0x2a, 0x23, 0x33, - 0x3f, 0x25, 0xe5, 0x1e, 0x95, 0x4a, 0x6c, 0x7a, 0xd6, 0x34, 0x58, 0x9d, 0x2f, 0xd7, 0x45, 0xe7, - 0x13, 0x72, 0x88, 0x1a, 0xd7, 0xea, 0xa1, 0x92, 0xeb, 0xd7, 0x15, 0xf5, 0x01, 0x5c, 0xb4, 0x62, - 0xf0, 0x37, 0xbe, 0x97, 0x32, 0xb4, 0xac, 0xd0, 0x03, 0x1d, 0x64, 0x8f, 0x9f, 0x7a, 0x35, 0x5c, - 0x7a, 0xdf, 0x05, 0xc0, 0x33, 0x9f, 0xa2, 0xbc, 0x41, 0x53, 0x11, 0xdf, 0x06, 0x4d, 0x58, 0x9d, - 0x1a, 0x0b, 0xdc, 0xa5, 0x06, 0x34, 0xfe, 0x2e, 0x8c, 0x7a, 0x12, 0x1d, 0xfa, 0xfb, 0x3e, 0x8c, - 0xfa, 0x52, 0xe7, 0x8e, 0x03, 0x13, 0xc6, 0x27, 0xfe, 0x21, 0x3f, 0x3e, 0x53, 0x28, 0x88, 0x80, - 0xf6, 0x00, 0xff, 0xe8, 0xfd, 0x59, 0x8a, 0x42, 0xe2, 0xfe, 0xdc, 0xc6, 0x95, 0xd2, 0x7f, 0x0a, - 0x33, 0x37, 0xb4, 0x07, 0xbc, 0xbc, 0xca, 0xf8, 0xb9, 0x3f, 0x23, 0x55, 0x5e, 0x46, 0x25, 0x83, - 0xe8, 0xca, 0xc6, 0xfd, 0xec, 0x99, 0x29, 0x7c, 0x53, 0xfb, 0x7e, 0x11, 0x86, 0xdd, 0x85, 0xbe, - 0xff, 0x00, 0xe1, 0x5f, 0xfc, 0x79, 0x2f, 0x2d, 0x8c, 0x6a, 0xee, 0x8a, 0xfb, 0xf1, 0x6b, 0xa0, - 0xc8, 0x28, 0x26, 0x68, 0xe4, 0xbc, 0x8e, 0x0c, 0xfe, 0x8d, 0xec, 0xa2, 0x5a, 0x66, 0x06, 0x69, - 0x32, 0xd6, 0x24, 0x8d, 0xc1, 0x71, 0xb0, 0x54, 0x44, 0x98, 0x86, 0xa0, 0xe3, 0x34, 0x8a, 0x42, - 0x91, 0x56, 0x6b, 0xe9, 0x8f, 0x85, 0xe6, 0x93, 0xe7, 0xe5, 0xf7, 0xf7, 0xf5, 0x5c, 0xf6, 0xdf, - 0xb3, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x5f, 0xbf, 0xf4, 0x92, 0x26, 0x08, 0x00, 0x00, + // 976 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x55, 0x6d, 0x73, 0x13, 0x37, + 0x10, 0x6e, 0x20, 0x4d, 0x40, 0x79, 0x53, 0x44, 0x5e, 0x9c, 0x77, 0xc7, 0x40, 0x08, 0xd0, 0x9a, + 0x16, 0xda, 0x4e, 0x5b, 0x4a, 0x5b, 0x59, 0xda, 0xd8, 0xc2, 0x77, 0xd2, 0x21, 0xe9, 0xdc, 0x71, + 0xbf, 0x68, 0x4c, 0x71, 0x99, 0xcc, 0x00, 0xf1, 0x10, 0xe7, 0x43, 0xfe, 0x4b, 0x7f, 0x45, 0x7f, + 0x61, 0x47, 0xf7, 0xea, 0x24, 0x97, 0xe6, 0x53, 0xe2, 0xdd, 0x67, 0x77, 0xb5, 0xcf, 0x3e, 0xbb, + 0x87, 0x1a, 0x83, 0xd1, 0xe8, 0xc3, 0xf1, 0x5f, 0x83, 0xf1, 0xf1, 0xc9, 0x27, 0xf7, 0x71, 0x38, + 0x1e, 0xbc, 0x1b, 0x8c, 0x07, 0xee, 0xe3, 0xf0, 0xf4, 0x74, 0xf0, 0x7e, 0xd8, 0x1c, 0x7d, 0x3e, + 0x19, 0x9f, 0x90, 0x3b, 0xc9, 0x9f, 0xb7, 0x67, 0x7f, 0x37, 0xfe, 0xc5, 0x68, 0x93, 0x96, 0x01, + 0x61, 0x86, 0x0f, 0x53, 0x38, 0xd9, 0x46, 0x77, 0x4f, 0x8f, 0xdf, 0x7f, 0x1a, 0x8c, 0xcf, 0x3e, + 0x0f, 0x6b, 0x53, 0xf5, 0xa9, 0xc3, 0x79, 0x5d, 0x1a, 0x48, 0x0d, 0xcd, 0x8e, 0x06, 0xe7, 0x1f, + 0x4e, 0x06, 0xef, 0x6a, 0xb7, 0x12, 0x5f, 0xfe, 0x93, 0xbc, 0x42, 0xd3, 0xe3, 0xf3, 0xd1, 0xb0, + 0x76, 0xbb, 0x3e, 0x75, 0xb8, 0xf8, 0xfc, 0x71, 0x33, 0xaf, 0xd7, 0xbc, 0xbe, 0x56, 0xd3, 0x9e, + 0x8f, 0x86, 0x3a, 0x09, 0x6b, 0xfc, 0xb3, 0x84, 0xa6, 0xfd, 0x4f, 0x32, 0x87, 0x66, 0x63, 0xd9, + 0x95, 0xea, 0x0f, 0x89, 0xbf, 0x20, 0x18, 0xcd, 0xb3, 0x0e, 0xb5, 0x2e, 0x04, 0x63, 0x68, 0x1b, + 0xf0, 0x14, 0x21, 0x68, 0x91, 0x29, 0x69, 0x29, 0xb3, 0x2e, 0x8e, 0x38, 0xb5, 0x80, 0x6f, 0x91, + 0x1d, 0xb4, 0x11, 0x42, 0xd8, 0x02, 0x6d, 0x3a, 0x22, 0xca, 0xcc, 0x45, 0xc8, 0x6d, 0xb2, 0x8a, + 0x96, 0x23, 0x2a, 0xb4, 0x13, 0xd2, 0x58, 0x1a, 0x04, 0xd4, 0x0a, 0x25, 0xf1, 0xb4, 0x37, 0x9b, + 0xbe, 0x64, 0x17, 0xcd, 0x5f, 0x92, 0xfb, 0x68, 0x4f, 0xc3, 0x9b, 0x18, 0x8c, 0x75, 0x94, 0x73, + 0x0d, 0xc6, 0xb8, 0x23, 0xa5, 0x9d, 0xd5, 0x54, 0x1a, 0xca, 0x12, 0xd0, 0x0c, 0x79, 0x82, 0x0e, + 0x28, 0x63, 0x10, 0x59, 0x77, 0x13, 0x76, 0x96, 0x3c, 0x45, 0x8f, 0x38, 0xb0, 0x40, 0x48, 0xb8, + 0x11, 0x7c, 0x87, 0xac, 0xa3, 0x7b, 0x39, 0x68, 0xd2, 0x71, 0x97, 0xac, 0x20, 0x6c, 0x40, 0xf2, + 0x0b, 0x56, 0x44, 0xf6, 0xd0, 0xd6, 0xe5, 0xdc, 0x93, 0x80, 0x39, 0x4f, 0xcd, 0x95, 0x26, 0x5d, + 0x46, 0x20, 0x9e, 0xaf, 0x76, 0x53, 0xc6, 0x54, 0x2c, 0x2d, 0x5e, 0x20, 0xfb, 0x68, 0xe7, 0xaa, + 0x3b, 0x8a, 0x5b, 0x81, 0x60, 0xce, 0xcf, 0x05, 0x2f, 0x92, 0x5d, 0xb4, 0x99, 0xcf, 0x83, 0x29, + 0x0e, 0x8e, 0xf2, 0x1e, 0x68, 0x2b, 0x0c, 0x84, 0x20, 0x2d, 0x5e, 0x22, 0x0d, 0xb4, 0x1b, 0xc5, + 0xa6, 0xe3, 0xa4, 0xb2, 0xe2, 0x48, 0xb0, 0x34, 0x85, 0x86, 0xb6, 0x30, 0x56, 0xa7, 0x94, 0x63, + 0xcf, 0xd0, 0xff, 0x63, 0x9c, 0x06, 0x13, 0x29, 0x69, 0x00, 0x2f, 0x93, 0x2d, 0xb4, 0x7e, 0x15, + 0xfc, 0x26, 0x06, 0xdd, 0xc7, 0x84, 0x3c, 0x40, 0xf5, 0x6b, 0x9c, 0x65, 0x8a, 0x7b, 0xbe, 0xeb, + 0xaa, 0x7a, 0x09, 0x7f, 0x78, 0xc5, 0xb7, 0x54, 0xe5, 0xce, 0xc2, 0x57, 0xbd, 0x04, 0x21, 0x54, + 0xaf, 0x85, 0xd3, 0x90, 0xf1, 0xbc, 0x46, 0x36, 0xd0, 0x6a, 0x5b, 0xab, 0x38, 0x4a, 0x68, 0x71, + 0x42, 0xf6, 0x84, 0x4d, 0xbb, 0x5b, 0x27, 0xcb, 0x68, 0x21, 0x35, 0x72, 0x90, 0x56, 0xd8, 0x3e, + 0xae, 0x79, 0x34, 0x53, 0x61, 0x18, 0x4b, 0x61, 0xfb, 0x8e, 0x83, 0x61, 0x5a, 0x44, 0x09, 0x7a, + 0x83, 0xd4, 0xd0, 0x4a, 0xe9, 0x9a, 0xc8, 0xb3, 0xe9, 0x5f, 0x5d, 0x7a, 0x8a, 0x69, 0x2b, 0xf7, + 0x5a, 0x09, 0x89, 0xb7, 0xc8, 0x12, 0x9a, 0x8b, 0x84, 0x2c, 0x64, 0xbf, 0xed, 0x77, 0x07, 0xb8, + 0x28, 0x77, 0x67, 0xc7, 0xbf, 0xc4, 0x58, 0x6a, 0x63, 0x93, 0xaf, 0xce, 0xae, 0xef, 0x85, 0x43, + 0x00, 0x13, 0xfb, 0xb2, 0xe7, 0x45, 0x55, 0xa5, 0x99, 0xac, 0x34, 0xae, 0x93, 0x4d, 0xb4, 0x46, + 0xa5, 0x92, 0xfd, 0x50, 0xc5, 0xc6, 0x85, 0x60, 0xb5, 0x60, 0xae, 0x45, 0x2d, 0xeb, 0xe0, 0xfd, + 0x62, 0xab, 0x92, 0x96, 0x35, 0x84, 0xaa, 0x07, 0x1c, 0x37, 0xfc, 0xd4, 0x4a, 0x73, 0x56, 0xca, + 0x78, 0x02, 0x39, 0xbe, 0x4f, 0x10, 0x9a, 0x69, 0x51, 0xd6, 0x8d, 0x23, 0xfc, 0xa0, 0x50, 0xa4, + 0x67, 0xb6, 0xe7, 0x3b, 0x65, 0x20, 0x2d, 0xe8, 0x14, 0xfa, 0xb0, 0x50, 0xe4, 0x65, 0x77, 0xba, + 0x8d, 0xc0, 0xf1, 0x81, 0x57, 0x5c, 0x25, 0x84, 0x0b, 0x13, 0x0a, 0x63, 0x80, 0xe3, 0x47, 0x09, + 0x13, 0x1e, 0xd3, 0x52, 0xaa, 0x1b, 0x52, 0xdd, 0xc5, 0x87, 0x64, 0x0d, 0x91, 0xf4, 0x85, 0x01, + 0x50, 0xed, 0x3a, 0xc2, 0x58, 0xa5, 0xfb, 0xf8, 0xb1, 0xa7, 0x31, 0xb1, 0x1b, 0xb0, 0x56, 0xc8, + 0x36, 0x7e, 0x42, 0xea, 0x68, 0xbb, 0x1c, 0x04, 0xd5, 0xac, 0x23, 0x7a, 0xe0, 0x42, 0xda, 0x96, + 0x60, 0x03, 0x21, 0xbb, 0xf8, 0xa9, 0x1f, 0x62, 0x12, 0x13, 0x69, 0x75, 0x24, 0x02, 0x70, 0x91, + 0x60, 0x36, 0xd6, 0x80, 0xbf, 0x2a, 0xb2, 0xe5, 0x3b, 0xf6, 0x75, 0x42, 0x66, 0x7a, 0x4a, 0xf2, + 0x3d, 0xca, 0x95, 0xd8, 0xf4, 0xac, 0x69, 0xb0, 0x3a, 0x5d, 0xae, 0x8b, 0xce, 0x67, 0xe4, 0x00, + 0x35, 0xae, 0xd5, 0x43, 0x29, 0xd7, 0x6f, 0x4a, 0xea, 0x0b, 0x70, 0xd6, 0x8a, 0xc1, 0xdf, 0xfa, + 0x5e, 0xf2, 0xd0, 0xbc, 0x42, 0x0f, 0x74, 0x21, 0x7b, 0xfc, 0xdc, 0xab, 0xe1, 0xd2, 0xfb, 0x2e, + 0x00, 0x5e, 0xf8, 0x14, 0xf9, 0x0d, 0xaa, 0x44, 0x7c, 0x57, 0x68, 0xc2, 0xea, 0xd8, 0x58, 0xe0, + 0x2e, 0x36, 0xa0, 0xf1, 0xf7, 0xc5, 0xa8, 0x27, 0xd1, 0x45, 0x7f, 0x3f, 0x14, 0xa3, 0xbe, 0xd4, + 0xb9, 0xe3, 0xc0, 0x84, 0xf1, 0x89, 0x7f, 0x4c, 0x8f, 0x4f, 0x05, 0x05, 0x01, 0xd0, 0x1e, 0xe0, + 0x9f, 0xbc, 0x3f, 0x49, 0x91, 0x49, 0xdc, 0x9f, 0xdb, 0xb0, 0x54, 0xfa, 0xcf, 0xc5, 0xcc, 0x0d, + 0xed, 0x01, 0xcf, 0xaf, 0x32, 0x7e, 0xe9, 0xcf, 0x48, 0x99, 0x97, 0x51, 0xc9, 0x20, 0xb8, 0xb2, + 0x71, 0xbf, 0x78, 0x66, 0x32, 0x5f, 0x65, 0xdf, 0xaf, 0x8a, 0x61, 0x77, 0xa1, 0xef, 0x3f, 0x40, + 0xf8, 0x57, 0x7f, 0xde, 0x73, 0x0b, 0xa3, 0x9a, 0xbb, 0xec, 0x7e, 0xfc, 0x56, 0x50, 0x64, 0x14, + 0x13, 0x34, 0x70, 0x5e, 0x47, 0x06, 0xff, 0x4e, 0xb6, 0x51, 0x2d, 0x31, 0x83, 0x34, 0x09, 0x6b, + 0x92, 0x86, 0xe0, 0x38, 0x58, 0x2a, 0x02, 0x4c, 0x8b, 0xa0, 0xa3, 0x38, 0x08, 0x8a, 0x22, 0x2d, + 0xf2, 0x10, 0xed, 0x57, 0x2e, 0xc0, 0xe4, 0x3d, 0xc3, 0xcc, 0x5f, 0xdd, 0x1b, 0x61, 0xce, 0xdf, + 0x0b, 0xc0, 0xbc, 0xb5, 0xf0, 0xe7, 0x5c, 0xf3, 0xd9, 0xcb, 0xfc, 0x9b, 0xfe, 0x76, 0x26, 0xf9, + 0xef, 0xc5, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x7a, 0x53, 0x02, 0xd0, 0x7a, 0x08, 0x00, 0x00, } diff --git a/protocol/protobuf/application_metadata_message.proto b/protocol/protobuf/application_metadata_message.proto index 2435876be..fa1a569ca 100644 --- a/protocol/protobuf/application_metadata_message.proto +++ b/protocol/protobuf/application_metadata_message.proto @@ -79,5 +79,7 @@ message ApplicationMetadataMessage { SYNC_SOCIAL_LINKS = 64; SYNC_ENS_USERNAME_DETAIL = 65; SYNC_FULL_KEYPAIR = 66; + SYNC_ACTIVITY_CENTER_NOTIFICATION = 67; + SYNC_ACTIVITY_CENTER_NOTIFICATION_STATE = 68; } } diff --git a/protocol/protobuf/pairing.pb.go b/protocol/protobuf/pairing.pb.go index 623f6aa4e..2c0c8f197 100644 --- a/protocol/protobuf/pairing.pb.go +++ b/protocol/protobuf/pairing.pb.go @@ -20,6 +20,129 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package +type SyncActivityCenterNotification_NotificationType int32 + +const ( + SyncActivityCenterNotification_NoType SyncActivityCenterNotification_NotificationType = 0 + SyncActivityCenterNotification_NewOneToOne SyncActivityCenterNotification_NotificationType = 1 + SyncActivityCenterNotification_NewPrivateGroupChat SyncActivityCenterNotification_NotificationType = 2 + SyncActivityCenterNotification_Mention SyncActivityCenterNotification_NotificationType = 3 + SyncActivityCenterNotification_Reply SyncActivityCenterNotification_NotificationType = 4 + SyncActivityCenterNotification_ContactRequest SyncActivityCenterNotification_NotificationType = 5 + SyncActivityCenterNotification_CommunityInvitation SyncActivityCenterNotification_NotificationType = 6 + SyncActivityCenterNotification_CommunityRequest SyncActivityCenterNotification_NotificationType = 7 + SyncActivityCenterNotification_CommunityMembershipRequest SyncActivityCenterNotification_NotificationType = 8 + SyncActivityCenterNotification_CommunityKicked SyncActivityCenterNotification_NotificationType = 9 + SyncActivityCenterNotification_ContactVerification SyncActivityCenterNotification_NotificationType = 10 +) + +var SyncActivityCenterNotification_NotificationType_name = map[int32]string{ + 0: "NoType", + 1: "NewOneToOne", + 2: "NewPrivateGroupChat", + 3: "Mention", + 4: "Reply", + 5: "ContactRequest", + 6: "CommunityInvitation", + 7: "CommunityRequest", + 8: "CommunityMembershipRequest", + 9: "CommunityKicked", + 10: "ContactVerification", +} + +var SyncActivityCenterNotification_NotificationType_value = map[string]int32{ + "NoType": 0, + "NewOneToOne": 1, + "NewPrivateGroupChat": 2, + "Mention": 3, + "Reply": 4, + "ContactRequest": 5, + "CommunityInvitation": 6, + "CommunityRequest": 7, + "CommunityMembershipRequest": 8, + "CommunityKicked": 9, + "ContactVerification": 10, +} + +func (x SyncActivityCenterNotification_NotificationType) String() string { + return proto.EnumName(SyncActivityCenterNotification_NotificationType_name, int32(x)) +} + +func (SyncActivityCenterNotification_NotificationType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_d61ab7221f0b5518, []int{20, 0} +} + +type SyncActivityCenterNotification_MembershipStatus int32 + +const ( + SyncActivityCenterNotification_MembershipStatusIdle SyncActivityCenterNotification_MembershipStatus = 0 + SyncActivityCenterNotification_MembershipStatusPending SyncActivityCenterNotification_MembershipStatus = 1 + SyncActivityCenterNotification_MembershipStatusAccepted SyncActivityCenterNotification_MembershipStatus = 2 + SyncActivityCenterNotification_MembershipStatusDeclined SyncActivityCenterNotification_MembershipStatus = 3 +) + +var SyncActivityCenterNotification_MembershipStatus_name = map[int32]string{ + 0: "MembershipStatusIdle", + 1: "MembershipStatusPending", + 2: "MembershipStatusAccepted", + 3: "MembershipStatusDeclined", +} + +var SyncActivityCenterNotification_MembershipStatus_value = map[string]int32{ + "MembershipStatusIdle": 0, + "MembershipStatusPending": 1, + "MembershipStatusAccepted": 2, + "MembershipStatusDeclined": 3, +} + +func (x SyncActivityCenterNotification_MembershipStatus) String() string { + return proto.EnumName(SyncActivityCenterNotification_MembershipStatus_name, int32(x)) +} + +func (SyncActivityCenterNotification_MembershipStatus) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_d61ab7221f0b5518, []int{20, 1} +} + +type SyncActivityCenterNotification_ContactVerificationStatus int32 + +const ( + SyncActivityCenterNotification_Unknown SyncActivityCenterNotification_ContactVerificationStatus = 0 + SyncActivityCenterNotification_Pending SyncActivityCenterNotification_ContactVerificationStatus = 1 + SyncActivityCenterNotification_Accepted SyncActivityCenterNotification_ContactVerificationStatus = 2 + SyncActivityCenterNotification_Declined SyncActivityCenterNotification_ContactVerificationStatus = 3 + SyncActivityCenterNotification_Cancelled SyncActivityCenterNotification_ContactVerificationStatus = 4 + SyncActivityCenterNotification_Trusted SyncActivityCenterNotification_ContactVerificationStatus = 5 + SyncActivityCenterNotification_UnTrustWorthy SyncActivityCenterNotification_ContactVerificationStatus = 6 +) + +var SyncActivityCenterNotification_ContactVerificationStatus_name = map[int32]string{ + 0: "Unknown", + 1: "Pending", + 2: "Accepted", + 3: "Declined", + 4: "Cancelled", + 5: "Trusted", + 6: "UnTrustWorthy", +} + +var SyncActivityCenterNotification_ContactVerificationStatus_value = map[string]int32{ + "Unknown": 0, + "Pending": 1, + "Accepted": 2, + "Declined": 3, + "Cancelled": 4, + "Trusted": 5, + "UnTrustWorthy": 6, +} + +func (x SyncActivityCenterNotification_ContactVerificationStatus) String() string { + return proto.EnumName(SyncActivityCenterNotification_ContactVerificationStatus_name, int32(x)) +} + +func (SyncActivityCenterNotification_ContactVerificationStatus) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_d61ab7221f0b5518, []int{20, 2} +} + type SyncTrustedUser_TrustStatus int32 const ( @@ -45,7 +168,7 @@ func (x SyncTrustedUser_TrustStatus) String() string { } func (SyncTrustedUser_TrustStatus) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_d61ab7221f0b5518, []int{28, 0} + return fileDescriptor_d61ab7221f0b5518, []int{31, 0} } type SyncVerificationRequest_VerificationStatus int32 @@ -79,7 +202,7 @@ func (x SyncVerificationRequest_VerificationStatus) String() string { } func (SyncVerificationRequest_VerificationStatus) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_d61ab7221f0b5518, []int{29, 0} + return fileDescriptor_d61ab7221f0b5518, []int{32, 0} } type SyncContactRequestDecision_DecisionStatus int32 @@ -104,7 +227,7 @@ func (x SyncContactRequestDecision_DecisionStatus) String() string { } func (SyncContactRequestDecision_DecisionStatus) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_d61ab7221f0b5518, []int{30, 0} + return fileDescriptor_d61ab7221f0b5518, []int{33, 0} } type SyncKeycardAction_Action int32 @@ -147,7 +270,7 @@ func (x SyncKeycardAction_Action) String() string { } func (SyncKeycardAction_Action) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_d61ab7221f0b5518, []int{35, 0} + return fileDescriptor_d61ab7221f0b5518, []int{38, 0} } // `FetchingBackedUpDataDetails` is used to describe how many messages a single backup data structure consists of @@ -1717,6 +1840,243 @@ func (m *SyncActivityCenterDismissed) GetIds() [][]byte { return nil } +type SyncActivityCenterNotificationState struct { + UpdatedAt uint64 `protobuf:"varint,1,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + HasSeen bool `protobuf:"varint,2,opt,name=has_seen,json=hasSeen,proto3" json:"has_seen,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SyncActivityCenterNotificationState) Reset() { *m = SyncActivityCenterNotificationState{} } +func (m *SyncActivityCenterNotificationState) String() string { return proto.CompactTextString(m) } +func (*SyncActivityCenterNotificationState) ProtoMessage() {} +func (*SyncActivityCenterNotificationState) Descriptor() ([]byte, []int) { + return fileDescriptor_d61ab7221f0b5518, []int{18} +} + +func (m *SyncActivityCenterNotificationState) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SyncActivityCenterNotificationState.Unmarshal(m, b) +} +func (m *SyncActivityCenterNotificationState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SyncActivityCenterNotificationState.Marshal(b, m, deterministic) +} +func (m *SyncActivityCenterNotificationState) XXX_Merge(src proto.Message) { + xxx_messageInfo_SyncActivityCenterNotificationState.Merge(m, src) +} +func (m *SyncActivityCenterNotificationState) XXX_Size() int { + return xxx_messageInfo_SyncActivityCenterNotificationState.Size(m) +} +func (m *SyncActivityCenterNotificationState) XXX_DiscardUnknown() { + xxx_messageInfo_SyncActivityCenterNotificationState.DiscardUnknown(m) +} + +var xxx_messageInfo_SyncActivityCenterNotificationState proto.InternalMessageInfo + +func (m *SyncActivityCenterNotificationState) GetUpdatedAt() uint64 { + if m != nil { + return m.UpdatedAt + } + return 0 +} + +func (m *SyncActivityCenterNotificationState) GetHasSeen() bool { + if m != nil { + return m.HasSeen + } + return false +} + +type SyncActivityCenterNotifications struct { + ActivityCenterNotifications []*SyncActivityCenterNotification `protobuf:"bytes,1,rep,name=activity_center_notifications,json=activityCenterNotifications,proto3" json:"activity_center_notifications,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SyncActivityCenterNotifications) Reset() { *m = SyncActivityCenterNotifications{} } +func (m *SyncActivityCenterNotifications) String() string { return proto.CompactTextString(m) } +func (*SyncActivityCenterNotifications) ProtoMessage() {} +func (*SyncActivityCenterNotifications) Descriptor() ([]byte, []int) { + return fileDescriptor_d61ab7221f0b5518, []int{19} +} + +func (m *SyncActivityCenterNotifications) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SyncActivityCenterNotifications.Unmarshal(m, b) +} +func (m *SyncActivityCenterNotifications) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SyncActivityCenterNotifications.Marshal(b, m, deterministic) +} +func (m *SyncActivityCenterNotifications) XXX_Merge(src proto.Message) { + xxx_messageInfo_SyncActivityCenterNotifications.Merge(m, src) +} +func (m *SyncActivityCenterNotifications) XXX_Size() int { + return xxx_messageInfo_SyncActivityCenterNotifications.Size(m) +} +func (m *SyncActivityCenterNotifications) XXX_DiscardUnknown() { + xxx_messageInfo_SyncActivityCenterNotifications.DiscardUnknown(m) +} + +var xxx_messageInfo_SyncActivityCenterNotifications proto.InternalMessageInfo + +func (m *SyncActivityCenterNotifications) GetActivityCenterNotifications() []*SyncActivityCenterNotification { + if m != nil { + return m.ActivityCenterNotifications + } + return nil +} + +type SyncActivityCenterNotification struct { + Id []byte `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Timestamp uint64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + NotificationType SyncActivityCenterNotification_NotificationType `protobuf:"varint,3,opt,name=notification_type,json=notificationType,proto3,enum=protobuf.SyncActivityCenterNotification_NotificationType" json:"notification_type,omitempty"` + ChatId string `protobuf:"bytes,4,opt,name=chat_id,json=chatId,proto3" json:"chat_id,omitempty"` + Read bool `protobuf:"varint,5,opt,name=read,proto3" json:"read,omitempty"` + Dismissed bool `protobuf:"varint,6,opt,name=dismissed,proto3" json:"dismissed,omitempty"` + Accepted bool `protobuf:"varint,7,opt,name=accepted,proto3" json:"accepted,omitempty"` + Message []byte `protobuf:"bytes,8,opt,name=message,proto3" json:"message,omitempty"` + Author string `protobuf:"bytes,9,opt,name=author,proto3" json:"author,omitempty"` + ReplyMessage []byte `protobuf:"bytes,10,opt,name=reply_message,json=replyMessage,proto3" json:"reply_message,omitempty"` + CommunityId string `protobuf:"bytes,11,opt,name=community_id,json=communityId,proto3" json:"community_id,omitempty"` + MembershipStatus SyncActivityCenterNotification_MembershipStatus `protobuf:"varint,12,opt,name=membership_status,json=membershipStatus,proto3,enum=protobuf.SyncActivityCenterNotification_MembershipStatus" json:"membership_status,omitempty"` + ContactVerificationStatus SyncActivityCenterNotification_ContactVerificationStatus `protobuf:"varint,13,opt,name=contact_verification_status,json=contactVerificationStatus,proto3,enum=protobuf.SyncActivityCenterNotification_ContactVerificationStatus" json:"contact_verification_status,omitempty"` + Deleted bool `protobuf:"varint,14,opt,name=deleted,proto3" json:"deleted,omitempty"` + UpdatedAt uint64 `protobuf:"varint,15,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SyncActivityCenterNotification) Reset() { *m = SyncActivityCenterNotification{} } +func (m *SyncActivityCenterNotification) String() string { return proto.CompactTextString(m) } +func (*SyncActivityCenterNotification) ProtoMessage() {} +func (*SyncActivityCenterNotification) Descriptor() ([]byte, []int) { + return fileDescriptor_d61ab7221f0b5518, []int{20} +} + +func (m *SyncActivityCenterNotification) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SyncActivityCenterNotification.Unmarshal(m, b) +} +func (m *SyncActivityCenterNotification) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SyncActivityCenterNotification.Marshal(b, m, deterministic) +} +func (m *SyncActivityCenterNotification) XXX_Merge(src proto.Message) { + xxx_messageInfo_SyncActivityCenterNotification.Merge(m, src) +} +func (m *SyncActivityCenterNotification) XXX_Size() int { + return xxx_messageInfo_SyncActivityCenterNotification.Size(m) +} +func (m *SyncActivityCenterNotification) XXX_DiscardUnknown() { + xxx_messageInfo_SyncActivityCenterNotification.DiscardUnknown(m) +} + +var xxx_messageInfo_SyncActivityCenterNotification proto.InternalMessageInfo + +func (m *SyncActivityCenterNotification) GetId() []byte { + if m != nil { + return m.Id + } + return nil +} + +func (m *SyncActivityCenterNotification) GetTimestamp() uint64 { + if m != nil { + return m.Timestamp + } + return 0 +} + +func (m *SyncActivityCenterNotification) GetNotificationType() SyncActivityCenterNotification_NotificationType { + if m != nil { + return m.NotificationType + } + return SyncActivityCenterNotification_NoType +} + +func (m *SyncActivityCenterNotification) GetChatId() string { + if m != nil { + return m.ChatId + } + return "" +} + +func (m *SyncActivityCenterNotification) GetRead() bool { + if m != nil { + return m.Read + } + return false +} + +func (m *SyncActivityCenterNotification) GetDismissed() bool { + if m != nil { + return m.Dismissed + } + return false +} + +func (m *SyncActivityCenterNotification) GetAccepted() bool { + if m != nil { + return m.Accepted + } + return false +} + +func (m *SyncActivityCenterNotification) GetMessage() []byte { + if m != nil { + return m.Message + } + return nil +} + +func (m *SyncActivityCenterNotification) GetAuthor() string { + if m != nil { + return m.Author + } + return "" +} + +func (m *SyncActivityCenterNotification) GetReplyMessage() []byte { + if m != nil { + return m.ReplyMessage + } + return nil +} + +func (m *SyncActivityCenterNotification) GetCommunityId() string { + if m != nil { + return m.CommunityId + } + return "" +} + +func (m *SyncActivityCenterNotification) GetMembershipStatus() SyncActivityCenterNotification_MembershipStatus { + if m != nil { + return m.MembershipStatus + } + return SyncActivityCenterNotification_MembershipStatusIdle +} + +func (m *SyncActivityCenterNotification) GetContactVerificationStatus() SyncActivityCenterNotification_ContactVerificationStatus { + if m != nil { + return m.ContactVerificationStatus + } + return SyncActivityCenterNotification_Unknown +} + +func (m *SyncActivityCenterNotification) GetDeleted() bool { + if m != nil { + return m.Deleted + } + return false +} + +func (m *SyncActivityCenterNotification) GetUpdatedAt() uint64 { + if m != nil { + return m.UpdatedAt + } + return 0 +} + type SyncBookmark struct { Clock uint64 `protobuf:"varint,1,opt,name=clock,proto3" json:"clock,omitempty"` Url string `protobuf:"bytes,2,opt,name=url,proto3" json:"url,omitempty"` @@ -1733,7 +2093,7 @@ func (m *SyncBookmark) Reset() { *m = SyncBookmark{} } func (m *SyncBookmark) String() string { return proto.CompactTextString(m) } func (*SyncBookmark) ProtoMessage() {} func (*SyncBookmark) Descriptor() ([]byte, []int) { - return fileDescriptor_d61ab7221f0b5518, []int{18} + return fileDescriptor_d61ab7221f0b5518, []int{21} } func (m *SyncBookmark) XXX_Unmarshal(b []byte) error { @@ -1810,7 +2170,7 @@ func (m *SyncEnsUsernameDetail) Reset() { *m = SyncEnsUsernameDetail{} } func (m *SyncEnsUsernameDetail) String() string { return proto.CompactTextString(m) } func (*SyncEnsUsernameDetail) ProtoMessage() {} func (*SyncEnsUsernameDetail) Descriptor() ([]byte, []int) { - return fileDescriptor_d61ab7221f0b5518, []int{19} + return fileDescriptor_d61ab7221f0b5518, []int{22} } func (m *SyncEnsUsernameDetail) XXX_Unmarshal(b []byte) error { @@ -1871,7 +2231,7 @@ func (m *SyncClearHistory) Reset() { *m = SyncClearHistory{} } func (m *SyncClearHistory) String() string { return proto.CompactTextString(m) } func (*SyncClearHistory) ProtoMessage() {} func (*SyncClearHistory) Descriptor() ([]byte, []int) { - return fileDescriptor_d61ab7221f0b5518, []int{20} + return fileDescriptor_d61ab7221f0b5518, []int{23} } func (m *SyncClearHistory) XXX_Unmarshal(b []byte) error { @@ -1923,7 +2283,7 @@ func (m *SyncProfilePicture) Reset() { *m = SyncProfilePicture{} } func (m *SyncProfilePicture) String() string { return proto.CompactTextString(m) } func (*SyncProfilePicture) ProtoMessage() {} func (*SyncProfilePicture) Descriptor() ([]byte, []int) { - return fileDescriptor_d61ab7221f0b5518, []int{21} + return fileDescriptor_d61ab7221f0b5518, []int{24} } func (m *SyncProfilePicture) XXX_Unmarshal(b []byte) error { @@ -2005,7 +2365,7 @@ func (m *SyncProfilePictures) Reset() { *m = SyncProfilePictures{} } func (m *SyncProfilePictures) String() string { return proto.CompactTextString(m) } func (*SyncProfilePictures) ProtoMessage() {} func (*SyncProfilePictures) Descriptor() ([]byte, []int) { - return fileDescriptor_d61ab7221f0b5518, []int{22} + return fileDescriptor_d61ab7221f0b5518, []int{25} } func (m *SyncProfilePictures) XXX_Unmarshal(b []byte) error { @@ -2062,7 +2422,7 @@ func (m *SyncAccount) Reset() { *m = SyncAccount{} } func (m *SyncAccount) String() string { return proto.CompactTextString(m) } func (*SyncAccount) ProtoMessage() {} func (*SyncAccount) Descriptor() ([]byte, []int) { - return fileDescriptor_d61ab7221f0b5518, []int{23} + return fileDescriptor_d61ab7221f0b5518, []int{26} } func (m *SyncAccount) XXX_Unmarshal(b []byte) error { @@ -2185,7 +2545,7 @@ func (m *SyncKeypair) Reset() { *m = SyncKeypair{} } func (m *SyncKeypair) String() string { return proto.CompactTextString(m) } func (*SyncKeypair) ProtoMessage() {} func (*SyncKeypair) Descriptor() ([]byte, []int) { - return fileDescriptor_d61ab7221f0b5518, []int{24} + return fileDescriptor_d61ab7221f0b5518, []int{27} } func (m *SyncKeypair) XXX_Unmarshal(b []byte) error { @@ -2274,7 +2634,7 @@ func (m *SyncKeypairFull) Reset() { *m = SyncKeypairFull{} } func (m *SyncKeypairFull) String() string { return proto.CompactTextString(m) } func (*SyncKeypairFull) ProtoMessage() {} func (*SyncKeypairFull) Descriptor() ([]byte, []int) { - return fileDescriptor_d61ab7221f0b5518, []int{25} + return fileDescriptor_d61ab7221f0b5518, []int{28} } func (m *SyncKeypairFull) XXX_Unmarshal(b []byte) error { @@ -2327,7 +2687,7 @@ func (m *SyncSavedAddress) Reset() { *m = SyncSavedAddress{} } func (m *SyncSavedAddress) String() string { return proto.CompactTextString(m) } func (*SyncSavedAddress) ProtoMessage() {} func (*SyncSavedAddress) Descriptor() ([]byte, []int) { - return fileDescriptor_d61ab7221f0b5518, []int{26} + return fileDescriptor_d61ab7221f0b5518, []int{29} } func (m *SyncSavedAddress) XXX_Unmarshal(b []byte) error { @@ -2417,7 +2777,7 @@ func (m *SyncCommunitySettings) Reset() { *m = SyncCommunitySettings{} } func (m *SyncCommunitySettings) String() string { return proto.CompactTextString(m) } func (*SyncCommunitySettings) ProtoMessage() {} func (*SyncCommunitySettings) Descriptor() ([]byte, []int) { - return fileDescriptor_d61ab7221f0b5518, []int{27} + return fileDescriptor_d61ab7221f0b5518, []int{30} } func (m *SyncCommunitySettings) XXX_Unmarshal(b []byte) error { @@ -2472,7 +2832,7 @@ func (m *SyncTrustedUser) Reset() { *m = SyncTrustedUser{} } func (m *SyncTrustedUser) String() string { return proto.CompactTextString(m) } func (*SyncTrustedUser) ProtoMessage() {} func (*SyncTrustedUser) Descriptor() ([]byte, []int) { - return fileDescriptor_d61ab7221f0b5518, []int{28} + return fileDescriptor_d61ab7221f0b5518, []int{31} } func (m *SyncTrustedUser) XXX_Unmarshal(b []byte) error { @@ -2533,7 +2893,7 @@ func (m *SyncVerificationRequest) Reset() { *m = SyncVerificationRequest func (m *SyncVerificationRequest) String() string { return proto.CompactTextString(m) } func (*SyncVerificationRequest) ProtoMessage() {} func (*SyncVerificationRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d61ab7221f0b5518, []int{29} + return fileDescriptor_d61ab7221f0b5518, []int{32} } func (m *SyncVerificationRequest) XXX_Unmarshal(b []byte) error { @@ -2630,7 +2990,7 @@ func (m *SyncContactRequestDecision) Reset() { *m = SyncContactRequestDe func (m *SyncContactRequestDecision) String() string { return proto.CompactTextString(m) } func (*SyncContactRequestDecision) ProtoMessage() {} func (*SyncContactRequestDecision) Descriptor() ([]byte, []int) { - return fileDescriptor_d61ab7221f0b5518, []int{30} + return fileDescriptor_d61ab7221f0b5518, []int{33} } func (m *SyncContactRequestDecision) XXX_Unmarshal(b []byte) error { @@ -2689,7 +3049,7 @@ func (m *BackedUpProfile) Reset() { *m = BackedUpProfile{} } func (m *BackedUpProfile) String() string { return proto.CompactTextString(m) } func (*BackedUpProfile) ProtoMessage() {} func (*BackedUpProfile) Descriptor() ([]byte, []int) { - return fileDescriptor_d61ab7221f0b5518, []int{31} + return fileDescriptor_d61ab7221f0b5518, []int{34} } func (m *BackedUpProfile) XXX_Unmarshal(b []byte) error { @@ -2764,7 +3124,7 @@ func (m *RawMessage) Reset() { *m = RawMessage{} } func (m *RawMessage) String() string { return proto.CompactTextString(m) } func (*RawMessage) ProtoMessage() {} func (*RawMessage) Descriptor() ([]byte, []int) { - return fileDescriptor_d61ab7221f0b5518, []int{32} + return fileDescriptor_d61ab7221f0b5518, []int{35} } func (m *RawMessage) XXX_Unmarshal(b []byte) error { @@ -2813,7 +3173,7 @@ func (m *SyncRawMessage) Reset() { *m = SyncRawMessage{} } func (m *SyncRawMessage) String() string { return proto.CompactTextString(m) } func (*SyncRawMessage) ProtoMessage() {} func (*SyncRawMessage) Descriptor() ([]byte, []int) { - return fileDescriptor_d61ab7221f0b5518, []int{33} + return fileDescriptor_d61ab7221f0b5518, []int{36} } func (m *SyncRawMessage) XXX_Unmarshal(b []byte) error { @@ -2871,7 +3231,7 @@ func (m *SyncKeycard) Reset() { *m = SyncKeycard{} } func (m *SyncKeycard) String() string { return proto.CompactTextString(m) } func (*SyncKeycard) ProtoMessage() {} func (*SyncKeycard) Descriptor() ([]byte, []int) { - return fileDescriptor_d61ab7221f0b5518, []int{34} + return fileDescriptor_d61ab7221f0b5518, []int{37} } func (m *SyncKeycard) XXX_Unmarshal(b []byte) error { @@ -2947,7 +3307,7 @@ func (m *SyncKeycardAction) Reset() { *m = SyncKeycardAction{} } func (m *SyncKeycardAction) String() string { return proto.CompactTextString(m) } func (*SyncKeycardAction) ProtoMessage() {} func (*SyncKeycardAction) Descriptor() ([]byte, []int) { - return fileDescriptor_d61ab7221f0b5518, []int{35} + return fileDescriptor_d61ab7221f0b5518, []int{38} } func (m *SyncKeycardAction) XXX_Unmarshal(b []byte) error { @@ -3001,7 +3361,7 @@ func (m *SyncSocialLinks) Reset() { *m = SyncSocialLinks{} } func (m *SyncSocialLinks) String() string { return proto.CompactTextString(m) } func (*SyncSocialLinks) ProtoMessage() {} func (*SyncSocialLinks) Descriptor() ([]byte, []int) { - return fileDescriptor_d61ab7221f0b5518, []int{36} + return fileDescriptor_d61ab7221f0b5518, []int{39} } func (m *SyncSocialLinks) XXX_Unmarshal(b []byte) error { @@ -3037,6 +3397,9 @@ func (m *SyncSocialLinks) GetClock() uint64 { } func init() { + proto.RegisterEnum("protobuf.SyncActivityCenterNotification_NotificationType", SyncActivityCenterNotification_NotificationType_name, SyncActivityCenterNotification_NotificationType_value) + proto.RegisterEnum("protobuf.SyncActivityCenterNotification_MembershipStatus", SyncActivityCenterNotification_MembershipStatus_name, SyncActivityCenterNotification_MembershipStatus_value) + proto.RegisterEnum("protobuf.SyncActivityCenterNotification_ContactVerificationStatus", SyncActivityCenterNotification_ContactVerificationStatus_name, SyncActivityCenterNotification_ContactVerificationStatus_value) proto.RegisterEnum("protobuf.SyncTrustedUser_TrustStatus", SyncTrustedUser_TrustStatus_name, SyncTrustedUser_TrustStatus_value) proto.RegisterEnum("protobuf.SyncVerificationRequest_VerificationStatus", SyncVerificationRequest_VerificationStatus_name, SyncVerificationRequest_VerificationStatus_value) proto.RegisterEnum("protobuf.SyncContactRequestDecision_DecisionStatus", SyncContactRequestDecision_DecisionStatus_name, SyncContactRequestDecision_DecisionStatus_value) @@ -3063,6 +3426,9 @@ func init() { proto.RegisterType((*SyncActivityCenterRead)(nil), "protobuf.SyncActivityCenterRead") proto.RegisterType((*SyncActivityCenterAccepted)(nil), "protobuf.SyncActivityCenterAccepted") proto.RegisterType((*SyncActivityCenterDismissed)(nil), "protobuf.SyncActivityCenterDismissed") + proto.RegisterType((*SyncActivityCenterNotificationState)(nil), "protobuf.SyncActivityCenterNotificationState") + proto.RegisterType((*SyncActivityCenterNotifications)(nil), "protobuf.SyncActivityCenterNotifications") + proto.RegisterType((*SyncActivityCenterNotification)(nil), "protobuf.SyncActivityCenterNotification") proto.RegisterType((*SyncBookmark)(nil), "protobuf.SyncBookmark") proto.RegisterType((*SyncEnsUsernameDetail)(nil), "protobuf.SyncEnsUsernameDetail") proto.RegisterType((*SyncClearHistory)(nil), "protobuf.SyncClearHistory") @@ -3089,197 +3455,226 @@ func init() { } var fileDescriptor_d61ab7221f0b5518 = []byte{ - // 3057 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x39, 0x4d, 0x73, 0x1b, 0xc7, - 0xb1, 0xc6, 0x07, 0xf1, 0xd1, 0x00, 0x41, 0x68, 0x44, 0x4b, 0x10, 0x25, 0x97, 0xa4, 0xb5, 0x5d, - 0xd6, 0x7b, 0xe5, 0x47, 0xbd, 0x27, 0xbf, 0xc4, 0x8e, 0x24, 0x97, 0x03, 0x01, 0xb0, 0x45, 0x51, - 0x02, 0x99, 0x21, 0x21, 0xc7, 0xa9, 0x54, 0x6d, 0x46, 0xbb, 0x23, 0x62, 0xcd, 0xc5, 0x2e, 0xb2, - 0x33, 0xa0, 0x02, 0x1f, 0x52, 0x95, 0xfc, 0x82, 0x54, 0x2e, 0xf1, 0xd1, 0xe7, 0x54, 0x4e, 0xa9, - 0xca, 0x21, 0xb7, 0x9c, 0x52, 0xb9, 0xe7, 0x98, 0xfc, 0x82, 0x54, 0x7e, 0x40, 0x8e, 0xa9, 0xe9, - 0x99, 0xfd, 0xc2, 0x87, 0x42, 0x56, 0x4e, 0x39, 0x61, 0xbb, 0xa7, 0xbb, 0xb7, 0xb7, 0xbf, 0x7b, - 0x00, 0x9b, 0x53, 0xe6, 0x45, 0x5e, 0x70, 0xb2, 0x3b, 0x8d, 0x42, 0x19, 0x92, 0x1a, 0xfe, 0xbc, - 0x98, 0xbd, 0xdc, 0xb9, 0xec, 0x8c, 0x99, 0xb4, 0x3d, 0x97, 0x07, 0xd2, 0x93, 0x73, 0x7d, 0xbc, - 0x73, 0x59, 0xcc, 0x03, 0xc7, 0x16, 0x5c, 0x4a, 0x2f, 0x38, 0x11, 0x06, 0x69, 0xb1, 0xe9, 0xd4, - 0xf7, 0x1c, 0x26, 0xbd, 0x30, 0xb0, 0x27, 0x5c, 0x32, 0x97, 0x49, 0x66, 0x4f, 0xb8, 0x10, 0xec, - 0x84, 0x6b, 0x1a, 0x8b, 0xc1, 0xf5, 0x4f, 0xb9, 0x74, 0xc6, 0x5e, 0x70, 0xf2, 0x88, 0x39, 0xa7, - 0xdc, 0x1d, 0x4d, 0xfb, 0x4c, 0xb2, 0x3e, 0x97, 0xcc, 0xf3, 0x05, 0xb9, 0x09, 0x0d, 0x64, 0x0a, - 0x66, 0x93, 0x17, 0x3c, 0xea, 0x14, 0x6e, 0x15, 0xee, 0x6c, 0x52, 0x50, 0xa8, 0x21, 0x62, 0xc8, - 0x6d, 0x68, 0xca, 0x50, 0x32, 0x3f, 0xa6, 0x28, 0x22, 0x45, 0x03, 0x71, 0x9a, 0xc4, 0xfa, 0x45, - 0x15, 0x2a, 0x4a, 0xf6, 0x6c, 0x4a, 0xb6, 0x61, 0xc3, 0xf1, 0x43, 0xe7, 0x14, 0x05, 0x95, 0xa9, - 0x06, 0x48, 0x0b, 0x8a, 0x9e, 0x8b, 0x9c, 0x75, 0x5a, 0xf4, 0x5c, 0xf2, 0x09, 0xd4, 0x9c, 0x30, - 0x90, 0xcc, 0x91, 0xa2, 0x53, 0xba, 0x55, 0xba, 0xd3, 0xb8, 0xf7, 0xf6, 0x6e, 0xfc, 0xf9, 0xbb, - 0x47, 0xf3, 0xc0, 0xd9, 0x0b, 0x84, 0x64, 0xbe, 0x8f, 0x1f, 0xd6, 0xd3, 0x94, 0xcf, 0xef, 0xd1, - 0x84, 0x89, 0x7c, 0x07, 0x1a, 0x4e, 0x38, 0x99, 0xcc, 0x02, 0x4f, 0x7a, 0x5c, 0x74, 0xca, 0x28, - 0xe3, 0x6a, 0x5e, 0x46, 0xcf, 0x10, 0xcc, 0x69, 0x96, 0x96, 0x1c, 0xc0, 0x56, 0x2c, 0xc6, 0xd8, - 0xa0, 0xb3, 0x71, 0xab, 0x70, 0xa7, 0x71, 0xef, 0xdd, 0x94, 0xfd, 0x35, 0x06, 0xa3, 0x8b, 0xdc, - 0x64, 0x04, 0x24, 0x23, 0x3f, 0x96, 0x59, 0xb9, 0x88, 0xcc, 0x15, 0x02, 0xc8, 0x07, 0x50, 0x9d, - 0x46, 0xe1, 0x4b, 0xcf, 0xe7, 0x9d, 0x2a, 0xca, 0xba, 0x96, 0xca, 0x8a, 0x65, 0x1c, 0x6a, 0x02, - 0x1a, 0x53, 0x92, 0x67, 0xd0, 0x32, 0x8f, 0xb1, 0x1e, 0xb5, 0x8b, 0xe8, 0xb1, 0xc0, 0x4c, 0xee, - 0x42, 0xd5, 0x44, 0x5c, 0xa7, 0x8e, 0x72, 0xde, 0xcc, 0x9b, 0xf8, 0x48, 0x1f, 0xd2, 0x98, 0x4a, - 0x19, 0x37, 0x0e, 0xd1, 0x58, 0x01, 0xb8, 0x90, 0x71, 0x17, 0xb8, 0xc9, 0x03, 0x68, 0xbc, 0x9c, - 0xf9, 0xfe, 0x3e, 0x9f, 0xab, 0x6c, 0xe9, 0x34, 0x16, 0x2d, 0xa1, 0xb4, 0x30, 0x87, 0x9f, 0xce, - 0x7c, 0x9f, 0x66, 0xa9, 0x95, 0x67, 0x32, 0x60, 0xac, 0x50, 0xf3, 0x42, 0x9e, 0x59, 0x16, 0x40, - 0xba, 0xd0, 0x7e, 0xc5, 0xa4, 0x33, 0x3e, 0x08, 0xfc, 0x79, 0xd7, 0x71, 0xc2, 0x59, 0x20, 0x3b, - 0x9b, 0xab, 0xcc, 0x63, 0x0e, 0xe9, 0x12, 0x39, 0xb1, 0xe1, 0xea, 0x22, 0x2e, 0x56, 0xaf, 0x75, - 0x11, 0xf5, 0xd6, 0x49, 0xb1, 0xfe, 0x5e, 0x86, 0xe6, 0xb3, 0x99, 0x2f, 0xbd, 0xf8, 0x8d, 0x04, - 0xca, 0x01, 0x9b, 0x70, 0xcc, 0xcb, 0x3a, 0xc5, 0x67, 0x72, 0x03, 0xea, 0xd2, 0x9b, 0x70, 0x21, - 0xd9, 0x64, 0x8a, 0xd9, 0x59, 0xa2, 0x29, 0x42, 0x9d, 0xea, 0x1a, 0xe4, 0x84, 0x41, 0xa7, 0x84, - 0x6c, 0x29, 0x82, 0x7c, 0x02, 0xe0, 0x84, 0x7e, 0x18, 0xd9, 0x63, 0x26, 0xc6, 0x26, 0x01, 0x6f, - 0xa5, 0x4a, 0x67, 0xdf, 0xbd, 0xdb, 0x53, 0x84, 0x8f, 0x99, 0x18, 0xd3, 0xba, 0x13, 0x3f, 0x92, - 0x6b, 0xaa, 0x06, 0x28, 0x01, 0x9e, 0x8b, 0x09, 0x58, 0xa2, 0x55, 0x84, 0xf7, 0x5c, 0xf2, 0x1e, - 0x6c, 0x9d, 0xf2, 0xb9, 0xc3, 0x22, 0xd7, 0x36, 0x35, 0x12, 0xd3, 0xa9, 0x4e, 0x5b, 0x06, 0x7d, - 0xa8, 0xb1, 0xe4, 0x2a, 0x54, 0x4f, 0xf9, 0xdc, 0x9e, 0x79, 0x2e, 0xe6, 0x48, 0x9d, 0x56, 0x4e, - 0xf9, 0x7c, 0xe4, 0xb9, 0xe4, 0x21, 0x54, 0xbc, 0x09, 0x3b, 0xe1, 0x2a, 0xfe, 0x95, 0x66, 0xef, - 0xac, 0xd1, 0x6c, 0xcf, 0x14, 0xd9, 0x3d, 0x45, 0x4c, 0x0d, 0x0f, 0xb9, 0x0b, 0x97, 0x9d, 0x99, - 0x90, 0xe1, 0xc4, 0xfb, 0x4a, 0x97, 0x56, 0x54, 0x0c, 0x53, 0xa0, 0x4e, 0x49, 0xee, 0x08, 0x3f, - 0x6d, 0xe7, 0x36, 0xd4, 0x93, 0x6f, 0x54, 0x25, 0xd0, 0x0b, 0x5c, 0xfe, 0x93, 0x4e, 0xe1, 0x56, - 0xe9, 0x4e, 0x89, 0x6a, 0x60, 0xe7, 0x2f, 0x05, 0xd8, 0xcc, 0xbd, 0x2d, 0xab, 0x7c, 0x21, 0xa7, - 0x7c, 0xec, 0xaa, 0x62, 0xc6, 0x55, 0x1d, 0xa8, 0x4e, 0xd9, 0xdc, 0x0f, 0x99, 0x8b, 0xae, 0x68, - 0xd2, 0x18, 0x54, 0xaf, 0x7b, 0xe5, 0xb9, 0x52, 0xf9, 0x40, 0x19, 0x51, 0x03, 0xe4, 0x0a, 0x54, - 0xc6, 0xdc, 0x3b, 0x19, 0x4b, 0x63, 0x5b, 0x03, 0x91, 0x1d, 0xa8, 0xa9, 0x04, 0x17, 0xde, 0x57, - 0x1c, 0x6d, 0x5a, 0xa2, 0x09, 0x4c, 0xde, 0x86, 0xcd, 0x08, 0x9f, 0x6c, 0xc9, 0xa2, 0x13, 0x2e, - 0xd1, 0xa6, 0x25, 0xda, 0xd4, 0xc8, 0x63, 0xc4, 0xa5, 0x05, 0xbe, 0x96, 0x29, 0xf0, 0xd6, 0x9f, - 0x0b, 0x70, 0xf9, 0x69, 0xe8, 0x30, 0xdf, 0x78, 0xe6, 0xd0, 0x28, 0xf7, 0x2d, 0x28, 0x9f, 0xf2, - 0xb9, 0x40, 0x53, 0x34, 0xee, 0xdd, 0x4e, 0xbd, 0xb0, 0x82, 0x78, 0x77, 0x9f, 0xcf, 0x29, 0x92, - 0x93, 0xfb, 0xd0, 0x9c, 0x28, 0x37, 0x31, 0x93, 0x5d, 0x45, 0xcc, 0x89, 0x2b, 0xab, 0x9d, 0x48, - 0x73, 0xb4, 0xea, 0x0b, 0xa7, 0x4c, 0x88, 0x57, 0x61, 0xe4, 0x9a, 0xa8, 0x4d, 0xe0, 0x9d, 0xff, - 0x81, 0xd2, 0x3e, 0x9f, 0xaf, 0xcc, 0x05, 0x02, 0x65, 0xd5, 0xf4, 0xf0, 0x55, 0x4d, 0x8a, 0xcf, - 0xd6, 0xef, 0x0b, 0xf0, 0x66, 0x4e, 0x51, 0xce, 0xa3, 0xc7, 0xdc, 0xf7, 0x43, 0x15, 0xa1, 0x26, - 0x32, 0xed, 0x33, 0x1e, 0x09, 0x2f, 0x0c, 0x50, 0xd8, 0x06, 0x6d, 0x19, 0xf4, 0x73, 0x8d, 0x55, - 0x4e, 0x9e, 0x72, 0x8e, 0x41, 0xae, 0x25, 0x57, 0x14, 0xb8, 0xe7, 0x62, 0xdf, 0xe5, 0x67, 0x9e, - 0xc3, 0x6d, 0x54, 0x45, 0x6b, 0x0a, 0x1a, 0x35, 0x54, 0x0a, 0xa5, 0x04, 0x72, 0x3e, 0xe5, 0xe8, - 0xdd, 0x84, 0xe0, 0x78, 0x3e, 0xc5, 0xec, 0x15, 0xde, 0x49, 0xc0, 0xe4, 0x2c, 0xe2, 0xe8, 0xe5, - 0x26, 0x4d, 0x11, 0xd6, 0x37, 0x05, 0x68, 0x2b, 0xb5, 0xb3, 0x9d, 0x74, 0x4d, 0x77, 0x7e, 0x0f, - 0xb6, 0xbc, 0x0c, 0x95, 0x9d, 0xb4, 0xea, 0x56, 0x16, 0x9d, 0xd3, 0x19, 0x55, 0x2a, 0x2d, 0xa9, - 0x14, 0x1b, 0xb6, 0x9c, 0x8f, 0xdc, 0xd8, 0x44, 0x1b, 0x38, 0x3a, 0xc4, 0xa0, 0xf5, 0xb7, 0x02, - 0x5c, 0x5d, 0xd3, 0xec, 0xcf, 0x39, 0x47, 0xbc, 0x0d, 0x9b, 0xa6, 0x63, 0xd9, 0x98, 0xba, 0x46, - 0xa5, 0xa6, 0x41, 0xea, 0x3c, 0xbb, 0x06, 0x35, 0x1e, 0x08, 0x3b, 0xa3, 0x58, 0x95, 0x07, 0x02, - 0x6d, 0x7c, 0x1b, 0x9a, 0x3e, 0x13, 0xd2, 0x9e, 0x4d, 0x5d, 0x26, 0xb9, 0xae, 0x43, 0x65, 0xda, - 0x50, 0xb8, 0x91, 0x46, 0xa9, 0x6f, 0x16, 0x73, 0x21, 0xf9, 0xc4, 0x96, 0xec, 0x44, 0xb5, 0xf5, - 0x92, 0xfa, 0x66, 0x8d, 0x3a, 0x66, 0x27, 0x82, 0xbc, 0x0b, 0x2d, 0x5f, 0xc5, 0x88, 0x1d, 0x78, - 0xce, 0x29, 0xbe, 0x44, 0x97, 0xa2, 0x4d, 0xc4, 0x0e, 0x0d, 0xd2, 0xfa, 0x59, 0x05, 0xae, 0xad, - 0x9d, 0x6c, 0xc8, 0xff, 0xc2, 0x76, 0x56, 0x11, 0x1b, 0x79, 0xfd, 0xb9, 0xf9, 0x7a, 0x92, 0x51, - 0xe8, 0xa9, 0x3e, 0xf9, 0x0f, 0x36, 0x85, 0xf2, 0x2d, 0x73, 0x5d, 0xee, 0x62, 0x41, 0xad, 0x51, - 0x0d, 0xa8, 0x38, 0x79, 0xa1, 0x9c, 0xcc, 0x5d, 0x1c, 0x19, 0x6a, 0x34, 0x06, 0x15, 0xfd, 0x64, - 0xa6, 0x74, 0x6a, 0x68, 0x7a, 0x04, 0x14, 0x7d, 0xc4, 0x27, 0xe1, 0x19, 0x77, 0xb1, 0xa3, 0xd7, - 0x68, 0x0c, 0x92, 0x5b, 0xd0, 0x1c, 0x33, 0x61, 0xa3, 0x58, 0x7b, 0x26, 0xb0, 0x37, 0xd7, 0x28, - 0x8c, 0x99, 0xe8, 0x2a, 0xd4, 0x08, 0x0b, 0xfc, 0x19, 0x8f, 0xbc, 0x97, 0xf1, 0xe8, 0x2c, 0x24, - 0x93, 0x33, 0xdd, 0x7a, 0x4b, 0x94, 0x64, 0x8f, 0x8e, 0xf0, 0x04, 0x87, 0xe0, 0x68, 0x26, 0x64, - 0x4c, 0xb9, 0x85, 0x94, 0x0d, 0xc4, 0x19, 0x92, 0x8f, 0xe1, 0xba, 0x99, 0x0c, 0xed, 0x88, 0xff, - 0x78, 0xc6, 0x85, 0xd4, 0x5e, 0x44, 0x16, 0xde, 0x69, 0x23, 0x47, 0xc7, 0x90, 0x50, 0x4d, 0x81, - 0xce, 0x54, 0xfc, 0x7c, 0x3d, 0xbb, 0x4e, 0x83, 0x4b, 0x6b, 0xd9, 0x7b, 0x98, 0x19, 0x9f, 0xc0, - 0x8d, 0x45, 0x76, 0x65, 0x0e, 0xc9, 0xcd, 0xeb, 0x09, 0xf2, 0x5f, 0xcb, 0xf3, 0x53, 0xa4, 0xd0, - 0xef, 0x5f, 0x2f, 0x40, 0x2b, 0x70, 0x79, 0xbd, 0x00, 0xad, 0xc1, 0x6d, 0x68, 0xba, 0x9e, 0x98, - 0xfa, 0x6c, 0xae, 0xe3, 0x6b, 0x1b, 0x5d, 0xdf, 0x30, 0x38, 0x15, 0x63, 0xd6, 0xab, 0xe5, 0x7c, - 0x8f, 0xc7, 0x93, 0xd5, 0xf9, 0xbe, 0x14, 0xd4, 0xc5, 0x15, 0x41, 0xbd, 0x18, 0xb9, 0xa5, 0xa5, - 0xc8, 0xb5, 0x1e, 0xc1, 0xce, 0xe2, 0x8b, 0x0f, 0x67, 0x2f, 0x7c, 0xcf, 0xe9, 0x8d, 0xd9, 0x39, - 0x6b, 0x8d, 0xf5, 0xbb, 0x12, 0x6c, 0xe6, 0xd6, 0x8a, 0x7f, 0xc9, 0xd7, 0xc4, 0xc4, 0xbc, 0x09, - 0x8d, 0x69, 0xe4, 0x9d, 0x31, 0xc9, 0xed, 0x53, 0x3e, 0x37, 0xdd, 0x1b, 0x0c, 0x4a, 0x75, 0xa3, - 0x5b, 0xaa, 0xaa, 0x0a, 0x27, 0xf2, 0xa6, 0x4a, 0x2f, 0xcc, 0xcb, 0x26, 0xcd, 0xa2, 0x54, 0x33, - 0xff, 0x32, 0xf4, 0x02, 0x93, 0x95, 0x35, 0x6a, 0x20, 0xd5, 0xea, 0x74, 0xac, 0x72, 0x17, 0x9b, - 0x79, 0x8d, 0x26, 0x70, 0x9a, 0x34, 0xd5, 0x6c, 0xd2, 0x1c, 0x40, 0xdb, 0x78, 0x57, 0xd8, 0x32, - 0xb4, 0x95, 0x1c, 0x33, 0x21, 0xbd, 0xbb, 0x6e, 0x79, 0x32, 0xe4, 0xc7, 0xe1, 0x93, 0xd0, 0x0b, - 0x68, 0x2b, 0xca, 0xc1, 0xe4, 0x01, 0xd4, 0xe2, 0x91, 0xdd, 0xac, 0x08, 0x37, 0xd7, 0x08, 0x32, - 0xbb, 0x82, 0xa0, 0x09, 0x83, 0xea, 0x60, 0x3c, 0x70, 0xa2, 0xf9, 0x54, 0x26, 0x49, 0x9f, 0x22, - 0xb0, 0xbf, 0x4d, 0xb9, 0x23, 0x59, 0x9a, 0xfa, 0x29, 0x42, 0x35, 0x2d, 0x43, 0xaa, 0x12, 0x18, - 0x87, 0x8c, 0x26, 0x5a, 0xae, 0x95, 0xa2, 0xf7, 0xf9, 0x5c, 0x58, 0x3f, 0x2f, 0xc1, 0xf5, 0xd7, - 0x7c, 0x91, 0xf1, 0x57, 0x21, 0xf1, 0xd7, 0x5b, 0x00, 0x53, 0x8c, 0x0d, 0x74, 0x97, 0xf6, 0x7f, - 0x5d, 0x63, 0x94, 0xb7, 0x12, 0xa7, 0x97, 0xb2, 0x4e, 0x7f, 0x4d, 0x61, 0xbd, 0x0a, 0x55, 0xb3, - 0xcf, 0xa3, 0xf7, 0xea, 0xb4, 0xa2, 0xc0, 0x3d, 0x57, 0xc5, 0x6d, 0xbc, 0xf6, 0xcd, 0xd5, 0x69, - 0x45, 0x3b, 0x3e, 0xc1, 0xed, 0xa1, 0x13, 0x75, 0xfa, 0x56, 0xf5, 0xcb, 0x10, 0x20, 0xa7, 0x40, - 0x22, 0x7e, 0xc6, 0x99, 0xcf, 0x5d, 0x55, 0xe4, 0x22, 0x2e, 0x44, 0x32, 0xe8, 0x3e, 0x3c, 0x97, - 0x1b, 0x77, 0xa9, 0xe1, 0xef, 0xc6, 0xec, 0x83, 0x40, 0x46, 0x73, 0x7a, 0x29, 0x5a, 0xc4, 0xef, - 0xf4, 0xe1, 0xca, 0x6a, 0x62, 0xd2, 0x86, 0x92, 0xb2, 0x90, 0x1e, 0xa2, 0xd4, 0xa3, 0x52, 0xf7, - 0x8c, 0xf9, 0x33, 0x6e, 0xa2, 0x5f, 0x03, 0xf7, 0x8b, 0x1f, 0x15, 0xac, 0x5f, 0x16, 0xa1, 0xbd, - 0x98, 0x81, 0xe4, 0xe3, 0xcc, 0x2d, 0xc0, 0xd2, 0x80, 0xb8, 0xa6, 0x57, 0x66, 0xee, 0x00, 0x3e, - 0x83, 0xa6, 0x71, 0x94, 0x32, 0xa8, 0xe8, 0x14, 0x17, 0x27, 0xfd, 0xf5, 0x29, 0x4f, 0x1b, 0xd3, - 0xe4, 0x59, 0xed, 0x98, 0xd5, 0x78, 0xd0, 0x2c, 0x61, 0x08, 0xbf, 0x46, 0x8d, 0x78, 0xe6, 0x8c, - 0x39, 0xfe, 0x8d, 0x9b, 0x08, 0xeb, 0x43, 0xd8, 0xc2, 0x53, 0xa5, 0x90, 0x69, 0x5d, 0xe7, 0x2b, - 0x45, 0x0f, 0x61, 0x3b, 0x66, 0x7c, 0xa6, 0xef, 0x7a, 0x04, 0xe5, 0xec, 0xbc, 0xdc, 0xdf, 0x85, - 0x2b, 0x7a, 0x39, 0x95, 0xde, 0x99, 0x27, 0xe7, 0x3d, 0x1e, 0x48, 0x1e, 0xbd, 0x86, 0xbf, 0x0d, - 0x25, 0xcf, 0xd5, 0xe6, 0x6d, 0x52, 0xf5, 0x68, 0xf5, 0x75, 0x39, 0xcd, 0x4b, 0xe8, 0x3a, 0x0e, - 0xc7, 0xbc, 0x3d, 0xaf, 0x94, 0x81, 0xce, 0xcb, 0xbc, 0x94, 0xbe, 0x27, 0x26, 0x9e, 0x10, 0x17, - 0x10, 0xf3, 0x4d, 0x01, 0x9a, 0x4a, 0xce, 0xa3, 0x30, 0x3c, 0x9d, 0xb0, 0xe8, 0x74, 0x3d, 0xe3, - 0x2c, 0xf2, 0x8d, 0x19, 0xd4, 0x63, 0x32, 0xac, 0x96, 0x32, 0xc3, 0xea, 0x75, 0xa8, 0x63, 0xa3, - 0xb1, 0x15, 0xad, 0x4e, 0xe4, 0x1a, 0x22, 0x46, 0x91, 0x9f, 0x9d, 0x38, 0x36, 0xf2, 0x13, 0xc7, - 0x5b, 0x00, 0x2e, 0xf7, 0xb9, 0x9a, 0xdc, 0x98, 0xc4, 0x44, 0x2e, 0xd3, 0xba, 0xc1, 0x74, 0xa5, - 0xf5, 0x53, 0x78, 0x53, 0x69, 0x38, 0x08, 0xc4, 0x48, 0xf0, 0x48, 0xbd, 0x48, 0xaf, 0xe9, 0x6b, - 0x54, 0xdd, 0x81, 0xda, 0xcc, 0xd0, 0x19, 0x7d, 0x13, 0x18, 0xb7, 0xe6, 0x31, 0xf3, 0x70, 0x48, - 0xd7, 0x15, 0xa8, 0x8a, 0xf0, 0x5e, 0x6e, 0x20, 0x2a, 0xe7, 0xd4, 0xb3, 0x9e, 0xe8, 0xe4, 0xeb, - 0xf9, 0x9c, 0x45, 0x8f, 0x3d, 0x21, 0xc3, 0x68, 0x9e, 0x2d, 0x4b, 0x85, 0x5c, 0x59, 0x7a, 0x0b, - 0xc0, 0x51, 0x84, 0xfa, 0x5b, 0x8a, 0xfa, 0x5b, 0x0c, 0xa6, 0x2b, 0xad, 0x3f, 0x15, 0x80, 0x28, - 0x61, 0xe6, 0xea, 0xe9, 0xd0, 0x73, 0xd4, 0xba, 0xb1, 0x72, 0xa5, 0xca, 0xec, 0xac, 0xc5, 0x35, - 0x3b, 0x6b, 0x09, 0x37, 0x82, 0xa5, 0x9d, 0xb5, 0x8c, 0xe8, 0x78, 0x67, 0xbd, 0x0e, 0x75, 0x1c, - 0x01, 0x70, 0x69, 0xd5, 0x3b, 0x04, 0x2e, 0xad, 0x47, 0x2b, 0x97, 0xd6, 0x0a, 0x12, 0xac, 0x59, - 0x5a, 0xab, 0xd9, 0xa5, 0x75, 0x0c, 0x97, 0x97, 0xbf, 0x44, 0xac, 0xdf, 0xcb, 0x3f, 0x82, 0xda, - 0xd4, 0x10, 0x99, 0x62, 0x73, 0x23, 0x9f, 0xe7, 0x79, 0x49, 0x34, 0xa1, 0xb6, 0x7e, 0x53, 0x84, - 0x46, 0xe6, 0x42, 0x68, 0x8d, 0xdf, 0x3b, 0x50, 0x35, 0xe5, 0x3c, 0xb6, 0x97, 0x01, 0xb3, 0x2a, - 0x95, 0x72, 0x2a, 0xe5, 0x9b, 0x95, 0x1e, 0x1d, 0x32, 0xcd, 0x8a, 0x40, 0x79, 0xca, 0xe4, 0xd8, - 0x34, 0x1e, 0x7c, 0x4e, 0x3c, 0x55, 0xc9, 0x78, 0x2a, 0x7b, 0x17, 0xa3, 0x47, 0xf6, 0xe4, 0x2e, - 0x66, 0x1b, 0x36, 0xf8, 0x24, 0xfc, 0xd2, 0xc3, 0x7d, 0xbf, 0x4e, 0x35, 0xa0, 0x5c, 0xf5, 0x8a, - 0xf9, 0x3e, 0x97, 0x66, 0x86, 0x37, 0x90, 0x12, 0xae, 0xc2, 0xc8, 0x34, 0x73, 0x7c, 0x46, 0xb7, - 0x7a, 0xae, 0xcb, 0x03, 0xd3, 0xc4, 0x0d, 0xb4, 0x7e, 0x80, 0xb7, 0xbe, 0x36, 0xe6, 0x8a, 0xef, - 0xf1, 0x56, 0x9b, 0x2b, 0x63, 0x94, 0xe2, 0xca, 0xfb, 0x93, 0x52, 0x7e, 0xbd, 0xcf, 0xac, 0xd1, - 0xf8, 0x8c, 0x13, 0x2b, 0x8f, 0xbc, 0x33, 0xee, 0xda, 0x2f, 0xa3, 0x70, 0x62, 0xac, 0xd4, 0x30, - 0xb8, 0x4f, 0xa3, 0x70, 0x42, 0x1e, 0xc0, 0x8e, 0x9e, 0x2d, 0x05, 0x77, 0x6d, 0x3c, 0x30, 0x2b, - 0x32, 0x5e, 0xf0, 0xe8, 0x44, 0xbf, 0x8a, 0x93, 0xa6, 0xe0, 0x6e, 0x3f, 0x39, 0xdf, 0x53, 0xc7, - 0x7a, 0x5f, 0x0a, 0x9c, 0x58, 0xbc, 0x36, 0x2c, 0x68, 0x14, 0x4a, 0xff, 0x3f, 0xa8, 0x99, 0x36, - 0x12, 0xb7, 0xef, 0x35, 0x17, 0x88, 0x09, 0x99, 0x35, 0xd3, 0x3d, 0x23, 0x73, 0xe5, 0x49, 0xee, - 0xa2, 0x1d, 0xf0, 0x7a, 0xb4, 0xb0, 0xea, 0x16, 0xd2, 0xd0, 0xd2, 0x98, 0x4a, 0xbd, 0xd6, 0xdc, - 0xa3, 0xc5, 0x71, 0xbc, 0xcc, 0xa1, 0x4e, 0x69, 0x42, 0x66, 0xfd, 0xa3, 0xa0, 0x4b, 0xc8, 0x11, - 0x3b, 0x4b, 0xe6, 0x80, 0x6c, 0xbc, 0x16, 0xf2, 0xf1, 0xba, 0xea, 0x06, 0xeb, 0x06, 0xd4, 0x5f, - 0xb2, 0xb3, 0x70, 0x16, 0x79, 0x52, 0xbb, 0xa6, 0x46, 0x53, 0xc4, 0x6b, 0x6a, 0xeb, 0x6d, 0x68, - 0xea, 0xc9, 0xde, 0xce, 0xa6, 0x70, 0x43, 0xe3, 0xf4, 0xea, 0xf1, 0xdf, 0x70, 0x49, 0x17, 0x45, - 0x31, 0x0e, 0x23, 0x89, 0x53, 0x98, 0x30, 0xf1, 0xba, 0x85, 0x07, 0x47, 0x0a, 0xaf, 0xa6, 0x31, - 0xa1, 0xfa, 0x00, 0x0f, 0x84, 0xb9, 0xcb, 0x53, 0x8f, 0x2a, 0x8e, 0x3c, 0x61, 0x4b, 0x2e, 0xe2, - 0xb0, 0xad, 0x78, 0xe2, 0x98, 0x0b, 0xf9, 0xa4, 0x5c, 0x2b, 0xb7, 0x37, 0xac, 0x5f, 0x15, 0x74, - 0xf5, 0x5e, 0x1a, 0x64, 0xd7, 0x84, 0xe5, 0xe2, 0x58, 0xa7, 0x6d, 0x90, 0x1b, 0xeb, 0x06, 0x70, - 0x73, 0xac, 0xcb, 0xb0, 0xcd, 0x22, 0x67, 0xec, 0x9d, 0x71, 0x5b, 0xcc, 0xa6, 0x53, 0xa5, 0x3b, - 0x0f, 0xd8, 0x0b, 0xdf, 0x2c, 0x31, 0x35, 0x7a, 0xc3, 0x90, 0x75, 0x35, 0xd5, 0x91, 0x26, 0x1a, - 0x68, 0x1a, 0xeb, 0xb7, 0x05, 0x1d, 0x0c, 0xc7, 0x6a, 0x0b, 0x55, 0x7b, 0x2d, 0x8f, 0xce, 0x79, - 0x6f, 0xf2, 0x31, 0x54, 0xcc, 0x22, 0xab, 0xde, 0xd3, 0x5a, 0x1c, 0xfe, 0x33, 0x02, 0x77, 0x8f, - 0xd3, 0x15, 0x97, 0x1a, 0x26, 0xeb, 0x3e, 0x34, 0x32, 0x68, 0xd2, 0x80, 0xea, 0x68, 0xb8, 0x3f, - 0x3c, 0xf8, 0x7c, 0xd8, 0x7e, 0x43, 0x01, 0xc7, 0x74, 0x74, 0x74, 0x3c, 0xe8, 0xb7, 0x0b, 0xe4, - 0x12, 0x6c, 0x8e, 0x86, 0x08, 0x7e, 0x7e, 0x40, 0x8f, 0x1f, 0x7f, 0xd1, 0x2e, 0x5a, 0xdf, 0x94, - 0xf4, 0x12, 0xf8, 0x3c, 0xb3, 0x64, 0x9b, 0xe1, 0x74, 0x8d, 0xf2, 0x04, 0xca, 0x98, 0x3f, 0x26, - 0x98, 0xd4, 0xb3, 0xfa, 0x20, 0x19, 0x9a, 0x04, 0x2f, 0xca, 0x50, 0x05, 0x97, 0x33, 0x56, 0x25, - 0x28, 0x38, 0x89, 0x73, 0x3c, 0x45, 0x28, 0x97, 0x98, 0xb5, 0x45, 0x37, 0x35, 0x73, 0xb7, 0x91, - 0xe0, 0xba, 0x78, 0x6b, 0x18, 0x71, 0x31, 0x0d, 0x03, 0x11, 0x57, 0xc6, 0x04, 0x56, 0x45, 0x36, - 0xe2, 0x53, 0xdf, 0xd3, 0xcc, 0x3a, 0xfe, 0xea, 0x06, 0xd3, 0x95, 0x84, 0xaf, 0xbe, 0x4c, 0xa8, - 0xa1, 0x65, 0xff, 0x3f, 0x6f, 0xd9, 0x15, 0x5f, 0xbd, 0xfb, 0x7c, 0xe9, 0xba, 0x61, 0xe5, 0x15, - 0x84, 0xf6, 0x61, 0x3d, 0x19, 0xe3, 0xbe, 0x0f, 0x64, 0x99, 0x73, 0xc9, 0x17, 0x87, 0x83, 0x61, - 0x7f, 0x6f, 0xf8, 0x59, 0xbb, 0x40, 0x9a, 0x50, 0xeb, 0xf6, 0x7a, 0x83, 0x43, 0xe5, 0x99, 0xa2, - 0x82, 0xfa, 0x83, 0xde, 0xd3, 0xbd, 0xe1, 0xa0, 0xdf, 0x2e, 0x29, 0xa8, 0xd7, 0x1d, 0xf6, 0x06, - 0x4f, 0x07, 0xfd, 0x76, 0xd9, 0xfa, 0x6b, 0x41, 0xcf, 0x77, 0xbd, 0xdc, 0xae, 0xdf, 0xe7, 0x8e, - 0x27, 0xd6, 0x5f, 0x22, 0xde, 0x80, 0xba, 0xb1, 0xe7, 0x5e, 0x1c, 0x69, 0x29, 0x82, 0xfc, 0x10, - 0xb6, 0x5c, 0xc3, 0x6f, 0xe7, 0x22, 0xef, 0x83, 0xc5, 0x49, 0x79, 0xd5, 0x2b, 0x77, 0xe3, 0x07, - 0x63, 0x9e, 0x96, 0x9b, 0x83, 0xad, 0xf7, 0xa1, 0x95, 0xa7, 0xc8, 0x7d, 0xec, 0x1b, 0xb9, 0x8f, - 0x2d, 0x58, 0x7f, 0x2c, 0xc2, 0xd6, 0xc2, 0x1f, 0x68, 0xeb, 0x7b, 0xfe, 0xe2, 0xad, 0x46, 0x71, - 0xe9, 0x56, 0x83, 0xbc, 0x0f, 0x24, 0x4b, 0x62, 0x67, 0xd7, 0xc3, 0x76, 0x86, 0x50, 0xd7, 0xaa, - 0xec, 0x10, 0x51, 0xbe, 0xc8, 0x10, 0x41, 0x1e, 0x42, 0x53, 0x84, 0x8e, 0xc7, 0x7c, 0xdb, 0xf7, - 0x82, 0xd3, 0xf8, 0x5f, 0xcb, 0x85, 0xff, 0xc2, 0x8e, 0x90, 0xe2, 0xa9, 0x22, 0xa0, 0x0d, 0x91, - 0x02, 0xe4, 0x7b, 0xb0, 0xad, 0x36, 0xd4, 0x78, 0x90, 0xb4, 0xdd, 0xe4, 0x7f, 0xca, 0xd2, 0xf2, - 0xd2, 0xbe, 0x34, 0xa9, 0x52, 0xc2, 0x17, 0x51, 0xc2, 0x12, 0x00, 0x94, 0xbd, 0x32, 0x1b, 0x48, - 0x76, 0xda, 0x2b, 0xe4, 0xa7, 0xbd, 0x7d, 0x68, 0x98, 0xbf, 0xa4, 0x8f, 0x55, 0x0b, 0x2e, 0xa2, - 0xe3, 0xff, 0x2b, 0x7d, 0x63, 0x37, 0xfd, 0x13, 0xfb, 0x99, 0xf9, 0x0f, 0xdb, 0x08, 0xdd, 0x55, - 0x0c, 0x34, 0xcb, 0x6d, 0xfd, 0xba, 0x00, 0x2d, 0xa5, 0x62, 0xe6, 0xcd, 0xdf, 0x86, 0x46, 0x94, - 0x40, 0xf1, 0x2a, 0xb9, 0x9d, 0xca, 0x4f, 0x49, 0x69, 0x96, 0x90, 0xdc, 0x83, 0x6d, 0x31, 0x7b, - 0x61, 0x7a, 0xac, 0x78, 0x22, 0xc2, 0xe0, 0xd1, 0x5c, 0xf2, 0x78, 0xf8, 0x5a, 0x79, 0x46, 0xde, - 0x87, 0x4b, 0xf1, 0xf5, 0x45, 0xca, 0xa0, 0xef, 0x74, 0x96, 0x0f, 0xac, 0xaf, 0x0b, 0xc9, 0x20, - 0xa3, 0xfa, 0x28, 0x2e, 0x21, 0x49, 0x88, 0xa9, 0xc7, 0x95, 0x9d, 0xf2, 0x0a, 0x54, 0xcc, 0x45, - 0xa8, 0xee, 0x02, 0x06, 0xca, 0x06, 0x69, 0x39, 0x17, 0xa4, 0x37, 0xa0, 0x9e, 0xde, 0x03, 0x6c, - 0xe0, 0x6a, 0x94, 0x22, 0xd2, 0x7c, 0xad, 0x64, 0x87, 0xdf, 0x3f, 0x14, 0xe1, 0x52, 0x46, 0x35, - 0xb5, 0x85, 0x85, 0x01, 0xb9, 0x0f, 0x15, 0x86, 0x4f, 0xa8, 0x63, 0xeb, 0x9e, 0xb5, 0x72, 0x30, - 0xd0, 0xc4, 0xbb, 0xfa, 0x87, 0x1a, 0x0e, 0xf2, 0x0e, 0x6c, 0x86, 0xbe, 0x6b, 0x48, 0x46, 0x49, - 0xbf, 0xc9, 0x23, 0xcd, 0xb4, 0xa2, 0x20, 0xb3, 0x6c, 0xaf, 0x99, 0x3d, 0x62, 0x2a, 0xd5, 0x7f, - 0x2b, 0x46, 0xbb, 0x4b, 0xb0, 0xb9, 0x3f, 0xf8, 0xa2, 0xd7, 0xa5, 0x7d, 0xbb, 0xdb, 0xef, 0x63, - 0x6a, 0x13, 0x68, 0x75, 0x7b, 0xbd, 0x83, 0xd1, 0xf0, 0xf8, 0xc8, 0xe0, 0x0a, 0xe4, 0x32, 0x6c, - 0xc5, 0x64, 0xfd, 0xc1, 0xd3, 0x81, 0x2e, 0x78, 0xdb, 0xd0, 0x4e, 0x08, 0xe9, 0xe0, 0xd9, 0xc1, - 0x73, 0x2c, 0x7c, 0x00, 0x95, 0xa7, 0x07, 0xbd, 0x7d, 0x55, 0xf6, 0x54, 0x95, 0x18, 0x0d, 0x0d, - 0xb4, 0x41, 0xb6, 0xa0, 0x31, 0xda, 0xeb, 0xdb, 0xa3, 0xc3, 0x7e, 0x57, 0x09, 0xa8, 0x90, 0x36, - 0x34, 0x87, 0xdd, 0x67, 0x03, 0xbb, 0xf7, 0xb8, 0x3b, 0xfc, 0x6c, 0xd0, 0x6f, 0x57, 0xad, 0x1f, - 0xe9, 0xf6, 0x9b, 0x49, 0x39, 0xf2, 0xe1, 0x42, 0x8e, 0x2e, 0xc5, 0x62, 0x4a, 0x9c, 0x4f, 0xcf, - 0xc4, 0x49, 0xc5, 0x8c, 0x93, 0x1e, 0x6d, 0xfe, 0xa0, 0xb1, 0x7b, 0xf7, 0x41, 0xcc, 0xfc, 0xa2, - 0x82, 0x4f, 0x1f, 0xfc, 0x33, 0x00, 0x00, 0xff, 0xff, 0x35, 0x39, 0xcc, 0x36, 0x3a, 0x22, 0x00, - 0x00, + // 3535 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x3a, 0x4d, 0x73, 0x23, 0x49, + 0x56, 0x53, 0x92, 0xac, 0x8f, 0x27, 0x59, 0x2e, 0x67, 0x7b, 0xba, 0xd5, 0xee, 0x9e, 0xed, 0xee, + 0x9a, 0x9d, 0xd8, 0x86, 0x18, 0x3c, 0xd0, 0x03, 0xec, 0xee, 0x7c, 0xc4, 0xa0, 0x96, 0x34, 0xd3, + 0x1e, 0x77, 0xcb, 0x26, 0x6d, 0xcf, 0xb0, 0x04, 0x11, 0x45, 0x76, 0x55, 0xb6, 0x55, 0xeb, 0x52, + 0x95, 0xa8, 0x4c, 0xd9, 0x68, 0x0f, 0x04, 0x6c, 0x04, 0x67, 0x08, 0x2e, 0xcc, 0x71, 0xce, 0x04, + 0x27, 0x22, 0x38, 0x10, 0xc1, 0x81, 0x13, 0xc1, 0x9d, 0x23, 0xfc, 0x02, 0x82, 0x0b, 0x37, 0x8e, + 0x44, 0xbe, 0xcc, 0xfa, 0xd2, 0x47, 0x63, 0x07, 0x27, 0x4e, 0xce, 0xf7, 0xf2, 0xe5, 0xcb, 0x57, + 0xf9, 0xbe, 0x9f, 0x0c, 0xdb, 0x33, 0x16, 0x24, 0x41, 0x74, 0x71, 0x30, 0x4b, 0x62, 0x19, 0x93, + 0x26, 0xfe, 0x79, 0x3d, 0x7f, 0xb3, 0x7f, 0xc7, 0x9b, 0x30, 0xe9, 0x06, 0x3e, 0x8f, 0x64, 0x20, + 0x17, 0x7a, 0x7b, 0xff, 0x8e, 0x58, 0x44, 0x9e, 0x2b, 0xb8, 0x94, 0x41, 0x74, 0x21, 0x0c, 0xd2, + 0x61, 0xb3, 0x59, 0x18, 0x78, 0x4c, 0x06, 0x71, 0xe4, 0x4e, 0xb9, 0x64, 0x3e, 0x93, 0xcc, 0x9d, + 0x72, 0x21, 0xd8, 0x05, 0xd7, 0x34, 0x0e, 0x83, 0x07, 0x5f, 0x72, 0xe9, 0x4d, 0x82, 0xe8, 0xe2, + 0x39, 0xf3, 0x2e, 0xb9, 0x7f, 0x3e, 0x1b, 0x32, 0xc9, 0x86, 0x5c, 0xb2, 0x20, 0x14, 0xe4, 0x11, + 0xb4, 0xf1, 0x50, 0x34, 0x9f, 0xbe, 0xe6, 0x49, 0xcf, 0x7a, 0x6c, 0x3d, 0xdd, 0xa6, 0xa0, 0x50, + 0x63, 0xc4, 0x90, 0x27, 0xd0, 0x91, 0xb1, 0x64, 0x61, 0x4a, 0x51, 0x41, 0x8a, 0x36, 0xe2, 0x34, + 0x89, 0xf3, 0x97, 0x0d, 0xa8, 0x2b, 0xde, 0xf3, 0x19, 0xd9, 0x83, 0x2d, 0x2f, 0x8c, 0xbd, 0x4b, + 0x64, 0x54, 0xa3, 0x1a, 0x20, 0x5d, 0xa8, 0x04, 0x3e, 0x9e, 0x6c, 0xd1, 0x4a, 0xe0, 0x93, 0x2f, + 0xa0, 0xe9, 0xc5, 0x91, 0x64, 0x9e, 0x14, 0xbd, 0xea, 0xe3, 0xea, 0xd3, 0xf6, 0xb3, 0xf7, 0x0f, + 0xd2, 0xcf, 0x3f, 0x38, 0x5d, 0x44, 0xde, 0x61, 0x24, 0x24, 0x0b, 0x43, 0xfc, 0xb0, 0x81, 0xa6, + 0xfc, 0xe6, 0x19, 0xcd, 0x0e, 0x91, 0x9f, 0x42, 0xdb, 0x8b, 0xa7, 0xd3, 0x79, 0x14, 0xc8, 0x80, + 0x8b, 0x5e, 0x0d, 0x79, 0xdc, 0x2b, 0xf3, 0x18, 0x18, 0x82, 0x05, 0x2d, 0xd2, 0x92, 0x63, 0xd8, + 0x49, 0xd9, 0x98, 0x37, 0xe8, 0x6d, 0x3d, 0xb6, 0x9e, 0xb6, 0x9f, 0x7d, 0x90, 0x1f, 0x7f, 0xcb, + 0x83, 0xd1, 0xe5, 0xd3, 0xe4, 0x1c, 0x48, 0x81, 0x7f, 0xca, 0xb3, 0x7e, 0x1b, 0x9e, 0x6b, 0x18, + 0x90, 0x8f, 0xa1, 0x31, 0x4b, 0xe2, 0x37, 0x41, 0xc8, 0x7b, 0x0d, 0xe4, 0x75, 0x3f, 0xe7, 0x95, + 0xf2, 0x38, 0xd1, 0x04, 0x34, 0xa5, 0x24, 0xaf, 0xa0, 0x6b, 0x96, 0xa9, 0x1c, 0xcd, 0xdb, 0xc8, + 0xb1, 0x74, 0x98, 0x7c, 0x04, 0x0d, 0x63, 0x71, 0xbd, 0x16, 0xf2, 0x79, 0xb7, 0xfc, 0xc4, 0xa7, + 0x7a, 0x93, 0xa6, 0x54, 0xea, 0x71, 0x53, 0x13, 0x4d, 0x05, 0x80, 0x5b, 0x3d, 0xee, 0xd2, 0x69, + 0xf2, 0x29, 0xb4, 0xdf, 0xcc, 0xc3, 0xf0, 0x88, 0x2f, 0x94, 0xb7, 0xf4, 0xda, 0xcb, 0x2f, 0xa1, + 0xa4, 0x30, 0x9b, 0x5f, 0xce, 0xc3, 0x90, 0x16, 0xa9, 0x95, 0x66, 0x0a, 0x60, 0x2a, 0x50, 0xe7, + 0x56, 0x9a, 0x59, 0x65, 0x40, 0xfa, 0x60, 0x5f, 0x33, 0xe9, 0x4d, 0x8e, 0xa3, 0x70, 0xd1, 0xf7, + 0xbc, 0x78, 0x1e, 0xc9, 0xde, 0xf6, 0xba, 0xe7, 0x31, 0x9b, 0x74, 0x85, 0x9c, 0xb8, 0x70, 0x6f, + 0x19, 0x97, 0x8a, 0xd7, 0xbd, 0x8d, 0x78, 0x9b, 0xb8, 0x38, 0xff, 0x59, 0x83, 0xce, 0xab, 0x79, + 0x28, 0x83, 0xf4, 0x46, 0x02, 0xb5, 0x88, 0x4d, 0x39, 0xfa, 0x65, 0x8b, 0xe2, 0x9a, 0x3c, 0x84, + 0x96, 0x0c, 0xa6, 0x5c, 0x48, 0x36, 0x9d, 0xa1, 0x77, 0x56, 0x69, 0x8e, 0x50, 0xbb, 0x3a, 0x06, + 0x79, 0x71, 0xd4, 0xab, 0xe2, 0xb1, 0x1c, 0x41, 0xbe, 0x00, 0xf0, 0xe2, 0x30, 0x4e, 0xdc, 0x09, + 0x13, 0x13, 0xe3, 0x80, 0x8f, 0x73, 0xa1, 0x8b, 0x77, 0x1f, 0x0c, 0x14, 0xe1, 0x0b, 0x26, 0x26, + 0xb4, 0xe5, 0xa5, 0x4b, 0x72, 0x5f, 0xc5, 0x00, 0xc5, 0x20, 0xf0, 0xd1, 0x01, 0xab, 0xb4, 0x81, + 0xf0, 0xa1, 0x4f, 0x7e, 0x04, 0x3b, 0x97, 0x7c, 0xe1, 0xb1, 0xc4, 0x77, 0x4d, 0x8c, 0x44, 0x77, + 0x6a, 0xd1, 0xae, 0x41, 0x9f, 0x68, 0x2c, 0xb9, 0x07, 0x8d, 0x4b, 0xbe, 0x70, 0xe7, 0x81, 0x8f, + 0x3e, 0xd2, 0xa2, 0xf5, 0x4b, 0xbe, 0x38, 0x0f, 0x7c, 0xf2, 0x19, 0xd4, 0x83, 0x29, 0xbb, 0xe0, + 0xca, 0xfe, 0x95, 0x64, 0x3f, 0xdc, 0x20, 0xd9, 0xa1, 0x09, 0xb2, 0x87, 0x8a, 0x98, 0x9a, 0x33, + 0xe4, 0x23, 0xb8, 0xe3, 0xcd, 0x85, 0x8c, 0xa7, 0xc1, 0x2f, 0x74, 0x68, 0x45, 0xc1, 0xd0, 0x05, + 0x5a, 0x94, 0x94, 0xb6, 0xf0, 0xd3, 0xf6, 0x9f, 0x40, 0x2b, 0xfb, 0x46, 0x15, 0x02, 0x83, 0xc8, + 0xe7, 0x7f, 0xdc, 0xb3, 0x1e, 0x57, 0x9f, 0x56, 0xa9, 0x06, 0xf6, 0xff, 0xcd, 0x82, 0xed, 0xd2, + 0x6d, 0x45, 0xe1, 0xad, 0x92, 0xf0, 0xa9, 0xaa, 0x2a, 0x05, 0x55, 0xf5, 0xa0, 0x31, 0x63, 0x8b, + 0x30, 0x66, 0x3e, 0xaa, 0xa2, 0x43, 0x53, 0x50, 0x5d, 0x77, 0x1d, 0xf8, 0x52, 0xe9, 0x40, 0x3d, + 0xa2, 0x06, 0xc8, 0x5d, 0xa8, 0x4f, 0x78, 0x70, 0x31, 0x91, 0xe6, 0x6d, 0x0d, 0x44, 0xf6, 0xa1, + 0xa9, 0x1c, 0x5c, 0x04, 0xbf, 0xe0, 0xf8, 0xa6, 0x55, 0x9a, 0xc1, 0xe4, 0x7d, 0xd8, 0x4e, 0x70, + 0xe5, 0x4a, 0x96, 0x5c, 0x70, 0x89, 0x6f, 0x5a, 0xa5, 0x1d, 0x8d, 0x3c, 0x43, 0x5c, 0x1e, 0xe0, + 0x9b, 0x85, 0x00, 0xef, 0xfc, 0xab, 0x05, 0x77, 0x5e, 0xc6, 0x1e, 0x0b, 0x8d, 0x66, 0x4e, 0x8c, + 0x70, 0xbf, 0x05, 0xb5, 0x4b, 0xbe, 0x10, 0xf8, 0x14, 0xed, 0x67, 0x4f, 0x72, 0x2d, 0xac, 0x21, + 0x3e, 0x38, 0xe2, 0x0b, 0x8a, 0xe4, 0xe4, 0x13, 0xe8, 0x4c, 0x95, 0x9a, 0x98, 0xf1, 0xae, 0x0a, + 0xfa, 0xc4, 0xdd, 0xf5, 0x4a, 0xa4, 0x25, 0x5a, 0xf5, 0x85, 0x33, 0x26, 0xc4, 0x75, 0x9c, 0xf8, + 0xc6, 0x6a, 0x33, 0x78, 0xff, 0xd7, 0xa0, 0x7a, 0xc4, 0x17, 0x6b, 0x7d, 0x81, 0x40, 0x4d, 0x25, + 0x3d, 0xbc, 0xaa, 0x43, 0x71, 0xed, 0xfc, 0x83, 0x05, 0xef, 0x96, 0x04, 0xe5, 0x3c, 0x79, 0xc1, + 0xc3, 0x30, 0x56, 0x16, 0x6a, 0x2c, 0xd3, 0xbd, 0xe2, 0x89, 0x08, 0xe2, 0x08, 0x99, 0x6d, 0xd1, + 0xae, 0x41, 0x7f, 0xa3, 0xb1, 0x4a, 0xc9, 0x33, 0xce, 0xd1, 0xc8, 0x35, 0xe7, 0xba, 0x02, 0x0f, + 0x7d, 0xcc, 0xbb, 0xfc, 0x2a, 0xf0, 0xb8, 0x8b, 0xa2, 0x68, 0x49, 0x41, 0xa3, 0xc6, 0x4a, 0xa0, + 0x9c, 0x40, 0x2e, 0x66, 0x1c, 0xb5, 0x9b, 0x11, 0x9c, 0x2d, 0x66, 0xe8, 0xbd, 0x22, 0xb8, 0x88, + 0x98, 0x9c, 0x27, 0x1c, 0xb5, 0xdc, 0xa1, 0x39, 0xc2, 0xf9, 0xde, 0x02, 0x5b, 0x89, 0x5d, 0xcc, + 0xa4, 0x1b, 0xb2, 0xf3, 0x8f, 0x60, 0x27, 0x28, 0x50, 0xb9, 0x59, 0xaa, 0xee, 0x16, 0xd1, 0x25, + 0x99, 0x51, 0xa4, 0xea, 0x8a, 0x48, 0xe9, 0xc3, 0xd6, 0xca, 0x96, 0x9b, 0x3e, 0xd1, 0x16, 0x96, + 0x0e, 0x29, 0xe8, 0xfc, 0x87, 0x05, 0xf7, 0x36, 0x24, 0xfb, 0x1b, 0xd6, 0x11, 0xef, 0xc3, 0xb6, + 0xc9, 0x58, 0x2e, 0xba, 0xae, 0x11, 0xa9, 0x63, 0x90, 0xda, 0xcf, 0xee, 0x43, 0x93, 0x47, 0xc2, + 0x2d, 0x08, 0xd6, 0xe0, 0x91, 0xc0, 0x37, 0x7e, 0x02, 0x9d, 0x90, 0x09, 0xe9, 0xce, 0x67, 0x3e, + 0x93, 0x5c, 0xc7, 0xa1, 0x1a, 0x6d, 0x2b, 0xdc, 0xb9, 0x46, 0xa9, 0x6f, 0x16, 0x0b, 0x21, 0xf9, + 0xd4, 0x95, 0xec, 0x42, 0xa5, 0xf5, 0xaa, 0xfa, 0x66, 0x8d, 0x3a, 0x63, 0x17, 0x82, 0x7c, 0x00, + 0xdd, 0x50, 0xd9, 0x88, 0x1b, 0x05, 0xde, 0x25, 0x5e, 0xa2, 0x43, 0xd1, 0x36, 0x62, 0xc7, 0x06, + 0xe9, 0xfc, 0x59, 0x1d, 0xee, 0x6f, 0xac, 0x6c, 0xc8, 0xaf, 0xc3, 0x5e, 0x51, 0x10, 0x17, 0xcf, + 0x86, 0x0b, 0xf3, 0xf5, 0xa4, 0x20, 0xd0, 0x4b, 0xbd, 0xf3, 0xff, 0xf8, 0x29, 0x94, 0x6e, 0x99, + 0xef, 0x73, 0x1f, 0x03, 0x6a, 0x93, 0x6a, 0x40, 0xd9, 0xc9, 0x6b, 0xa5, 0x64, 0xee, 0x63, 0xc9, + 0xd0, 0xa4, 0x29, 0xa8, 0xe8, 0xa7, 0x73, 0x25, 0x53, 0x5b, 0xd3, 0x23, 0xa0, 0xe8, 0x13, 0x3e, + 0x8d, 0xaf, 0xb8, 0x8f, 0x19, 0xbd, 0x49, 0x53, 0x90, 0x3c, 0x86, 0xce, 0x84, 0x09, 0x17, 0xd9, + 0xba, 0x73, 0x81, 0xb9, 0xb9, 0x49, 0x61, 0xc2, 0x44, 0x5f, 0xa1, 0xce, 0x31, 0xc0, 0x5f, 0xf1, + 0x24, 0x78, 0x93, 0x96, 0xce, 0x42, 0x32, 0x39, 0xd7, 0xa9, 0xb7, 0x4a, 0x49, 0x71, 0xeb, 0x14, + 0x77, 0xb0, 0x08, 0x4e, 0xe6, 0x42, 0xa6, 0x94, 0x3b, 0x48, 0xd9, 0x46, 0x9c, 0x21, 0xf9, 0x1c, + 0x1e, 0x98, 0xca, 0xd0, 0x4d, 0xf8, 0x1f, 0xcd, 0xb9, 0x90, 0x5a, 0x8b, 0x78, 0x84, 0xf7, 0x6c, + 0x3c, 0xd1, 0x33, 0x24, 0x54, 0x53, 0xa0, 0x32, 0xd5, 0x79, 0xbe, 0xf9, 0xb8, 0x76, 0x83, 0xdd, + 0x8d, 0xc7, 0x07, 0xe8, 0x19, 0x5f, 0xc0, 0xc3, 0xe5, 0xe3, 0xea, 0x39, 0x24, 0x37, 0xd7, 0x13, + 0x3c, 0x7f, 0xbf, 0x7c, 0x9e, 0x22, 0x85, 0xbe, 0x7f, 0x33, 0x03, 0x2d, 0xc0, 0x9d, 0xcd, 0x0c, + 0xb4, 0x04, 0x4f, 0xa0, 0xe3, 0x07, 0x62, 0x16, 0xb2, 0x85, 0xb6, 0xaf, 0x3d, 0x54, 0x7d, 0xdb, + 0xe0, 0x94, 0x8d, 0x39, 0xd7, 0xab, 0xfe, 0x9e, 0x96, 0x27, 0xeb, 0xfd, 0x7d, 0xc5, 0xa8, 0x2b, + 0x6b, 0x8c, 0x7a, 0xd9, 0x72, 0xab, 0x2b, 0x96, 0xeb, 0x3c, 0x87, 0xfd, 0xe5, 0x8b, 0x4f, 0xe6, + 0xaf, 0xc3, 0xc0, 0x1b, 0x4c, 0xd8, 0x0d, 0x63, 0x8d, 0xf3, 0xf7, 0x55, 0xd8, 0x2e, 0xb5, 0x15, + 0xff, 0xeb, 0xb9, 0x0e, 0x3a, 0xe6, 0x23, 0x68, 0xcf, 0x92, 0xe0, 0x8a, 0x49, 0xee, 0x5e, 0xf2, + 0x85, 0xc9, 0xde, 0x60, 0x50, 0x2a, 0x1b, 0x3d, 0x56, 0x51, 0x55, 0x78, 0x49, 0x30, 0x53, 0x72, + 0xa1, 0x5f, 0x76, 0x68, 0x11, 0xa5, 0x92, 0xf9, 0xcf, 0xe3, 0x20, 0x32, 0x5e, 0xd9, 0xa4, 0x06, + 0x52, 0xa9, 0x4e, 0xdb, 0x2a, 0xf7, 0x31, 0x99, 0x37, 0x69, 0x06, 0xe7, 0x4e, 0xd3, 0x28, 0x3a, + 0xcd, 0x31, 0xd8, 0x46, 0xbb, 0xc2, 0x95, 0xb1, 0xab, 0xf8, 0x98, 0x0a, 0xe9, 0x83, 0x4d, 0xcd, + 0x93, 0x21, 0x3f, 0x8b, 0xbf, 0x8e, 0x83, 0x88, 0x76, 0x93, 0x12, 0x4c, 0x3e, 0x85, 0x66, 0x5a, + 0xb2, 0x9b, 0x16, 0xe1, 0xd1, 0x06, 0x46, 0xa6, 0x57, 0x10, 0x34, 0x3b, 0xa0, 0x32, 0x18, 0x8f, + 0xbc, 0x64, 0x31, 0x93, 0x99, 0xd3, 0xe7, 0x08, 0xcc, 0x6f, 0x33, 0xee, 0x49, 0x96, 0xbb, 0x7e, + 0x8e, 0x50, 0x49, 0xcb, 0x90, 0x2a, 0x07, 0xc6, 0x22, 0xa3, 0x83, 0x2f, 0xd7, 0xcd, 0xd1, 0x47, + 0x7c, 0x21, 0x9c, 0x5f, 0x56, 0xe1, 0xc1, 0x5b, 0xbe, 0xc8, 0xe8, 0xcb, 0xca, 0xf4, 0xf5, 0x1e, + 0xc0, 0x0c, 0x6d, 0x03, 0xd5, 0xa5, 0xf5, 0xdf, 0xd2, 0x18, 0xa5, 0xad, 0x4c, 0xe9, 0xd5, 0xa2, + 0xd2, 0xdf, 0x12, 0x58, 0xef, 0x41, 0xc3, 0xf4, 0xf3, 0xa8, 0xbd, 0x16, 0xad, 0x2b, 0xf0, 0xd0, + 0x57, 0x76, 0x9b, 0xb6, 0x7d, 0x0b, 0xb5, 0x5b, 0xd7, 0x8a, 0xcf, 0x70, 0x87, 0xa8, 0x44, 0xed, + 0xbe, 0x0d, 0x7d, 0x19, 0x02, 0xe4, 0x12, 0x48, 0xc2, 0xaf, 0x38, 0x0b, 0xb9, 0xaf, 0x82, 0x5c, + 0xc2, 0x85, 0xc8, 0x0a, 0xdd, 0xcf, 0x6e, 0xa4, 0xc6, 0x03, 0x6a, 0xce, 0xf7, 0xd3, 0xe3, 0xa3, + 0x48, 0x26, 0x0b, 0xba, 0x9b, 0x2c, 0xe3, 0xf7, 0x87, 0x70, 0x77, 0x3d, 0x31, 0xb1, 0xa1, 0xaa, + 0x5e, 0x48, 0x17, 0x51, 0x6a, 0xa9, 0xc4, 0xbd, 0x62, 0xe1, 0x9c, 0x1b, 0xeb, 0xd7, 0xc0, 0x27, + 0x95, 0x9f, 0x58, 0xce, 0x5f, 0x55, 0xc0, 0x5e, 0xf6, 0x40, 0xf2, 0x79, 0x61, 0x0a, 0xb0, 0x52, + 0x20, 0x6e, 0xc8, 0x95, 0x85, 0x19, 0xc0, 0x57, 0xd0, 0x31, 0x8a, 0x52, 0x0f, 0x2a, 0x7a, 0x95, + 0xe5, 0x4a, 0x7f, 0xb3, 0xcb, 0xd3, 0xf6, 0x2c, 0x5b, 0xab, 0x1e, 0xb3, 0x91, 0x16, 0x9a, 0x55, + 0x34, 0xe1, 0xb7, 0x88, 0x91, 0xd6, 0x9c, 0xe9, 0x89, 0xff, 0xc3, 0x24, 0xc2, 0xf9, 0x31, 0xec, + 0xe0, 0xae, 0x12, 0xc8, 0xa4, 0xae, 0x9b, 0x85, 0xa2, 0xcf, 0x60, 0x2f, 0x3d, 0xf8, 0x4a, 0xcf, + 0x7a, 0x04, 0xe5, 0xec, 0xa6, 0xa7, 0x7f, 0x07, 0xee, 0xea, 0xe6, 0x54, 0x06, 0x57, 0x81, 0x5c, + 0x0c, 0x78, 0x24, 0x79, 0xf2, 0x96, 0xf3, 0x36, 0x54, 0x03, 0x5f, 0x3f, 0x6f, 0x87, 0xaa, 0xa5, + 0x33, 0xd4, 0xe1, 0xb4, 0xcc, 0xa1, 0xef, 0x79, 0x1c, 0xfd, 0xf6, 0xa6, 0x5c, 0x46, 0xda, 0x2f, + 0xcb, 0x5c, 0x86, 0x81, 0x98, 0x06, 0x42, 0xdc, 0x82, 0x8d, 0x0b, 0xef, 0xaf, 0xb2, 0x19, 0xc7, + 0xb2, 0x94, 0xc2, 0xb9, 0x72, 0xeb, 0xb4, 0xb8, 0x62, 0xd2, 0xf0, 0x6c, 0x19, 0x4c, 0x5f, 0x2a, + 0x07, 0x56, 0x35, 0x83, 0xe0, 0x3c, 0xc2, 0xa7, 0x6a, 0xd2, 0xc6, 0x84, 0x89, 0x53, 0xce, 0x23, + 0xe7, 0x2f, 0x2c, 0x78, 0xf4, 0xf6, 0x1b, 0x04, 0x09, 0xe1, 0x3d, 0x66, 0xb6, 0x5d, 0x0f, 0xf7, + 0xdd, 0xa8, 0x48, 0x60, 0xec, 0xfb, 0xe9, 0xf2, 0x7c, 0x60, 0x13, 0x47, 0xfa, 0x80, 0x6d, 0xbe, + 0xcd, 0xf9, 0xc7, 0x16, 0xfc, 0xe0, 0xed, 0xe7, 0x57, 0xa2, 0xda, 0x4a, 0xab, 0x5f, 0x2b, 0xb6, + 0xfa, 0x6f, 0x60, 0xb7, 0x28, 0x6e, 0x5e, 0xde, 0x77, 0x9f, 0xfd, 0xf4, 0xa6, 0x22, 0x1f, 0x14, + 0x01, 0xd5, 0x0d, 0x50, 0x3b, 0x5a, 0xc2, 0x14, 0x63, 0x61, 0xad, 0x14, 0x0b, 0x09, 0xd4, 0x12, + 0xce, 0xd2, 0xfc, 0x86, 0x6b, 0x25, 0xb2, 0x9f, 0x5a, 0x83, 0x49, 0x6f, 0x39, 0x42, 0xe5, 0x3e, + 0x66, 0x2c, 0xce, 0xa4, 0xb8, 0x0c, 0x56, 0xa5, 0xa1, 0x99, 0x81, 0x62, 0x97, 0xda, 0xa1, 0x29, + 0xa8, 0x32, 0x29, 0x9b, 0xcb, 0x49, 0xd6, 0xcc, 0x1b, 0x48, 0xb7, 0xbe, 0xb3, 0x70, 0x91, 0xce, + 0x4e, 0x31, 0x1b, 0x75, 0x54, 0xeb, 0x3b, 0x0b, 0x17, 0xc6, 0xc7, 0x56, 0x02, 0x76, 0x5b, 0x57, + 0x38, 0xc5, 0x80, 0xfd, 0x06, 0x76, 0xa7, 0x7c, 0xfa, 0x9a, 0x27, 0x62, 0x12, 0xcc, 0xd2, 0x62, + 0xb1, 0x73, 0xcb, 0x87, 0x7c, 0x95, 0x71, 0xd0, 0xa5, 0x25, 0xb5, 0xa7, 0x4b, 0x18, 0xf2, 0x4b, + 0x2b, 0x2f, 0x17, 0xd7, 0x55, 0xb2, 0xdb, 0x78, 0xe5, 0xf3, 0x1b, 0x5f, 0x99, 0x76, 0x22, 0x2b, + 0x95, 0x6f, 0x56, 0xf1, 0xad, 0x6e, 0xa9, 0x67, 0xf6, 0x79, 0xc8, 0x95, 0x06, 0xba, 0xda, 0x65, + 0x0c, 0xb8, 0xe4, 0x6c, 0x3b, 0x4b, 0xce, 0xe6, 0xfc, 0x97, 0x05, 0xf6, 0xb2, 0xb5, 0x10, 0x80, + 0xfa, 0x38, 0x56, 0x2b, 0xfb, 0x1d, 0xb2, 0x03, 0xed, 0x31, 0xbf, 0x3e, 0x8e, 0xf8, 0x59, 0x7c, + 0x1c, 0x71, 0xdb, 0x22, 0xf7, 0xe0, 0xce, 0x98, 0x5f, 0x9f, 0xe8, 0xa2, 0xe9, 0xab, 0x24, 0x9e, + 0xcf, 0x54, 0xf0, 0xb3, 0x2b, 0xa4, 0x0d, 0x8d, 0x57, 0x3c, 0x52, 0x4c, 0xec, 0x2a, 0x69, 0xc1, + 0x16, 0x55, 0x0a, 0xb3, 0x6b, 0x84, 0x40, 0x77, 0x50, 0x2a, 0x55, 0xed, 0x2d, 0xc5, 0x24, 0x8b, + 0xc4, 0x87, 0xd1, 0x55, 0x20, 0xf1, 0x72, 0xbb, 0x4e, 0xf6, 0xc0, 0x5e, 0x4e, 0x94, 0x76, 0x83, + 0xfc, 0x00, 0xf6, 0x33, 0x6c, 0xae, 0x92, 0x74, 0xbf, 0x49, 0xee, 0xc0, 0x4e, 0xb6, 0x7f, 0x14, + 0xa8, 0x4e, 0xc5, 0x6e, 0xe9, 0x3b, 0x56, 0x1e, 0xcc, 0x06, 0xe7, 0xcf, 0x2d, 0xb0, 0x97, 0x15, + 0x4b, 0x7a, 0xb0, 0xb7, 0x8c, 0x3b, 0xf4, 0x43, 0xf5, 0x02, 0x0f, 0xe0, 0xde, 0xf2, 0xce, 0x09, + 0x8f, 0xfc, 0x20, 0xba, 0xb0, 0x2d, 0xf2, 0x10, 0x7a, 0xcb, 0x9b, 0x69, 0xf4, 0xb5, 0x2b, 0xeb, + 0x76, 0x87, 0xdc, 0x0b, 0x55, 0xc5, 0x68, 0x57, 0x9d, 0x3f, 0xb5, 0xe0, 0xfe, 0x46, 0x6d, 0xab, + 0xe7, 0x3c, 0x8f, 0x2e, 0xa3, 0xf8, 0x3a, 0xb2, 0xdf, 0x51, 0x40, 0x7e, 0x67, 0x07, 0x9a, 0x85, + 0x3b, 0x3a, 0xd0, 0xcc, 0x79, 0x92, 0x6d, 0x68, 0x0d, 0x58, 0xe4, 0xf1, 0x30, 0xe4, 0xbe, 0x5d, + 0x53, 0xe7, 0xce, 0x54, 0x63, 0xc4, 0x7d, 0x7b, 0x8b, 0xec, 0xc2, 0xf6, 0x79, 0x84, 0xe0, 0xb7, + 0x71, 0x22, 0x27, 0x0b, 0xbb, 0xee, 0x7c, 0x6f, 0x41, 0x47, 0xd9, 0xe3, 0xf3, 0x38, 0xbe, 0x9c, + 0xb2, 0xe4, 0x72, 0x73, 0xa8, 0x9f, 0x27, 0xa1, 0x49, 0x5c, 0x6a, 0x99, 0x8d, 0x17, 0xaa, 0x85, + 0xf1, 0xc2, 0x03, 0x68, 0x61, 0x6b, 0xe0, 0x2a, 0x5a, 0x1d, 0x54, 0x9a, 0x88, 0x38, 0x4f, 0xc2, + 0x62, 0x8f, 0xb8, 0x55, 0xee, 0x11, 0xdf, 0x03, 0x30, 0xc6, 0xaa, 0x2c, 0xb4, 0xae, 0x2d, 0xd4, + 0x60, 0xfa, 0xd2, 0xf9, 0x13, 0x78, 0x57, 0x49, 0x38, 0x8a, 0xc4, 0xb9, 0xe0, 0x89, 0xba, 0x48, + 0x0f, 0x56, 0x37, 0x88, 0xba, 0x0f, 0xcd, 0xb9, 0xa1, 0x33, 0xf2, 0x66, 0x30, 0xce, 0x39, 0x27, + 0x2c, 0xc0, 0xb1, 0x8a, 0xae, 0x19, 0x1b, 0x08, 0x1f, 0x96, 0x5a, 0xd8, 0x5a, 0x49, 0x3c, 0xe7, + 0x6b, 0x5d, 0x2e, 0x0d, 0x42, 0xce, 0x92, 0x17, 0x81, 0x90, 0x71, 0xb2, 0x28, 0x06, 0x4f, 0xab, + 0x14, 0x3c, 0xdf, 0x03, 0xf0, 0x14, 0xa1, 0xfe, 0x16, 0x13, 0xdc, 0x0d, 0xa6, 0x2f, 0x9d, 0x7f, + 0xb1, 0x80, 0x28, 0x66, 0xe6, 0xc7, 0x82, 0x93, 0xc0, 0x93, 0xf3, 0x84, 0xaf, 0x1d, 0x82, 0x15, + 0xa6, 0x8c, 0x95, 0x0d, 0x53, 0xc6, 0x2a, 0xce, 0x70, 0x56, 0xa6, 0x8c, 0x35, 0x44, 0xa7, 0x53, + 0xc6, 0x07, 0xd0, 0xc2, 0xa6, 0x0d, 0xc7, 0x8c, 0x7a, 0xea, 0x83, 0x63, 0xc6, 0xd3, 0xb5, 0x63, + 0xc6, 0x3a, 0x12, 0x6c, 0x18, 0x33, 0x36, 0x8a, 0x63, 0xc6, 0x09, 0xdc, 0x59, 0xfd, 0x12, 0xb1, + 0x79, 0x92, 0xfa, 0x13, 0x68, 0xce, 0x0c, 0x91, 0x29, 0x0f, 0x1f, 0x96, 0x43, 0x62, 0x99, 0x13, + 0xcd, 0xa8, 0x9d, 0xbf, 0xad, 0x40, 0xbb, 0x30, 0xc2, 0xdf, 0xa0, 0xf7, 0x1e, 0x34, 0x4c, 0x01, + 0x9e, 0xbe, 0x97, 0x01, 0x8b, 0x22, 0x55, 0x4b, 0x22, 0x95, 0xdb, 0x0b, 0xdd, 0xec, 0x15, 0xda, + 0x0b, 0x02, 0xb5, 0x19, 0x93, 0x13, 0xd3, 0x2a, 0xe0, 0x3a, 0xd3, 0x54, 0xbd, 0xa0, 0xa9, 0xe2, + 0xf4, 0x5c, 0x0f, 0x59, 0xb2, 0xe9, 0xf9, 0x1e, 0x6c, 0xf1, 0x69, 0xfc, 0xf3, 0x00, 0x73, 0x5f, + 0x8b, 0x6a, 0x40, 0xa9, 0xea, 0x9a, 0x85, 0x21, 0x97, 0x66, 0xea, 0x62, 0x20, 0xc5, 0x5c, 0x99, + 0x91, 0x69, 0xbf, 0x70, 0x8d, 0x6a, 0x0d, 0x7c, 0x9f, 0x47, 0xa6, 0xed, 0x32, 0xd0, 0xe6, 0x91, + 0x8b, 0xf3, 0x9d, 0x79, 0xae, 0xf4, 0x97, 0x97, 0xf5, 0xcf, 0x55, 0x78, 0x94, 0xca, 0xda, 0x89, + 0x77, 0xb5, 0x3c, 0x90, 0x2d, 0x0c, 0x3e, 0x71, 0x8d, 0x33, 0x06, 0x9e, 0x04, 0x57, 0xdc, 0x77, + 0xdf, 0x24, 0xf1, 0xd4, 0xbc, 0x52, 0xdb, 0xe0, 0xbe, 0x4c, 0xe2, 0x29, 0xf9, 0x14, 0xf6, 0xf5, + 0x34, 0x40, 0x70, 0xdf, 0xc5, 0x0d, 0x33, 0xd4, 0xc4, 0x91, 0xbc, 0x76, 0xf4, 0x7b, 0x38, 0x1b, + 0x10, 0xdc, 0x1f, 0x66, 0xfb, 0x87, 0x6a, 0x5b, 0x4f, 0xb8, 0x22, 0x2f, 0x65, 0xaf, 0x1f, 0x16, + 0x34, 0x0a, 0xb9, 0xff, 0x06, 0x56, 0x1d, 0xca, 0x22, 0xd2, 0x86, 0x6b, 0xc3, 0x4f, 0x3e, 0x19, + 0x99, 0x33, 0xd7, 0x55, 0x7e, 0xe1, 0x47, 0x2a, 0xf2, 0x11, 0xbe, 0x03, 0xfe, 0xa0, 0x65, 0xad, + 0xfb, 0xdd, 0xc8, 0xd0, 0xd2, 0x94, 0x4a, 0x5d, 0x6b, 0x7e, 0xf9, 0x48, 0xed, 0x78, 0xf5, 0x84, + 0xda, 0xa5, 0x19, 0x99, 0xf3, 0xdf, 0x96, 0x0e, 0x21, 0xa7, 0xec, 0x2a, 0xeb, 0xdc, 0x8a, 0xf6, + 0x6a, 0x95, 0xed, 0x75, 0xdd, 0x6f, 0x0e, 0x0f, 0xa1, 0xf5, 0x86, 0x5d, 0xc5, 0xf3, 0x24, 0x90, + 0x5a, 0x35, 0x4d, 0x9a, 0x23, 0xde, 0x12, 0x5b, 0x9f, 0x40, 0x47, 0xe7, 0x7a, 0xb7, 0xe8, 0xc2, + 0x6d, 0x8d, 0xd3, 0xc3, 0xa2, 0x5f, 0x85, 0x5d, 0x1d, 0x14, 0xc5, 0x24, 0x4e, 0x24, 0xf6, 0xcd, + 0xc2, 0xd8, 0xeb, 0x0e, 0x6e, 0x9c, 0x2a, 0xbc, 0xea, 0x9f, 0x85, 0xca, 0x03, 0x3c, 0x12, 0xa6, + 0x60, 0x53, 0x4b, 0x65, 0x47, 0x81, 0x70, 0x25, 0x17, 0xa9, 0xd9, 0xd6, 0x03, 0x71, 0xc6, 0x85, + 0xfc, 0xba, 0xd6, 0xac, 0xd9, 0x5b, 0xce, 0x5f, 0x5b, 0x3a, 0x7a, 0xaf, 0x8c, 0x1e, 0x36, 0x98, + 0xe5, 0x72, 0x5d, 0x57, 0x59, 0xad, 0xeb, 0x46, 0xf0, 0x68, 0xa2, 0xc3, 0xb0, 0xcb, 0x12, 0x6f, + 0x12, 0x5c, 0x71, 0x57, 0xcc, 0x67, 0x33, 0x25, 0x3b, 0x8f, 0xd8, 0xeb, 0xd0, 0x8c, 0x9d, 0x9a, + 0xf4, 0xa1, 0x21, 0xeb, 0x6b, 0xaa, 0x53, 0x4d, 0x34, 0xd2, 0x34, 0xce, 0xdf, 0x59, 0xda, 0x18, + 0x4c, 0x7a, 0x54, 0xb9, 0xe5, 0x86, 0x93, 0xee, 0xcf, 0xa1, 0x6e, 0x4a, 0x3b, 0x5d, 0x96, 0x2f, + 0x8d, 0x6b, 0x0a, 0x0c, 0x0f, 0xce, 0xf2, 0xa1, 0x24, 0x35, 0x87, 0x9c, 0x4f, 0xa0, 0x5d, 0x40, + 0x63, 0x9a, 0x1f, 0x1f, 0x8d, 0x8f, 0xbf, 0x1d, 0xeb, 0x34, 0x7f, 0x46, 0xcf, 0x4f, 0xcf, 0x46, + 0x43, 0xdb, 0xc2, 0x74, 0x3d, 0x46, 0xf0, 0xdb, 0x63, 0x7a, 0xf6, 0xe2, 0x67, 0x76, 0xc5, 0xf9, + 0xbe, 0xaa, 0xc7, 0x76, 0xc5, 0x72, 0xc1, 0x54, 0x41, 0x1b, 0x84, 0x27, 0x50, 0x43, 0xff, 0x31, + 0xc6, 0xa4, 0xd6, 0xea, 0x83, 0x64, 0x6c, 0x1c, 0xbc, 0x22, 0x63, 0x65, 0x5c, 0xde, 0x44, 0x85, + 0xa0, 0xe8, 0x22, 0xf5, 0xf1, 0x1c, 0xa1, 0x54, 0x62, 0x06, 0x4d, 0x3a, 0xa9, 0x99, 0x69, 0x74, + 0x86, 0xeb, 0xe3, 0xef, 0x3c, 0x09, 0x17, 0xb3, 0x38, 0x12, 0x69, 0x64, 0xcc, 0x60, 0x15, 0x64, + 0x55, 0xe5, 0x1e, 0xe8, 0xc3, 0xda, 0xfe, 0x5a, 0x06, 0xd3, 0x97, 0x84, 0xaf, 0x1f, 0xff, 0x36, + 0xf1, 0x65, 0x7f, 0xb3, 0xfc, 0xb2, 0x6b, 0xbe, 0xfa, 0x60, 0x4d, 0x99, 0xbc, 0x6e, 0x68, 0xac, + 0x75, 0xd8, 0xca, 0x1a, 0xef, 0xdf, 0x03, 0xb2, 0xa1, 0xe4, 0x2a, 0xea, 0xe2, 0x64, 0x34, 0x1e, + 0x1e, 0x8e, 0xbf, 0x32, 0x25, 0xd7, 0x60, 0x30, 0x3a, 0x51, 0x9a, 0xd1, 0x25, 0xd7, 0x68, 0xf0, + 0xf2, 0x70, 0x3c, 0x1a, 0xda, 0x55, 0x05, 0x0d, 0xfa, 0xe3, 0xc1, 0xe8, 0xe5, 0x68, 0x68, 0xd7, + 0x9c, 0x7f, 0xb7, 0x74, 0x47, 0x5e, 0x2e, 0x79, 0x87, 0xdc, 0x0b, 0xc4, 0xe6, 0x9f, 0x7d, 0x1e, + 0x42, 0xcb, 0xbc, 0xe7, 0x61, 0x6a, 0x69, 0x39, 0x82, 0xfc, 0x01, 0xec, 0xf8, 0xe6, 0xbc, 0x5b, + 0xb2, 0xbc, 0x8f, 0x97, 0x67, 0x1b, 0xeb, 0xae, 0x3c, 0x48, 0x17, 0xe6, 0x79, 0xba, 0x7e, 0x09, + 0x76, 0x3e, 0x84, 0x6e, 0x99, 0xa2, 0xf4, 0xb1, 0xef, 0x94, 0x3e, 0xd6, 0x72, 0xfe, 0xb9, 0x02, + 0x3b, 0x4b, 0xff, 0xf2, 0xb0, 0x39, 0xe7, 0x2f, 0xcf, 0xa1, 0x2b, 0x2b, 0x73, 0x68, 0xf2, 0x21, + 0x90, 0x22, 0x89, 0x5b, 0x1c, 0xe8, 0xd9, 0x05, 0x42, 0x1d, 0xab, 0x8a, 0x45, 0x44, 0xed, 0x36, + 0x45, 0x04, 0xf9, 0x0c, 0x3a, 0x22, 0xf6, 0x02, 0x16, 0xba, 0x61, 0x10, 0x5d, 0xa6, 0xff, 0x67, + 0xb2, 0xf4, 0xdf, 0x0b, 0xa7, 0x48, 0xf1, 0x52, 0x11, 0xd0, 0xb6, 0xc8, 0x01, 0xf2, 0xbb, 0xb0, + 0xc7, 0x23, 0xe1, 0xa6, 0x85, 0xa4, 0xeb, 0x67, 0xff, 0x59, 0x52, 0x5d, 0x1d, 0xb3, 0xae, 0x54, + 0xaa, 0x94, 0xf0, 0x65, 0x94, 0x70, 0x04, 0x00, 0x65, 0xd7, 0x69, 0x3f, 0x5b, 0xa8, 0xf6, 0xac, + 0x72, 0xb5, 0x77, 0x04, 0x6d, 0xd3, 0x08, 0xab, 0x86, 0x0c, 0x9f, 0xb0, 0xfb, 0xec, 0x57, 0xf2, + 0x1b, 0xfb, 0xf9, 0xbf, 0x1d, 0xbd, 0x32, 0xff, 0x75, 0x64, 0x98, 0x1e, 0x60, 0xe7, 0x5f, 0x3c, + 0xed, 0xfc, 0x8d, 0x05, 0x5d, 0x25, 0x62, 0xe1, 0xe6, 0xdf, 0x86, 0x76, 0x92, 0x41, 0xe9, 0x70, + 0x64, 0x2f, 0xe7, 0x9f, 0x93, 0xd2, 0x22, 0x21, 0x79, 0x06, 0x7b, 0x62, 0xfe, 0xda, 0xe4, 0x58, + 0xf1, 0xb5, 0x88, 0xa3, 0xe7, 0x0b, 0xc9, 0xd3, 0xe2, 0x6b, 0xed, 0x1e, 0xf9, 0x10, 0x76, 0xd3, + 0x81, 0x73, 0x7e, 0x40, 0x4f, 0xe1, 0x57, 0x37, 0x9c, 0xef, 0xac, 0xac, 0x90, 0x51, 0x79, 0x14, + 0x9b, 0x90, 0xcc, 0xc4, 0xd4, 0x72, 0x6d, 0xa6, 0xbc, 0x0b, 0x75, 0xf3, 0xd3, 0x95, 0xce, 0x02, + 0x06, 0x2a, 0x1a, 0x69, 0xad, 0x64, 0xa4, 0x0f, 0xa1, 0x95, 0x4f, 0x6e, 0xb7, 0x70, 0x98, 0x95, + 0x23, 0x72, 0x7f, 0xad, 0x17, 0x8b, 0xdf, 0x7f, 0xaa, 0xc0, 0x6e, 0x41, 0x34, 0xd5, 0xcd, 0xc7, + 0x11, 0xf9, 0x04, 0xea, 0x0c, 0x57, 0x28, 0x63, 0xf7, 0x99, 0xb3, 0xb6, 0x30, 0xd0, 0xc4, 0x07, + 0xfa, 0x0f, 0x35, 0x27, 0xc8, 0x0f, 0x61, 0x3b, 0x0e, 0x7d, 0x43, 0x72, 0x9e, 0xe5, 0x9b, 0x32, + 0xd2, 0x54, 0x2b, 0x0a, 0x32, 0xe3, 0xd1, 0x0d, 0xb5, 0x47, 0x4a, 0xa5, 0xf2, 0x6f, 0xdd, 0x48, + 0xb7, 0x0b, 0xdb, 0x47, 0xa3, 0x9f, 0x0d, 0xfa, 0x74, 0xe8, 0xf6, 0x87, 0x43, 0x74, 0x6d, 0x02, + 0xdd, 0xfe, 0x60, 0x70, 0x7c, 0x3e, 0x3e, 0x3b, 0x35, 0x38, 0x4b, 0xb5, 0xd2, 0x29, 0xd9, 0x70, + 0xf4, 0x72, 0xa4, 0x03, 0xde, 0x1e, 0xd8, 0x19, 0x21, 0x1d, 0xbd, 0x3a, 0xfe, 0x06, 0x03, 0x1f, + 0x40, 0xfd, 0xe5, 0xf1, 0xe0, 0x48, 0x85, 0x3d, 0x15, 0x25, 0xce, 0xc7, 0x06, 0xda, 0x22, 0x3b, + 0xd0, 0x3e, 0x3f, 0x1c, 0xba, 0xe7, 0x27, 0xc3, 0xbe, 0x62, 0x50, 0x27, 0x36, 0x74, 0xc6, 0xfd, + 0x57, 0x23, 0x77, 0xf0, 0xa2, 0x3f, 0xfe, 0x6a, 0x34, 0xb4, 0x1b, 0xce, 0x1f, 0xea, 0xf4, 0x5b, + 0x70, 0x39, 0xf2, 0xe3, 0x25, 0x1f, 0x5d, 0xb1, 0xc5, 0x9c, 0xb8, 0xec, 0x9e, 0x99, 0x92, 0x2a, + 0x05, 0x25, 0x3d, 0xdf, 0xfe, 0xfd, 0xf6, 0xc1, 0x47, 0x9f, 0xa6, 0x87, 0x5f, 0xd7, 0x71, 0xf5, + 0xf1, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0xf0, 0x54, 0xc8, 0x8b, 0xec, 0x27, 0x00, 0x00, } diff --git a/protocol/protobuf/pairing.proto b/protocol/protobuf/pairing.proto index ea45a2aaa..63d340449 100644 --- a/protocol/protobuf/pairing.proto +++ b/protocol/protobuf/pairing.proto @@ -189,6 +189,61 @@ message SyncActivityCenterDismissed { repeated bytes ids = 2; } +message SyncActivityCenterNotificationState { + uint64 updated_at = 1; + bool has_seen = 2; +} + +message SyncActivityCenterNotifications { + repeated SyncActivityCenterNotification activity_center_notifications = 1; +} + +message SyncActivityCenterNotification { + bytes id = 1; + uint64 timestamp = 2; + NotificationType notification_type = 3; + enum NotificationType { + NoType = 0; + NewOneToOne = 1; + NewPrivateGroupChat = 2; + Mention = 3; + Reply = 4; + ContactRequest = 5; + CommunityInvitation = 6; + CommunityRequest = 7; + CommunityMembershipRequest = 8; + CommunityKicked = 9; + ContactVerification = 10; + } + string chat_id = 4; + bool read = 5; + bool dismissed = 6; + bool accepted = 7; + bytes message = 8; + string author = 9; + bytes reply_message = 10; + string community_id = 11; + MembershipStatus membership_status = 12; + enum MembershipStatus { + MembershipStatusIdle = 0; + MembershipStatusPending = 1; + MembershipStatusAccepted = 2; + MembershipStatusDeclined = 3; + } + ContactVerificationStatus contact_verification_status = 13; + enum ContactVerificationStatus { + Unknown = 0; + Pending = 1; + Accepted = 2; + Declined = 3; + Cancelled = 4; + Trusted = 5; + UnTrustWorthy = 6; + } + bool deleted = 14; + uint64 updated_at = 15; +} + message SyncBookmark { uint64 clock = 1; string url = 2; diff --git a/protocol/v1/status_message.go b/protocol/v1/status_message.go index 449332e48..ac59b1dc7 100644 --- a/protocol/v1/status_message.go +++ b/protocol/v1/status_message.go @@ -328,6 +328,10 @@ func (m *StatusMessage) HandleApplication() error { return m.unmarshalProtobufData(new(protobuf.SyncKeypair)) case protobuf.ApplicationMetadataMessage_SYNC_FULL_KEYPAIR: return m.unmarshalProtobufData(new(protobuf.SyncKeypairFull)) + case protobuf.ApplicationMetadataMessage_SYNC_ACTIVITY_CENTER_NOTIFICATION: + return m.unmarshalProtobufData(new(protobuf.SyncActivityCenterNotifications)) + case protobuf.ApplicationMetadataMessage_SYNC_ACTIVITY_CENTER_NOTIFICATION_STATE: + return m.unmarshalProtobufData(new(protobuf.SyncActivityCenterNotificationState)) } return nil } diff --git a/services/ext/api.go b/services/ext/api.go index 66e11d4a2..b1aff8da6 100644 --- a/services/ext/api.go +++ b/services/ext/api.go @@ -1152,7 +1152,7 @@ func (api *PublicAPI) MarkAllActivityCenterNotificationsRead(ctx context.Context } func (api *PublicAPI) MarkActivityCenterNotificationsRead(ctx context.Context, ids []types.HexBytes) (*protocol.MessengerResponse, error) { - return api.service.messenger.MarkActivityCenterNotificationsRead(ctx, ids, true) + return api.service.messenger.MarkActivityCenterNotificationsRead(ctx, ids, 0, true) } func (api *PublicAPI) MarkActivityCenterNotificationsUnread(ids []types.HexBytes) (*protocol.MessengerResponse, error) { @@ -1160,11 +1160,11 @@ func (api *PublicAPI) MarkActivityCenterNotificationsUnread(ids []types.HexBytes } func (api *PublicAPI) AcceptActivityCenterNotifications(ctx context.Context, ids []types.HexBytes) (*protocol.MessengerResponse, error) { - return api.service.messenger.AcceptActivityCenterNotifications(ctx, ids, true) + return api.service.messenger.AcceptActivityCenterNotifications(ctx, ids, 0, true) } func (api *PublicAPI) DismissActivityCenterNotifications(ctx context.Context, ids []types.HexBytes) error { - _, err := api.service.messenger.DismissActivityCenterNotifications(ctx, ids, true) + _, err := api.service.messenger.DismissActivityCenterNotifications(ctx, ids, 0, true) return err }