feat: auto re-apply rejected community events

closes: status-im/status-desktop#11552
This commit is contained in:
Patryk Osmaczko 2023-08-08 15:16:29 +02:00 committed by osmaczko
parent e762cf4b9e
commit 8b9ee803e2
13 changed files with 463 additions and 194 deletions

View File

@ -11,6 +11,8 @@ import (
"github.com/status-im/status-go/protocol/protobuf"
)
var ErrInvalidCommunityEventClock = errors.New("clock for admin event message is outdated")
func (o *Community) ToCreateChannelCommunityEvent(channelID string, channel *protobuf.CommunityChat) *CommunityEvent {
return &CommunityEvent{
CommunityEventClock: o.NewCommunityEventClock(),
@ -190,7 +192,7 @@ func (o *Community) UpdateCommunityByEvents(communityEventMessage *CommunityEven
}
if description.Clock != o.config.CommunityDescription.Clock {
return nil, errors.New("clock for admin event message is outdated")
return nil, ErrInvalidCommunityEventClock
}
// Create a deep copy of current community so we can update CommunityDescription by new admin events

View File

@ -2,12 +2,14 @@ package communities
import (
"bytes"
"crypto/ecdsa"
"encoding/json"
"errors"
"sort"
"github.com/golang/protobuf/proto"
"github.com/status-im/status-go/eth-node/crypto"
"github.com/status-im/status-go/protocol/protobuf"
)
@ -42,6 +44,7 @@ func (e *CommunityEvent) ToProtobuf() *protobuf.CommunityEvent {
TokenMetadata: e.TokenMetadata,
}
}
func communityEventFromProtobuf(msg *protobuf.SignedCommunityEvent) (*CommunityEvent, error) {
decodedEvent := protobuf.CommunityEvent{}
err := proto.Unmarshal(msg.Payload, &decodedEvent)
@ -66,6 +69,32 @@ func communityEventFromProtobuf(msg *protobuf.SignedCommunityEvent) (*CommunityE
}, nil
}
func (e *CommunityEvent) RecoverSigner() (*ecdsa.PublicKey, error) {
if e.Signature == nil || len(e.Signature) == 0 {
return nil, errors.New("missing signature")
}
signer, err := crypto.SigToPub(
crypto.Keccak256(e.Payload),
e.Signature,
)
if err != nil {
return nil, errors.New("failed to recover signer")
}
return signer, nil
}
func (e *CommunityEvent) Sign(pk *ecdsa.PrivateKey) error {
sig, err := crypto.Sign(crypto.Keccak256(e.Payload), pk)
if err != nil {
return err
}
e.Signature = sig
return nil
}
type CommunityEventsMessage struct {
CommunityID []byte `json:"communityId"`
EventsBaseCommunityDescription []byte `json:"eventsBaseCommunityDescription"`

View File

@ -302,6 +302,7 @@ type Subscription struct {
DownloadingHistoryArchivesFinishedSignal *signal.DownloadingHistoryArchivesFinishedSignal
ImportingHistoryArchiveMessagesSignal *signal.ImportingHistoryArchiveMessagesSignal
CommunityEventsMessage *CommunityEventsMessage
CommunityEventsMessageInvalidClock *CommunityEventsMessageInvalidClockSignal
AcceptedRequestsToJoin []types.HexBytes
RejectedRequestsToJoin []types.HexBytes
}
@ -311,6 +312,11 @@ type CommunityResponse struct {
Changes *CommunityChanges `json:"changes"`
}
type CommunityEventsMessageInvalidClockSignal struct {
Community *Community
CommunityEventsMessage *CommunityEventsMessage
}
func (m *Manager) Subscribe() chan *Subscription {
subscription := make(chan *Subscription, 100)
m.subscriptions = append(m.subscriptions, subscription)
@ -1318,8 +1324,7 @@ func (m *Manager) signEvents(community *Community) error {
for i := range community.config.EventsData.Events {
communityEvent := &community.config.EventsData.Events[i]
if communityEvent.Signature == nil || len(communityEvent.Signature) == 0 {
var err error
communityEvent.Signature, err = crypto.Sign(crypto.Keccak256(communityEvent.Payload), m.identity)
err := communityEvent.Sign(m.identity)
if err != nil {
return err
}
@ -1332,16 +1337,9 @@ func (m *Manager) validateAndFilterEvents(community *Community, events []Communi
validatedEvents := make([]CommunityEvent, 0, len(events))
validateEvent := func(event *CommunityEvent) error {
if event.Signature == nil || len(event.Signature) == 0 {
return errors.New("missing signature")
}
signer, err := crypto.SigToPub(
crypto.Keccak256(event.Payload),
event.Signature,
)
signer, err := event.RecoverSigner()
if err != nil {
return errors.New("failed to recover signer")
return err
}
err = community.ValidateEvent(event, signer)
@ -1390,6 +1388,13 @@ func (m *Manager) HandleCommunityEventsMessage(signer *ecdsa.PublicKey, message
changes, err := community.UpdateCommunityByEvents(eventsMessage)
if err != nil {
if err == ErrInvalidCommunityEventClock && community.IsControlNode() {
m.publish(&Subscription{
CommunityEventsMessageInvalidClock: &CommunityEventsMessageInvalidClockSignal{
Community: community,
CommunityEventsMessage: eventsMessage,
}})
}
return nil, err
}
@ -1425,6 +1430,54 @@ func (m *Manager) HandleCommunityEventsMessage(signer *ecdsa.PublicKey, message
}, nil
}
// Creates new CommunityEventsMessage by re-applying our rejected events on top of latest known CommunityDescription.
// Returns nil if none of our events were rejected.
func (m *Manager) HandleCommunityEventsMessageRejected(signer *ecdsa.PublicKey, message *protobuf.CommunityEventsMessageRejected) (*CommunityEventsMessage, error) {
if signer == nil {
return nil, errors.New("signer can't be nil")
}
id := crypto.CompressPubkey(signer)
community, err := m.persistence.GetByID(&m.identity.PublicKey, id)
if err != nil {
return nil, err
}
if community == nil {
return nil, ErrOrgNotFound
}
eventsMessage, err := CommunityEventsMessageFromProtobuf(message.Msg)
if err != nil {
return nil, err
}
eventsMessage.Events = m.validateAndFilterEvents(community, eventsMessage.Events)
myRejectedEvents := make([]CommunityEvent, 0)
for _, rejectedEvent := range eventsMessage.Events {
rejectedEventSigner, err := rejectedEvent.RecoverSigner()
if err != nil {
continue
}
if rejectedEventSigner.Equal(m.identity.Public()) {
myRejectedEvents = append(myRejectedEvents, rejectedEvent)
}
}
if len(myRejectedEvents) == 0 {
return nil, nil
}
// Re-apply rejected events on top of latest known `CommunityDescription`
community.config.EventsData = &EventsData{
EventsBaseCommunityDescription: community.config.CommunityDescriptionProtocolMessage,
Events: myRejectedEvents,
}
reapplyEventsMessage := community.ToCommunityEventsMessage()
return reapplyEventsMessage, nil
}
func (m *Manager) handleAdditionalAdminChanges(community *Community) error {
if !(community.IsControlNode() || community.HasPermissionToSendCommunityEvents()) {

View File

@ -13,8 +13,10 @@ import (
gethbridge "github.com/status-im/status-go/eth-node/bridge/geth"
"github.com/status-im/status-go/eth-node/types"
"github.com/status-im/status-go/protocol/common"
"github.com/status-im/status-go/protocol/communities"
"github.com/status-im/status-go/protocol/communities/token"
"github.com/status-im/status-go/protocol/protobuf"
"github.com/status-im/status-go/protocol/requests"
"github.com/status-im/status-go/protocol/tt"
"github.com/status-im/status-go/services/wallet/bigint"
"github.com/status-im/status-go/waku"
@ -280,3 +282,73 @@ func (s *AdminCommunityEventsSuite) TestMemberReceiveAdminEventsWhenOwnerOffline
community := setUpCommunityAndRoles(s, protobuf.CommunityMember_ROLE_ADMIN)
testMemberReceiveEventsWhenControlNodeOffline(s, community)
}
func (s *AdminCommunityEventsSuite) TestAdminResendRejectedEvents() {
community := setUpCommunityAndRoles(s, protobuf.CommunityMember_ROLE_ADMIN)
// admin modifies community description
adminEditRequest := &requests.EditCommunity{
CommunityID: community.ID(),
CreateCommunity: requests.CreateCommunity{
Name: "admin name",
Description: "admin description",
Color: "#FFFFFF",
Membership: protobuf.CommunityPermissions_ON_REQUEST,
},
}
_, err := s.admin.EditCommunity(adminEditRequest)
s.Require().NoError(err)
// in the meantime, control node updates community description as well
ownerEditRequest := &requests.EditCommunity{
CommunityID: community.ID(),
CreateCommunity: requests.CreateCommunity{
Name: "control node name",
Description: "control node description",
Color: "#FFFFFF",
Membership: protobuf.CommunityPermissions_ON_REQUEST,
},
}
_, err = s.owner.EditCommunity(ownerEditRequest)
s.Require().NoError(err)
waitOnAdminEventsRejection := waitOnCommunitiesEvent(s.owner, func(s *communities.Subscription) bool {
return s.CommunityEventsMessageInvalidClock != nil
})
// control node receives admin event and rejects it
_, err = WaitOnMessengerResponse(s.owner, func(response *MessengerResponse) bool {
select {
case err := <-waitOnAdminEventsRejection:
s.Require().NoError(err)
return true
default:
return false
}
}, "")
s.Require().NoError(err)
community, err = s.owner.communitiesManager.GetByID(community.ID())
s.Require().NoError(err)
s.Require().Equal(ownerEditRequest.Description, community.DescriptionText())
// admin receives rejected events and re-applies them
// there is no signal whatsoever, we just wait for admin to process all incoming messages
_, _ = WaitOnMessengerResponse(s.admin, func(response *MessengerResponse) bool {
return false
}, "")
// control node receives re-applied admin event and accepts it
response, err := WaitOnMessengerResponse(s.owner, func(response *MessengerResponse) bool {
return len(response.Communities()) > 0
}, "no communities in response")
s.Require().NoError(err)
s.Require().Equal(adminEditRequest.Description, response.Communities()[0].DescriptionText())
// admin receives updated community description
response, err = WaitOnMessengerResponse(s.admin, func(response *MessengerResponse) bool {
return len(response.Communities()) > 0
}, "no communities in response")
s.Require().NoError(err)
s.Require().Equal(adminEditRequest.Description, response.Communities()[0].DescriptionText())
}

View File

@ -432,3 +432,31 @@ func checkMemberJoinedToTheCommunity(response *MessengerResponse, member *ecdsa.
return nil
}
func waitOnCommunitiesEvent(user *Messenger, condition func(*communities.Subscription) bool) <-chan error {
errCh := make(chan error, 1)
go func() {
defer close(errCh)
for {
select {
case sub, more := <-user.communitiesManager.Subscribe():
if !more {
errCh <- errors.New("channel closed when waiting for communities event")
return
}
if condition(sub) {
return
}
case <-time.After(500 * time.Millisecond):
errCh <- errors.New("timed out when waiting for communities event")
return
}
}
}()
return errCh
}

View File

@ -198,34 +198,6 @@ func (s *MessengerCommunitiesTokenPermissionsSuite) makeAddressSatisfyTheCriteri
s.mockedBalances[chainID][walletAddress][contractAddress] = (*hexutil.Big)(balance)
}
func (s *MessengerCommunitiesTokenPermissionsSuite) waitOnCommunitiesEvent(user *Messenger, condition func(*communities.Subscription) bool) <-chan error {
errCh := make(chan error, 1)
go func() {
defer close(errCh)
for {
select {
case sub, more := <-user.communitiesManager.Subscribe():
if !more {
errCh <- errors.New("channel closed when waiting for communities event")
return
}
if condition(sub) {
return
}
case <-time.After(500 * time.Millisecond):
errCh <- errors.New("timed out when waiting for communities event")
return
}
}
}()
return errCh
}
func (s *MessengerCommunitiesTokenPermissionsSuite) waitOnKeyDistribution(condition func(*CommunityAndKeyActions) bool) <-chan error {
testCommunitiesKeyDistributor, ok := s.owner.communitiesKeyDistributor.(*TestCommunitiesKeyDistributor)
s.Require().True(ok)
@ -597,7 +569,7 @@ func (s *MessengerCommunitiesTokenPermissionsSuite) TestBecomeMemberPermissions(
},
}
waitOnBobToBeKicked := s.waitOnCommunitiesEvent(s.owner, func(sub *communities.Subscription) bool {
waitOnBobToBeKicked := waitOnCommunitiesEvent(s.owner, func(sub *communities.Subscription) bool {
return len(sub.Community.Members()) == 1
})
waitOnCommunityToBeRekeyedOnceBobIsKicked := s.waitOnKeyDistribution(func(sub *CommunityAndKeyActions) bool {
@ -885,7 +857,7 @@ func (s *MessengerCommunitiesTokenPermissionsSuite) TestViewChannelPermissions()
ChatIds: []string{chat.ID},
}
waitOnBobToBeKickedFromChannel := s.waitOnCommunitiesEvent(s.owner, func(sub *communities.Subscription) bool {
waitOnBobToBeKickedFromChannel := waitOnCommunitiesEvent(s.owner, func(sub *communities.Subscription) bool {
for channelID, channel := range sub.Community.Chats() {
if channelID == chat.CommunityChatID() && len(channel.Members) == 1 {
return true
@ -1015,7 +987,7 @@ func (s *MessengerCommunitiesTokenPermissionsSuite) testReevaluateMemberPrivileg
s.Require().Len(response.Communities(), 1)
s.Require().True(response.Communities()[0].HasTokenPermissions())
waitOnCommunityPermissionCreated := s.waitOnCommunitiesEvent(s.owner, func(sub *communities.Subscription) bool {
waitOnCommunityPermissionCreated := waitOnCommunitiesEvent(s.owner, func(sub *communities.Subscription) bool {
return sub.Community.HasTokenPermissions()
})
@ -1125,7 +1097,7 @@ func (s *MessengerCommunitiesTokenPermissionsSuite) testReevaluateMemberPrivileg
s.Require().Len(response.Communities(), 1)
s.Require().True(response.Communities()[0].HasTokenPermissions())
waitOnCommunityPermissionCreated := s.waitOnCommunitiesEvent(s.owner, func(sub *communities.Subscription) bool {
waitOnCommunityPermissionCreated := waitOnCommunitiesEvent(s.owner, func(sub *communities.Subscription) bool {
return len(sub.Community.TokenPermissions()) == 2
})

View File

@ -4392,7 +4392,18 @@ func (m *Messenger) handleRetrievedMessages(chatWithMessages map[transport.Filte
m.outputToCSV(msg.TransportMessage.Timestamp, msg.ID, senderID, filter.Topic, filter.ChatID, msg.Type, message)
err = m.handleCommunityEventsMessage(messageState, publicKey, message)
if err != nil {
logger.Warn("failed to handle CommunityEvent", zap.Error(err))
logger.Warn("failed to handle CommunityEventsMessage", zap.Error(err))
allMessagesProcessed = false
continue
}
case protobuf.CommunityEventsMessageRejected:
logger.Debug("Handling CommunityEventsMessageRejected")
message := msg.ParsedMessage.Interface().(protobuf.CommunityEventsMessageRejected)
m.outputToCSV(msg.TransportMessage.Timestamp, msg.ID, senderID, filter.Topic, filter.ChatID, msg.Type, message)
err = m.handleCommunityEventsMessageRejected(messageState, publicKey, message)
if err != nil {
logger.Warn("failed to handle CommunityEventsMessageRejected", zap.Error(err))
allMessagesProcessed = false
continue
}

View File

@ -84,15 +84,10 @@ func (m *Messenger) publishOrg(org *communities.Community) error {
return err
}
func (m *Messenger) publishCommunityEventsMessage(adminMessage *communities.CommunityEventsMessage) error {
adminPubkey := common.PubkeyToHex(&m.identity.PublicKey)
m.logger.Debug("publishing community admin event", zap.String("admin-id", adminPubkey), zap.Any("event", adminMessage))
_, err := crypto.DecompressPubkey(adminMessage.CommunityID)
if err != nil {
return err
}
func (m *Messenger) publishCommunityEvents(msg *communities.CommunityEventsMessage) error {
m.logger.Debug("publishing community events", zap.String("admin-id", common.PubkeyToHex(&m.identity.PublicKey)), zap.Any("event", msg))
payload, err := adminMessage.Marshal()
payload, err := msg.Marshal()
if err != nil {
return err
}
@ -102,10 +97,40 @@ func (m *Messenger) publishCommunityEventsMessage(adminMessage *communities.Comm
Sender: m.identity,
// we don't want to wrap in an encryption layer message
SkipProtocolLayer: true,
MessageType: protobuf.ApplicationMetadataMessage_COMMUNITY_ADMIN_MESSAGE,
MessageType: protobuf.ApplicationMetadataMessage_COMMUNITY_EVENTS_MESSAGE,
}
_, err = m.sender.SendPublic(context.Background(), types.EncodeHex(adminMessage.CommunityID), rawMessage)
// TODO: resend in case of failure?
_, err = m.sender.SendPublic(context.Background(), types.EncodeHex(msg.CommunityID), rawMessage)
return err
}
func (m *Messenger) publishCommunityEventsRejected(community *communities.Community, msg *communities.CommunityEventsMessage) error {
if !community.IsControlNode() {
return communities.ErrNotControlNode
}
m.logger.Debug("publishing community events rejected", zap.Any("event", msg))
communityEventsMessage := msg.ToProtobuf()
communityEventsMessageRejected := &protobuf.CommunityEventsMessageRejected{
Msg: &communityEventsMessage,
}
payload, err := proto.Marshal(communityEventsMessageRejected)
if err != nil {
return err
}
rawMessage := common.RawMessage{
Payload: payload,
Sender: community.PrivateKey(),
// we don't want to wrap in an encryption layer message
SkipProtocolLayer: true,
MessageType: protobuf.ApplicationMetadataMessage_COMMUNITY_EVENTS_MESSAGE_REJECTED,
}
// TODO: resend in case of failure?
_, err = m.sender.SendPublic(context.Background(), types.EncodeHex(msg.CommunityID), rawMessage)
return err
}
@ -249,9 +274,17 @@ func (m *Messenger) handleCommunitiesSubscription(c chan *communities.Subscripti
}
if sub.CommunityEventsMessage != nil {
err := m.publishCommunityEventsMessage(sub.CommunityEventsMessage)
err := m.publishCommunityEvents(sub.CommunityEventsMessage)
if err != nil {
m.logger.Warn("failed to publish community admin event", zap.Error(err))
m.logger.Warn("failed to publish community events", zap.Error(err))
}
}
if sub.CommunityEventsMessageInvalidClock != nil {
err := m.publishCommunityEventsRejected(sub.CommunityEventsMessageInvalidClock.Community,
sub.CommunityEventsMessageInvalidClock.CommunityEventsMessage)
if err != nil {
m.logger.Warn("failed to publish community events rejected", zap.Error(err))
}
}
@ -2485,7 +2518,6 @@ func (m *Messenger) handleCommunityResponse(state *ReceivedMessageState, communi
}
func (m *Messenger) handleCommunityEventsMessage(state *ReceivedMessageState, signer *ecdsa.PublicKey, message protobuf.CommunityEventsMessage) error {
communityResponse, err := m.communitiesManager.HandleCommunityEventsMessage(signer, &message)
if err != nil {
return err
@ -2494,6 +2526,24 @@ func (m *Messenger) handleCommunityEventsMessage(state *ReceivedMessageState, si
return m.handleCommunityResponse(state, communityResponse)
}
// Re-sends rejected events, if any.
func (m *Messenger) handleCommunityEventsMessageRejected(state *ReceivedMessageState, signer *ecdsa.PublicKey, message protobuf.CommunityEventsMessageRejected) error {
reapplyEventsMessage, err := m.communitiesManager.HandleCommunityEventsMessageRejected(signer, &message)
if err != nil {
return err
}
if reapplyEventsMessage == nil {
return nil
}
err = m.publishCommunityEvents(reapplyEventsMessage)
if err != nil {
return err
}
return nil
}
func (m *Messenger) handleSyncCommunity(messageState *ReceivedMessageState, syncCommunity protobuf.SyncCommunity) error {
logger := m.logger.Named("handleSyncCommunity")

View File

@ -89,10 +89,11 @@ const (
ApplicationMetadataMessage_SYNC_ENS_USERNAME_DETAIL ApplicationMetadataMessage_Type = 64
ApplicationMetadataMessage_SYNC_ACTIVITY_CENTER_NOTIFICATION ApplicationMetadataMessage_Type = 65
ApplicationMetadataMessage_SYNC_ACTIVITY_CENTER_NOTIFICATION_STATE ApplicationMetadataMessage_Type = 66
ApplicationMetadataMessage_COMMUNITY_ADMIN_MESSAGE ApplicationMetadataMessage_Type = 67
ApplicationMetadataMessage_COMMUNITY_EVENTS_MESSAGE ApplicationMetadataMessage_Type = 67
ApplicationMetadataMessage_COMMUNITY_EDIT_SHARED_ADDRESSES ApplicationMetadataMessage_Type = 68
ApplicationMetadataMessage_SYNC_ACCOUNT_CUSTOMIZATION_COLOR ApplicationMetadataMessage_Type = 69
ApplicationMetadataMessage_SYNC_ACCOUNTS_POSITIONS ApplicationMetadataMessage_Type = 70
ApplicationMetadataMessage_COMMUNITY_EVENTS_MESSAGE_REJECTED ApplicationMetadataMessage_Type = 71
)
var ApplicationMetadataMessage_Type_name = map[int32]string{
@ -162,10 +163,11 @@ var ApplicationMetadataMessage_Type_name = map[int32]string{
64: "SYNC_ENS_USERNAME_DETAIL",
65: "SYNC_ACTIVITY_CENTER_NOTIFICATION",
66: "SYNC_ACTIVITY_CENTER_NOTIFICATION_STATE",
67: "COMMUNITY_ADMIN_MESSAGE",
67: "COMMUNITY_EVENTS_MESSAGE",
68: "COMMUNITY_EDIT_SHARED_ADDRESSES",
69: "SYNC_ACCOUNT_CUSTOMIZATION_COLOR",
70: "SYNC_ACCOUNTS_POSITIONS",
71: "COMMUNITY_EVENTS_MESSAGE_REJECTED",
}
var ApplicationMetadataMessage_Type_value = map[string]int32{
@ -235,10 +237,11 @@ var ApplicationMetadataMessage_Type_value = map[string]int32{
"SYNC_ENS_USERNAME_DETAIL": 64,
"SYNC_ACTIVITY_CENTER_NOTIFICATION": 65,
"SYNC_ACTIVITY_CENTER_NOTIFICATION_STATE": 66,
"COMMUNITY_ADMIN_MESSAGE": 67,
"COMMUNITY_EVENTS_MESSAGE": 67,
"COMMUNITY_EDIT_SHARED_ADDRESSES": 68,
"SYNC_ACCOUNT_CUSTOMIZATION_COLOR": 69,
"SYNC_ACCOUNTS_POSITIONS": 70,
"COMMUNITY_EVENTS_MESSAGE_REJECTED": 71,
}
func (x ApplicationMetadataMessage_Type) String() string {
@ -317,69 +320,70 @@ func init() {
}
var fileDescriptor_ad09a6406fcf24c7 = []byte{
// 1014 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x56, 0x5d, 0x53, 0x5b, 0x37,
0x10, 0x2d, 0x84, 0x02, 0x11, 0x5f, 0x42, 0xe1, 0xc3, 0x80, 0x01, 0xe3, 0x24, 0x84, 0x24, 0xad,
0xd3, 0x26, 0x6d, 0xa7, 0x6d, 0x9a, 0xb6, 0xb2, 0xb4, 0xd8, 0x8a, 0xef, 0x95, 0x6e, 0x24, 0x5d,
0x77, 0x9c, 0x17, 0x8d, 0xd3, 0xb8, 0x19, 0x66, 0x92, 0xe0, 0x09, 0xce, 0x03, 0xbf, 0xa1, 0xbf,
0xb7, 0xef, 0x1d, 0xdd, 0x4f, 0x03, 0x26, 0x3c, 0x81, 0xf7, 0x1c, 0xad, 0xb4, 0x67, 0xcf, 0xae,
0x8d, 0xea, 0xfd, 0xe1, 0xf0, 0xfd, 0xc9, 0xdf, 0xfd, 0xd1, 0xc9, 0xe9, 0x47, 0xf7, 0x61, 0x30,
0xea, 0xbf, 0xed, 0x8f, 0xfa, 0xee, 0xc3, 0xe0, 0xec, 0xac, 0xff, 0x6e, 0xd0, 0x18, 0x7e, 0x3a,
0x1d, 0x9d, 0x92, 0xf9, 0xe4, 0xcf, 0x9b, 0xcf, 0xff, 0xd4, 0xff, 0x5d, 0x45, 0xdb, 0xb4, 0x3c,
0x10, 0x66, 0xfc, 0x30, 0xa5, 0x93, 0x2a, 0xba, 0x7d, 0x76, 0xf2, 0xee, 0x63, 0x7f, 0xf4, 0xf9,
0xd3, 0xa0, 0x32, 0x55, 0x9b, 0x3a, 0x5a, 0xd4, 0x65, 0x80, 0x54, 0xd0, 0xdc, 0xb0, 0x7f, 0xfe,
0xfe, 0xb4, 0xff, 0xb6, 0x32, 0x9d, 0x60, 0xf9, 0x47, 0xf2, 0x02, 0xcd, 0x8c, 0xce, 0x87, 0x83,
0xca, 0xad, 0xda, 0xd4, 0xd1, 0xf2, 0xd3, 0x87, 0x8d, 0xfc, 0xbe, 0xc6, 0xf5, 0x77, 0x35, 0xec,
0xf9, 0x70, 0xa0, 0x93, 0x63, 0xf5, 0xff, 0x56, 0xd0, 0x8c, 0xff, 0x48, 0x16, 0xd0, 0x5c, 0x2c,
0x3b, 0x52, 0xfd, 0x25, 0xf1, 0x57, 0x04, 0xa3, 0x45, 0xd6, 0xa6, 0xd6, 0x85, 0x60, 0x0c, 0x6d,
0x01, 0x9e, 0x22, 0x04, 0x2d, 0x33, 0x25, 0x2d, 0x65, 0xd6, 0xc5, 0x11, 0xa7, 0x16, 0xf0, 0x34,
0xd9, 0x45, 0x5b, 0x21, 0x84, 0x4d, 0xd0, 0xa6, 0x2d, 0xa2, 0x2c, 0x5c, 0x1c, 0xb9, 0x45, 0xd6,
0xd1, 0x6a, 0x44, 0x85, 0x76, 0x42, 0x1a, 0x4b, 0x83, 0x80, 0x5a, 0xa1, 0x24, 0x9e, 0xf1, 0x61,
0xd3, 0x93, 0xec, 0x62, 0xf8, 0x6b, 0x72, 0x17, 0xed, 0x6b, 0x78, 0x15, 0x83, 0xb1, 0x8e, 0x72,
0xae, 0xc1, 0x18, 0x77, 0xac, 0xb4, 0xb3, 0x9a, 0x4a, 0x43, 0x59, 0x42, 0x9a, 0x25, 0x8f, 0xd0,
0x21, 0x65, 0x0c, 0x22, 0xeb, 0x6e, 0xe2, 0xce, 0x91, 0xc7, 0xe8, 0x01, 0x07, 0x16, 0x08, 0x09,
0x37, 0x92, 0xe7, 0xc9, 0x26, 0xba, 0x93, 0x93, 0xc6, 0x81, 0xdb, 0x64, 0x0d, 0x61, 0x03, 0x92,
0x5f, 0x88, 0x22, 0xb2, 0x8f, 0x76, 0x2e, 0xe7, 0x1e, 0x27, 0x2c, 0x78, 0x69, 0xae, 0x14, 0xe9,
0x32, 0x01, 0xf1, 0xe2, 0x64, 0x98, 0x32, 0xa6, 0x62, 0x69, 0xf1, 0x12, 0x39, 0x40, 0xbb, 0x57,
0xe1, 0x28, 0x6e, 0x06, 0x82, 0x39, 0xdf, 0x17, 0xbc, 0x4c, 0xf6, 0xd0, 0x76, 0xde, 0x0f, 0xa6,
0x38, 0x38, 0xca, 0xbb, 0xa0, 0xad, 0x30, 0x10, 0x82, 0xb4, 0x78, 0x85, 0xd4, 0xd1, 0x5e, 0x14,
0x9b, 0xb6, 0x93, 0xca, 0x8a, 0x63, 0xc1, 0xd2, 0x14, 0x1a, 0x5a, 0xc2, 0x58, 0x9d, 0x4a, 0x8e,
0xbd, 0x42, 0x5f, 0xe6, 0x38, 0x0d, 0x26, 0x52, 0xd2, 0x00, 0x5e, 0x25, 0x3b, 0x68, 0xf3, 0x2a,
0xf9, 0x55, 0x0c, 0xba, 0x87, 0x09, 0xb9, 0x87, 0x6a, 0xd7, 0x80, 0x65, 0x8a, 0x3b, 0xbe, 0xea,
0x49, 0xf7, 0x25, 0xfa, 0xe1, 0x35, 0x5f, 0xd2, 0x24, 0x38, 0x3b, 0xbe, 0xee, 0x2d, 0x08, 0xa1,
0x7a, 0x29, 0x9c, 0x86, 0x4c, 0xe7, 0x0d, 0xb2, 0x85, 0xd6, 0x5b, 0x5a, 0xc5, 0x51, 0x22, 0x8b,
0x13, 0xb2, 0x2b, 0x6c, 0x5a, 0xdd, 0x26, 0x59, 0x45, 0x4b, 0x69, 0x90, 0x83, 0xb4, 0xc2, 0xf6,
0x70, 0xc5, 0xb3, 0x99, 0x0a, 0xc3, 0x58, 0x0a, 0xdb, 0x73, 0x1c, 0x0c, 0xd3, 0x22, 0x4a, 0xd8,
0x5b, 0xa4, 0x8a, 0xd6, 0x4a, 0x68, 0x2c, 0xcf, 0xf6, 0xf6, 0xf4, 0xfc, 0x94, 0x7f, 0x79, 0x89,
0x16, 0x1d, 0x57, 0xee, 0xa5, 0x12, 0x12, 0xef, 0x90, 0x15, 0xb4, 0x10, 0x09, 0x59, 0x58, 0xbf,
0xea, 0xe7, 0x07, 0xb8, 0x28, 0xe7, 0x67, 0xd7, 0xbf, 0xc6, 0x58, 0x6a, 0x63, 0x93, 0x8f, 0xcf,
0x9e, 0xaf, 0x87, 0x43, 0x00, 0x63, 0x33, 0xb3, 0xef, 0x8d, 0x35, 0xc9, 0x37, 0xd9, 0xd5, 0xb8,
0x46, 0xb6, 0xd1, 0x06, 0x95, 0x4a, 0xf6, 0x42, 0x15, 0x1b, 0x17, 0x82, 0xd5, 0x82, 0xb9, 0x26,
0xb5, 0xac, 0x8d, 0x0f, 0x8a, 0xc9, 0x4a, 0xca, 0xd6, 0x10, 0xaa, 0x2e, 0x70, 0x5c, 0xf7, 0x9d,
0x2b, 0xc3, 0xd9, 0x55, 0xc6, 0x8b, 0xc8, 0xf1, 0x5d, 0x82, 0xd0, 0x6c, 0x93, 0xb2, 0x4e, 0x1c,
0xe1, 0x7b, 0x85, 0x2b, 0xbd, 0xba, 0x5d, 0x5f, 0x29, 0x03, 0x69, 0x41, 0xa7, 0xd4, 0xfb, 0x85,
0x2b, 0x2f, 0xc3, 0xe9, 0x44, 0x02, 0xc7, 0x87, 0xde, 0x75, 0x13, 0x29, 0x5c, 0x98, 0x50, 0x18,
0x03, 0x1c, 0x3f, 0x48, 0x94, 0xf0, 0x9c, 0xa6, 0x52, 0x9d, 0x90, 0xea, 0x0e, 0x3e, 0x22, 0x1b,
0x88, 0xa4, 0x2f, 0x0c, 0x80, 0x6a, 0xd7, 0x16, 0xc6, 0x2a, 0xdd, 0xc3, 0x0f, 0xbd, 0x8c, 0x49,
0xdc, 0x80, 0xb5, 0x42, 0xb6, 0xf0, 0x23, 0x52, 0x43, 0xd5, 0xb2, 0x11, 0x54, 0xb3, 0xb6, 0xe8,
0x82, 0x0b, 0x69, 0x4b, 0x82, 0x0d, 0x84, 0xec, 0xe0, 0xc7, 0xa4, 0x82, 0xd6, 0x92, 0x33, 0x91,
0x56, 0xc7, 0x22, 0x00, 0x17, 0x09, 0x66, 0x63, 0x0d, 0xf8, 0x9b, 0x22, 0x5b, 0x3e, 0x67, 0xdf,
0x26, 0x62, 0xa6, 0xeb, 0x24, 0x9f, 0xa5, 0xdc, 0x8d, 0x0d, 0xaf, 0x9a, 0x06, 0xab, 0xd3, 0x01,
0xbb, 0x08, 0x3e, 0x21, 0x87, 0xa8, 0x7e, 0xad, 0x1f, 0x4a, 0xcb, 0x7e, 0x57, 0x4a, 0x5f, 0x90,
0xb3, 0x52, 0x0c, 0xfe, 0xde, 0xd7, 0x92, 0x1f, 0xcd, 0x6f, 0xe8, 0x82, 0x2e, 0xac, 0x8f, 0x9f,
0x7a, 0x37, 0x5c, 0x7a, 0xdf, 0x05, 0xc2, 0x33, 0x9f, 0x22, 0xdf, 0x43, 0x13, 0x19, 0x3f, 0x14,
0x9e, 0xb0, 0x3a, 0x36, 0x16, 0xb8, 0x8b, 0x0d, 0x68, 0xfc, 0x63, 0xd1, 0xea, 0x71, 0x76, 0x51,
0xdf, 0x4f, 0x45, 0xab, 0x2f, 0x55, 0xee, 0x38, 0x30, 0x61, 0x7c, 0xe2, 0x9f, 0xd3, 0x05, 0x34,
0x41, 0x82, 0x00, 0x68, 0x17, 0xf0, 0x2f, 0x1e, 0x4f, 0x52, 0x64, 0x16, 0xf7, 0x2b, 0x37, 0x2c,
0x9d, 0xfe, 0x6b, 0xd1, 0x73, 0x43, 0xbb, 0xc0, 0xf3, 0xcd, 0x8c, 0x9f, 0xfb, 0x55, 0x52, 0xe6,
0x65, 0x54, 0x32, 0x08, 0xae, 0x4c, 0xdc, 0x6f, 0x5e, 0x99, 0x0c, 0x9b, 0x58, 0xf7, 0x8b, 0xa2,
0xd9, 0x1d, 0xe8, 0xf9, 0x2f, 0x21, 0xfc, 0x7b, 0xa1, 0x84, 0x51, 0x4c, 0xd0, 0xc0, 0x79, 0xbb,
0x18, 0xfc, 0x07, 0xa9, 0xa2, 0x4a, 0x12, 0x06, 0x69, 0x12, 0x71, 0x24, 0x0d, 0xc1, 0x71, 0xb0,
0x54, 0x04, 0xf8, 0x4f, 0x72, 0x1f, 0x1d, 0x4c, 0x34, 0xf4, 0xf8, 0x8e, 0xc2, 0xd4, 0x6f, 0xd2,
0x1b, 0x69, 0xce, 0xcf, 0x3f, 0xe0, 0xa6, 0x37, 0xc5, 0x98, 0x87, 0x79, 0x38, 0xb6, 0x39, 0x98,
0xff, 0x1a, 0x2c, 0xc1, 0x64, 0x87, 0x98, 0x36, 0xd5, 0xa5, 0x42, 0x60, 0x30, 0xf7, 0x1a, 0x8d,
0x3b, 0xd9, 0xb1, 0xd8, 0x58, 0x15, 0x8a, 0xd7, 0xf9, 0xba, 0x08, 0x94, 0xc6, 0x50, 0x98, 0x2f,
0x63, 0x19, 0x17, 0x29, 0x23, 0x3c, 0xc3, 0xe0, 0xe3, 0xe6, 0xd2, 0xeb, 0x85, 0xc6, 0x93, 0xe7,
0xf9, 0x8f, 0x85, 0x37, 0xb3, 0xc9, 0x7f, 0xcf, 0xfe, 0x0f, 0x00, 0x00, 0xff, 0xff, 0x99, 0x64,
0xf4, 0xe4, 0xd3, 0x08, 0x00, 0x00,
// 1028 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x56, 0x6b, 0x73, 0x53, 0x37,
0x10, 0x6d, 0x42, 0x9a, 0x04, 0xe5, 0xc1, 0x46, 0xe4, 0xe1, 0xbc, 0x13, 0x03, 0x21, 0x40, 0x6b,
0x5a, 0x68, 0x3b, 0x6d, 0x29, 0x6d, 0x65, 0xdd, 0x8d, 0xad, 0xf8, 0x5e, 0xe9, 0x22, 0xe9, 0xba,
0x63, 0xbe, 0x68, 0x4c, 0x71, 0x99, 0xcc, 0x00, 0xf1, 0x10, 0xf3, 0x21, 0x3f, 0xa6, 0xbf, 0xa2,
0x7f, 0xb0, 0xa3, 0xeb, 0xfb, 0x70, 0x12, 0x87, 0x7c, 0x4a, 0xbc, 0x7b, 0xb4, 0xd2, 0x39, 0x7b,
0x76, 0x6d, 0x52, 0xed, 0xf6, 0xfb, 0xef, 0x4f, 0xfe, 0xee, 0x0e, 0x4e, 0x4e, 0x3f, 0xba, 0x0f,
0xbd, 0x41, 0xf7, 0x6d, 0x77, 0xd0, 0x75, 0x1f, 0x7a, 0x67, 0x67, 0xdd, 0x77, 0xbd, 0x5a, 0xff,
0xd3, 0xe9, 0xe0, 0x94, 0xce, 0xa6, 0x7f, 0xde, 0x7c, 0xfe, 0xa7, 0xfa, 0xdf, 0x12, 0xd9, 0x60,
0xe5, 0x81, 0x28, 0xc3, 0x47, 0x43, 0x38, 0xdd, 0x22, 0xb7, 0xcf, 0x4e, 0xde, 0x7d, 0xec, 0x0e,
0x3e, 0x7f, 0xea, 0x55, 0x26, 0xf6, 0x26, 0x0e, 0xe7, 0x75, 0x19, 0xa0, 0x15, 0x32, 0xd3, 0xef,
0x9e, 0xbf, 0x3f, 0xed, 0xbe, 0xad, 0x4c, 0xa6, 0xb9, 0xfc, 0x23, 0x7d, 0x49, 0xa6, 0x06, 0xe7,
0xfd, 0x5e, 0xe5, 0xd6, 0xde, 0xc4, 0xe1, 0xe2, 0xb3, 0x47, 0xb5, 0xfc, 0xbe, 0xda, 0xf5, 0x77,
0xd5, 0xec, 0x79, 0xbf, 0xa7, 0xd3, 0x63, 0xd5, 0x7f, 0x81, 0x4c, 0xf9, 0x8f, 0x74, 0x8e, 0xcc,
0x24, 0xb2, 0x25, 0xd5, 0x5f, 0x12, 0xbe, 0xa2, 0x40, 0xe6, 0x79, 0x93, 0x59, 0x17, 0xa1, 0x31,
0xac, 0x81, 0x30, 0x41, 0x29, 0x59, 0xe4, 0x4a, 0x5a, 0xc6, 0xad, 0x4b, 0xe2, 0x80, 0x59, 0x84,
0x49, 0xba, 0x4d, 0xd6, 0x23, 0x8c, 0xea, 0xa8, 0x4d, 0x53, 0xc4, 0x59, 0xb8, 0x38, 0x72, 0x8b,
0xae, 0x90, 0xa5, 0x98, 0x09, 0xed, 0x84, 0x34, 0x96, 0x85, 0x21, 0xb3, 0x42, 0x49, 0x98, 0xf2,
0x61, 0xd3, 0x91, 0xfc, 0x62, 0xf8, 0x6b, 0x7a, 0x8f, 0xec, 0x6a, 0x7c, 0x95, 0xa0, 0xb1, 0x8e,
0x05, 0x81, 0x46, 0x63, 0xdc, 0x91, 0xd2, 0xce, 0x6a, 0x26, 0x0d, 0xe3, 0x29, 0x68, 0x9a, 0x3e,
0x26, 0x07, 0x8c, 0x73, 0x8c, 0xad, 0xbb, 0x09, 0x3b, 0x43, 0x9f, 0x90, 0x87, 0x01, 0xf2, 0x50,
0x48, 0xbc, 0x11, 0x3c, 0x4b, 0xd7, 0xc8, 0xdd, 0x1c, 0x34, 0x9a, 0xb8, 0x4d, 0x97, 0x09, 0x18,
0x94, 0xc1, 0x85, 0x28, 0xa1, 0xbb, 0x64, 0xf3, 0x72, 0xed, 0x51, 0xc0, 0x9c, 0x97, 0xe6, 0x0a,
0x49, 0x97, 0x09, 0x08, 0xf3, 0xe3, 0xd3, 0x8c, 0x73, 0x95, 0x48, 0x0b, 0x0b, 0x74, 0x9f, 0x6c,
0x5f, 0x4d, 0xc7, 0x49, 0x3d, 0x14, 0xdc, 0xf9, 0xbe, 0xc0, 0x22, 0xdd, 0x21, 0x1b, 0x79, 0x3f,
0xb8, 0x0a, 0xd0, 0xb1, 0xa0, 0x8d, 0xda, 0x0a, 0x83, 0x11, 0x4a, 0x0b, 0x77, 0x68, 0x95, 0xec,
0xc4, 0x89, 0x69, 0x3a, 0xa9, 0xac, 0x38, 0x12, 0x7c, 0x58, 0x42, 0x63, 0x43, 0x18, 0xab, 0x87,
0x92, 0x83, 0x57, 0xe8, 0xcb, 0x18, 0xa7, 0xd1, 0xc4, 0x4a, 0x1a, 0x84, 0x25, 0xba, 0x49, 0xd6,
0xae, 0x82, 0x5f, 0x25, 0xa8, 0x3b, 0x40, 0xe9, 0x7d, 0xb2, 0x77, 0x4d, 0xb2, 0x2c, 0x71, 0xd7,
0xb3, 0x1e, 0x77, 0x5f, 0xaa, 0x1f, 0x2c, 0x7b, 0x4a, 0xe3, 0xd2, 0xd9, 0xf1, 0x15, 0x6f, 0x41,
0x8c, 0xd4, 0xb1, 0x70, 0x1a, 0x33, 0x9d, 0x57, 0xe9, 0x3a, 0x59, 0x69, 0x68, 0x95, 0xc4, 0xa9,
0x2c, 0x4e, 0xc8, 0xb6, 0xb0, 0x43, 0x76, 0x6b, 0x74, 0x89, 0x2c, 0x0c, 0x83, 0x01, 0x4a, 0x2b,
0x6c, 0x07, 0x2a, 0x1e, 0xcd, 0x55, 0x14, 0x25, 0x52, 0xd8, 0x8e, 0x0b, 0xd0, 0x70, 0x2d, 0xe2,
0x14, 0xbd, 0x4e, 0xb7, 0xc8, 0x72, 0x99, 0x1a, 0xa9, 0xb3, 0xb1, 0x31, 0x39, 0x3b, 0xe1, 0x5f,
0x5e, 0x66, 0x8b, 0x8e, 0x2b, 0x77, 0xac, 0x84, 0x84, 0x4d, 0x7a, 0x87, 0xcc, 0xc5, 0x42, 0x16,
0xd6, 0xdf, 0xf2, 0xf3, 0x83, 0x81, 0x28, 0xe7, 0x67, 0xdb, 0xbf, 0xc6, 0x58, 0x66, 0x13, 0x93,
0x8f, 0xcf, 0x8e, 0xe7, 0x13, 0x60, 0x88, 0x23, 0x33, 0xb3, 0xeb, 0x8d, 0x35, 0xce, 0x37, 0xd9,
0xd5, 0xb0, 0x47, 0x37, 0xc8, 0x2a, 0x93, 0x4a, 0x76, 0x22, 0x95, 0x18, 0x17, 0xa1, 0xd5, 0x82,
0xbb, 0x3a, 0xb3, 0xbc, 0x09, 0xfb, 0xc5, 0x64, 0xa5, 0xb4, 0x35, 0x46, 0xaa, 0x8d, 0x01, 0x54,
0x7d, 0xe7, 0xca, 0x70, 0x76, 0x95, 0xf1, 0x22, 0x06, 0x70, 0x8f, 0x12, 0x32, 0x5d, 0x67, 0xbc,
0x95, 0xc4, 0x70, 0xbf, 0x70, 0xa5, 0x57, 0xb7, 0xed, 0x99, 0x72, 0x94, 0x16, 0xf5, 0x10, 0xfa,
0xa0, 0x70, 0xe5, 0xe5, 0xf4, 0x70, 0x22, 0x31, 0x80, 0x03, 0xef, 0xba, 0xb1, 0x90, 0x40, 0x98,
0x48, 0x18, 0x83, 0x01, 0x3c, 0x4c, 0x95, 0xf0, 0x98, 0xba, 0x52, 0xad, 0x88, 0xe9, 0x16, 0x1c,
0xd2, 0x55, 0x42, 0x87, 0x2f, 0x0c, 0x91, 0x69, 0xd7, 0x14, 0xc6, 0x2a, 0xdd, 0x81, 0x47, 0x5e,
0xc6, 0x34, 0x6e, 0xd0, 0x5a, 0x21, 0x1b, 0xf0, 0x98, 0xee, 0x91, 0xad, 0xb2, 0x11, 0x4c, 0xf3,
0xa6, 0x68, 0xa3, 0x8b, 0x58, 0x43, 0xa2, 0x0d, 0x85, 0x6c, 0xc1, 0x13, 0x5a, 0x21, 0xcb, 0xe9,
0x99, 0x58, 0xab, 0x23, 0x11, 0xa2, 0x8b, 0x05, 0xb7, 0x89, 0x46, 0xf8, 0xa6, 0xa8, 0x96, 0xcf,
0xd9, 0xb7, 0xa9, 0x98, 0xc3, 0x75, 0x92, 0xcf, 0x52, 0xee, 0xc6, 0x9a, 0x57, 0x4d, 0xa3, 0xd5,
0xc3, 0x01, 0xbb, 0x98, 0x7c, 0x4a, 0x0f, 0x48, 0xf5, 0x5a, 0x3f, 0x94, 0x96, 0xfd, 0xae, 0x94,
0xbe, 0x00, 0x67, 0x54, 0x0c, 0x7c, 0xef, 0xb9, 0xe4, 0x47, 0xf3, 0x1b, 0xda, 0xa8, 0x0b, 0xeb,
0xc3, 0x33, 0xef, 0x86, 0x4b, 0xef, 0xbb, 0x00, 0x78, 0xee, 0x4b, 0xe4, 0x7b, 0x68, 0x2c, 0xe2,
0x87, 0xc2, 0x13, 0x56, 0x27, 0xc6, 0x62, 0xe0, 0x12, 0x83, 0x1a, 0x7e, 0x2c, 0x5a, 0x3d, 0x8a,
0x2e, 0xf8, 0xfd, 0x54, 0xb4, 0xfa, 0x12, 0x73, 0x17, 0x20, 0x17, 0xc6, 0x17, 0xfe, 0x79, 0xb8,
0x80, 0xc6, 0x48, 0x10, 0x22, 0x6b, 0x23, 0xfc, 0xe2, 0xf3, 0x69, 0x89, 0xcc, 0xe2, 0x7e, 0xe5,
0x46, 0xa5, 0xd3, 0x7f, 0x2d, 0x7a, 0x6e, 0x58, 0x1b, 0x83, 0x7c, 0x33, 0xc3, 0x0b, 0xbf, 0x4a,
0xca, 0xba, 0x9c, 0x49, 0x8e, 0xe1, 0x95, 0x89, 0xfb, 0xcd, 0x2b, 0x93, 0xe5, 0xc6, 0xf2, 0x7e,
0x59, 0x34, 0xbb, 0x85, 0x1d, 0xff, 0x25, 0x04, 0xbf, 0x17, 0x4a, 0x18, 0xc5, 0x05, 0x0b, 0x9d,
0xb7, 0x8b, 0x81, 0x3f, 0xe8, 0x16, 0xa9, 0xa4, 0x61, 0x94, 0x26, 0x15, 0x47, 0xb2, 0x08, 0x5d,
0x80, 0x96, 0x89, 0x10, 0xfe, 0xa4, 0x0f, 0xc8, 0xfe, 0x58, 0x43, 0x8f, 0xee, 0x28, 0x60, 0x7e,
0x93, 0xde, 0x08, 0x73, 0x7e, 0xfe, 0x11, 0xea, 0xfe, 0xc6, 0x92, 0x21, 0xb6, 0x51, 0x5a, 0x53,
0xe8, 0xc2, 0xfd, 0xf7, 0xe0, 0x48, 0xd6, 0x2f, 0x11, 0xd3, 0x64, 0xba, 0x94, 0x08, 0x0d, 0x04,
0x5e, 0xa4, 0x51, 0x2b, 0x3b, 0x9e, 0x18, 0xab, 0x22, 0xf1, 0x3a, 0xdf, 0x17, 0xa1, 0xd2, 0x80,
0x85, 0xfb, 0x32, 0x94, 0x71, 0xb1, 0x32, 0xc2, 0x23, 0x0c, 0x1c, 0x79, 0x66, 0xd7, 0xbd, 0xc2,
0x69, 0x3c, 0x46, 0xee, 0x27, 0xba, 0x51, 0x5f, 0x78, 0x3d, 0x57, 0x7b, 0xfa, 0x22, 0xff, 0x51,
0xf1, 0x66, 0x3a, 0xfd, 0xef, 0xf9, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0xdd, 0xe6, 0x40, 0xbc,
0xfb, 0x08, 0x00, 0x00,
}

View File

@ -79,9 +79,10 @@ message ApplicationMetadataMessage {
SYNC_ENS_USERNAME_DETAIL = 64;
SYNC_ACTIVITY_CENTER_NOTIFICATION = 65;
SYNC_ACTIVITY_CENTER_NOTIFICATION_STATE = 66;
COMMUNITY_ADMIN_MESSAGE = 67;
COMMUNITY_EVENTS_MESSAGE = 67;
COMMUNITY_EDIT_SHARED_ADDRESSES = 68;
SYNC_ACCOUNT_CUSTOMIZATION_COLOR = 69;
SYNC_ACCOUNTS_POSITIONS = 70;
COMMUNITY_EVENTS_MESSAGE_REJECTED = 71;
}
}

View File

@ -536,6 +536,45 @@ func (m *CommunityEventsMessage) GetSignedEvents() []*SignedCommunityEvent {
return nil
}
type CommunityEventsMessageRejected struct {
Msg *CommunityEventsMessage `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *CommunityEventsMessageRejected) Reset() { *m = CommunityEventsMessageRejected{} }
func (m *CommunityEventsMessageRejected) String() string { return proto.CompactTextString(m) }
func (*CommunityEventsMessageRejected) ProtoMessage() {}
func (*CommunityEventsMessageRejected) Descriptor() ([]byte, []int) {
return fileDescriptor_52ed23dfc73918ab, []int{6}
}
func (m *CommunityEventsMessageRejected) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CommunityEventsMessageRejected.Unmarshal(m, b)
}
func (m *CommunityEventsMessageRejected) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_CommunityEventsMessageRejected.Marshal(b, m, deterministic)
}
func (m *CommunityEventsMessageRejected) XXX_Merge(src proto.Message) {
xxx_messageInfo_CommunityEventsMessageRejected.Merge(m, src)
}
func (m *CommunityEventsMessageRejected) XXX_Size() int {
return xxx_messageInfo_CommunityEventsMessageRejected.Size(m)
}
func (m *CommunityEventsMessageRejected) XXX_DiscardUnknown() {
xxx_messageInfo_CommunityEventsMessageRejected.DiscardUnknown(m)
}
var xxx_messageInfo_CommunityEventsMessageRejected proto.InternalMessageInfo
func (m *CommunityEventsMessageRejected) GetMsg() *CommunityEventsMessage {
if m != nil {
return m.Msg
}
return nil
}
func init() {
proto.RegisterEnum("protobuf.CommunityEvent_EventType", CommunityEvent_EventType_name, CommunityEvent_EventType_value)
proto.RegisterType((*CommunityEvent)(nil), "protobuf.CommunityEvent")
@ -547,6 +586,7 @@ func init() {
proto.RegisterType((*ChannelData)(nil), "protobuf.ChannelData")
proto.RegisterType((*SignedCommunityEvent)(nil), "protobuf.SignedCommunityEvent")
proto.RegisterType((*CommunityEventsMessage)(nil), "protobuf.CommunityEventsMessage")
proto.RegisterType((*CommunityEventsMessageRejected)(nil), "protobuf.CommunityEventsMessageRejected")
}
func init() {
@ -554,73 +594,74 @@ func init() {
}
var fileDescriptor_52ed23dfc73918ab = []byte{
// 1073 bytes of a gzipped FileDescriptorProto
// 1095 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0xcb, 0x6e, 0xdb, 0x46,
0x14, 0xad, 0x2c, 0xf9, 0xa1, 0xab, 0x87, 0xe9, 0x71, 0x6c, 0xd3, 0x4a, 0xe2, 0x2a, 0x6a, 0x17,
0x42, 0x51, 0x38, 0xa8, 0x5b, 0x04, 0x41, 0xb3, 0x29, 0x4d, 0x0d, 0x1c, 0xda, 0x11, 0xe5, 0x8e,
0x42, 0x51, 0x38, 0xa8, 0x5a, 0x04, 0x41, 0xb3, 0xa9, 0x4c, 0x0d, 0x1c, 0xda, 0x11, 0xe5, 0x8e,
0x69, 0x14, 0xc9, 0x86, 0x18, 0x93, 0x13, 0x99, 0xb5, 0x45, 0xaa, 0x9a, 0x51, 0x00, 0x6d, 0xfb,
0x05, 0xfd, 0x80, 0x7e, 0x43, 0xd1, 0xbf, 0xea, 0x6f, 0x14, 0x9c, 0x21, 0x45, 0xd2, 0xa6, 0x9d,
0x2e, 0xba, 0x91, 0x38, 0xf7, 0x9c, 0x7b, 0xce, 0xdc, 0x79, 0xf0, 0x12, 0x76, 0xbd, 0x68, 0x32,
0x99, 0x87, 0x81, 0x58, 0xb8, 0xf3, 0xa9, 0x4f, 0x05, 0x3b, 0x9c, 0xce, 0x22, 0x11, 0xa1, 0x0d,
0xf9, 0x77, 0x35, 0xff, 0xd8, 0xd9, 0xf6, 0xae, 0xa9, 0x70, 0x03, 0x9f, 0x85, 0x22, 0x10, 0x0b,
0x05, 0x77, 0xb6, 0xd2, 0xb4, 0x80, 0x71, 0x15, 0xea, 0xfd, 0xd1, 0x82, 0xb6, 0x99, 0x8a, 0xe1,
0x4f, 0x2c, 0x14, 0xe8, 0x08, 0x76, 0x32, 0x79, 0x16, 0x87, 0x5c, 0xef, 0x36, 0xf2, 0x6e, 0xf4,
0x4a, 0xb7, 0xd2, 0xaf, 0x91, 0x6d, 0xaf, 0x40, 0x37, 0x63, 0x08, 0xbd, 0x82, 0x9a, 0x58, 0x4c,
0x99, 0xbe, 0xd2, 0xad, 0xf4, 0xdb, 0x47, 0xbd, 0xc3, 0x74, 0x1e, 0x87, 0x45, 0xed, 0x43, 0xf9,
0xeb, 0x2c, 0xa6, 0x8c, 0x48, 0x3e, 0x1a, 0x80, 0x96, 0x79, 0x79, 0x51, 0xf8, 0x31, 0x18, 0xeb,
0xd5, 0x6e, 0xa5, 0xdf, 0x38, 0xda, 0x2f, 0xd1, 0x30, 0x25, 0x81, 0x6c, 0x7a, 0xc5, 0x00, 0x1a,
0x82, 0x26, 0xa2, 0x1b, 0x16, 0xba, 0x53, 0x36, 0x9b, 0x04, 0x9c, 0x07, 0x51, 0xa8, 0xd7, 0xa4,
0x4a, 0xd9, 0x4c, 0x9c, 0x98, 0x7a, 0xbe, 0x64, 0x92, 0x4d, 0x51, 0x0c, 0xa0, 0x37, 0xd0, 0xf2,
0xa8, 0x60, 0xe3, 0x68, 0xb6, 0x70, 0x7d, 0x2a, 0xa8, 0xbe, 0x2a, 0xb5, 0x76, 0x73, 0x5a, 0x09,
0x3c, 0xa0, 0x82, 0x92, 0xa6, 0x97, 0x1b, 0xa1, 0xd7, 0xd0, 0xf4, 0xae, 0x69, 0x18, 0xb2, 0x5b,
0x95, 0xbb, 0x26, 0x73, 0x77, 0x72, 0xb9, 0x0a, 0x95, 0xa9, 0x0d, 0x2f, 0x1b, 0xa0, 0x3e, 0x68,
0x13, 0x36, 0xb9, 0x62, 0x33, 0x57, 0x44, 0x2e, 0xf5, 0x44, 0x5c, 0xc5, 0x7a, 0xb7, 0xd2, 0xaf,
0x93, 0xb6, 0x8a, 0x3b, 0x91, 0x21, 0xa3, 0xc8, 0x86, 0xa6, 0x8a, 0x70, 0xc3, 0xf7, 0x99, 0xaf,
0x6f, 0x74, 0xab, 0xfd, 0xc6, 0xd1, 0x37, 0x0f, 0xae, 0xfa, 0x30, 0x47, 0xc6, 0xa1, 0x98, 0x2d,
0x48, 0x21, 0x1f, 0xdd, 0xc2, 0xee, 0x8c, 0xfd, 0xca, 0x3c, 0xc1, 0x7c, 0xc2, 0x7e, 0x9b, 0x33,
0x2e, 0xb8, 0x13, 0x9d, 0x46, 0x41, 0xa8, 0xd7, 0xa5, 0xf2, 0x0f, 0x0f, 0x2a, 0x93, 0xd2, 0x34,
0xe5, 0xf1, 0x80, 0x66, 0xec, 0x46, 0x3d, 0x8f, 0x4d, 0xef, 0xbb, 0xc1, 0x67, 0xdc, 0x8c, 0xd2,
0xb4, 0xc4, 0xad, 0x5c, 0x13, 0x9d, 0x40, 0x5b, 0x9d, 0x8d, 0x09, 0x13, 0x54, 0xee, 0x48, 0x43,
0xee, 0x48, 0xf7, 0xa1, 0x93, 0x31, 0x4c, 0x78, 0xa4, 0x25, 0xf2, 0xc3, 0xce, 0x07, 0xd8, 0xba,
0xb7, 0x8e, 0x48, 0x83, 0xea, 0x0d, 0x5b, 0xc8, 0x9b, 0x51, 0x27, 0xf1, 0x23, 0x7a, 0x09, 0xab,
0x9f, 0xe8, 0xed, 0x5c, 0x5d, 0x85, 0xf2, 0x63, 0xac, 0x64, 0x88, 0xe2, 0xfd, 0xb8, 0xf2, 0xba,
0xd2, 0xb9, 0x81, 0xa7, 0x8f, 0xac, 0x64, 0x89, 0xcb, 0xab, 0xa2, 0x4b, 0x59, 0x31, 0x89, 0x90,
0xd2, 0xb9, 0x63, 0xf6, 0xc8, 0x42, 0xfe, 0xbf, 0x66, 0xbd, 0xbf, 0x6b, 0x50, 0x5f, 0x5e, 0x7a,
0xd4, 0x80, 0xf5, 0x4b, 0xfb, 0xcc, 0x1e, 0xfd, 0x62, 0x6b, 0x5f, 0x20, 0x04, 0x6d, 0x73, 0x34,
0x1c, 0x5e, 0xda, 0x96, 0xf3, 0xde, 0xc5, 0x03, 0xcb, 0xd1, 0x2a, 0xe8, 0x5b, 0xe8, 0x67, 0xb1,
0x21, 0x1e, 0x1e, 0x63, 0xe2, 0x3a, 0xa3, 0x33, 0x6c, 0xbb, 0xe7, 0x98, 0x0c, 0xad, 0x8b, 0x0b,
0x6b, 0x64, 0xbb, 0xe6, 0x5b, 0xc3, 0x3e, 0xc1, 0xda, 0xca, 0x7f, 0x63, 0x0f, 0xf0, 0x3b, 0xec,
0x60, 0xad, 0x8a, 0x9e, 0xc3, 0x7e, 0xc6, 0x36, 0x0d, 0x07, 0x9f, 0x8c, 0xc8, 0x7b, 0xd7, 0x24,
0xd8, 0x70, 0xb0, 0x56, 0x7b, 0x00, 0x4e, 0xb2, 0x57, 0xd1, 0x53, 0xd8, 0x2b, 0x81, 0xe5, 0xb4,
0xd7, 0xd0, 0x33, 0xd0, 0x73, 0xe0, 0x5b, 0xc3, 0xb6, 0xf1, 0xbb, 0x54, 0x79, 0xbd, 0x1c, 0x4d,
0x84, 0x37, 0x50, 0x07, 0x76, 0xef, 0xa3, 0x52, 0xb7, 0x8e, 0x0e, 0xa0, 0x53, 0x62, 0x4a, 0xf0,
0x88, 0x0c, 0x30, 0xd1, 0xe0, 0xce, 0x9c, 0x93, 0xdc, 0x14, 0x6e, 0xa0, 0xaf, 0xa1, 0x9b, 0xc1,
0x04, 0xff, 0x7c, 0x89, 0x2f, 0x1c, 0xd7, 0x19, 0xb9, 0xa7, 0x23, 0xcb, 0x76, 0x0d, 0xd3, 0xc4,
0xe7, 0x8e, 0xd6, 0x7c, 0x9c, 0x45, 0xf0, 0x29, 0x36, 0x1d, 0xad, 0x85, 0xf6, 0x61, 0xe7, 0xde,
0x5a, 0x9f, 0x59, 0xe6, 0x99, 0xd6, 0x46, 0x3a, 0x3c, 0xb9, 0x07, 0x1d, 0x1b, 0xb6, 0xb6, 0x59,
0xac, 0x2d, 0x41, 0x2e, 0xed, 0x18, 0xd3, 0xd0, 0x1e, 0x6c, 0x67, 0x98, 0xda, 0x35, 0x63, 0x30,
0xd0, 0xb6, 0x7a, 0x7f, 0xad, 0xc0, 0xe6, 0x9d, 0x57, 0x3e, 0x3a, 0x82, 0x8d, 0xb4, 0x97, 0xc9,
0x93, 0x59, 0x7c, 0x1b, 0x5f, 0x53, 0x61, 0x25, 0x28, 0x59, 0xf2, 0xd0, 0x4f, 0xd0, 0xc8, 0xfa,
0x01, 0x4f, 0x0e, 0xef, 0x41, 0xc9, 0xe1, 0xcd, 0x5e, 0xfd, 0x9c, 0xe4, 0x53, 0xe2, 0x77, 0x07,
0xf5, 0x27, 0x41, 0xe8, 0x72, 0x26, 0x44, 0x10, 0x8e, 0x79, 0xd2, 0x9b, 0xca, 0x6e, 0x80, 0x11,
0x13, 0x2f, 0x12, 0x1e, 0x69, 0xd1, 0xfc, 0x10, 0x7d, 0x05, 0xad, 0x20, 0x14, 0xb3, 0xc8, 0x9d,
0x30, 0xce, 0xe9, 0x98, 0xc9, 0xee, 0x54, 0x27, 0x4d, 0x19, 0x1c, 0xaa, 0x58, 0x4c, 0x8a, 0xe6,
0x79, 0xd2, 0xaa, 0x22, 0xc9, 0x60, 0x4a, 0x42, 0x50, 0x13, 0x74, 0xcc, 0xf5, 0xb5, 0x6e, 0xb5,
0x5f, 0x27, 0xf2, 0xb9, 0xf7, 0x7b, 0x05, 0x9a, 0xf9, 0x8e, 0x84, 0xbe, 0x84, 0xc6, 0xb2, 0x81,
0x05, 0x7e, 0x72, 0x95, 0x21, 0x0d, 0x59, 0x7e, 0xac, 0x12, 0xd2, 0x89, 0xba, 0xd0, 0x75, 0x22,
0x9f, 0xd1, 0x8b, 0x65, 0xe3, 0xe2, 0x6e, 0xe0, 0xc7, 0xa5, 0xc6, 0x0e, 0x69, 0x87, 0xe2, 0x96,
0xcf, 0x51, 0x07, 0x36, 0xa6, 0x11, 0x0f, 0x44, 0xda, 0x5f, 0x57, 0xc9, 0x72, 0xdc, 0xfb, 0xb3,
0x02, 0x8d, 0x5c, 0x6b, 0xfb, 0xfc, 0x1c, 0x9e, 0x03, 0xa4, 0x8d, 0x32, 0xf0, 0x93, 0x99, 0xd4,
0x93, 0x88, 0xe5, 0x17, 0xbc, 0xaa, 0x45, 0x2f, 0xf4, 0x1d, 0xac, 0x27, 0xc4, 0xa4, 0xcd, 0xef,
0x95, 0x7d, 0x2c, 0x5c, 0x53, 0x41, 0x52, 0x5e, 0xcf, 0x86, 0x27, 0x17, 0xc1, 0x38, 0x64, 0xfe,
0x9d, 0x8f, 0x9d, 0x67, 0x50, 0xe7, 0xc1, 0x38, 0xa4, 0x62, 0x3e, 0x63, 0x72, 0x92, 0x4d, 0x92,
0x05, 0x90, 0x0e, 0xeb, 0x53, 0xba, 0xb8, 0x8d, 0xa8, 0x9a, 0x60, 0x93, 0xa4, 0xc3, 0xde, 0x3f,
0x15, 0xd8, 0x2d, 0x4a, 0xf1, 0x74, 0x8b, 0xe2, 0x85, 0x5c, 0x7e, 0xd3, 0x24, 0xa5, 0x37, 0x49,
0x63, 0x19, 0xb3, 0x7c, 0x64, 0xc1, 0x0b, 0xf9, 0x61, 0xc5, 0xdd, 0x2b, 0xca, 0x99, 0x9b, 0xd1,
0x7d, 0xc6, 0xbd, 0x59, 0x30, 0x95, 0x55, 0x2b, 0xc7, 0x03, 0x45, 0x3c, 0xa6, 0x9c, 0x2d, 0xfd,
0x06, 0x19, 0x0b, 0x75, 0x60, 0x4d, 0x31, 0xe4, 0x86, 0x35, 0x8f, 0x57, 0xf4, 0x0a, 0x49, 0x22,
0xc8, 0x84, 0x16, 0x97, 0x45, 0xbb, 0x09, 0xa5, 0x26, 0x1b, 0x6c, 0xee, 0x0e, 0x94, 0xad, 0x09,
0x69, 0xaa, 0x24, 0x55, 0xd5, 0x71, 0xeb, 0x43, 0xe3, 0xf0, 0xe5, 0x9b, 0x34, 0xe3, 0x6a, 0x4d,
0x3e, 0x7d, 0xff, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x39, 0xf7, 0x01, 0xf5, 0x83, 0x0a, 0x00,
0x00,
0x05, 0xfd, 0x80, 0x7e, 0x43, 0xd1, 0xbf, 0xea, 0x6f, 0x14, 0x9c, 0x21, 0x45, 0xd2, 0xa6, 0x9c,
0x2e, 0xba, 0x91, 0x38, 0xf7, 0x9c, 0x7b, 0xce, 0xdc, 0x79, 0xf0, 0x12, 0xf6, 0xdd, 0x70, 0x32,
0x99, 0x07, 0xbe, 0x58, 0x38, 0xf3, 0xa9, 0x47, 0x05, 0x3b, 0x9e, 0xce, 0x42, 0x11, 0xa2, 0x2d,
0xf9, 0x77, 0x3d, 0xff, 0xd8, 0xda, 0x75, 0x6f, 0xa8, 0x70, 0x7c, 0x8f, 0x05, 0xc2, 0x17, 0x0b,
0x05, 0xb7, 0x76, 0x92, 0x34, 0x9f, 0x71, 0x15, 0xea, 0xfc, 0xd1, 0x80, 0xa6, 0x91, 0x88, 0xe1,
0x4f, 0x2c, 0x10, 0xa8, 0x07, 0x7b, 0xa9, 0x3c, 0x8b, 0x42, 0x8e, 0x7b, 0x17, 0xba, 0xb7, 0x7a,
0xa9, 0x5d, 0xea, 0x56, 0xc8, 0xae, 0x9b, 0xa3, 0x1b, 0x11, 0x84, 0x5e, 0x41, 0x45, 0x2c, 0xa6,
0x4c, 0x5f, 0x6b, 0x97, 0xba, 0xcd, 0x5e, 0xe7, 0x38, 0x99, 0xc7, 0x71, 0x5e, 0xfb, 0x58, 0xfe,
0xda, 0x8b, 0x29, 0x23, 0x92, 0x8f, 0x06, 0xa0, 0xa5, 0x5e, 0x6e, 0x18, 0x7c, 0xf4, 0xc7, 0x7a,
0xb9, 0x5d, 0xea, 0xd6, 0x7a, 0x87, 0x05, 0x1a, 0x86, 0x24, 0x90, 0x6d, 0x37, 0x1f, 0x40, 0x43,
0xd0, 0x44, 0x78, 0xcb, 0x02, 0x67, 0xca, 0x66, 0x13, 0x9f, 0x73, 0x3f, 0x0c, 0xf4, 0x8a, 0x54,
0x29, 0x9a, 0x89, 0x1d, 0x51, 0x2f, 0x96, 0x4c, 0xb2, 0x2d, 0xf2, 0x01, 0xf4, 0x06, 0x1a, 0x2e,
0x15, 0x6c, 0x1c, 0xce, 0x16, 0x8e, 0x47, 0x05, 0xd5, 0xd7, 0xa5, 0xd6, 0x7e, 0x46, 0x2b, 0x86,
0x07, 0x54, 0x50, 0x52, 0x77, 0x33, 0x23, 0xf4, 0x1a, 0xea, 0xee, 0x0d, 0x0d, 0x02, 0x76, 0xa7,
0x72, 0x37, 0x64, 0xee, 0x5e, 0x26, 0x57, 0xa1, 0x32, 0xb5, 0xe6, 0xa6, 0x03, 0xd4, 0x05, 0x6d,
0xc2, 0x26, 0xd7, 0x6c, 0xe6, 0x88, 0xd0, 0xa1, 0xae, 0x88, 0xaa, 0xd8, 0x6c, 0x97, 0xba, 0x55,
0xd2, 0x54, 0x71, 0x3b, 0xec, 0xcb, 0x28, 0xb2, 0xa0, 0xae, 0x22, 0xbc, 0xef, 0x79, 0xcc, 0xd3,
0xb7, 0xda, 0xe5, 0x6e, 0xad, 0xf7, 0xcd, 0xca, 0x55, 0x1f, 0x66, 0xc8, 0x38, 0x10, 0xb3, 0x05,
0xc9, 0xe5, 0xa3, 0x3b, 0xd8, 0x9f, 0xb1, 0x5f, 0x99, 0x2b, 0x98, 0x47, 0xd8, 0x6f, 0x73, 0xc6,
0x05, 0xb7, 0xc3, 0xb3, 0xd0, 0x0f, 0xf4, 0xaa, 0x54, 0xfe, 0x61, 0xa5, 0x32, 0x29, 0x4c, 0x53,
0x1e, 0x2b, 0x34, 0x23, 0x37, 0xea, 0xba, 0x6c, 0xfa, 0xd0, 0x0d, 0x3e, 0xe3, 0xd6, 0x2f, 0x4c,
0x8b, 0xdd, 0x8a, 0x35, 0xd1, 0x29, 0x34, 0xd5, 0xd9, 0x98, 0x30, 0x41, 0xe5, 0x8e, 0xd4, 0xe4,
0x8e, 0xb4, 0x57, 0x9d, 0x8c, 0x61, 0xcc, 0x23, 0x0d, 0x91, 0x1d, 0xb6, 0x3e, 0xc0, 0xce, 0x83,
0x75, 0x44, 0x1a, 0x94, 0x6f, 0xd9, 0x42, 0xde, 0x8c, 0x2a, 0x89, 0x1e, 0xd1, 0x4b, 0x58, 0xff,
0x44, 0xef, 0xe6, 0xea, 0x2a, 0x14, 0x1f, 0x63, 0x25, 0x43, 0x14, 0xef, 0xc7, 0xb5, 0xd7, 0xa5,
0xd6, 0x2d, 0x3c, 0x7d, 0x64, 0x25, 0x0b, 0x5c, 0x5e, 0xe5, 0x5d, 0x8a, 0x8a, 0x89, 0x85, 0x94,
0xce, 0x3d, 0xb3, 0x47, 0x16, 0xf2, 0xff, 0x35, 0xeb, 0xfc, 0x5d, 0x81, 0xea, 0xf2, 0xd2, 0xa3,
0x1a, 0x6c, 0x5e, 0x59, 0xe7, 0xd6, 0xe8, 0x17, 0x4b, 0xfb, 0x02, 0x21, 0x68, 0x1a, 0xa3, 0xe1,
0xf0, 0xca, 0x32, 0xed, 0xf7, 0x0e, 0x1e, 0x98, 0xb6, 0x56, 0x42, 0xdf, 0x42, 0x37, 0x8d, 0x0d,
0xf1, 0xf0, 0x04, 0x13, 0xc7, 0x1e, 0x9d, 0x63, 0xcb, 0xb9, 0xc0, 0x64, 0x68, 0x5e, 0x5e, 0x9a,
0x23, 0xcb, 0x31, 0xde, 0xf6, 0xad, 0x53, 0xac, 0xad, 0xfd, 0x37, 0xf6, 0x00, 0xbf, 0xc3, 0x36,
0xd6, 0xca, 0xe8, 0x39, 0x1c, 0xa6, 0x6c, 0xa3, 0x6f, 0xe3, 0xd3, 0x11, 0x79, 0xef, 0x18, 0x04,
0xf7, 0x6d, 0xac, 0x55, 0x56, 0xc0, 0x71, 0xf6, 0x3a, 0x7a, 0x0a, 0x07, 0x05, 0xb0, 0x9c, 0xf6,
0x06, 0x7a, 0x06, 0x7a, 0x06, 0x7c, 0xdb, 0xb7, 0x2c, 0xfc, 0x2e, 0x51, 0xde, 0x2c, 0x46, 0x63,
0xe1, 0x2d, 0xd4, 0x82, 0xfd, 0x87, 0xa8, 0xd4, 0xad, 0xa2, 0x23, 0x68, 0x15, 0x98, 0x12, 0x3c,
0x22, 0x03, 0x4c, 0x34, 0xb8, 0x37, 0xe7, 0x38, 0x37, 0x81, 0x6b, 0xe8, 0x6b, 0x68, 0xa7, 0x30,
0xc1, 0x3f, 0x5f, 0xe1, 0x4b, 0xdb, 0xb1, 0x47, 0xce, 0xd9, 0xc8, 0xb4, 0x9c, 0xbe, 0x61, 0xe0,
0x0b, 0x5b, 0xab, 0x3f, 0xce, 0x22, 0xf8, 0x0c, 0x1b, 0xb6, 0xd6, 0x40, 0x87, 0xb0, 0xf7, 0x60,
0xad, 0xcf, 0x4d, 0xe3, 0x5c, 0x6b, 0x22, 0x1d, 0x9e, 0x3c, 0x80, 0x4e, 0xfa, 0x96, 0xb6, 0x9d,
0xaf, 0x2d, 0x46, 0xae, 0xac, 0x08, 0xd3, 0xd0, 0x01, 0xec, 0xa6, 0x98, 0xda, 0xb5, 0xfe, 0x60,
0xa0, 0xed, 0x74, 0xfe, 0x5a, 0x83, 0xed, 0x7b, 0xaf, 0x7c, 0xd4, 0x83, 0xad, 0xa4, 0x97, 0xc9,
0x93, 0x99, 0x7f, 0x1b, 0xdf, 0x50, 0x61, 0xc6, 0x28, 0x59, 0xf2, 0xd0, 0x4f, 0x50, 0x4b, 0xfb,
0x01, 0x8f, 0x0f, 0xef, 0x51, 0xc1, 0xe1, 0x4d, 0x5f, 0xfd, 0x9c, 0x64, 0x53, 0xa2, 0x77, 0x07,
0xf5, 0x26, 0x7e, 0xe0, 0x70, 0x26, 0x84, 0x1f, 0x8c, 0x79, 0xdc, 0x9b, 0x8a, 0x6e, 0x40, 0x3f,
0x22, 0x5e, 0xc6, 0x3c, 0xd2, 0xa0, 0xd9, 0x21, 0xfa, 0x0a, 0x1a, 0x7e, 0x20, 0x66, 0xa1, 0x33,
0x61, 0x9c, 0xd3, 0x31, 0x93, 0xdd, 0xa9, 0x4a, 0xea, 0x32, 0x38, 0x54, 0xb1, 0x88, 0x14, 0xce,
0xb3, 0xa4, 0x75, 0x45, 0x92, 0xc1, 0x84, 0x84, 0xa0, 0x22, 0xe8, 0x98, 0xeb, 0x1b, 0xed, 0x72,
0xb7, 0x4a, 0xe4, 0x73, 0xe7, 0xf7, 0x12, 0xd4, 0xb3, 0x1d, 0x09, 0x7d, 0x09, 0xb5, 0x65, 0x03,
0xf3, 0xbd, 0xf8, 0x2a, 0x43, 0x12, 0x32, 0xbd, 0x48, 0x25, 0xa0, 0x13, 0x75, 0xa1, 0xab, 0x44,
0x3e, 0xa3, 0x17, 0xcb, 0xc6, 0xc5, 0x1d, 0xdf, 0x8b, 0x4a, 0x8d, 0x1c, 0x92, 0x0e, 0xc5, 0x4d,
0x8f, 0xa3, 0x16, 0x6c, 0x4d, 0x43, 0xee, 0x8b, 0xa4, 0xbf, 0xae, 0x93, 0xe5, 0xb8, 0xf3, 0x67,
0x09, 0x6a, 0x99, 0xd6, 0xf6, 0xf9, 0x39, 0x3c, 0x07, 0x48, 0x1a, 0xa5, 0xef, 0xc5, 0x33, 0xa9,
0xc6, 0x11, 0xd3, 0xcb, 0x79, 0x95, 0xf3, 0x5e, 0xe8, 0x3b, 0xd8, 0x8c, 0x89, 0x71, 0x9b, 0x3f,
0x28, 0xfa, 0x58, 0xb8, 0xa1, 0x82, 0x24, 0xbc, 0x8e, 0x05, 0x4f, 0x2e, 0xfd, 0x71, 0xc0, 0xbc,
0x7b, 0x1f, 0x3b, 0xcf, 0xa0, 0xca, 0xfd, 0x71, 0x40, 0xc5, 0x7c, 0xc6, 0xe4, 0x24, 0xeb, 0x24,
0x0d, 0x20, 0x1d, 0x36, 0xa7, 0x74, 0x71, 0x17, 0x52, 0x35, 0xc1, 0x3a, 0x49, 0x86, 0x9d, 0x7f,
0x4a, 0xb0, 0x9f, 0x97, 0xe2, 0xc9, 0x16, 0x45, 0x0b, 0xb9, 0xfc, 0xa6, 0x89, 0x4b, 0xaf, 0x93,
0xda, 0x32, 0x66, 0x7a, 0xc8, 0x84, 0x17, 0xf2, 0xc3, 0x8a, 0x3b, 0xd7, 0x94, 0x33, 0x27, 0xa5,
0x7b, 0x8c, 0xbb, 0x33, 0x7f, 0x2a, 0xab, 0x56, 0x8e, 0x47, 0x8a, 0x78, 0x42, 0x39, 0x5b, 0xfa,
0x0d, 0x52, 0x16, 0x6a, 0xc1, 0x86, 0x62, 0xc8, 0x0d, 0xab, 0x9f, 0xac, 0xe9, 0x25, 0x12, 0x47,
0x90, 0x01, 0x0d, 0x2e, 0x8b, 0x76, 0x62, 0x4a, 0x45, 0x36, 0xd8, 0xcc, 0x1d, 0x28, 0x5a, 0x13,
0x52, 0x57, 0x49, 0xaa, 0xaa, 0x8e, 0x0d, 0x47, 0xc5, 0x85, 0x26, 0x1d, 0x0b, 0xf5, 0xa0, 0x3c,
0xe1, 0xe3, 0xf8, 0x5e, 0xb6, 0x57, 0x75, 0xef, 0x65, 0x5a, 0x44, 0x3e, 0x69, 0x7c, 0xa8, 0x1d,
0xbf, 0x7c, 0x93, 0x50, 0xaf, 0x37, 0xe4, 0xd3, 0xf7, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x92,
0x1f, 0x8f, 0xf4, 0xd9, 0x0a, 0x00, 0x00,
}

View File

@ -86,3 +86,7 @@ message CommunityEventsMessage {
// A list of signed community events
repeated SignedCommunityEvent signed_events = 4;
}
message CommunityEventsMessageRejected {
CommunityEventsMessage msg = 1;
}

View File

@ -328,8 +328,10 @@ func (m *StatusMessage) HandleApplication() error {
return m.unmarshalProtobufData(new(protobuf.SyncActivityCenterNotifications))
case protobuf.ApplicationMetadataMessage_SYNC_ACTIVITY_CENTER_NOTIFICATION_STATE:
return m.unmarshalProtobufData(new(protobuf.SyncActivityCenterNotificationState))
case protobuf.ApplicationMetadataMessage_COMMUNITY_ADMIN_MESSAGE:
case protobuf.ApplicationMetadataMessage_COMMUNITY_EVENTS_MESSAGE:
return m.unmarshalProtobufData(new(protobuf.CommunityEventsMessage))
case protobuf.ApplicationMetadataMessage_COMMUNITY_EVENTS_MESSAGE_REJECTED:
return m.unmarshalProtobufData(new(protobuf.CommunityEventsMessageRejected))
case protobuf.ApplicationMetadataMessage_SYNC_ACCOUNT_CUSTOMIZATION_COLOR:
return m.unmarshalProtobufData(new(protobuf.SyncAccountCustomizationColor))
case protobuf.ApplicationMetadataMessage_SYNC_ACCOUNTS_POSITIONS: