From cb20c4c64ab5fcd4fe63baa8ebfecc874344b3d5 Mon Sep 17 00:00:00 2001 From: Patryk Osmaczko Date: Thu, 27 Jun 2024 17:29:03 +0200 Subject: [PATCH] feat(communities)_: introduce bloom filter members list iterates: status-im/status-desktop#15064 --- protocol/communities/community.go | 86 +- .../communities/community_bloom_filter.go | 106 ++ .../community_bloom_filter_test.go | 68 ++ .../community_encryption_key_action_test.go | 2 +- protocol/communities/community_test.go | 8 +- protocol/communities/manager.go | 8 +- protocol/communities/persistence_mapping.go | 2 +- protocol/communities/persistence_test.go | 4 +- ...nities_messenger_token_permissions_test.go | 10 + protocol/encryption/helpers.go | 6 +- protocol/encryption/protocol.go | 4 +- protocol/protobuf/communities.pb.go | 908 ++++++++++-------- protocol/protobuf/communities.proto | 7 + 13 files changed, 770 insertions(+), 449 deletions(-) create mode 100644 protocol/communities/community_bloom_filter.go create mode 100644 protocol/communities/community_bloom_filter_test.go diff --git a/protocol/communities/community.go b/protocol/communities/community.go index 3ffcc7a06..11babd332 100644 --- a/protocol/communities/community.go +++ b/protocol/communities/community.go @@ -52,7 +52,7 @@ type Config struct { Logger *zap.Logger RequestedToJoinAt uint64 RequestsToJoin []*RequestToJoin - MemberIdentity *ecdsa.PublicKey + MemberIdentity *ecdsa.PrivateKey EventsData *EventsData Shard *shard.Shard PubsubTopicPrivateKey *ecdsa.PrivateKey @@ -115,6 +115,7 @@ type CommunityChat struct { CategoryID string `json:"categoryID"` TokenGated bool `json:"tokenGated"` HideIfPermissionsNotMet bool `json:"hideIfPermissionsNotMet"` + MissingEncryptionKey bool `json:"missingEncryptionKey"` } type CommunityCategory struct { @@ -189,15 +190,15 @@ func (o *Community) MarshalPublicAPIJSON() ([]byte, error) { for id, c := range o.config.CommunityDescription.Chats { // NOTE: Here `CanPost` is only set for ChatMessage and Emoji reactions. But it can be different for pin/etc. // Consider adding more properties to `CommunityChat` to reflect that. - canPost, err := o.CanPost(o.config.MemberIdentity, id, protobuf.ApplicationMetadataMessage_CHAT_MESSAGE) + canPost, err := o.CanPost(o.MemberIdentity(), id, protobuf.ApplicationMetadataMessage_CHAT_MESSAGE) if err != nil { return nil, err } - canPostReactions, err := o.CanPost(o.config.MemberIdentity, id, protobuf.ApplicationMetadataMessage_EMOJI_REACTION) + canPostReactions, err := o.CanPost(o.MemberIdentity(), id, protobuf.ApplicationMetadataMessage_EMOJI_REACTION) if err != nil { return nil, err } - canView := o.CanView(o.config.MemberIdentity, id) + canView := o.CanView(o.MemberIdentity(), id) chat := CommunityChat{ ID: id, @@ -314,10 +315,10 @@ func (o *Community) MarshalJSONWithMediaServer(mediaServer *server.MediaServer) Joined: o.config.Joined, JoinedAt: o.config.JoinedAt, Spectated: o.config.Spectated, - CanRequestAccess: o.CanRequestAccess(o.config.MemberIdentity), + CanRequestAccess: o.CanRequestAccess(o.MemberIdentity()), CanJoin: o.canJoin(), - CanManageUsers: o.CanManageUsers(o.config.MemberIdentity), - CanDeleteMessageForEveryone: o.CanDeleteMessageForEveryone(o.config.MemberIdentity), + CanManageUsers: o.CanManageUsers(o.MemberIdentity()), + CanDeleteMessageForEveryone: o.CanDeleteMessageForEveryone(o.MemberIdentity()), RequestedToJoinAt: o.RequestedToJoinAt(), IsMember: o.isMember(), Muted: o.config.Muted, @@ -342,15 +343,15 @@ func (o *Community) MarshalJSONWithMediaServer(mediaServer *server.MediaServer) for id, c := range o.config.CommunityDescription.Chats { // NOTE: Here `CanPost` is only set for ChatMessage. But it can be different for reactions/pin/etc. // Consider adding more properties to `CommunityChat` to reflect that. - canPost, err := o.CanPost(o.config.MemberIdentity, id, protobuf.ApplicationMetadataMessage_CHAT_MESSAGE) + canPost, err := o.CanPost(o.MemberIdentity(), id, protobuf.ApplicationMetadataMessage_CHAT_MESSAGE) if err != nil { return nil, err } - canPostReactions, err := o.CanPost(o.config.MemberIdentity, id, protobuf.ApplicationMetadataMessage_EMOJI_REACTION) + canPostReactions, err := o.CanPost(o.MemberIdentity(), id, protobuf.ApplicationMetadataMessage_EMOJI_REACTION) if err != nil { return nil, err } - canView := o.CanView(o.config.MemberIdentity, id) + canView := o.CanView(o.MemberIdentity(), id) chat := CommunityChat{ ID: id, @@ -368,6 +369,7 @@ func (o *Community) MarshalJSONWithMediaServer(mediaServer *server.MediaServer) CategoryID: c.CategoryId, HideIfPermissionsNotMet: c.HideIfPermissionsNotMet, Position: int(c.Position), + MissingEncryptionKey: !o.IsMemberInChat(o.MemberIdentity(), id) && o.IsMemberLikelyInChat(id), } communityItem.Chats[id] = chat } @@ -466,10 +468,10 @@ func (o *Community) MarshalJSON() ([]byte, error) { Joined: o.config.Joined, JoinedAt: o.config.JoinedAt, Spectated: o.config.Spectated, - CanRequestAccess: o.CanRequestAccess(o.config.MemberIdentity), + CanRequestAccess: o.CanRequestAccess(o.MemberIdentity()), CanJoin: o.canJoin(), - CanManageUsers: o.CanManageUsers(o.config.MemberIdentity), - CanDeleteMessageForEveryone: o.CanDeleteMessageForEveryone(o.config.MemberIdentity), + CanManageUsers: o.CanManageUsers(o.MemberIdentity()), + CanDeleteMessageForEveryone: o.CanDeleteMessageForEveryone(o.MemberIdentity()), RequestedToJoinAt: o.RequestedToJoinAt(), IsMember: o.isMember(), Muted: o.config.Muted, @@ -494,15 +496,15 @@ func (o *Community) MarshalJSON() ([]byte, error) { for id, c := range o.config.CommunityDescription.Chats { // NOTE: Here `CanPost` is only set for ChatMessage. But it can be different for reactions/pin/etc. // Consider adding more properties to `CommunityChat` to reflect that. - canPost, err := o.CanPost(o.config.MemberIdentity, id, protobuf.ApplicationMetadataMessage_CHAT_MESSAGE) + canPost, err := o.CanPost(o.MemberIdentity(), id, protobuf.ApplicationMetadataMessage_CHAT_MESSAGE) if err != nil { return nil, err } - canPostReactions, err := o.CanPost(o.config.MemberIdentity, id, protobuf.ApplicationMetadataMessage_EMOJI_REACTION) + canPostReactions, err := o.CanPost(o.MemberIdentity(), id, protobuf.ApplicationMetadataMessage_EMOJI_REACTION) if err != nil { return nil, err } - canView := o.CanView(o.config.MemberIdentity, id) + canView := o.CanView(o.MemberIdentity(), id) chat := CommunityChat{ ID: id, @@ -519,6 +521,7 @@ func (o *Community) MarshalJSON() ([]byte, error) { CategoryID: c.CategoryId, HideIfPermissionsNotMet: c.HideIfPermissionsNotMet, Position: int(c.Position), + MissingEncryptionKey: !o.IsMemberInChat(o.MemberIdentity(), id) && o.IsMemberLikelyInChat(id), } if chat.TokenGated { @@ -898,6 +901,32 @@ func (o *Community) IsMemberInChat(pk *ecdsa.PublicKey, chatID string) bool { return o.getChatMember(pk, chatID) != nil } +// Uses bloom filter members list to estimate presence in the channel. +// False positive rate is 0.1%. +func (o *Community) IsMemberLikelyInChat(chatID string) bool { + if o.IsControlNode() || o.IsPrivilegedMember(o.MemberIdentity()) || !o.channelEncrypted(chatID) { + return true + } + + chat, ok := o.config.CommunityDescription.Chats[chatID] + if !ok { + return false + } + + // For communities controlled by clients that haven't updated to newer version yet we assume no membership. + if chat.MembersList == nil { + return false + } + + res, err := verifyMembershipWithBloomFilter(chat.MembersList, o.config.MemberIdentity, o.ControlNode(), chatID, o.Clock()) + if err != nil { + o.config.Logger.Error("failed to estimate membership", zap.Error(err)) + return false + } + + return res +} + func (o *Community) RemoveUserFromChat(pk *ecdsa.PublicKey, chatID string) (*protobuf.CommunityDescription, error) { o.mutex.Lock() defer o.mutex.Unlock() @@ -975,7 +1004,7 @@ func (o *Community) RemoveUserFromOrg(pk *ecdsa.PublicKey) (*protobuf.CommunityD func (o *Community) RemoveAllUsersFromOrg() *CommunityChanges { o.increaseClock() - myPublicKey := common.PubkeyToHex(o.config.MemberIdentity) + myPublicKey := common.PubkeyToHex(o.MemberIdentity()) member := o.config.CommunityDescription.Members[myPublicKey] membersToRemove := o.config.CommunityDescription.Members @@ -1274,7 +1303,7 @@ func (o *Community) MuteTill() time.Time { } func (o *Community) MemberIdentity() *ecdsa.PublicKey { - return o.config.MemberIdentity + return &o.config.MemberIdentity.PublicKey } // UpdateCommunityDescription will update the community to the new community description and return a list of changes @@ -1412,15 +1441,15 @@ func (o *Community) IsControlNode() bool { } func (o *Community) IsOwner() bool { - return o.IsMemberOwner(o.config.MemberIdentity) + return o.IsMemberOwner(o.MemberIdentity()) } func (o *Community) IsTokenMaster() bool { - return o.IsMemberTokenMaster(o.config.MemberIdentity) + return o.IsMemberTokenMaster(o.MemberIdentity()) } func (o *Community) IsAdmin() bool { - return o.IsMemberAdmin(o.config.MemberIdentity) + return o.IsMemberAdmin(o.MemberIdentity()) } func (o *Community) GetPrivilegedMembers() []*ecdsa.PublicKey { @@ -1460,15 +1489,15 @@ func (o *Community) GetFilteredPrivilegedMembers(skipMembers map[string]struct{} } func (o *Community) HasPermissionToSendCommunityEvents() bool { - return !o.IsControlNode() && o.hasRoles(o.config.MemberIdentity, manageCommunityRoles()) + return !o.IsControlNode() && o.hasRoles(o.MemberIdentity(), manageCommunityRoles()) } func (o *Community) hasPermissionToSendCommunityEvent(event protobuf.CommunityEvent_EventType) bool { - return !o.IsControlNode() && canRolesPerformEvent(o.rolesOf(o.config.MemberIdentity), event) + return !o.IsControlNode() && canRolesPerformEvent(o.rolesOf(o.MemberIdentity()), event) } func (o *Community) hasPermissionToSendTokenPermissionCommunityEvent(event protobuf.CommunityEvent_EventType, permissionType protobuf.CommunityTokenPermission_Type) bool { - roles := o.rolesOf(o.config.MemberIdentity) + roles := o.rolesOf(o.MemberIdentity()) return !o.IsControlNode() && canRolesPerformEvent(roles, event) && canRolesModifyPermission(roles, permissionType) } @@ -1672,6 +1701,11 @@ func (o *Community) marshaledDescription() ([]byte, error) { // see https://github.com/status-im/status-desktop/issues/12188 dehydrateChannelsMembers(clone) + err := generateBloomFiltersForChannels(clone, o.PrivateKey()) + if err != nil { + o.config.Logger.Error("failed to generate bloom filters", zap.Error(err)) + } + if o.encryptor != nil { err := encryptDescription(o.encryptor, o, clone) if err != nil { @@ -2256,11 +2290,11 @@ func (o *Community) CanDeleteMessageForEveryone(pk *ecdsa.PublicKey) bool { } func (o *Community) isMember() bool { - return o.hasMember(o.config.MemberIdentity) + return o.hasMember(o.MemberIdentity()) } func (o *Community) CanMemberIdentityPost(chatID string, messageType protobuf.ApplicationMetadataMessage_Type) (bool, error) { - return o.CanPost(o.config.MemberIdentity, chatID, messageType) + return o.CanPost(o.MemberIdentity(), chatID, messageType) } // CanJoin returns whether a user can join the community, only if it's diff --git a/protocol/communities/community_bloom_filter.go b/protocol/communities/community_bloom_filter.go new file mode 100644 index 000000000..67d5a3475 --- /dev/null +++ b/protocol/communities/community_bloom_filter.go @@ -0,0 +1,106 @@ +package communities + +import ( + "crypto/ecdsa" + "encoding/binary" + "errors" + "math/bits" + + "github.com/bits-and-blooms/bloom/v3" + + "github.com/status-im/status-go/eth-node/crypto" + "github.com/status-im/status-go/protocol/common" + "github.com/status-im/status-go/protocol/encryption" + "github.com/status-im/status-go/protocol/protobuf" +) + +func generateBloomFiltersForChannels(description *protobuf.CommunityDescription, privateKey *ecdsa.PrivateKey) error { + for channelID, channel := range description.Chats { + if !channelEncrypted(ChatID(description.ID, channelID), description.TokenPermissions) { + continue + } + + filter, err := generateBloomFilter(channel.Members, privateKey, channelID, description.Clock) + if err != nil { + return err + } + + marshaledFilter, err := filter.MarshalBinary() + if err != nil { + return err + } + + channel.MembersList = &protobuf.CommunityBloomFilter{ + Data: marshaledFilter, + M: uint64(filter.Cap()), + K: uint64(filter.K()), + } + } + + return nil +} + +func nextPowerOfTwo(x int) uint { + return 1 << bits.Len(uint(x)) +} + +func max(x, y uint) uint { + if x > y { + return x + } + return y +} + +func generateBloomFilter(members map[string]*protobuf.CommunityMember, privateKey *ecdsa.PrivateKey, channelID string, clock uint64) (*bloom.BloomFilter, error) { + membersCount := len(members) + if membersCount == 0 { + return nil, errors.New("invalid members count") + } + + const falsePositiveRate = 0.001 + numberOfItems := max(128, nextPowerOfTwo(membersCount)) // This makes it difficult to guess the exact number of members, even with knowledge of filter size and parameters. + filter := bloom.NewWithEstimates(numberOfItems, falsePositiveRate) + + for pk := range members { + publicKey, err := common.HexToPubkey(pk) + if err != nil { + return nil, err + } + + value, err := bloomFilterValue(privateKey, publicKey, channelID, clock) + if err != nil { + return nil, err + } + + filter.Add(value) + } + + return filter, nil +} + +func verifyMembershipWithBloomFilter(membersList *protobuf.CommunityBloomFilter, privateKey *ecdsa.PrivateKey, publicKey *ecdsa.PublicKey, channelID string, clock uint64) (bool, error) { + filter := bloom.New(uint(membersList.M), uint(membersList.K)) + err := filter.UnmarshalBinary(membersList.Data) + if err != nil { + return false, err + } + + value, err := bloomFilterValue(privateKey, publicKey, channelID, clock) + if err != nil { + return false, err + } + + return filter.Test(value), nil +} + +func bloomFilterValue(privateKey *ecdsa.PrivateKey, publicKey *ecdsa.PublicKey, channelID string, clock uint64) ([]byte, error) { + sharedSecret, err := encryption.GenerateSharedKey(privateKey, publicKey) + if err != nil { + return nil, err + } + + clockBytes := make([]byte, 8) + binary.LittleEndian.PutUint64(clockBytes, clock) + + return crypto.Keccak256(sharedSecret, []byte(channelID), clockBytes), nil +} diff --git a/protocol/communities/community_bloom_filter_test.go b/protocol/communities/community_bloom_filter_test.go new file mode 100644 index 000000000..293d70566 --- /dev/null +++ b/protocol/communities/community_bloom_filter_test.go @@ -0,0 +1,68 @@ +package communities + +import ( + "testing" + + "github.com/stretchr/testify/suite" + + "github.com/status-im/status-go/eth-node/crypto" + "github.com/status-im/status-go/protocol/common" + "github.com/status-im/status-go/protocol/protobuf" +) + +func TestCommunityBloomFilter(t *testing.T) { + suite.Run(t, new(CommunityBloomFilterSuite)) +} + +type CommunityBloomFilterSuite struct { + suite.Suite +} + +func (s *CommunityBloomFilterSuite) TestBasic() { + ownerIdentity, err := crypto.GenerateKey() + s.Require().NoError(err) + + memberIdentity, err := crypto.GenerateKey() + s.Require().NoError(err) + + nonMemberIdentity, err := crypto.GenerateKey() + s.Require().NoError(err) + + communityID := "cid" + encryptedChannelID := "enc" + nonEncryptedChannelID := "non-enc" + + description := &protobuf.CommunityDescription{ + ID: communityID, + Clock: 1, + Chats: map[string]*protobuf.CommunityChat{ + encryptedChannelID: { + Members: map[string]*protobuf.CommunityMember{ + common.PubkeyToHex(&memberIdentity.PublicKey): {}, + }, + }, + nonEncryptedChannelID: { + Members: map[string]*protobuf.CommunityMember{ + common.PubkeyToHex(&memberIdentity.PublicKey): {}, + }, + }, + }, + TokenPermissions: map[string]*protobuf.CommunityTokenPermission{ + "permissionID": { + Id: "permissionID", + Type: protobuf.CommunityTokenPermission_CAN_VIEW_CHANNEL, + TokenCriteria: []*protobuf.TokenCriteria{{}}, + ChatIds: []string{ChatID(communityID, encryptedChannelID)}, + }, + }, + } + + err = generateBloomFiltersForChannels(description, ownerIdentity) + s.Require().NoError(err) + s.Require().NotNil(description.Chats[encryptedChannelID].MembersList) + s.Require().Nil(description.Chats[nonEncryptedChannelID].MembersList) + + filter := description.Chats[encryptedChannelID].MembersList + s.Require().True(verifyMembershipWithBloomFilter(filter, memberIdentity, &ownerIdentity.PublicKey, encryptedChannelID, description.Clock)) + s.Require().False(verifyMembershipWithBloomFilter(filter, nonMemberIdentity, &ownerIdentity.PublicKey, encryptedChannelID, description.Clock)) +} diff --git a/protocol/communities/community_encryption_key_action_test.go b/protocol/communities/community_encryption_key_action_test.go index 3fee5ac0e..de01f1e2d 100644 --- a/protocol/communities/community_encryption_key_action_test.go +++ b/protocol/communities/community_encryption_key_action_test.go @@ -30,7 +30,7 @@ func createTestCommunity(identity *ecdsa.PrivateKey) (*Community, error) { ControlNode: &identity.PublicKey, ControlDevice: true, Joined: true, - MemberIdentity: &identity.PublicKey, + MemberIdentity: identity, } return New(config, &TimeSourceStub{}, &DescriptionEncryptorMock{}) diff --git a/protocol/communities/community_test.go b/protocol/communities/community_test.go index 70821f3b9..250025020 100644 --- a/protocol/communities/community_test.go +++ b/protocol/communities/community_test.go @@ -390,7 +390,7 @@ func (s *CommunitySuite) TestValidateRequestToJoin() { }, { name: "not admin", - config: Config{MemberIdentity: signer, CommunityDescription: description}, + config: Config{MemberIdentity: key, CommunityDescription: description}, signer: signer, request: request, err: ErrNotAdmin, @@ -813,7 +813,7 @@ func (s *CommunitySuite) emptyCommunityDescriptionWithChat() *protobuf.Community func (s *CommunitySuite) newConfig(identity *ecdsa.PrivateKey, description *protobuf.CommunityDescription) Config { return Config{ - MemberIdentity: &identity.PublicKey, + MemberIdentity: identity, ID: &identity.PublicKey, CommunityDescription: description, PrivateKey: identity, @@ -998,7 +998,7 @@ func (s *CommunitySuite) TestMarshalJSON() { s.Require().True(community.ChannelEncrypted(testChatID1)) communityDescription := community.config.CommunityDescription - ownerKey, err := crypto.GenerateKey() + ownerKey := s.identity s.Require().NoError(err) memberKey, err := crypto.GenerateKey() @@ -1043,6 +1043,7 @@ func (s *CommunitySuite) TestMarshalJSON() { "position": float64(0), "tokenGated": true, "viewersCanPostReactions": false, + "missingEncryptionKey": false, } expectedChats[testChatID1] = expectedChat @@ -1074,6 +1075,7 @@ func (s *CommunitySuite) TestMarshalJSON() { "position": float64(0), "tokenGated": false, "viewersCanPostReactions": false, + "missingEncryptionKey": false, } expectedChats[testChatID1] = expectedChat diff --git a/protocol/communities/manager.go b/protocol/communities/manager.go index 3b8b4de88..52a363b32 100644 --- a/protocol/communities/manager.go +++ b/protocol/communities/manager.go @@ -845,7 +845,7 @@ func (m *Manager) CreateCommunity(request *requests.CreateCommunity, publish boo Logger: m.logger, Joined: true, JoinedAt: time.Now().Unix(), - MemberIdentity: &m.identity.PublicKey, + MemberIdentity: m.identity, CommunityDescription: description, Shard: nil, LastOpenedAt: 0, @@ -1709,7 +1709,7 @@ func (m *Manager) ImportCommunity(key *ecdsa.PrivateKey, clock uint64) (*Communi Logger: m.logger, Joined: true, JoinedAt: time.Now().Unix(), - MemberIdentity: &m.identity.PublicKey, + MemberIdentity: m.identity, CommunityDescription: description, LastOpenedAt: 0, } @@ -2134,7 +2134,7 @@ func (m *Manager) HandleCommunityDescriptionMessage(signer *ecdsa.PublicKey, des CommunityDescription: processedDescription, Logger: m.logger, CommunityDescriptionProtocolMessage: payload, - MemberIdentity: &m.identity.PublicKey, + MemberIdentity: m.identity, ID: pubKey, ControlNode: signer, Shard: shard.FromProtobuff(communityShard), @@ -3851,7 +3851,7 @@ func (m *Manager) dbRecordBundleToCommunity(r *CommunityRecordBundle) (*Communit descriptionEncryptor = m } - return recordBundleToCommunity(r, &m.identity.PublicKey, m.installationID, m.logger, m.timesource, descriptionEncryptor, func(community *Community) error { + return recordBundleToCommunity(r, m.identity, m.installationID, m.logger, m.timesource, descriptionEncryptor, func(community *Community) error { _, description, err := m.preprocessDescription(community.ID(), community.config.CommunityDescription) if err != nil { return err diff --git a/protocol/communities/persistence_mapping.go b/protocol/communities/persistence_mapping.go index 176e802dd..bc795bb64 100644 --- a/protocol/communities/persistence_mapping.go +++ b/protocol/communities/persistence_mapping.go @@ -71,7 +71,7 @@ func recordToRequestToJoin(r *RequestToJoinRecord) *RequestToJoin { } } -func recordBundleToCommunity(r *CommunityRecordBundle, memberIdentity *ecdsa.PublicKey, installationID string, +func recordBundleToCommunity(r *CommunityRecordBundle, memberIdentity *ecdsa.PrivateKey, installationID string, logger *zap.Logger, timesource common.TimeSource, encryptor DescriptionEncryptor, initializer func(*Community) error) (*Community, error) { var privateKey *ecdsa.PrivateKey var controlNode *ecdsa.PublicKey diff --git a/protocol/communities/persistence_test.go b/protocol/communities/persistence_test.go index 83a041c91..29a452466 100644 --- a/protocol/communities/persistence_test.go +++ b/protocol/communities/persistence_test.go @@ -48,7 +48,7 @@ func (s *PersistenceSuite) SetupTest() { s.Require().NoError(err) s.db = &Persistence{db: db, recordBundleToCommunity: func(r *CommunityRecordBundle) (*Community, error) { - return recordBundleToCommunity(r, &s.identity.PublicKey, "", nil, &TimeSourceStub{}, &DescriptionEncryptorMock{}, nil) + return recordBundleToCommunity(r, s.identity, "", nil, &TimeSourceStub{}, &DescriptionEncryptorMock{}, nil) }} } @@ -259,7 +259,7 @@ func (s *PersistenceSuite) makeNewCommunity(identity *ecdsa.PrivateKey) *Communi s.Require().NoError(err, "crypto.GenerateKey shouldn't give any error") com, err := New(Config{ - MemberIdentity: &identity.PublicKey, + MemberIdentity: identity, PrivateKey: comPrivKey, ControlNode: &comPrivKey.PublicKey, ControlDevice: true, diff --git a/protocol/communities_messenger_token_permissions_test.go b/protocol/communities_messenger_token_permissions_test.go index 563cc0871..e0500bdaf 100644 --- a/protocol/communities_messenger_token_permissions_test.go +++ b/protocol/communities_messenger_token_permissions_test.go @@ -1208,6 +1208,11 @@ func (s *MessengerCommunitiesTokenPermissionsSuite) testViewChannelPermissions(v ) s.Require().NoError(err) + // bob should not be in the bloom filter list + community, err = s.bob.communitiesManager.GetByID(community.ID()) + s.Require().NoError(err) + s.Require().False(community.IsMemberLikelyInChat(chat.CommunityChatID())) + // make bob satisfy channel criteria s.makeAddressSatisfyTheCriteria(testChainID1, bobAddress, channelPermissionRequest.TokenCriteria[0]) defer s.resetMockedBalances() // reset mocked balances, this test in run with different test cases @@ -1245,6 +1250,11 @@ func (s *MessengerCommunitiesTokenPermissionsSuite) testViewChannelPermissions(v s.Require().Len(response.Messages(), 1) s.Require().Equal(msg.Text, response.Messages()[0].Text) + // bob should be in the bloom filter list + community, err = s.bob.communitiesManager.GetByID(community.ID()) + s.Require().NoError(err) + s.Require().True(community.IsMemberLikelyInChat(chat.CommunityChatID())) + // bob can/can't post reactions response, err = s.bob.SendEmojiReaction(context.Background(), chat.ID, msg.ID, protobuf.EmojiReaction_THUMBS_UP) if !viewersCanAddReactions { diff --git a/protocol/encryption/helpers.go b/protocol/encryption/helpers.go index affa28d2d..3630bde6b 100644 --- a/protocol/encryption/helpers.go +++ b/protocol/encryption/helpers.go @@ -66,7 +66,7 @@ func encrypt(plaintext []byte, key []byte, reader io.Reader) ([]byte, error) { return gcm.Seal(nonce, nonce, plaintext, nil), nil } -func generateSharedKey(privateKey *ecdsa.PrivateKey, publicKey *ecdsa.PublicKey) ([]byte, error) { +func GenerateSharedKey(privateKey *ecdsa.PrivateKey, publicKey *ecdsa.PublicKey) ([]byte, error) { const encryptedPayloadKeyLength = 16 @@ -87,7 +87,7 @@ func buildGroupRekeyMessage(privateKey *ecdsa.PrivateKey, groupID []byte, timest for _, k := range keys { - sharedKey, err := generateSharedKey(privateKey, k) + sharedKey, err := GenerateSharedKey(privateKey, k) if err != nil { return nil, err } @@ -138,7 +138,7 @@ func decryptGroupRekeyMessage(privateKey *ecdsa.PrivateKey, publicKey *ecdsa.Pub return nil, nil } - sharedKey, err := generateSharedKey(privateKey, publicKey) + sharedKey, err := GenerateSharedKey(privateKey, publicKey) if err != nil { return nil, err } diff --git a/protocol/encryption/protocol.go b/protocol/encryption/protocol.go index ae76249e3..2d49549f6 100644 --- a/protocol/encryption/protocol.go +++ b/protocol/encryption/protocol.go @@ -427,7 +427,7 @@ func (p *Protocol) EncryptCommunityGrants(privateKey *ecdsa.PrivateKey, recipien grants := make(map[uint32][]byte) for recipientKey, grant := range recipientGrants { - sharedKey, err := generateSharedKey(privateKey, recipientKey) + sharedKey, err := GenerateSharedKey(privateKey, recipientKey) if err != nil { return nil, err } @@ -452,7 +452,7 @@ func (p *Protocol) DecryptCommunityGrant(myIdentityKey *ecdsa.PrivateKey, sender return nil, errors.New("can't find related grant in the map") } - sharedKey, err := generateSharedKey(myIdentityKey, senderKey) + sharedKey, err := GenerateSharedKey(myIdentityKey, senderKey) if err != nil { return nil, err } diff --git a/protocol/protobuf/communities.pb.go b/protocol/protobuf/communities.pb.go index fb5327d86..184c261a2 100644 --- a/protocol/protobuf/communities.pb.go +++ b/protocol/protobuf/communities.pb.go @@ -1154,6 +1154,7 @@ type CommunityChat struct { Position int32 `protobuf:"varint,5,opt,name=position,proto3" json:"position,omitempty"` ViewersCanPostReactions bool `protobuf:"varint,6,opt,name=viewers_can_post_reactions,json=viewersCanPostReactions,proto3" json:"viewers_can_post_reactions,omitempty"` HideIfPermissionsNotMet bool `protobuf:"varint,7,opt,name=hide_if_permissions_not_met,json=hideIfPermissionsNotMet,proto3" json:"hide_if_permissions_not_met,omitempty"` + MembersList *CommunityBloomFilter `protobuf:"bytes,8,opt,name=members_list,json=membersList,proto3" json:"members_list,omitempty"` } func (x *CommunityChat) Reset() { @@ -1237,6 +1238,76 @@ func (x *CommunityChat) GetHideIfPermissionsNotMet() bool { return false } +func (x *CommunityChat) GetMembersList() *CommunityBloomFilter { + if x != nil { + return x.MembersList + } + return nil +} + +type CommunityBloomFilter struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` + M uint64 `protobuf:"varint,2,opt,name=m,proto3" json:"m,omitempty"` + K uint64 `protobuf:"varint,3,opt,name=k,proto3" json:"k,omitempty"` +} + +func (x *CommunityBloomFilter) Reset() { + *x = CommunityBloomFilter{} + if protoimpl.UnsafeEnabled { + mi := &file_communities_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CommunityBloomFilter) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CommunityBloomFilter) ProtoMessage() {} + +func (x *CommunityBloomFilter) ProtoReflect() protoreflect.Message { + mi := &file_communities_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CommunityBloomFilter.ProtoReflect.Descriptor instead. +func (*CommunityBloomFilter) Descriptor() ([]byte, []int) { + return file_communities_proto_rawDescGZIP(), []int{11} +} + +func (x *CommunityBloomFilter) GetData() []byte { + if x != nil { + return x.Data + } + return nil +} + +func (x *CommunityBloomFilter) GetM() uint64 { + if x != nil { + return x.M + } + return 0 +} + +func (x *CommunityBloomFilter) GetK() uint64 { + if x != nil { + return x.K + } + return 0 +} + type CommunityCategory struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1250,7 +1321,7 @@ type CommunityCategory struct { func (x *CommunityCategory) Reset() { *x = CommunityCategory{} if protoimpl.UnsafeEnabled { - mi := &file_communities_proto_msgTypes[11] + mi := &file_communities_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1263,7 +1334,7 @@ func (x *CommunityCategory) String() string { func (*CommunityCategory) ProtoMessage() {} func (x *CommunityCategory) ProtoReflect() protoreflect.Message { - mi := &file_communities_proto_msgTypes[11] + mi := &file_communities_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1276,7 +1347,7 @@ func (x *CommunityCategory) ProtoReflect() protoreflect.Message { // Deprecated: Use CommunityCategory.ProtoReflect.Descriptor instead. func (*CommunityCategory) Descriptor() ([]byte, []int) { - return file_communities_proto_rawDescGZIP(), []int{11} + return file_communities_proto_rawDescGZIP(), []int{12} } func (x *CommunityCategory) GetCategoryId() string { @@ -1314,7 +1385,7 @@ type RevealedAccount struct { func (x *RevealedAccount) Reset() { *x = RevealedAccount{} if protoimpl.UnsafeEnabled { - mi := &file_communities_proto_msgTypes[12] + mi := &file_communities_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1327,7 +1398,7 @@ func (x *RevealedAccount) String() string { func (*RevealedAccount) ProtoMessage() {} func (x *RevealedAccount) ProtoReflect() protoreflect.Message { - mi := &file_communities_proto_msgTypes[12] + mi := &file_communities_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1340,7 +1411,7 @@ func (x *RevealedAccount) ProtoReflect() protoreflect.Message { // Deprecated: Use RevealedAccount.ProtoReflect.Descriptor instead. func (*RevealedAccount) Descriptor() ([]byte, []int) { - return file_communities_proto_rawDescGZIP(), []int{12} + return file_communities_proto_rawDescGZIP(), []int{13} } func (x *RevealedAccount) GetAddress() string { @@ -1388,7 +1459,7 @@ type CommunityRequestToJoin struct { func (x *CommunityRequestToJoin) Reset() { *x = CommunityRequestToJoin{} if protoimpl.UnsafeEnabled { - mi := &file_communities_proto_msgTypes[13] + mi := &file_communities_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1401,7 +1472,7 @@ func (x *CommunityRequestToJoin) String() string { func (*CommunityRequestToJoin) ProtoMessage() {} func (x *CommunityRequestToJoin) ProtoReflect() protoreflect.Message { - mi := &file_communities_proto_msgTypes[13] + mi := &file_communities_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1414,7 +1485,7 @@ func (x *CommunityRequestToJoin) ProtoReflect() protoreflect.Message { // Deprecated: Use CommunityRequestToJoin.ProtoReflect.Descriptor instead. func (*CommunityRequestToJoin) Descriptor() ([]byte, []int) { - return file_communities_proto_rawDescGZIP(), []int{13} + return file_communities_proto_rawDescGZIP(), []int{14} } func (x *CommunityRequestToJoin) GetClock() uint64 { @@ -1479,7 +1550,7 @@ type CommunityEditSharedAddresses struct { func (x *CommunityEditSharedAddresses) Reset() { *x = CommunityEditSharedAddresses{} if protoimpl.UnsafeEnabled { - mi := &file_communities_proto_msgTypes[14] + mi := &file_communities_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1492,7 +1563,7 @@ func (x *CommunityEditSharedAddresses) String() string { func (*CommunityEditSharedAddresses) ProtoMessage() {} func (x *CommunityEditSharedAddresses) ProtoReflect() protoreflect.Message { - mi := &file_communities_proto_msgTypes[14] + mi := &file_communities_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1505,7 +1576,7 @@ func (x *CommunityEditSharedAddresses) ProtoReflect() protoreflect.Message { // Deprecated: Use CommunityEditSharedAddresses.ProtoReflect.Descriptor instead. func (*CommunityEditSharedAddresses) Descriptor() ([]byte, []int) { - return file_communities_proto_rawDescGZIP(), []int{14} + return file_communities_proto_rawDescGZIP(), []int{15} } func (x *CommunityEditSharedAddresses) GetClock() uint64 { @@ -1545,7 +1616,7 @@ type CommunityCancelRequestToJoin struct { func (x *CommunityCancelRequestToJoin) Reset() { *x = CommunityCancelRequestToJoin{} if protoimpl.UnsafeEnabled { - mi := &file_communities_proto_msgTypes[15] + mi := &file_communities_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1558,7 +1629,7 @@ func (x *CommunityCancelRequestToJoin) String() string { func (*CommunityCancelRequestToJoin) ProtoMessage() {} func (x *CommunityCancelRequestToJoin) ProtoReflect() protoreflect.Message { - mi := &file_communities_proto_msgTypes[15] + mi := &file_communities_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1571,7 +1642,7 @@ func (x *CommunityCancelRequestToJoin) ProtoReflect() protoreflect.Message { // Deprecated: Use CommunityCancelRequestToJoin.ProtoReflect.Descriptor instead. func (*CommunityCancelRequestToJoin) Descriptor() ([]byte, []int) { - return file_communities_proto_rawDescGZIP(), []int{15} + return file_communities_proto_rawDescGZIP(), []int{16} } func (x *CommunityCancelRequestToJoin) GetClock() uint64 { @@ -1628,7 +1699,7 @@ type CommunityUserKicked struct { func (x *CommunityUserKicked) Reset() { *x = CommunityUserKicked{} if protoimpl.UnsafeEnabled { - mi := &file_communities_proto_msgTypes[16] + mi := &file_communities_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1641,7 +1712,7 @@ func (x *CommunityUserKicked) String() string { func (*CommunityUserKicked) ProtoMessage() {} func (x *CommunityUserKicked) ProtoReflect() protoreflect.Message { - mi := &file_communities_proto_msgTypes[16] + mi := &file_communities_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1654,7 +1725,7 @@ func (x *CommunityUserKicked) ProtoReflect() protoreflect.Message { // Deprecated: Use CommunityUserKicked.ProtoReflect.Descriptor instead. func (*CommunityUserKicked) Descriptor() ([]byte, []int) { - return file_communities_proto_rawDescGZIP(), []int{16} + return file_communities_proto_rawDescGZIP(), []int{17} } func (x *CommunityUserKicked) GetClock() uint64 { @@ -1689,7 +1760,7 @@ type CommunityRequestToJoinResponse struct { func (x *CommunityRequestToJoinResponse) Reset() { *x = CommunityRequestToJoinResponse{} if protoimpl.UnsafeEnabled { - mi := &file_communities_proto_msgTypes[17] + mi := &file_communities_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1702,7 +1773,7 @@ func (x *CommunityRequestToJoinResponse) String() string { func (*CommunityRequestToJoinResponse) ProtoMessage() {} func (x *CommunityRequestToJoinResponse) ProtoReflect() protoreflect.Message { - mi := &file_communities_proto_msgTypes[17] + mi := &file_communities_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1715,7 +1786,7 @@ func (x *CommunityRequestToJoinResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CommunityRequestToJoinResponse.ProtoReflect.Descriptor instead. func (*CommunityRequestToJoinResponse) Descriptor() ([]byte, []int) { - return file_communities_proto_rawDescGZIP(), []int{17} + return file_communities_proto_rawDescGZIP(), []int{18} } func (x *CommunityRequestToJoinResponse) GetClock() uint64 { @@ -1786,7 +1857,7 @@ type CommunityRequestToLeave struct { func (x *CommunityRequestToLeave) Reset() { *x = CommunityRequestToLeave{} if protoimpl.UnsafeEnabled { - mi := &file_communities_proto_msgTypes[18] + mi := &file_communities_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1799,7 +1870,7 @@ func (x *CommunityRequestToLeave) String() string { func (*CommunityRequestToLeave) ProtoMessage() {} func (x *CommunityRequestToLeave) ProtoReflect() protoreflect.Message { - mi := &file_communities_proto_msgTypes[18] + mi := &file_communities_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1812,7 +1883,7 @@ func (x *CommunityRequestToLeave) ProtoReflect() protoreflect.Message { // Deprecated: Use CommunityRequestToLeave.ProtoReflect.Descriptor instead. func (*CommunityRequestToLeave) Descriptor() ([]byte, []int) { - return file_communities_proto_rawDescGZIP(), []int{18} + return file_communities_proto_rawDescGZIP(), []int{19} } func (x *CommunityRequestToLeave) GetClock() uint64 { @@ -1841,7 +1912,7 @@ type CommunityMessageArchiveMagnetlink struct { func (x *CommunityMessageArchiveMagnetlink) Reset() { *x = CommunityMessageArchiveMagnetlink{} if protoimpl.UnsafeEnabled { - mi := &file_communities_proto_msgTypes[19] + mi := &file_communities_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1854,7 +1925,7 @@ func (x *CommunityMessageArchiveMagnetlink) String() string { func (*CommunityMessageArchiveMagnetlink) ProtoMessage() {} func (x *CommunityMessageArchiveMagnetlink) ProtoReflect() protoreflect.Message { - mi := &file_communities_proto_msgTypes[19] + mi := &file_communities_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1867,7 +1938,7 @@ func (x *CommunityMessageArchiveMagnetlink) ProtoReflect() protoreflect.Message // Deprecated: Use CommunityMessageArchiveMagnetlink.ProtoReflect.Descriptor instead. func (*CommunityMessageArchiveMagnetlink) Descriptor() ([]byte, []int) { - return file_communities_proto_rawDescGZIP(), []int{19} + return file_communities_proto_rawDescGZIP(), []int{20} } func (x *CommunityMessageArchiveMagnetlink) GetClock() uint64 { @@ -1901,7 +1972,7 @@ type WakuMessage struct { func (x *WakuMessage) Reset() { *x = WakuMessage{} if protoimpl.UnsafeEnabled { - mi := &file_communities_proto_msgTypes[20] + mi := &file_communities_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1914,7 +1985,7 @@ func (x *WakuMessage) String() string { func (*WakuMessage) ProtoMessage() {} func (x *WakuMessage) ProtoReflect() protoreflect.Message { - mi := &file_communities_proto_msgTypes[20] + mi := &file_communities_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1927,7 +1998,7 @@ func (x *WakuMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use WakuMessage.ProtoReflect.Descriptor instead. func (*WakuMessage) Descriptor() ([]byte, []int) { - return file_communities_proto_rawDescGZIP(), []int{20} + return file_communities_proto_rawDescGZIP(), []int{21} } func (x *WakuMessage) GetSig() []byte { @@ -1993,7 +2064,7 @@ type WakuMessageArchiveMetadata struct { func (x *WakuMessageArchiveMetadata) Reset() { *x = WakuMessageArchiveMetadata{} if protoimpl.UnsafeEnabled { - mi := &file_communities_proto_msgTypes[21] + mi := &file_communities_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2006,7 +2077,7 @@ func (x *WakuMessageArchiveMetadata) String() string { func (*WakuMessageArchiveMetadata) ProtoMessage() {} func (x *WakuMessageArchiveMetadata) ProtoReflect() protoreflect.Message { - mi := &file_communities_proto_msgTypes[21] + mi := &file_communities_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2019,7 +2090,7 @@ func (x *WakuMessageArchiveMetadata) ProtoReflect() protoreflect.Message { // Deprecated: Use WakuMessageArchiveMetadata.ProtoReflect.Descriptor instead. func (*WakuMessageArchiveMetadata) Descriptor() ([]byte, []int) { - return file_communities_proto_rawDescGZIP(), []int{21} + return file_communities_proto_rawDescGZIP(), []int{22} } func (x *WakuMessageArchiveMetadata) GetVersion() uint32 { @@ -2063,7 +2134,7 @@ type WakuMessageArchive struct { func (x *WakuMessageArchive) Reset() { *x = WakuMessageArchive{} if protoimpl.UnsafeEnabled { - mi := &file_communities_proto_msgTypes[22] + mi := &file_communities_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2076,7 +2147,7 @@ func (x *WakuMessageArchive) String() string { func (*WakuMessageArchive) ProtoMessage() {} func (x *WakuMessageArchive) ProtoReflect() protoreflect.Message { - mi := &file_communities_proto_msgTypes[22] + mi := &file_communities_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2089,7 +2160,7 @@ func (x *WakuMessageArchive) ProtoReflect() protoreflect.Message { // Deprecated: Use WakuMessageArchive.ProtoReflect.Descriptor instead. func (*WakuMessageArchive) Descriptor() ([]byte, []int) { - return file_communities_proto_rawDescGZIP(), []int{22} + return file_communities_proto_rawDescGZIP(), []int{23} } func (x *WakuMessageArchive) GetVersion() uint32 { @@ -2128,7 +2199,7 @@ type WakuMessageArchiveIndexMetadata struct { func (x *WakuMessageArchiveIndexMetadata) Reset() { *x = WakuMessageArchiveIndexMetadata{} if protoimpl.UnsafeEnabled { - mi := &file_communities_proto_msgTypes[23] + mi := &file_communities_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2141,7 +2212,7 @@ func (x *WakuMessageArchiveIndexMetadata) String() string { func (*WakuMessageArchiveIndexMetadata) ProtoMessage() {} func (x *WakuMessageArchiveIndexMetadata) ProtoReflect() protoreflect.Message { - mi := &file_communities_proto_msgTypes[23] + mi := &file_communities_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2154,7 +2225,7 @@ func (x *WakuMessageArchiveIndexMetadata) ProtoReflect() protoreflect.Message { // Deprecated: Use WakuMessageArchiveIndexMetadata.ProtoReflect.Descriptor instead. func (*WakuMessageArchiveIndexMetadata) Descriptor() ([]byte, []int) { - return file_communities_proto_rawDescGZIP(), []int{23} + return file_communities_proto_rawDescGZIP(), []int{24} } func (x *WakuMessageArchiveIndexMetadata) GetVersion() uint32 { @@ -2203,7 +2274,7 @@ type WakuMessageArchiveIndex struct { func (x *WakuMessageArchiveIndex) Reset() { *x = WakuMessageArchiveIndex{} if protoimpl.UnsafeEnabled { - mi := &file_communities_proto_msgTypes[24] + mi := &file_communities_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2216,7 +2287,7 @@ func (x *WakuMessageArchiveIndex) String() string { func (*WakuMessageArchiveIndex) ProtoMessage() {} func (x *WakuMessageArchiveIndex) ProtoReflect() protoreflect.Message { - mi := &file_communities_proto_msgTypes[24] + mi := &file_communities_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2229,7 +2300,7 @@ func (x *WakuMessageArchiveIndex) ProtoReflect() protoreflect.Message { // Deprecated: Use WakuMessageArchiveIndex.ProtoReflect.Descriptor instead. func (*WakuMessageArchiveIndex) Descriptor() ([]byte, []int) { - return file_communities_proto_rawDescGZIP(), []int{24} + return file_communities_proto_rawDescGZIP(), []int{25} } func (x *WakuMessageArchiveIndex) GetArchives() map[string]*WakuMessageArchiveIndexMetadata { @@ -2253,7 +2324,7 @@ type CommunityPublicStorenodesInfo struct { func (x *CommunityPublicStorenodesInfo) Reset() { *x = CommunityPublicStorenodesInfo{} if protoimpl.UnsafeEnabled { - mi := &file_communities_proto_msgTypes[25] + mi := &file_communities_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2266,7 +2337,7 @@ func (x *CommunityPublicStorenodesInfo) String() string { func (*CommunityPublicStorenodesInfo) ProtoMessage() {} func (x *CommunityPublicStorenodesInfo) ProtoReflect() protoreflect.Message { - mi := &file_communities_proto_msgTypes[25] + mi := &file_communities_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2279,7 +2350,7 @@ func (x *CommunityPublicStorenodesInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use CommunityPublicStorenodesInfo.ProtoReflect.Descriptor instead. func (*CommunityPublicStorenodesInfo) Descriptor() ([]byte, []int) { - return file_communities_proto_rawDescGZIP(), []int{25} + return file_communities_proto_rawDescGZIP(), []int{26} } func (x *CommunityPublicStorenodesInfo) GetSignature() []byte { @@ -2310,7 +2381,7 @@ type CommunityStorenodes struct { func (x *CommunityStorenodes) Reset() { *x = CommunityStorenodes{} if protoimpl.UnsafeEnabled { - mi := &file_communities_proto_msgTypes[26] + mi := &file_communities_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2323,7 +2394,7 @@ func (x *CommunityStorenodes) String() string { func (*CommunityStorenodes) ProtoMessage() {} func (x *CommunityStorenodes) ProtoReflect() protoreflect.Message { - mi := &file_communities_proto_msgTypes[26] + mi := &file_communities_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2336,7 +2407,7 @@ func (x *CommunityStorenodes) ProtoReflect() protoreflect.Message { // Deprecated: Use CommunityStorenodes.ProtoReflect.Descriptor instead. func (*CommunityStorenodes) Descriptor() ([]byte, []int) { - return file_communities_proto_rawDescGZIP(), []int{26} + return file_communities_proto_rawDescGZIP(), []int{27} } func (x *CommunityStorenodes) GetClock() uint64 { @@ -2385,7 +2456,7 @@ type Storenode struct { func (x *Storenode) Reset() { *x = Storenode{} if protoimpl.UnsafeEnabled { - mi := &file_communities_proto_msgTypes[27] + mi := &file_communities_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2398,7 +2469,7 @@ func (x *Storenode) String() string { func (*Storenode) ProtoMessage() {} func (x *Storenode) ProtoReflect() protoreflect.Message { - mi := &file_communities_proto_msgTypes[27] + mi := &file_communities_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2411,7 +2482,7 @@ func (x *Storenode) ProtoReflect() protoreflect.Message { // Deprecated: Use Storenode.ProtoReflect.Descriptor instead. func (*Storenode) Descriptor() ([]byte, []int) { - return file_communities_proto_rawDescGZIP(), []int{27} + return file_communities_proto_rawDescGZIP(), []int{28} } func (x *Storenode) GetCommunityId() []byte { @@ -2481,7 +2552,7 @@ type CommunityReevaluatePermissionsRequest struct { func (x *CommunityReevaluatePermissionsRequest) Reset() { *x = CommunityReevaluatePermissionsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_communities_proto_msgTypes[28] + mi := &file_communities_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2494,7 +2565,7 @@ func (x *CommunityReevaluatePermissionsRequest) String() string { func (*CommunityReevaluatePermissionsRequest) ProtoMessage() {} func (x *CommunityReevaluatePermissionsRequest) ProtoReflect() protoreflect.Message { - mi := &file_communities_proto_msgTypes[28] + mi := &file_communities_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2507,7 +2578,7 @@ func (x *CommunityReevaluatePermissionsRequest) ProtoReflect() protoreflect.Mess // Deprecated: Use CommunityReevaluatePermissionsRequest.ProtoReflect.Descriptor instead. func (*CommunityReevaluatePermissionsRequest) Descriptor() ([]byte, []int) { - return file_communities_proto_rawDescGZIP(), []int{28} + return file_communities_proto_rawDescGZIP(), []int{29} } func (x *CommunityReevaluatePermissionsRequest) GetCommunityId() []byte { @@ -2529,7 +2600,7 @@ type DeleteCommunityMemberMessage struct { func (x *DeleteCommunityMemberMessage) Reset() { *x = DeleteCommunityMemberMessage{} if protoimpl.UnsafeEnabled { - mi := &file_communities_proto_msgTypes[29] + mi := &file_communities_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2542,7 +2613,7 @@ func (x *DeleteCommunityMemberMessage) String() string { func (*DeleteCommunityMemberMessage) ProtoMessage() {} func (x *DeleteCommunityMemberMessage) ProtoReflect() protoreflect.Message { - mi := &file_communities_proto_msgTypes[29] + mi := &file_communities_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2555,7 +2626,7 @@ func (x *DeleteCommunityMemberMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteCommunityMemberMessage.ProtoReflect.Descriptor instead. func (*DeleteCommunityMemberMessage) Descriptor() ([]byte, []int) { - return file_communities_proto_rawDescGZIP(), []int{29} + return file_communities_proto_rawDescGZIP(), []int{30} } func (x *DeleteCommunityMemberMessage) GetId() string { @@ -2586,7 +2657,7 @@ type DeleteCommunityMemberMessages struct { func (x *DeleteCommunityMemberMessages) Reset() { *x = DeleteCommunityMemberMessages{} if protoimpl.UnsafeEnabled { - mi := &file_communities_proto_msgTypes[30] + mi := &file_communities_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2599,7 +2670,7 @@ func (x *DeleteCommunityMemberMessages) String() string { func (*DeleteCommunityMemberMessages) ProtoMessage() {} func (x *DeleteCommunityMemberMessages) ProtoReflect() protoreflect.Message { - mi := &file_communities_proto_msgTypes[30] + mi := &file_communities_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2612,7 +2683,7 @@ func (x *DeleteCommunityMemberMessages) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteCommunityMemberMessages.ProtoReflect.Descriptor instead. func (*DeleteCommunityMemberMessages) Descriptor() ([]byte, []int) { - return file_communities_proto_rawDescGZIP(), []int{30} + return file_communities_proto_rawDescGZIP(), []int{31} } func (x *DeleteCommunityMemberMessages) GetClock() uint64 { @@ -2656,7 +2727,7 @@ type CommunityUpdateGrant struct { func (x *CommunityUpdateGrant) Reset() { *x = CommunityUpdateGrant{} if protoimpl.UnsafeEnabled { - mi := &file_communities_proto_msgTypes[31] + mi := &file_communities_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2669,7 +2740,7 @@ func (x *CommunityUpdateGrant) String() string { func (*CommunityUpdateGrant) ProtoMessage() {} func (x *CommunityUpdateGrant) ProtoReflect() protoreflect.Message { - mi := &file_communities_proto_msgTypes[31] + mi := &file_communities_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2682,7 +2753,7 @@ func (x *CommunityUpdateGrant) ProtoReflect() protoreflect.Message { // Deprecated: Use CommunityUpdateGrant.ProtoReflect.Descriptor instead. func (*CommunityUpdateGrant) Descriptor() ([]byte, []int) { - return file_communities_proto_rawDescGZIP(), []int{31} + return file_communities_proto_rawDescGZIP(), []int{32} } func (x *CommunityUpdateGrant) GetTimestamp() uint64 { @@ -2717,7 +2788,7 @@ type CommunityEncryptionKeysRequest struct { func (x *CommunityEncryptionKeysRequest) Reset() { *x = CommunityEncryptionKeysRequest{} if protoimpl.UnsafeEnabled { - mi := &file_communities_proto_msgTypes[32] + mi := &file_communities_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2730,7 +2801,7 @@ func (x *CommunityEncryptionKeysRequest) String() string { func (*CommunityEncryptionKeysRequest) ProtoMessage() {} func (x *CommunityEncryptionKeysRequest) ProtoReflect() protoreflect.Message { - mi := &file_communities_proto_msgTypes[32] + mi := &file_communities_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2743,7 +2814,7 @@ func (x *CommunityEncryptionKeysRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CommunityEncryptionKeysRequest.ProtoReflect.Descriptor instead. func (*CommunityEncryptionKeysRequest) Descriptor() ([]byte, []int) { - return file_communities_proto_rawDescGZIP(), []int{32} + return file_communities_proto_rawDescGZIP(), []int{33} } func (x *CommunityEncryptionKeysRequest) GetCommunityId() []byte { @@ -2764,7 +2835,7 @@ type CommunitySharedAddressesRequest struct { func (x *CommunitySharedAddressesRequest) Reset() { *x = CommunitySharedAddressesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_communities_proto_msgTypes[33] + mi := &file_communities_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2777,7 +2848,7 @@ func (x *CommunitySharedAddressesRequest) String() string { func (*CommunitySharedAddressesRequest) ProtoMessage() {} func (x *CommunitySharedAddressesRequest) ProtoReflect() protoreflect.Message { - mi := &file_communities_proto_msgTypes[33] + mi := &file_communities_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2790,7 +2861,7 @@ func (x *CommunitySharedAddressesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CommunitySharedAddressesRequest.ProtoReflect.Descriptor instead. func (*CommunitySharedAddressesRequest) Descriptor() ([]byte, []int) { - return file_communities_proto_rawDescGZIP(), []int{33} + return file_communities_proto_rawDescGZIP(), []int{34} } func (x *CommunitySharedAddressesRequest) GetCommunityId() []byte { @@ -2812,7 +2883,7 @@ type CommunitySharedAddressesResponse struct { func (x *CommunitySharedAddressesResponse) Reset() { *x = CommunitySharedAddressesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_communities_proto_msgTypes[34] + mi := &file_communities_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2825,7 +2896,7 @@ func (x *CommunitySharedAddressesResponse) String() string { func (*CommunitySharedAddressesResponse) ProtoMessage() {} func (x *CommunitySharedAddressesResponse) ProtoReflect() protoreflect.Message { - mi := &file_communities_proto_msgTypes[34] + mi := &file_communities_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2838,7 +2909,7 @@ func (x *CommunitySharedAddressesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CommunitySharedAddressesResponse.ProtoReflect.Descriptor instead. func (*CommunitySharedAddressesResponse) Descriptor() ([]byte, []int) { - return file_communities_proto_rawDescGZIP(), []int{34} + return file_communities_proto_rawDescGZIP(), []int{35} } func (x *CommunitySharedAddressesResponse) GetCommunityId() []byte { @@ -3120,7 +3191,7 @@ var file_communities_proto_rawDesc = []byte{ 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1b, 0x70, 0x69, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x41, 0x6c, 0x6c, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x64, 0x22, 0xd4, 0x03, 0x0a, 0x0d, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x43, + 0x64, 0x22, 0x97, 0x04, 0x0a, 0x0d, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x43, 0x68, 0x61, 0x74, 0x12, 0x3e, 0x0a, 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x43, 0x68, 0x61, 0x74, 0x2e, 0x4d, 0x65, @@ -3144,247 +3215,256 @@ var file_communities_proto_rawDesc = []byte{ 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x68, 0x69, 0x64, 0x65, 0x49, 0x66, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x4e, 0x6f, 0x74, 0x4d, 0x65, - 0x74, 0x1a, 0x55, 0x0a, 0x0c, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x43, 0x6f, - 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x64, 0x0a, 0x11, 0x43, 0x6f, 0x6d, 0x6d, - 0x75, 0x6e, 0x69, 0x74, 0x79, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x1f, 0x0a, - 0x0b, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x49, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x92, - 0x01, 0x0a, 0x0f, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x65, 0x64, 0x41, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1c, 0x0a, 0x09, - 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x68, - 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x04, 0x52, 0x08, 0x63, - 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x69, 0x73, 0x41, 0x69, 0x72, - 0x64, 0x72, 0x6f, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x10, 0x69, 0x73, 0x41, 0x69, 0x72, 0x64, 0x72, 0x6f, 0x70, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x22, 0xa1, 0x02, 0x0a, 0x16, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x6f, 0x4a, 0x6f, 0x69, 0x6e, 0x12, 0x14, - 0x0a, 0x05, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x63, - 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x6e, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x6e, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x17, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x63, 0x68, 0x61, 0x74, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, - 0x75, 0x6e, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, - 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x64, - 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x46, - 0x0a, 0x11, 0x72, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x65, 0x64, 0x41, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x10, 0x72, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x65, 0x64, 0x41, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x2f, 0x0a, 0x13, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x12, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x22, 0x9f, 0x01, 0x0a, 0x1c, 0x43, 0x6f, 0x6d, 0x6d, - 0x75, 0x6e, 0x69, 0x74, 0x79, 0x45, 0x64, 0x69, 0x74, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6c, 0x6f, 0x63, - 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x21, - 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x49, - 0x64, 0x12, 0x46, 0x0a, 0x11, 0x72, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x65, 0x64, - 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x10, 0x72, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x65, - 0x64, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x22, 0xdf, 0x01, 0x0a, 0x1c, 0x43, 0x6f, - 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x54, 0x6f, 0x4a, 0x6f, 0x69, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6c, - 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x63, 0x6c, 0x6f, 0x63, 0x6b, - 0x12, 0x19, 0x0a, 0x08, 0x65, 0x6e, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x65, 0x6e, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x63, - 0x68, 0x61, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x68, - 0x61, 0x74, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, - 0x79, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, - 0x75, 0x6e, 0x69, 0x74, 0x79, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, - 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, - 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x13, 0x63, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, - 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x22, 0x4e, 0x0a, 0x13, 0x43, - 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x55, 0x73, 0x65, 0x72, 0x4b, 0x69, 0x63, 0x6b, - 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x74, 0x12, 0x41, 0x0a, 0x0c, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x5f, 0x6c, 0x69, 0x73, + 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x42, 0x6c, 0x6f, 0x6f, + 0x6d, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x0b, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, + 0x4c, 0x69, 0x73, 0x74, 0x1a, 0x55, 0x0a, 0x0c, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x46, 0x0a, 0x14, 0x43, + 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x42, 0x6c, 0x6f, 0x6f, 0x6d, 0x46, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x0c, 0x0a, 0x01, 0x6d, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x01, 0x6d, 0x12, 0x0c, 0x0a, 0x01, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x01, 0x6b, 0x22, 0x64, 0x0a, 0x11, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, + 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x61, 0x74, 0x65, + 0x67, 0x6f, 0x72, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, + 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x92, 0x01, 0x0a, 0x0f, 0x52, 0x65, + 0x76, 0x65, 0x61, 0x6c, 0x65, 0x64, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x0a, + 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, + 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x04, 0x52, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, + 0x64, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x69, 0x73, 0x41, 0x69, 0x72, 0x64, 0x72, 0x6f, 0x70, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, 0x73, + 0x41, 0x69, 0x72, 0x64, 0x72, 0x6f, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0xa1, + 0x02, 0x0a, 0x16, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x54, 0x6f, 0x4a, 0x6f, 0x69, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6c, 0x6f, + 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x12, + 0x19, 0x0a, 0x08, 0x65, 0x6e, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x65, 0x6e, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x63, 0x68, + 0x61, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x68, 0x61, + 0x74, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, + 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x75, + 0x6e, 0x69, 0x74, 0x79, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x46, 0x0a, 0x11, 0x72, 0x65, 0x76, + 0x65, 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x06, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x65, 0x64, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, + 0x10, 0x72, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x65, 0x64, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x73, 0x12, 0x2f, 0x0a, 0x13, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, + 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6c, + 0x6f, 0x72, 0x22, 0x9f, 0x01, 0x0a, 0x1c, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, + 0x45, 0x64, 0x69, 0x74, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x05, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, + 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x49, 0x64, 0x12, 0x46, 0x0a, 0x11, + 0x72, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x65, 0x64, 0x41, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x52, 0x10, 0x72, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x65, 0x64, 0x41, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x73, 0x22, 0xdf, 0x01, 0x0a, 0x1c, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, + 0x74, 0x79, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, + 0x6f, 0x4a, 0x6f, 0x69, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x19, 0x0a, 0x08, 0x65, + 0x6e, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, + 0x6e, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x68, 0x61, 0x74, 0x49, 0x64, 0x12, + 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, + 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x13, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x12, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x22, 0x4e, 0x0a, 0x13, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, + 0x69, 0x74, 0x79, 0x55, 0x73, 0x65, 0x72, 0x4b, 0x69, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x63, 0x6c, + 0x6f, 0x63, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x75, + 0x6e, 0x69, 0x74, 0x79, 0x49, 0x64, 0x22, 0xce, 0x02, 0x0a, 0x1e, 0x43, 0x6f, 0x6d, 0x6d, 0x75, + 0x6e, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x6f, 0x4a, 0x6f, 0x69, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6c, 0x6f, + 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x12, + 0x3c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x43, 0x6f, + 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x12, 0x1a, 0x0a, + 0x08, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x08, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x72, 0x61, + 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x12, + 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, + 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x67, 0x6e, 0x65, 0x74, 0x5f, 0x75, 0x72, 0x69, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x67, 0x6e, 0x65, 0x74, 0x55, 0x72, + 0x69, 0x12, 0x3d, 0x0a, 0x1b, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x74, + 0x6f, 0x70, 0x69, 0x63, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x18, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x65, + 0x64, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, + 0x12, 0x25, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, 0x52, 0x0a, 0x17, 0x43, 0x6f, 0x6d, 0x6d, 0x75, + 0x6e, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x6f, 0x4c, 0x65, 0x61, + 0x76, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, - 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x49, 0x64, 0x22, 0xce, 0x02, 0x0a, 0x1e, - 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x54, 0x6f, 0x4a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x63, - 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x3c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, - 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x44, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, - 0x74, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x12, 0x14, - 0x0a, 0x05, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x67, - 0x72, 0x61, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, - 0x79, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, - 0x75, 0x6e, 0x69, 0x74, 0x79, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x67, 0x6e, 0x65, - 0x74, 0x5f, 0x75, 0x72, 0x69, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x67, - 0x6e, 0x65, 0x74, 0x55, 0x72, 0x69, 0x12, 0x3d, 0x0a, 0x1b, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, - 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x18, 0x70, 0x72, 0x6f, - 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x50, 0x72, 0x69, 0x76, 0x61, - 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x25, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, 0x52, 0x0a, 0x17, - 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x54, 0x6f, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6c, 0x6f, 0x63, 0x6b, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x21, 0x0a, - 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x49, 0x64, - 0x22, 0x58, 0x0a, 0x21, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x4d, 0x61, 0x67, 0x6e, 0x65, - 0x74, 0x6c, 0x69, 0x6e, 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, - 0x61, 0x67, 0x6e, 0x65, 0x74, 0x5f, 0x75, 0x72, 0x69, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x6d, 0x61, 0x67, 0x6e, 0x65, 0x74, 0x55, 0x72, 0x69, 0x22, 0xbf, 0x01, 0x0a, 0x0b, 0x57, - 0x61, 0x6b, 0x75, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x69, - 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x73, 0x69, 0x67, 0x12, 0x1c, 0x0a, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, - 0x70, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, - 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, - 0x64, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x61, 0x64, - 0x64, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x22, 0x0a, 0x0c, 0x74, 0x68, 0x69, 0x72, - 0x64, 0x50, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x74, 0x68, 0x69, 0x72, 0x64, 0x50, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x22, 0x7e, 0x0a, 0x1a, - 0x57, 0x61, 0x6b, 0x75, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x41, 0x72, 0x63, 0x68, 0x69, - 0x76, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x74, 0x6f, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0c, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x22, 0xa3, 0x01, 0x0a, - 0x12, 0x57, 0x61, 0x6b, 0x75, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x41, 0x72, 0x63, 0x68, - 0x69, 0x76, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, - 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x57, 0x61, 0x6b, 0x75, 0x4d, + 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x49, 0x64, 0x22, 0x58, 0x0a, 0x21, 0x43, + 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x41, + 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x4d, 0x61, 0x67, 0x6e, 0x65, 0x74, 0x6c, 0x69, 0x6e, 0x6b, + 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x05, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x67, 0x6e, 0x65, 0x74, + 0x5f, 0x75, 0x72, 0x69, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x67, 0x6e, + 0x65, 0x74, 0x55, 0x72, 0x69, 0x22, 0xbf, 0x01, 0x0a, 0x0b, 0x57, 0x61, 0x6b, 0x75, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x03, 0x73, 0x69, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x70, + 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x61, + 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x12, + 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, + 0x61, 0x73, 0x68, 0x12, 0x22, 0x0a, 0x0c, 0x74, 0x68, 0x69, 0x72, 0x64, 0x50, 0x61, 0x72, 0x74, + 0x79, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x68, 0x69, 0x72, 0x64, + 0x50, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x22, 0x7e, 0x0a, 0x1a, 0x57, 0x61, 0x6b, 0x75, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, - 0x31, 0x0a, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x57, 0x61, 0x6b, - 0x75, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x73, 0x22, 0xc3, 0x01, 0x0a, 0x1f, 0x57, 0x61, 0x6b, 0x75, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x40, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x57, 0x61, - 0x6b, 0x75, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, - 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x07, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x22, 0xce, 0x01, 0x0a, 0x17, 0x57, 0x61, 0x6b, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x12, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x66, + 0x72, 0x6f, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x02, 0x74, 0x6f, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x6f, + 0x70, 0x69, 0x63, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x22, 0xa3, 0x01, 0x0a, 0x12, 0x57, 0x61, 0x6b, 0x75, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x57, 0x61, 0x6b, 0x75, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x31, 0x0a, 0x08, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x57, 0x61, 0x6b, 0x75, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x52, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x22, 0xc3, 0x01, + 0x0a, 0x1f, 0x57, 0x61, 0x6b, 0x75, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x41, 0x72, 0x63, + 0x68, 0x69, 0x76, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x57, 0x61, 0x6b, 0x75, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, + 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x64, + 0x64, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x70, 0x61, 0x64, 0x64, + 0x69, 0x6e, 0x67, 0x22, 0xce, 0x01, 0x0a, 0x17, 0x57, 0x61, 0x6b, 0x75, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, + 0x4b, 0x0a, 0x08, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x57, 0x61, 0x6b, 0x75, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x12, 0x4b, 0x0a, 0x08, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x57, 0x61, 0x6b, 0x75, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x41, 0x72, 0x63, - 0x68, 0x69, 0x76, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, - 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, - 0x73, 0x1a, 0x66, 0x0a, 0x0d, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x57, - 0x61, 0x6b, 0x75, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, - 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x57, 0x0a, 0x1d, 0x43, 0x6f, 0x6d, - 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x53, 0x74, 0x6f, 0x72, - 0x65, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, - 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, - 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, - 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, - 0x61, 0x64, 0x22, 0x9e, 0x01, 0x0a, 0x13, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, - 0x53, 0x74, 0x6f, 0x72, 0x65, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6c, - 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x63, 0x6c, 0x6f, 0x63, 0x6b, - 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, - 0x79, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x6e, 0x6f, 0x64, 0x65, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x6e, 0x6f, 0x64, 0x65, 0x52, 0x0a, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, - 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, - 0x6e, 0x49, 0x64, 0x22, 0xe8, 0x01, 0x0a, 0x09, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x6e, 0x6f, 0x64, - 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, - 0x74, 0x79, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x6e, 0x6f, 0x64, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x74, 0x6f, 0x72, - 0x65, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6c, 0x65, 0x65, 0x74, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x6c, 0x65, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x12, - 0x1d, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x4a, - 0x0a, 0x25, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x52, 0x65, 0x65, 0x76, 0x61, - 0x6c, 0x75, 0x61, 0x74, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x75, - 0x6e, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x63, - 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x49, 0x64, 0x22, 0x47, 0x0a, 0x1c, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x4d, 0x65, 0x6d, - 0x62, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x63, 0x68, - 0x61, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x68, 0x61, - 0x74, 0x49, 0x64, 0x22, 0xb9, 0x01, 0x0a, 0x1d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, - 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, + 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x08, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x73, 0x1a, 0x66, 0x0a, 0x0d, + 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x3f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x57, 0x61, 0x6b, 0x75, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x57, 0x0a, 0x1d, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, + 0x79, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x6e, 0x6f, 0x64, 0x65, + 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x9e, 0x01, + 0x0a, 0x13, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x53, 0x74, 0x6f, 0x72, 0x65, + 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x49, 0x64, 0x12, 0x1b, - 0x0a, 0x09, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x49, 0x64, 0x12, 0x42, 0x0a, 0x08, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, + 0x0c, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x49, 0x64, 0x12, 0x33, + 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, + 0x6f, 0x72, 0x65, 0x6e, 0x6f, 0x64, 0x65, 0x52, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x6e, 0x6f, + 0x64, 0x65, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x22, 0xe8, + 0x01, 0x0a, 0x09, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x21, 0x0a, 0x0c, + 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x49, 0x64, 0x12, + 0x21, 0x0a, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x6e, 0x6f, 0x64, 0x65, + 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6c, 0x65, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x66, 0x6c, 0x65, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x07, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x64, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x4a, 0x0a, 0x25, 0x43, 0x6f, 0x6d, + 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x52, 0x65, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, + 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, + 0x69, 0x74, 0x79, 0x49, 0x64, 0x22, 0x47, 0x0a, 0x1c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x22, - 0xd6, 0x01, 0x0a, 0x14, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x74, 0x5f, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x68, 0x61, 0x74, 0x49, 0x64, 0x22, 0xb9, + 0x01, 0x0a, 0x1d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, + 0x74, 0x79, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, + 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x05, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x63, 0x6f, - 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x49, 0x64, 0x12, 0x42, 0x0a, 0x06, 0x67, 0x72, 0x61, - 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x2e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x1a, 0x39, 0x0a, - 0x0b, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x43, 0x0a, 0x1e, 0x43, 0x6f, 0x6d, 0x6d, - 0x75, 0x6e, 0x69, 0x74, 0x79, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4b, - 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, - 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x49, 0x64, 0x22, 0x44, 0x0a, - 0x1f, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, - 0x79, 0x49, 0x64, 0x22, 0x8d, 0x01, 0x0a, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, - 0x79, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, - 0x75, 0x6e, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, - 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x49, 0x64, 0x12, 0x46, 0x0a, 0x11, 0x72, - 0x65, 0x76, 0x65, 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x52, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x65, 0x64, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x52, 0x10, 0x72, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x65, 0x64, 0x41, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x73, 0x42, 0x0d, 0x5a, 0x0b, 0x2e, 0x2f, 0x3b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x49, 0x64, 0x12, 0x42, 0x0a, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, + 0x69, 0x74, 0x79, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x52, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x22, 0xd6, 0x01, 0x0a, 0x14, 0x43, + 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, + 0x61, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, + 0x74, 0x79, 0x49, 0x64, 0x12, 0x42, 0x0a, 0x06, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, + 0x72, 0x61, 0x6e, 0x74, 0x2e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x06, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x47, 0x72, 0x61, 0x6e, + 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0x43, 0x0a, 0x1e, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, + 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, + 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x63, 0x6f, 0x6d, + 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x49, 0x64, 0x22, 0x44, 0x0a, 0x1f, 0x43, 0x6f, 0x6d, 0x6d, + 0x75, 0x6e, 0x69, 0x74, 0x79, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x63, + 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x49, 0x64, 0x22, 0x8d, + 0x01, 0x0a, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x53, 0x68, 0x61, 0x72, + 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x75, + 0x6e, 0x69, 0x74, 0x79, 0x49, 0x64, 0x12, 0x46, 0x0a, 0x11, 0x72, 0x65, 0x76, 0x65, 0x61, 0x6c, + 0x65, 0x64, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x52, 0x65, 0x76, + 0x65, 0x61, 0x6c, 0x65, 0x64, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x10, 0x72, 0x65, + 0x76, 0x65, 0x61, 0x6c, 0x65, 0x64, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x42, 0x0d, + 0x5a, 0x0b, 0x2e, 0x2f, 0x3b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -3400,7 +3480,7 @@ func file_communities_proto_rawDescGZIP() []byte { } var file_communities_proto_enumTypes = make([]protoimpl.EnumInfo, 5) -var file_communities_proto_msgTypes = make([]protoimpl.MessageInfo, 46) +var file_communities_proto_msgTypes = make([]protoimpl.MessageInfo, 47) var file_communities_proto_goTypes = []interface{}{ (CommunityMember_Roles)(0), // 0: protobuf.CommunityMember.Roles (CommunityMember_ChannelRole)(0), // 1: protobuf.CommunityMember.ChannelRole @@ -3418,94 +3498,96 @@ var file_communities_proto_goTypes = []interface{}{ (*CommunityBanInfo)(nil), // 13: protobuf.CommunityBanInfo (*CommunityAdminSettings)(nil), // 14: protobuf.CommunityAdminSettings (*CommunityChat)(nil), // 15: protobuf.CommunityChat - (*CommunityCategory)(nil), // 16: protobuf.CommunityCategory - (*RevealedAccount)(nil), // 17: protobuf.RevealedAccount - (*CommunityRequestToJoin)(nil), // 18: protobuf.CommunityRequestToJoin - (*CommunityEditSharedAddresses)(nil), // 19: protobuf.CommunityEditSharedAddresses - (*CommunityCancelRequestToJoin)(nil), // 20: protobuf.CommunityCancelRequestToJoin - (*CommunityUserKicked)(nil), // 21: protobuf.CommunityUserKicked - (*CommunityRequestToJoinResponse)(nil), // 22: protobuf.CommunityRequestToJoinResponse - (*CommunityRequestToLeave)(nil), // 23: protobuf.CommunityRequestToLeave - (*CommunityMessageArchiveMagnetlink)(nil), // 24: protobuf.CommunityMessageArchiveMagnetlink - (*WakuMessage)(nil), // 25: protobuf.WakuMessage - (*WakuMessageArchiveMetadata)(nil), // 26: protobuf.WakuMessageArchiveMetadata - (*WakuMessageArchive)(nil), // 27: protobuf.WakuMessageArchive - (*WakuMessageArchiveIndexMetadata)(nil), // 28: protobuf.WakuMessageArchiveIndexMetadata - (*WakuMessageArchiveIndex)(nil), // 29: protobuf.WakuMessageArchiveIndex - (*CommunityPublicStorenodesInfo)(nil), // 30: protobuf.CommunityPublicStorenodesInfo - (*CommunityStorenodes)(nil), // 31: protobuf.CommunityStorenodes - (*Storenode)(nil), // 32: protobuf.Storenode - (*CommunityReevaluatePermissionsRequest)(nil), // 33: protobuf.CommunityReevaluatePermissionsRequest - (*DeleteCommunityMemberMessage)(nil), // 34: protobuf.DeleteCommunityMemberMessage - (*DeleteCommunityMemberMessages)(nil), // 35: protobuf.DeleteCommunityMemberMessages - (*CommunityUpdateGrant)(nil), // 36: protobuf.CommunityUpdateGrant - (*CommunityEncryptionKeysRequest)(nil), // 37: protobuf.CommunityEncryptionKeysRequest - (*CommunitySharedAddressesRequest)(nil), // 38: protobuf.CommunitySharedAddressesRequest - (*CommunitySharedAddressesResponse)(nil), // 39: protobuf.CommunitySharedAddressesResponse - nil, // 40: protobuf.CommunityTokenMetadata.ContractAddressesEntry - nil, // 41: protobuf.TokenCriteria.ContractAddressesEntry - nil, // 42: protobuf.CommunityDescription.MembersEntry - nil, // 43: protobuf.CommunityDescription.ChatsEntry - nil, // 44: protobuf.CommunityDescription.CategoriesEntry - nil, // 45: protobuf.CommunityDescription.TokenPermissionsEntry - nil, // 46: protobuf.CommunityDescription.BannedMembersEntry - nil, // 47: protobuf.CommunityDescription.PrivateDataEntry - nil, // 48: protobuf.CommunityChat.MembersEntry - nil, // 49: protobuf.WakuMessageArchiveIndex.ArchivesEntry - nil, // 50: protobuf.CommunityUpdateGrant.GrantsEntry - (CommunityTokenType)(0), // 51: protobuf.CommunityTokenType - (*ChatIdentity)(nil), // 52: protobuf.ChatIdentity - (*Shard)(nil), // 53: protobuf.Shard + (*CommunityBloomFilter)(nil), // 16: protobuf.CommunityBloomFilter + (*CommunityCategory)(nil), // 17: protobuf.CommunityCategory + (*RevealedAccount)(nil), // 18: protobuf.RevealedAccount + (*CommunityRequestToJoin)(nil), // 19: protobuf.CommunityRequestToJoin + (*CommunityEditSharedAddresses)(nil), // 20: protobuf.CommunityEditSharedAddresses + (*CommunityCancelRequestToJoin)(nil), // 21: protobuf.CommunityCancelRequestToJoin + (*CommunityUserKicked)(nil), // 22: protobuf.CommunityUserKicked + (*CommunityRequestToJoinResponse)(nil), // 23: protobuf.CommunityRequestToJoinResponse + (*CommunityRequestToLeave)(nil), // 24: protobuf.CommunityRequestToLeave + (*CommunityMessageArchiveMagnetlink)(nil), // 25: protobuf.CommunityMessageArchiveMagnetlink + (*WakuMessage)(nil), // 26: protobuf.WakuMessage + (*WakuMessageArchiveMetadata)(nil), // 27: protobuf.WakuMessageArchiveMetadata + (*WakuMessageArchive)(nil), // 28: protobuf.WakuMessageArchive + (*WakuMessageArchiveIndexMetadata)(nil), // 29: protobuf.WakuMessageArchiveIndexMetadata + (*WakuMessageArchiveIndex)(nil), // 30: protobuf.WakuMessageArchiveIndex + (*CommunityPublicStorenodesInfo)(nil), // 31: protobuf.CommunityPublicStorenodesInfo + (*CommunityStorenodes)(nil), // 32: protobuf.CommunityStorenodes + (*Storenode)(nil), // 33: protobuf.Storenode + (*CommunityReevaluatePermissionsRequest)(nil), // 34: protobuf.CommunityReevaluatePermissionsRequest + (*DeleteCommunityMemberMessage)(nil), // 35: protobuf.DeleteCommunityMemberMessage + (*DeleteCommunityMemberMessages)(nil), // 36: protobuf.DeleteCommunityMemberMessages + (*CommunityUpdateGrant)(nil), // 37: protobuf.CommunityUpdateGrant + (*CommunityEncryptionKeysRequest)(nil), // 38: protobuf.CommunityEncryptionKeysRequest + (*CommunitySharedAddressesRequest)(nil), // 39: protobuf.CommunitySharedAddressesRequest + (*CommunitySharedAddressesResponse)(nil), // 40: protobuf.CommunitySharedAddressesResponse + nil, // 41: protobuf.CommunityTokenMetadata.ContractAddressesEntry + nil, // 42: protobuf.TokenCriteria.ContractAddressesEntry + nil, // 43: protobuf.CommunityDescription.MembersEntry + nil, // 44: protobuf.CommunityDescription.ChatsEntry + nil, // 45: protobuf.CommunityDescription.CategoriesEntry + nil, // 46: protobuf.CommunityDescription.TokenPermissionsEntry + nil, // 47: protobuf.CommunityDescription.BannedMembersEntry + nil, // 48: protobuf.CommunityDescription.PrivateDataEntry + nil, // 49: protobuf.CommunityChat.MembersEntry + nil, // 50: protobuf.WakuMessageArchiveIndex.ArchivesEntry + nil, // 51: protobuf.CommunityUpdateGrant.GrantsEntry + (CommunityTokenType)(0), // 52: protobuf.CommunityTokenType + (*ChatIdentity)(nil), // 53: protobuf.ChatIdentity + (*Shard)(nil), // 54: protobuf.Shard } var file_communities_proto_depIdxs = []int32{ 0, // 0: protobuf.CommunityMember.roles:type_name -> protobuf.CommunityMember.Roles - 17, // 1: protobuf.CommunityMember.revealed_accounts:type_name -> protobuf.RevealedAccount + 18, // 1: protobuf.CommunityMember.revealed_accounts:type_name -> protobuf.RevealedAccount 1, // 2: protobuf.CommunityMember.channel_role:type_name -> protobuf.CommunityMember.ChannelRole - 40, // 3: protobuf.CommunityTokenMetadata.contract_addresses:type_name -> protobuf.CommunityTokenMetadata.ContractAddressesEntry - 51, // 4: protobuf.CommunityTokenMetadata.tokenType:type_name -> protobuf.CommunityTokenType + 41, // 3: protobuf.CommunityTokenMetadata.contract_addresses:type_name -> protobuf.CommunityTokenMetadata.ContractAddressesEntry + 52, // 4: protobuf.CommunityTokenMetadata.tokenType:type_name -> protobuf.CommunityTokenType 2, // 5: protobuf.CommunityTokenAction.action_type:type_name -> protobuf.CommunityTokenAction.ActionType 3, // 6: protobuf.CommunityPermissions.access:type_name -> protobuf.CommunityPermissions.Access - 41, // 7: protobuf.TokenCriteria.contract_addresses:type_name -> protobuf.TokenCriteria.ContractAddressesEntry - 51, // 8: protobuf.TokenCriteria.type:type_name -> protobuf.CommunityTokenType + 42, // 7: protobuf.TokenCriteria.contract_addresses:type_name -> protobuf.TokenCriteria.ContractAddressesEntry + 52, // 8: protobuf.TokenCriteria.type:type_name -> protobuf.CommunityTokenType 4, // 9: protobuf.CommunityTokenPermission.type:type_name -> protobuf.CommunityTokenPermission.Type 10, // 10: protobuf.CommunityTokenPermission.token_criteria:type_name -> protobuf.TokenCriteria - 42, // 11: protobuf.CommunityDescription.members:type_name -> protobuf.CommunityDescription.MembersEntry + 43, // 11: protobuf.CommunityDescription.members:type_name -> protobuf.CommunityDescription.MembersEntry 9, // 12: protobuf.CommunityDescription.permissions:type_name -> protobuf.CommunityPermissions - 52, // 13: protobuf.CommunityDescription.identity:type_name -> protobuf.ChatIdentity - 43, // 14: protobuf.CommunityDescription.chats:type_name -> protobuf.CommunityDescription.ChatsEntry - 44, // 15: protobuf.CommunityDescription.categories:type_name -> protobuf.CommunityDescription.CategoriesEntry + 53, // 13: protobuf.CommunityDescription.identity:type_name -> protobuf.ChatIdentity + 44, // 14: protobuf.CommunityDescription.chats:type_name -> protobuf.CommunityDescription.ChatsEntry + 45, // 15: protobuf.CommunityDescription.categories:type_name -> protobuf.CommunityDescription.CategoriesEntry 14, // 16: protobuf.CommunityDescription.admin_settings:type_name -> protobuf.CommunityAdminSettings - 45, // 17: protobuf.CommunityDescription.token_permissions:type_name -> protobuf.CommunityDescription.TokenPermissionsEntry + 46, // 17: protobuf.CommunityDescription.token_permissions:type_name -> protobuf.CommunityDescription.TokenPermissionsEntry 7, // 18: protobuf.CommunityDescription.community_tokens_metadata:type_name -> protobuf.CommunityTokenMetadata - 46, // 19: protobuf.CommunityDescription.banned_members:type_name -> protobuf.CommunityDescription.BannedMembersEntry - 47, // 20: protobuf.CommunityDescription.privateData:type_name -> protobuf.CommunityDescription.PrivateDataEntry - 48, // 21: protobuf.CommunityChat.members:type_name -> protobuf.CommunityChat.MembersEntry + 47, // 19: protobuf.CommunityDescription.banned_members:type_name -> protobuf.CommunityDescription.BannedMembersEntry + 48, // 20: protobuf.CommunityDescription.privateData:type_name -> protobuf.CommunityDescription.PrivateDataEntry + 49, // 21: protobuf.CommunityChat.members:type_name -> protobuf.CommunityChat.MembersEntry 9, // 22: protobuf.CommunityChat.permissions:type_name -> protobuf.CommunityPermissions - 52, // 23: protobuf.CommunityChat.identity:type_name -> protobuf.ChatIdentity - 17, // 24: protobuf.CommunityRequestToJoin.revealed_accounts:type_name -> protobuf.RevealedAccount - 17, // 25: protobuf.CommunityEditSharedAddresses.revealed_accounts:type_name -> protobuf.RevealedAccount - 12, // 26: protobuf.CommunityRequestToJoinResponse.community:type_name -> protobuf.CommunityDescription - 53, // 27: protobuf.CommunityRequestToJoinResponse.shard:type_name -> protobuf.Shard - 26, // 28: protobuf.WakuMessageArchive.metadata:type_name -> protobuf.WakuMessageArchiveMetadata - 25, // 29: protobuf.WakuMessageArchive.messages:type_name -> protobuf.WakuMessage - 26, // 30: protobuf.WakuMessageArchiveIndexMetadata.metadata:type_name -> protobuf.WakuMessageArchiveMetadata - 49, // 31: protobuf.WakuMessageArchiveIndex.archives:type_name -> protobuf.WakuMessageArchiveIndex.ArchivesEntry - 32, // 32: protobuf.CommunityStorenodes.storenodes:type_name -> protobuf.Storenode - 34, // 33: protobuf.DeleteCommunityMemberMessages.messages:type_name -> protobuf.DeleteCommunityMemberMessage - 50, // 34: protobuf.CommunityUpdateGrant.grants:type_name -> protobuf.CommunityUpdateGrant.GrantsEntry - 17, // 35: protobuf.CommunitySharedAddressesResponse.revealed_accounts:type_name -> protobuf.RevealedAccount - 6, // 36: protobuf.CommunityDescription.MembersEntry.value:type_name -> protobuf.CommunityMember - 15, // 37: protobuf.CommunityDescription.ChatsEntry.value:type_name -> protobuf.CommunityChat - 16, // 38: protobuf.CommunityDescription.CategoriesEntry.value:type_name -> protobuf.CommunityCategory - 11, // 39: protobuf.CommunityDescription.TokenPermissionsEntry.value:type_name -> protobuf.CommunityTokenPermission - 13, // 40: protobuf.CommunityDescription.BannedMembersEntry.value:type_name -> protobuf.CommunityBanInfo - 6, // 41: protobuf.CommunityChat.MembersEntry.value:type_name -> protobuf.CommunityMember - 28, // 42: protobuf.WakuMessageArchiveIndex.ArchivesEntry.value:type_name -> protobuf.WakuMessageArchiveIndexMetadata - 43, // [43:43] is the sub-list for method output_type - 43, // [43:43] is the sub-list for method input_type - 43, // [43:43] is the sub-list for extension type_name - 43, // [43:43] is the sub-list for extension extendee - 0, // [0:43] is the sub-list for field type_name + 53, // 23: protobuf.CommunityChat.identity:type_name -> protobuf.ChatIdentity + 16, // 24: protobuf.CommunityChat.members_list:type_name -> protobuf.CommunityBloomFilter + 18, // 25: protobuf.CommunityRequestToJoin.revealed_accounts:type_name -> protobuf.RevealedAccount + 18, // 26: protobuf.CommunityEditSharedAddresses.revealed_accounts:type_name -> protobuf.RevealedAccount + 12, // 27: protobuf.CommunityRequestToJoinResponse.community:type_name -> protobuf.CommunityDescription + 54, // 28: protobuf.CommunityRequestToJoinResponse.shard:type_name -> protobuf.Shard + 27, // 29: protobuf.WakuMessageArchive.metadata:type_name -> protobuf.WakuMessageArchiveMetadata + 26, // 30: protobuf.WakuMessageArchive.messages:type_name -> protobuf.WakuMessage + 27, // 31: protobuf.WakuMessageArchiveIndexMetadata.metadata:type_name -> protobuf.WakuMessageArchiveMetadata + 50, // 32: protobuf.WakuMessageArchiveIndex.archives:type_name -> protobuf.WakuMessageArchiveIndex.ArchivesEntry + 33, // 33: protobuf.CommunityStorenodes.storenodes:type_name -> protobuf.Storenode + 35, // 34: protobuf.DeleteCommunityMemberMessages.messages:type_name -> protobuf.DeleteCommunityMemberMessage + 51, // 35: protobuf.CommunityUpdateGrant.grants:type_name -> protobuf.CommunityUpdateGrant.GrantsEntry + 18, // 36: protobuf.CommunitySharedAddressesResponse.revealed_accounts:type_name -> protobuf.RevealedAccount + 6, // 37: protobuf.CommunityDescription.MembersEntry.value:type_name -> protobuf.CommunityMember + 15, // 38: protobuf.CommunityDescription.ChatsEntry.value:type_name -> protobuf.CommunityChat + 17, // 39: protobuf.CommunityDescription.CategoriesEntry.value:type_name -> protobuf.CommunityCategory + 11, // 40: protobuf.CommunityDescription.TokenPermissionsEntry.value:type_name -> protobuf.CommunityTokenPermission + 13, // 41: protobuf.CommunityDescription.BannedMembersEntry.value:type_name -> protobuf.CommunityBanInfo + 6, // 42: protobuf.CommunityChat.MembersEntry.value:type_name -> protobuf.CommunityMember + 29, // 43: protobuf.WakuMessageArchiveIndex.ArchivesEntry.value:type_name -> protobuf.WakuMessageArchiveIndexMetadata + 44, // [44:44] is the sub-list for method output_type + 44, // [44:44] is the sub-list for method input_type + 44, // [44:44] is the sub-list for extension type_name + 44, // [44:44] is the sub-list for extension extendee + 0, // [0:44] is the sub-list for field type_name } func init() { file_communities_proto_init() } @@ -3650,7 +3732,7 @@ func file_communities_proto_init() { } } file_communities_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CommunityCategory); i { + switch v := v.(*CommunityBloomFilter); i { case 0: return &v.state case 1: @@ -3662,7 +3744,7 @@ func file_communities_proto_init() { } } file_communities_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RevealedAccount); i { + switch v := v.(*CommunityCategory); i { case 0: return &v.state case 1: @@ -3674,7 +3756,7 @@ func file_communities_proto_init() { } } file_communities_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CommunityRequestToJoin); i { + switch v := v.(*RevealedAccount); i { case 0: return &v.state case 1: @@ -3686,7 +3768,7 @@ func file_communities_proto_init() { } } file_communities_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CommunityEditSharedAddresses); i { + switch v := v.(*CommunityRequestToJoin); i { case 0: return &v.state case 1: @@ -3698,7 +3780,7 @@ func file_communities_proto_init() { } } file_communities_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CommunityCancelRequestToJoin); i { + switch v := v.(*CommunityEditSharedAddresses); i { case 0: return &v.state case 1: @@ -3710,7 +3792,7 @@ func file_communities_proto_init() { } } file_communities_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CommunityUserKicked); i { + switch v := v.(*CommunityCancelRequestToJoin); i { case 0: return &v.state case 1: @@ -3722,7 +3804,7 @@ func file_communities_proto_init() { } } file_communities_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CommunityRequestToJoinResponse); i { + switch v := v.(*CommunityUserKicked); i { case 0: return &v.state case 1: @@ -3734,7 +3816,7 @@ func file_communities_proto_init() { } } file_communities_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CommunityRequestToLeave); i { + switch v := v.(*CommunityRequestToJoinResponse); i { case 0: return &v.state case 1: @@ -3746,7 +3828,7 @@ func file_communities_proto_init() { } } file_communities_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CommunityMessageArchiveMagnetlink); i { + switch v := v.(*CommunityRequestToLeave); i { case 0: return &v.state case 1: @@ -3758,7 +3840,7 @@ func file_communities_proto_init() { } } file_communities_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WakuMessage); i { + switch v := v.(*CommunityMessageArchiveMagnetlink); i { case 0: return &v.state case 1: @@ -3770,7 +3852,7 @@ func file_communities_proto_init() { } } file_communities_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WakuMessageArchiveMetadata); i { + switch v := v.(*WakuMessage); i { case 0: return &v.state case 1: @@ -3782,7 +3864,7 @@ func file_communities_proto_init() { } } file_communities_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WakuMessageArchive); i { + switch v := v.(*WakuMessageArchiveMetadata); i { case 0: return &v.state case 1: @@ -3794,7 +3876,7 @@ func file_communities_proto_init() { } } file_communities_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WakuMessageArchiveIndexMetadata); i { + switch v := v.(*WakuMessageArchive); i { case 0: return &v.state case 1: @@ -3806,7 +3888,7 @@ func file_communities_proto_init() { } } file_communities_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WakuMessageArchiveIndex); i { + switch v := v.(*WakuMessageArchiveIndexMetadata); i { case 0: return &v.state case 1: @@ -3818,7 +3900,7 @@ func file_communities_proto_init() { } } file_communities_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CommunityPublicStorenodesInfo); i { + switch v := v.(*WakuMessageArchiveIndex); i { case 0: return &v.state case 1: @@ -3830,7 +3912,7 @@ func file_communities_proto_init() { } } file_communities_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CommunityStorenodes); i { + switch v := v.(*CommunityPublicStorenodesInfo); i { case 0: return &v.state case 1: @@ -3842,7 +3924,7 @@ func file_communities_proto_init() { } } file_communities_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Storenode); i { + switch v := v.(*CommunityStorenodes); i { case 0: return &v.state case 1: @@ -3854,7 +3936,7 @@ func file_communities_proto_init() { } } file_communities_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CommunityReevaluatePermissionsRequest); i { + switch v := v.(*Storenode); i { case 0: return &v.state case 1: @@ -3866,7 +3948,7 @@ func file_communities_proto_init() { } } file_communities_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteCommunityMemberMessage); i { + switch v := v.(*CommunityReevaluatePermissionsRequest); i { case 0: return &v.state case 1: @@ -3878,7 +3960,7 @@ func file_communities_proto_init() { } } file_communities_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteCommunityMemberMessages); i { + switch v := v.(*DeleteCommunityMemberMessage); i { case 0: return &v.state case 1: @@ -3890,7 +3972,7 @@ func file_communities_proto_init() { } } file_communities_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CommunityUpdateGrant); i { + switch v := v.(*DeleteCommunityMemberMessages); i { case 0: return &v.state case 1: @@ -3902,7 +3984,7 @@ func file_communities_proto_init() { } } file_communities_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CommunityEncryptionKeysRequest); i { + switch v := v.(*CommunityUpdateGrant); i { case 0: return &v.state case 1: @@ -3914,7 +3996,7 @@ func file_communities_proto_init() { } } file_communities_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CommunitySharedAddressesRequest); i { + switch v := v.(*CommunityEncryptionKeysRequest); i { case 0: return &v.state case 1: @@ -3926,6 +4008,18 @@ func file_communities_proto_init() { } } file_communities_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CommunitySharedAddressesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_communities_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CommunitySharedAddressesResponse); i { case 0: return &v.state @@ -3944,7 +4038,7 @@ func file_communities_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_communities_proto_rawDesc, NumEnums: 5, - NumMessages: 46, + NumMessages: 47, NumExtensions: 0, NumServices: 0, }, diff --git a/protocol/protobuf/communities.proto b/protocol/protobuf/communities.proto index 82b1b810f..5694cefa4 100644 --- a/protocol/protobuf/communities.proto +++ b/protocol/protobuf/communities.proto @@ -144,6 +144,13 @@ message CommunityChat { int32 position = 5; bool viewers_can_post_reactions = 6; bool hide_if_permissions_not_met = 7; + CommunityBloomFilter members_list = 8; +} + +message CommunityBloomFilter { + bytes data = 1; + uint64 m = 2; + uint64 k = 3; } message CommunityCategory {