diff --git a/bridge/harmony/harmony.go b/bridge/harmony/harmony.go
new file mode 100644
index 00000000..14174c31
--- /dev/null
+++ b/bridge/harmony/harmony.go
@@ -0,0 +1,252 @@
+package harmony
+
+import (
+	"fmt"
+	"log"
+	"strconv"
+	"strings"
+	"time"
+
+	"github.com/42wim/matterbridge/bridge"
+	"github.com/42wim/matterbridge/bridge/config"
+	"github.com/harmony-development/shibshib"
+	chatv1 "github.com/harmony-development/shibshib/gen/chat/v1"
+	typesv1 "github.com/harmony-development/shibshib/gen/harmonytypes/v1"
+	profilev1 "github.com/harmony-development/shibshib/gen/profile/v1"
+)
+
+type cachedProfile struct {
+	data        *profilev1.GetProfileResponse
+	lastUpdated time.Time
+}
+
+type Bharmony struct {
+	*bridge.Config
+
+	c            *shibshib.Client
+	profileCache map[uint64]cachedProfile
+}
+
+func uToStr(in uint64) string {
+	return strconv.FormatUint(in, 10)
+}
+
+func strToU(in string) (uint64, error) {
+	return strconv.ParseUint(in, 10, 64)
+}
+
+func New(cfg *bridge.Config) bridge.Bridger {
+	b := &Bharmony{
+		Config:       cfg,
+		profileCache: map[uint64]cachedProfile{},
+	}
+
+	return b
+}
+
+func (b *Bharmony) getProfile(u uint64) (*profilev1.GetProfileResponse, error) {
+	if v, ok := b.profileCache[u]; ok && time.Since(v.lastUpdated) < time.Minute*10 {
+		return v.data, nil
+	}
+
+	resp, err := b.c.ProfileKit.GetProfile(&profilev1.GetProfileRequest{
+		UserId: u,
+	})
+	if err != nil {
+		if v, ok := b.profileCache[u]; ok {
+			return v.data, nil
+		}
+		return nil, err
+	}
+	b.profileCache[u] = cachedProfile{
+		data:        resp,
+		lastUpdated: time.Now(),
+	}
+	return resp, nil
+}
+
+func (b *Bharmony) avatarFor(m *chatv1.Message) string {
+	if m.Overrides != nil {
+		return m.Overrides.GetAvatar()
+	}
+
+	profi, err := b.getProfile(m.AuthorId)
+	if err != nil {
+		return ""
+	}
+
+	return b.c.TransformHMCURL(profi.Profile.GetUserAvatar())
+}
+
+func (b *Bharmony) usernameFor(m *chatv1.Message) string {
+	if m.Overrides != nil {
+		return m.Overrides.GetUsername()
+	}
+
+	profi, err := b.getProfile(m.AuthorId)
+	if err != nil {
+		return ""
+	}
+
+	return profi.Profile.UserName
+}
+
+func (b *Bharmony) toMessage(msg *shibshib.LocatedMessage) config.Message {
+	message := config.Message{}
+	message.Account = b.Account
+	message.UserID = uToStr(msg.Message.AuthorId)
+	message.Avatar = b.avatarFor(msg.Message)
+	message.Username = b.usernameFor(msg.Message)
+	message.Channel = uToStr(msg.ChannelID)
+	message.ID = uToStr(msg.MessageId)
+
+	switch content := msg.Message.Content.Content.(type) {
+	case *chatv1.Content_EmbedMessage:
+		message.Text = "Embed"
+	case *chatv1.Content_AttachmentMessage:
+		var s strings.Builder
+		for idx, attach := range content.AttachmentMessage.Files {
+			s.WriteString(b.c.TransformHMCURL(attach.Id))
+			if idx < len(content.AttachmentMessage.Files)-1 {
+				s.WriteString(", ")
+			}
+		}
+		message.Text = s.String()
+	case *chatv1.Content_PhotoMessage:
+		var s strings.Builder
+		for idx, attach := range content.PhotoMessage.GetPhotos() {
+			s.WriteString(attach.GetCaption().GetText())
+			s.WriteString("\n")
+			s.WriteString(b.c.TransformHMCURL(attach.GetHmc()))
+			if idx < len(content.PhotoMessage.GetPhotos())-1 {
+				s.WriteString("\n\n")
+			}
+		}
+		message.Text = s.String()
+	case *chatv1.Content_TextMessage:
+		message.Text = content.TextMessage.Content.Text
+	}
+
+	return message
+}
+
+func (b *Bharmony) outputMessages() {
+	for {
+		msg := <-b.c.EventsStream()
+
+		if msg.Message.AuthorId == b.c.UserID {
+			continue
+		}
+
+		b.Remote <- b.toMessage(msg)
+	}
+}
+
+func (b *Bharmony) GetUint64(conf string) uint64 {
+	num, err := strToU(b.GetString(conf))
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	return num
+}
+
+func (b *Bharmony) Connect() (err error) {
+	b.c, err = shibshib.NewClient(b.GetString("Homeserver"), b.GetString("Token"), b.GetUint64("UserID"))
+	if err != nil {
+		return
+	}
+	b.c.SubscribeToGuild(b.GetUint64("Community"))
+
+	go b.outputMessages()
+
+	return nil
+}
+
+func (b *Bharmony) send(msg config.Message) (id string, err error) {
+	msgChan, err := strToU(msg.Channel)
+	if err != nil {
+		return
+	}
+
+	retID, err := b.c.ChatKit.SendMessage(&chatv1.SendMessageRequest{
+		GuildId:   b.GetUint64("Community"),
+		ChannelId: msgChan,
+		Content: &chatv1.Content{
+			Content: &chatv1.Content_TextMessage{
+				TextMessage: &chatv1.Content_TextContent{
+					Content: &chatv1.FormattedText{
+						Text: msg.Text,
+					},
+				},
+			},
+		},
+		Overrides: &chatv1.Overrides{
+			Username: &msg.Username,
+			Avatar:   &msg.Avatar,
+			Reason:   &chatv1.Overrides_Bridge{Bridge: &typesv1.Empty{}},
+		},
+		InReplyTo: nil,
+		EchoId:    nil,
+		Metadata:  nil,
+	})
+	if err != nil {
+		err = fmt.Errorf("send: error sending message: %w", err)
+		log.Println(err.Error())
+	}
+
+	return uToStr(retID.MessageId), err
+}
+
+func (b *Bharmony) delete(msg config.Message) (id string, err error) {
+	msgChan, err := strToU(msg.Channel)
+	if err != nil {
+		return "", err
+	}
+
+	msgID, err := strToU(msg.ID)
+	if err != nil {
+		return "", err
+	}
+
+	_, err = b.c.ChatKit.DeleteMessage(&chatv1.DeleteMessageRequest{
+		GuildId:   b.GetUint64("Community"),
+		ChannelId: msgChan,
+		MessageId: msgID,
+	})
+	return "", err
+}
+
+func (b *Bharmony) typing(msg config.Message) (id string, err error) {
+	msgChan, err := strToU(msg.Channel)
+	if err != nil {
+		return "", err
+	}
+
+	_, err = b.c.ChatKit.Typing(&chatv1.TypingRequest{
+		GuildId:   b.GetUint64("Community"),
+		ChannelId: msgChan,
+	})
+	return "", err
+}
+
+func (b *Bharmony) Send(msg config.Message) (id string, err error) {
+	switch msg.Event {
+	case "":
+		return b.send(msg)
+	case config.EventMsgDelete:
+		return b.delete(msg)
+	case config.EventUserTyping:
+		return b.typing(msg)
+	default:
+		return "", nil
+	}
+}
+
+func (b *Bharmony) JoinChannel(channel config.ChannelInfo) error {
+	return nil
+}
+
+func (b *Bharmony) Disconnect() error {
+	return nil
+}
diff --git a/gateway/bridgemap/bharmony.go b/gateway/bridgemap/bharmony.go
new file mode 100644
index 00000000..a747dda4
--- /dev/null
+++ b/gateway/bridgemap/bharmony.go
@@ -0,0 +1,12 @@
+//go:build !noharmony
+// +build !noharmony
+
+package bridgemap
+
+import (
+	bharmony "github.com/42wim/matterbridge/bridge/harmony"
+)
+
+func init() {
+	FullMap["harmony"] = bharmony.New
+}
diff --git a/go.mod b/go.mod
index 71a0b5f0..c17b9a32 100644
--- a/go.mod
+++ b/go.mod
@@ -15,6 +15,7 @@ require (
 	github.com/google/gops v0.3.22
 	github.com/gorilla/schema v1.2.0
 	github.com/gorilla/websocket v1.4.2
+	github.com/harmony-development/shibshib v0.0.0-20211127182844-512296f7c548
 	github.com/hashicorp/golang-lru v0.5.4
 	github.com/jpillora/backoff v1.0.0
 	github.com/keybase/go-keybase-chat-bot v0.0.0-20211201215354-ee4b23828b55
diff --git a/go.sum b/go.sum
index 328204df..3b85b895 100644
--- a/go.sum
+++ b/go.sum
@@ -125,6 +125,7 @@ github.com/advancedlogic/GoOse v0.0.0-20191112112754-e742535969c1/go.mod h1:f3HC
 github.com/advancedlogic/GoOse v0.0.0-20200830213114-1225d531e0ad/go.mod h1:f3HCSN1fBWjcpGtXyM119MJgeQl838v6so/PQOqvE1w=
 github.com/advancedlogic/GoOse v0.0.0-20210820140952-9d5822d4a625/go.mod h1:f3HCSN1fBWjcpGtXyM119MJgeQl838v6so/PQOqvE1w=
 github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY=
+github.com/alecthomas/repr v0.0.0-20210801044451-80ca428c5142/go.mod h1:2kn6fqh/zIyPLmm3ugklbEi5hg5wS435eygvNfaDQL8=
 github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
@@ -132,6 +133,7 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF
 github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
 github.com/alexcesaro/log v0.0.0-20150915221235-61e686294e58/go.mod h1:YNfsMyWSs+h+PaYkxGeMVmVCX75Zj/pqdjbu12ciCYE=
 github.com/andybalholm/brotli v1.0.0/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y=
+github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y=
 github.com/andybalholm/brotli v1.0.3/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
 github.com/andybalholm/cascadia v1.0.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y=
 github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y=
@@ -332,6 +334,8 @@ github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c/go.mod h1:Yg+htX
 github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg=
 github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0=
 github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8=
+github.com/fasthttp/websocket v1.4.3-rc.9/go.mod h1:eXL2zqDbexYJxaCw8/PQlm7VcMK6uoGvwbYbTdt4dFo=
+github.com/fasthttp/websocket v1.4.3-rc.10/go.mod h1:xU7SHrziVFuFx3IO24nLKcu4tm3QykCFXhwtwRk9Xd0=
 github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
 github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
 github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
@@ -429,6 +433,8 @@ github.com/gocql/gocql v0.0.0-20190301043612-f6df8288f9b4/go.mod h1:4Fw1eo5iaEhD
 github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
 github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
 github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
+github.com/gofiber/fiber/v2 v2.20.1/go.mod h1:/LdZHMUXZvTTo7gU4+b1hclqCAdoQphNQ9bi9gutPyI=
+github.com/gofiber/websocket/v2 v2.0.12/go.mod h1:lQRy0u5ACJfiez/e/bhGeYvM0/M940Y3NFw14U3/otI=
 github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
 github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
 github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
@@ -570,6 +576,9 @@ github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFb
 github.com/h2non/go-is-svg v0.0.0-20160927212452-35e8c4b0612c/go.mod h1:ObS/W+h8RYb1Y7fYivughjxojTmIu5iAIjSrSLCLeqE=
 github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4=
 github.com/hako/durafmt v0.0.0-20210608085754-5c1018a4e16b/go.mod h1:VzxiSdG6j1pi7rwGm/xYI5RbtpBgM8sARDXlvEvxlu0=
+github.com/harmony-development/hrpc v0.0.0-20211020182021-788fc204a0fe/go.mod h1:B+5b0+n0UpMtqAGtJ2oYlgsArI9LbSJ0/HoySJNzDFY=
+github.com/harmony-development/shibshib v0.0.0-20211127182844-512296f7c548 h1:jAnKjA+wco4ONGpCtINd0t+sC+ffF+yYScGqgJ2OG4o=
+github.com/harmony-development/shibshib v0.0.0-20211127182844-512296f7c548/go.mod h1:e3LPbk9jFYwu72EVyGPJC7CKBBSmxb4ZdyJalaaskdc=
 github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
 github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M=
 github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
@@ -742,6 +751,7 @@ github.com/klauspost/compress v1.10.10/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdY
 github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
 github.com/klauspost/compress v1.12.2/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
 github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
+github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
 github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
 github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
 github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
@@ -814,6 +824,10 @@ github.com/matterbridge/discordgo v0.21.2-0.20210201201054-fb39a175b4f7 h1:4J2YZ
 github.com/matterbridge/discordgo v0.21.2-0.20210201201054-fb39a175b4f7/go.mod h1:411nZYv0UMMrtppR5glXop1foboJiFAowy+42U+Ahvw=
 github.com/matterbridge/go-xmpp v0.0.0-20211030125215-791a06c5f1be h1:zlirT+LngOJ60G6FVzI87DljGZLUnfNzmXja61EjtYM=
 github.com/matterbridge/go-xmpp v0.0.0-20211030125215-791a06c5f1be/go.mod h1:ECDRehsR9TYTKCAsRS8/wLeOk6UUqDydw47ln7wG41Q=
+github.com/matterbridge/go-xmpp v0.0.0-20180131083630-7ec2b8b7def6 h1:GDh7egrbDEzP41mScMt7Q/uPM2nJENh9LNFXjUOGts8=
+github.com/matterbridge/go-xmpp v0.0.0-20180131083630-7ec2b8b7def6/go.mod h1:ECDRehsR9TYTKCAsRS8/wLeOk6UUqDydw47ln7wG41Q=
+github.com/matterbridge/go-xmpp v0.0.0-20210731150933-5702291c239f h1:1hfavl4YOoRjgTBWezeX8WXCGnhrxnfEgQtb38wQnyg=
+github.com/matterbridge/go-xmpp v0.0.0-20210731150933-5702291c239f/go.mod h1:ECDRehsR9TYTKCAsRS8/wLeOk6UUqDydw47ln7wG41Q=
 github.com/matterbridge/gozulipbot v0.0.0-20211023205727-a19d6c1f3b75 h1:GslZKF7lW7oSisycGLpxPO+TnKJuA4VZuTWIfYZrClc=
 github.com/matterbridge/gozulipbot v0.0.0-20211023205727-a19d6c1f3b75/go.mod h1:yAjnZ34DuDyPHMPHHjOsTk/FefW4JJjoMMCGt/8uuQA=
 github.com/matterbridge/logrus-prefixed-formatter v0.5.3-0.20200523233437-d971309a77ba h1:XleOY4IjAEIcxAh+IFwT5JT5Ze3RHiYz6m+4ZfZ0rc0=
@@ -872,6 +886,8 @@ github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOq
 github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
 github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
 github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
+github.com/mattn/go-xmpp v0.0.0-20211029151415-912ba614897a h1:BRuMO9LUDuGp6viOhrEbmuXNlvC78X5QdsnY9Wc+cqM=
+github.com/mattn/go-xmpp v0.0.0-20211029151415-912ba614897a/go.mod h1:Cs5mF0OsrRRmhkyOod//ldNPOwJsrBvJ+1WRspv0xoc=
 github.com/mattn/godown v0.0.1 h1:39uk50ufLVQFs0eapIJVX5fCS74a1Fs2g5f1MVqIHdE=
 github.com/mattn/godown v0.0.1/go.mod h1:/ivCKurgV/bx6yqtP/Jtc2Xmrv3beCYBvlfAUl4X5g4=
 github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw=
@@ -1108,6 +1124,7 @@ github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca h1:NugYot0LIVPxT
 github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca/go.mod h1:uugorj2VCxiV1x+LzaIdVa9b4S4qGAcH6cbhh4qVxOU=
 github.com/satori/go.uuid v0.0.0-20180103174451-36e9d2ebbde5/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
 github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
+github.com/savsgio/gotils v0.0.0-20210921075833-21a6215cb0e4/go.mod h1:oejLrk1Y/5zOF+c/aHtXqn3TFlzzbAgPWg8zBiAHDas=
 github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g=
 github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw=
 github.com/scylladb/termtables v0.0.0-20191203121021-c4c0b6d42ff4/go.mod h1:C1a7PQSMz9NShzorzCiG2fk9+xuCgLkPeCvMHYR2OWg=
@@ -1260,10 +1277,14 @@ github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKn
 github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
 github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
 github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w=
+github.com/valyala/fasthttp v1.29.0/go.mod h1:2rsYD01CKFrjjsvFxx75KlEUNpWNBY9JWD3K/7o2Cus=
+github.com/valyala/fasthttp v1.30.0/go.mod h1:2rsYD01CKFrjjsvFxx75KlEUNpWNBY9JWD3K/7o2Cus=
+github.com/valyala/fasthttp v1.31.0/go.mod h1:2rsYD01CKFrjjsvFxx75KlEUNpWNBY9JWD3K/7o2Cus=
 github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8=
 github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4=
 github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
 github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio=
+github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc=
 github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU=
 github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM=
 github.com/vincent-petithory/dataurl v1.0.0 h1:cXw+kPto8NLuJtlMsI152irrVw9fRDX8AbShPRpg2CI=
@@ -1511,6 +1532,7 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT
 golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
@@ -1655,6 +1677,8 @@ golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20211006225509-1a26e0398eed h1:E159xujlywdAeN3FqsTBPzRKGUq/pDHolXbuttkC36E=
 golang.org/x/sys v0.0.0-20211006225509-1a26e0398eed/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
+golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac h1:oN6lz7iLW/YC7un8pq+9bOLyXrprv2+DKfkJY+2LJJw=
+golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
diff --git a/matterbridge.toml.sample b/matterbridge.toml.sample
index d9210f48..150e0d80 100644
--- a/matterbridge.toml.sample
+++ b/matterbridge.toml.sample
@@ -1660,6 +1660,18 @@ StripNick=false
 #OPTIONAL (default false)
 ShowTopicChange=false
 
+###################################################################
+# Harmony
+###################################################################
+
+[harmony.chat_harmonyapp_io]
+Homeserver = "https://chat.harmonyapp.io:2289"
+Token = "your token goes here"
+UserID = "user id of the bot account"
+Community = "community id that channels will be located in"
+UseUserName = true
+RemoteNickFormat = "{NICK}"
+
 ###################################################################
 #API
 ###################################################################
@@ -1953,6 +1965,10 @@ enable=true
     account="zulip.streamchat"
     channel="general/topic:mytopic"
 
+    [[gateway.inout]]
+    account="harmony.chat_harmonyapp_io"
+    channel="channel id goes here"
+
     #API example
     #[[gateway.inout]]
     #account="api.local"
diff --git a/vendor/github.com/harmony-development/shibshib/buf.gen.yaml b/vendor/github.com/harmony-development/shibshib/buf.gen.yaml
new file mode 100644
index 00000000..7d8ef040
--- /dev/null
+++ b/vendor/github.com/harmony-development/shibshib/buf.gen.yaml
@@ -0,0 +1,12 @@
+version: v1
+managed:
+  enabled: true
+  go_package_prefix:
+    default: github.com/harmony-development/shibshib/gen
+plugins:
+  - name: go
+    out: gen
+    opt: paths=source_relative
+  - name: go-hrpc
+    out: gen
+    opt: paths=source_relative
\ No newline at end of file
diff --git a/vendor/github.com/harmony-development/shibshib/client.go b/vendor/github.com/harmony-development/shibshib/client.go
new file mode 100644
index 00000000..e0690ad1
--- /dev/null
+++ b/vendor/github.com/harmony-development/shibshib/client.go
@@ -0,0 +1,216 @@
+package shibshib
+
+import (
+	"errors"
+	"fmt"
+	"net/http"
+	"net/url"
+	"strconv"
+	"strings"
+	"sync"
+
+	authv1 "github.com/harmony-development/shibshib/gen/auth/v1"
+	chatv1 "github.com/harmony-development/shibshib/gen/chat/v1"
+	profilev1 "github.com/harmony-development/shibshib/gen/profile/v1"
+)
+
+type Client struct {
+	ChatKit    chatv1.HTTPChatServiceClient
+	AuthKit    authv1.HTTPAuthServiceClient
+	ProfileKit profilev1.HTTPProfileServiceClient
+
+	ErrorHandler func(error)
+
+	UserID uint64
+
+	incomingEvents <-chan *chatv1.StreamEventsResponse
+	outgoingEvents chan<- *chatv1.StreamEventsRequest
+
+	subscribedGuilds []uint64
+	onceHandlers     []func(*LocatedMessage)
+
+	events       chan *LocatedMessage
+	homeserver   string
+	sessionToken string
+
+	streaming bool
+
+	mtx *sync.Mutex
+}
+
+var ErrEndOfStream = errors.New("end of stream")
+
+func (c *Client) init(h string, wsp, wsph string) {
+	c.events = make(chan *LocatedMessage)
+	c.mtx = new(sync.Mutex)
+	c.ErrorHandler = func(e error) {
+		panic(e)
+	}
+	c.homeserver = h
+	c.ChatKit = chatv1.HTTPChatServiceClient{*http.DefaultClient, h, wsp, wsph, http.Header{}}
+	c.AuthKit = authv1.HTTPAuthServiceClient{*http.DefaultClient, h, wsp, wsph, http.Header{}}
+	c.ProfileKit = profilev1.HTTPProfileServiceClient{*http.DefaultClient, h, wsp, wsph, http.Header{}}
+}
+
+func (c *Client) authed(token string, userID uint64) {
+	c.sessionToken = token
+	c.ChatKit.Header.Add("Authorization", token)
+	c.AuthKit.Header.Add("Authorization", token)
+	c.ProfileKit.Header.Add("Authorization", token)
+	c.UserID = userID
+}
+
+func NewClient(homeserver, token string, userid uint64) (ret *Client, err error) {
+	url, err := url.Parse(homeserver)
+	if err != nil {
+		return nil, err
+	}
+	it := "wss"
+	if url.Scheme == "http" {
+		it = "ws"
+	}
+	ret = &Client{}
+	ret.homeserver = homeserver
+	ret.init(homeserver, it, url.Host)
+	ret.authed(token, userid)
+
+	err = ret.StreamEvents()
+	if err != nil {
+		ret = nil
+		return
+	}
+
+	return
+}
+
+func (c *Client) StreamEvents() (err error) {
+	c.mtx.Lock()
+	defer c.mtx.Unlock()
+
+	if c.streaming {
+		return
+	}
+
+	it := make(chan *chatv1.StreamEventsRequest)
+	c.outgoingEvents = it
+	c.incomingEvents, err = c.ChatKit.StreamEvents(it)
+	if err != nil {
+		err = fmt.Errorf("StreamEvents: failed to open stream: %w", err)
+		return
+	}
+
+	c.streaming = true
+
+	go func() {
+		for ev := range c.incomingEvents {
+			chat, ok := ev.Event.(*chatv1.StreamEventsResponse_Chat)
+			if !ok {
+				continue
+			}
+
+			msg, ok := chat.Chat.Event.(*chatv1.StreamEvent_SentMessage)
+			if !ok {
+				continue
+			}
+
+			imsg := &LocatedMessage{
+				GuildID:   msg.SentMessage.GuildId,
+				ChannelID: msg.SentMessage.ChannelId,
+				MessageWithId: chatv1.MessageWithId{
+					MessageId: msg.SentMessage.MessageId,
+					Message:   msg.SentMessage.Message,
+				},
+			}
+
+			for _, h := range c.onceHandlers {
+				h(imsg)
+			}
+			c.onceHandlers = make([]func(*LocatedMessage), 0)
+			c.events <- imsg
+		}
+
+		c.mtx.Lock()
+		defer c.mtx.Unlock()
+
+		c.streaming = false
+		c.ErrorHandler(ErrEndOfStream)
+	}()
+
+	return nil
+}
+
+func (c *Client) SubscribeToGuild(community uint64) {
+	for _, g := range c.subscribedGuilds {
+		if g == community {
+			return
+		}
+	}
+	c.outgoingEvents <- &chatv1.StreamEventsRequest{
+		Request: &chatv1.StreamEventsRequest_SubscribeToGuild_{
+			SubscribeToGuild: &chatv1.StreamEventsRequest_SubscribeToGuild{
+				GuildId: community,
+			},
+		},
+	}
+	c.subscribedGuilds = append(c.subscribedGuilds, community)
+}
+
+func (c *Client) SubscribedGuilds() []uint64 {
+	return c.subscribedGuilds
+}
+
+func (c *Client) SendMessage(msg *chatv1.SendMessageRequest) (*chatv1.SendMessageResponse, error) {
+	return c.ChatKit.SendMessage(msg)
+}
+
+func (c *Client) TransformHMCURL(hmc string) string {
+	if !strings.HasPrefix(hmc, "hmc://") {
+		return fmt.Sprintf("%s/_harmony/media/download/%s", c.homeserver, hmc)
+	}
+
+	trimmed := strings.TrimPrefix(hmc, "hmc://")
+	split := strings.Split(trimmed, "/")
+	if len(split) != 2 {
+		return fmt.Sprintf("malformed URL: %s", hmc)
+	}
+
+	return fmt.Sprintf("https://%s/_harmony/media/download/%s", split[0], split[1])
+}
+
+func (c *Client) UsernameFor(m *chatv1.Message) string {
+	if m.Overrides != nil {
+		return m.Overrides.GetUsername()
+	}
+
+	resp, err := c.ProfileKit.GetProfile(&profilev1.GetProfileRequest{
+		UserId: m.AuthorId,
+	})
+	if err != nil {
+		return strconv.FormatUint(m.AuthorId, 10)
+	}
+
+	return resp.Profile.UserName
+}
+
+func (c *Client) AvatarFor(m *chatv1.Message) string {
+	if m.Overrides != nil {
+		return m.Overrides.GetAvatar()
+	}
+
+	resp, err := c.ProfileKit.GetProfile(&profilev1.GetProfileRequest{
+		UserId: m.AuthorId,
+	})
+	if err != nil {
+		return ""
+	}
+
+	return c.TransformHMCURL(resp.Profile.GetUserAvatar())
+}
+
+func (c *Client) EventsStream() <-chan *LocatedMessage {
+	return c.events
+}
+
+func (c *Client) HandleOnce(f func(*LocatedMessage)) {
+	c.onceHandlers = append(c.onceHandlers, f)
+}
diff --git a/vendor/github.com/harmony-development/shibshib/federatedclient.go b/vendor/github.com/harmony-development/shibshib/federatedclient.go
new file mode 100644
index 00000000..c4c779f3
--- /dev/null
+++ b/vendor/github.com/harmony-development/shibshib/federatedclient.go
@@ -0,0 +1,164 @@
+package shibshib
+
+import (
+	"fmt"
+	"net/url"
+	"reflect"
+	"strings"
+
+	authv1 "github.com/harmony-development/shibshib/gen/auth/v1"
+	chatv1 "github.com/harmony-development/shibshib/gen/chat/v1"
+)
+
+type FederatedClient struct {
+	Client
+
+	homeserver string
+	subclients map[string]*Client
+	streams    map[<-chan *LocatedMessage]*Client
+	listening  map[*Client]<-chan *LocatedMessage
+}
+
+type FederatedEvent struct {
+	Client *Client
+	Event  *LocatedMessage
+}
+
+func NewFederatedClient(homeserver, token string, userID uint64) (*FederatedClient, error) {
+	url, err := url.Parse(homeserver)
+	if err != nil {
+		return nil, err
+	}
+	it := "wss"
+	if url.Scheme == "http" {
+		it = "ws"
+	}
+
+	self := &FederatedClient{}
+	self.homeserver = homeserver
+	self.Client.homeserver = homeserver
+	self.init(homeserver, it, url.Host)
+	self.authed(token, userID)
+
+	self.subclients = make(map[string]*Client)
+	self.streams = make(map[<-chan *LocatedMessage]*Client)
+	self.listening = make(map[*Client]<-chan *LocatedMessage)
+
+	err = self.StreamEvents()
+	if err != nil {
+		return nil, fmt.Errorf("NewFederatedClient: own streamevents failed: %w", err)
+	}
+
+	return self, nil
+}
+
+func (f *FederatedClient) clientFor(homeserver string) (*Client, error) {
+	if f.homeserver == homeserver || strings.Split(homeserver, ":")[0] == "localhost" || homeserver == "" {
+		return &f.Client, nil
+	}
+
+	if val, ok := f.subclients[homeserver]; ok {
+		return val, nil
+	}
+
+	session, err := f.AuthKit.Federate(&authv1.FederateRequest{
+		ServerId: homeserver,
+	})
+	if err != nil {
+		return nil, fmt.Errorf("ClientFor: homeserver federation step failed: %w", err)
+	}
+
+	url, err := url.Parse(homeserver)
+	if err != nil {
+		return nil, err
+	}
+	scheme := "wss"
+	if url.Scheme == "http" {
+		scheme = "ws"
+	}
+
+	c := new(Client)
+	c.init(homeserver, scheme, url.Host)
+
+	data, err := c.AuthKit.LoginFederated(&authv1.LoginFederatedRequest{
+		AuthToken: session.Token,
+		ServerId:  f.homeserver,
+	})
+	if err != nil {
+		return nil, fmt.Errorf("ClientFor: failed to log into foreignserver: %w", err)
+	}
+
+	c.authed(data.Session.SessionToken, data.Session.UserId)
+	err = c.StreamEvents()
+	if err != nil {
+		return nil, fmt.Errorf("ClientFor: failed to stream events for foreign server: %w", err)
+	}
+
+	f.subclients[homeserver] = c
+
+	return c, nil
+}
+
+func (f *FederatedClient) Start() (<-chan FederatedEvent, error) {
+	list, err := f.ChatKit.GetGuildList(&chatv1.GetGuildListRequest{})
+	if err != nil {
+		return nil, fmt.Errorf("Start: failed to get guild list on homeserver: %w", err)
+	}
+
+	cases := []reflect.SelectCase{}
+
+	for _, g := range list.Guilds {
+		client, err := f.clientFor(g.ServerId)
+		if err != nil {
+			return nil, fmt.Errorf("Start: failed to get client for guild %s/%d: %w", g.ServerId, g.GuildId, err)
+		}
+
+		stream, ok := f.listening[client]
+		if !ok {
+			stream = client.EventsStream()
+			cases = append(cases, reflect.SelectCase{
+				Dir:  reflect.SelectRecv,
+				Chan: reflect.ValueOf(stream),
+			})
+			client.ErrorHandler = func(e error) {
+				if e == ErrEndOfStream {
+					err := client.StreamEvents()
+					if err != nil {
+						panic(fmt.Errorf("client.ErrorHandler: could not restart stream: %w", err))
+					}
+					cp := client.subscribedGuilds
+					client.subscribedGuilds = make([]uint64, 0)
+					for _, gg := range cp {
+						client.SubscribeToGuild(gg)
+					}
+				} else {
+					panic(err)
+				}
+			}
+
+			f.listening[client] = stream
+			f.streams[stream] = client
+		}
+
+		client.SubscribeToGuild(g.GuildId)
+	}
+
+	channel := make(chan FederatedEvent)
+	go func() {
+		for {
+			i, v, ok := reflect.Select(cases)
+			if !ok {
+				cases = append(cases[:i], cases[i+1:]...)
+			}
+
+			val := v.Interface().(*LocatedMessage)
+
+			channel <- FederatedEvent{
+				Event:  val,
+				Client: f.streams[cases[i].Chan.Interface().(<-chan *LocatedMessage)],
+			}
+		}
+	}()
+
+	return channel, nil
+}
diff --git a/vendor/github.com/harmony-development/shibshib/gen/auth/v1/auth.pb.go b/vendor/github.com/harmony-development/shibshib/gen/auth/v1/auth.pb.go
new file mode 100644
index 00000000..86541c3a
--- /dev/null
+++ b/vendor/github.com/harmony-development/shibshib/gen/auth/v1/auth.pb.go
@@ -0,0 +1,2190 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.23.0
+// 	protoc        v3.17.3
+// source: auth/v1/auth.proto
+
+package authv1
+
+import (
+	proto "github.com/golang/protobuf/proto"
+	v1 "github.com/harmony-development/shibshib/gen/harmonytypes/v1"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
+
+// Used in `BeginAuth` endpoint.
+type BeginAuthRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *BeginAuthRequest) Reset() {
+	*x = BeginAuthRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_auth_v1_auth_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *BeginAuthRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*BeginAuthRequest) ProtoMessage() {}
+
+func (x *BeginAuthRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_auth_v1_auth_proto_msgTypes[0]
+	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 BeginAuthRequest.ProtoReflect.Descriptor instead.
+func (*BeginAuthRequest) Descriptor() ([]byte, []int) {
+	return file_auth_v1_auth_proto_rawDescGZIP(), []int{0}
+}
+
+// BeginAuthResponse
+// The return type of BeginAuth, containing the
+// auth_id that will be used for the authentication
+// section
+type BeginAuthResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// auth_id: the ID of this auth session
+	AuthId string `protobuf:"bytes,1,opt,name=auth_id,json=authId,proto3" json:"auth_id,omitempty"`
+}
+
+func (x *BeginAuthResponse) Reset() {
+	*x = BeginAuthResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_auth_v1_auth_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *BeginAuthResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*BeginAuthResponse) ProtoMessage() {}
+
+func (x *BeginAuthResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_auth_v1_auth_proto_msgTypes[1]
+	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 BeginAuthResponse.ProtoReflect.Descriptor instead.
+func (*BeginAuthResponse) Descriptor() ([]byte, []int) {
+	return file_auth_v1_auth_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *BeginAuthResponse) GetAuthId() string {
+	if x != nil {
+		return x.AuthId
+	}
+	return ""
+}
+
+// Session
+// Session contains the information for a new session;
+// the user_id you logged in as and the session_token
+// which should be passed to authorisation
+type Session struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// user_id: the ID of the user you logged in as
+	UserId uint64 `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
+	// session_token: the session token to use in authorization
+	SessionToken string `protobuf:"bytes,2,opt,name=session_token,json=sessionToken,proto3" json:"session_token,omitempty"`
+}
+
+func (x *Session) Reset() {
+	*x = Session{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_auth_v1_auth_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Session) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Session) ProtoMessage() {}
+
+func (x *Session) ProtoReflect() protoreflect.Message {
+	mi := &file_auth_v1_auth_proto_msgTypes[2]
+	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 Session.ProtoReflect.Descriptor instead.
+func (*Session) Descriptor() ([]byte, []int) {
+	return file_auth_v1_auth_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *Session) GetUserId() uint64 {
+	if x != nil {
+		return x.UserId
+	}
+	return 0
+}
+
+func (x *Session) GetSessionToken() string {
+	if x != nil {
+		return x.SessionToken
+	}
+	return ""
+}
+
+// AuthStep
+// A step in the authentication process
+// Contains a variety of different types of views
+// It is recommended to have a fallback_url specified
+// For non-trivial authentication procedures (such as captchas)
+type AuthStep struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// fallback_url: unused
+	FallbackUrl string `protobuf:"bytes,1,opt,name=fallback_url,json=fallbackUrl,proto3" json:"fallback_url,omitempty"`
+	// can_go_back: whether or not the client can request the
+	// server to send the previous step
+	CanGoBack bool `protobuf:"varint,2,opt,name=can_go_back,json=canGoBack,proto3" json:"can_go_back,omitempty"`
+	// step: the current step
+	//
+	// Types that are assignable to Step:
+	//	*AuthStep_Choice_
+	//	*AuthStep_Form_
+	//	*AuthStep_Session
+	//	*AuthStep_Waiting_
+	Step isAuthStep_Step `protobuf_oneof:"step"`
+}
+
+func (x *AuthStep) Reset() {
+	*x = AuthStep{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_auth_v1_auth_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *AuthStep) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*AuthStep) ProtoMessage() {}
+
+func (x *AuthStep) ProtoReflect() protoreflect.Message {
+	mi := &file_auth_v1_auth_proto_msgTypes[3]
+	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 AuthStep.ProtoReflect.Descriptor instead.
+func (*AuthStep) Descriptor() ([]byte, []int) {
+	return file_auth_v1_auth_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *AuthStep) GetFallbackUrl() string {
+	if x != nil {
+		return x.FallbackUrl
+	}
+	return ""
+}
+
+func (x *AuthStep) GetCanGoBack() bool {
+	if x != nil {
+		return x.CanGoBack
+	}
+	return false
+}
+
+func (m *AuthStep) GetStep() isAuthStep_Step {
+	if m != nil {
+		return m.Step
+	}
+	return nil
+}
+
+func (x *AuthStep) GetChoice() *AuthStep_Choice {
+	if x, ok := x.GetStep().(*AuthStep_Choice_); ok {
+		return x.Choice
+	}
+	return nil
+}
+
+func (x *AuthStep) GetForm() *AuthStep_Form {
+	if x, ok := x.GetStep().(*AuthStep_Form_); ok {
+		return x.Form
+	}
+	return nil
+}
+
+func (x *AuthStep) GetSession() *Session {
+	if x, ok := x.GetStep().(*AuthStep_Session); ok {
+		return x.Session
+	}
+	return nil
+}
+
+func (x *AuthStep) GetWaiting() *AuthStep_Waiting {
+	if x, ok := x.GetStep().(*AuthStep_Waiting_); ok {
+		return x.Waiting
+	}
+	return nil
+}
+
+type isAuthStep_Step interface {
+	isAuthStep_Step()
+}
+
+type AuthStep_Choice_ struct {
+	// choice: the user must pick a thing out of a list of options
+	Choice *AuthStep_Choice `protobuf:"bytes,3,opt,name=choice,proto3,oneof"`
+}
+
+type AuthStep_Form_ struct {
+	// form: the user must complete a form
+	Form *AuthStep_Form `protobuf:"bytes,4,opt,name=form,proto3,oneof"`
+}
+
+type AuthStep_Session struct {
+	// session: you've completed auth, and have a session
+	Session *Session `protobuf:"bytes,5,opt,name=session,proto3,oneof"`
+}
+
+type AuthStep_Waiting_ struct {
+	// waiting: you're waiting on something
+	Waiting *AuthStep_Waiting `protobuf:"bytes,6,opt,name=waiting,proto3,oneof"`
+}
+
+func (*AuthStep_Choice_) isAuthStep_Step() {}
+
+func (*AuthStep_Form_) isAuthStep_Step() {}
+
+func (*AuthStep_Session) isAuthStep_Step() {}
+
+func (*AuthStep_Waiting_) isAuthStep_Step() {}
+
+// NextStepRequest
+// contains the client's response to the server's challenge
+// This needs to be called first with no arguments to
+// receive the first step
+type NextStepRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// auth_id: the authentication session you want
+	// the next step of
+	AuthId string `protobuf:"bytes,1,opt,name=auth_id,json=authId,proto3" json:"auth_id,omitempty"`
+	// step: the user's response to a step
+	//
+	// Types that are assignable to Step:
+	//	*NextStepRequest_Choice_
+	//	*NextStepRequest_Form_
+	Step isNextStepRequest_Step `protobuf_oneof:"step"`
+}
+
+func (x *NextStepRequest) Reset() {
+	*x = NextStepRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_auth_v1_auth_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *NextStepRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*NextStepRequest) ProtoMessage() {}
+
+func (x *NextStepRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_auth_v1_auth_proto_msgTypes[4]
+	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 NextStepRequest.ProtoReflect.Descriptor instead.
+func (*NextStepRequest) Descriptor() ([]byte, []int) {
+	return file_auth_v1_auth_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *NextStepRequest) GetAuthId() string {
+	if x != nil {
+		return x.AuthId
+	}
+	return ""
+}
+
+func (m *NextStepRequest) GetStep() isNextStepRequest_Step {
+	if m != nil {
+		return m.Step
+	}
+	return nil
+}
+
+func (x *NextStepRequest) GetChoice() *NextStepRequest_Choice {
+	if x, ok := x.GetStep().(*NextStepRequest_Choice_); ok {
+		return x.Choice
+	}
+	return nil
+}
+
+func (x *NextStepRequest) GetForm() *NextStepRequest_Form {
+	if x, ok := x.GetStep().(*NextStepRequest_Form_); ok {
+		return x.Form
+	}
+	return nil
+}
+
+type isNextStepRequest_Step interface {
+	isNextStepRequest_Step()
+}
+
+type NextStepRequest_Choice_ struct {
+	// choice: the choice the user picked
+	Choice *NextStepRequest_Choice `protobuf:"bytes,2,opt,name=choice,proto3,oneof"`
+}
+
+type NextStepRequest_Form_ struct {
+	// form: the form the user filled out
+	Form *NextStepRequest_Form `protobuf:"bytes,3,opt,name=form,proto3,oneof"`
+}
+
+func (*NextStepRequest_Choice_) isNextStepRequest_Step() {}
+
+func (*NextStepRequest_Form_) isNextStepRequest_Step() {}
+
+// Used in `NextStep` endpoint.
+type NextStepResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// step: the next step in the authentication process
+	Step *AuthStep `protobuf:"bytes,1,opt,name=step,proto3" json:"step,omitempty"`
+}
+
+func (x *NextStepResponse) Reset() {
+	*x = NextStepResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_auth_v1_auth_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *NextStepResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*NextStepResponse) ProtoMessage() {}
+
+func (x *NextStepResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_auth_v1_auth_proto_msgTypes[5]
+	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 NextStepResponse.ProtoReflect.Descriptor instead.
+func (*NextStepResponse) Descriptor() ([]byte, []int) {
+	return file_auth_v1_auth_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *NextStepResponse) GetStep() *AuthStep {
+	if x != nil {
+		return x.Step
+	}
+	return nil
+}
+
+// StepBackRequest
+// A request to go back 1 step
+type StepBackRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// auth_id: the authentication session the user
+	// wants to go back in
+	AuthId string `protobuf:"bytes,1,opt,name=auth_id,json=authId,proto3" json:"auth_id,omitempty"`
+}
+
+func (x *StepBackRequest) Reset() {
+	*x = StepBackRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_auth_v1_auth_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StepBackRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StepBackRequest) ProtoMessage() {}
+
+func (x *StepBackRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_auth_v1_auth_proto_msgTypes[6]
+	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 StepBackRequest.ProtoReflect.Descriptor instead.
+func (*StepBackRequest) Descriptor() ([]byte, []int) {
+	return file_auth_v1_auth_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *StepBackRequest) GetAuthId() string {
+	if x != nil {
+		return x.AuthId
+	}
+	return ""
+}
+
+// Used in `StepBack` endpoint.
+type StepBackResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// step: the previous step in the authentication process
+	Step *AuthStep `protobuf:"bytes,1,opt,name=step,proto3" json:"step,omitempty"`
+}
+
+func (x *StepBackResponse) Reset() {
+	*x = StepBackResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_auth_v1_auth_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StepBackResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StepBackResponse) ProtoMessage() {}
+
+func (x *StepBackResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_auth_v1_auth_proto_msgTypes[7]
+	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 StepBackResponse.ProtoReflect.Descriptor instead.
+func (*StepBackResponse) Descriptor() ([]byte, []int) {
+	return file_auth_v1_auth_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *StepBackResponse) GetStep() *AuthStep {
+	if x != nil {
+		return x.Step
+	}
+	return nil
+}
+
+// StreamStepsRequest
+// Required to be initiated by all authenticating clients
+// Allows the server to send steps
+type StreamStepsRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// auth_id: the authorization session
+	// who's steps you want to stream
+	AuthId string `protobuf:"bytes,1,opt,name=auth_id,json=authId,proto3" json:"auth_id,omitempty"`
+}
+
+func (x *StreamStepsRequest) Reset() {
+	*x = StreamStepsRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_auth_v1_auth_proto_msgTypes[8]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamStepsRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamStepsRequest) ProtoMessage() {}
+
+func (x *StreamStepsRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_auth_v1_auth_proto_msgTypes[8]
+	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 StreamStepsRequest.ProtoReflect.Descriptor instead.
+func (*StreamStepsRequest) Descriptor() ([]byte, []int) {
+	return file_auth_v1_auth_proto_rawDescGZIP(), []int{8}
+}
+
+func (x *StreamStepsRequest) GetAuthId() string {
+	if x != nil {
+		return x.AuthId
+	}
+	return ""
+}
+
+// Used in `StreamSteps` endpoint.
+type StreamStepsResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// step: the next step in the authentication process
+	Step *AuthStep `protobuf:"bytes,1,opt,name=step,proto3" json:"step,omitempty"`
+}
+
+func (x *StreamStepsResponse) Reset() {
+	*x = StreamStepsResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_auth_v1_auth_proto_msgTypes[9]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamStepsResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamStepsResponse) ProtoMessage() {}
+
+func (x *StreamStepsResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_auth_v1_auth_proto_msgTypes[9]
+	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 StreamStepsResponse.ProtoReflect.Descriptor instead.
+func (*StreamStepsResponse) Descriptor() ([]byte, []int) {
+	return file_auth_v1_auth_proto_rawDescGZIP(), []int{9}
+}
+
+func (x *StreamStepsResponse) GetStep() *AuthStep {
+	if x != nil {
+		return x.Step
+	}
+	return nil
+}
+
+// The request to federate with a foreign server.
+type FederateRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The server ID foreign server you want to federate with
+	ServerId string `protobuf:"bytes,1,opt,name=server_id,json=serverId,proto3" json:"server_id,omitempty"`
+}
+
+func (x *FederateRequest) Reset() {
+	*x = FederateRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_auth_v1_auth_proto_msgTypes[10]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *FederateRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*FederateRequest) ProtoMessage() {}
+
+func (x *FederateRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_auth_v1_auth_proto_msgTypes[10]
+	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 FederateRequest.ProtoReflect.Descriptor instead.
+func (*FederateRequest) Descriptor() ([]byte, []int) {
+	return file_auth_v1_auth_proto_rawDescGZIP(), []int{10}
+}
+
+func (x *FederateRequest) GetServerId() string {
+	if x != nil {
+		return x.ServerId
+	}
+	return ""
+}
+
+// The reply to a successful federation request,
+// containing the token you need to present to the
+// foreign server.
+type FederateResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// A `harmonytypes.v1.Token` whose `data` field is a serialized `TokenData` message.
+	// It is signed with the homeserver's private key.
+	Token *v1.Token `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"`
+}
+
+func (x *FederateResponse) Reset() {
+	*x = FederateResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_auth_v1_auth_proto_msgTypes[11]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *FederateResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*FederateResponse) ProtoMessage() {}
+
+func (x *FederateResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_auth_v1_auth_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 FederateResponse.ProtoReflect.Descriptor instead.
+func (*FederateResponse) Descriptor() ([]byte, []int) {
+	return file_auth_v1_auth_proto_rawDescGZIP(), []int{11}
+}
+
+func (x *FederateResponse) GetToken() *v1.Token {
+	if x != nil {
+		return x.Token
+	}
+	return nil
+}
+
+// Used in `Key` endpoint.
+type KeyRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *KeyRequest) Reset() {
+	*x = KeyRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_auth_v1_auth_proto_msgTypes[12]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *KeyRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*KeyRequest) ProtoMessage() {}
+
+func (x *KeyRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_auth_v1_auth_proto_msgTypes[12]
+	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 KeyRequest.ProtoReflect.Descriptor instead.
+func (*KeyRequest) Descriptor() ([]byte, []int) {
+	return file_auth_v1_auth_proto_rawDescGZIP(), []int{12}
+}
+
+// Contains a key's bytes.
+type KeyResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// key: the bytes of the public key.
+	Key []byte `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
+}
+
+func (x *KeyResponse) Reset() {
+	*x = KeyResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_auth_v1_auth_proto_msgTypes[13]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *KeyResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*KeyResponse) ProtoMessage() {}
+
+func (x *KeyResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_auth_v1_auth_proto_msgTypes[13]
+	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 KeyResponse.ProtoReflect.Descriptor instead.
+func (*KeyResponse) Descriptor() ([]byte, []int) {
+	return file_auth_v1_auth_proto_rawDescGZIP(), []int{13}
+}
+
+func (x *KeyResponse) GetKey() []byte {
+	if x != nil {
+		return x.Key
+	}
+	return nil
+}
+
+// Log into a foreignserver using a token
+// from your homeserver, obtained through a FederateRequest
+type LoginFederatedRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// A `harmonytypes.v1.Token` whose `data` field is a serialized `TokenData` message.
+	// It is signed with the homeserver's private key.
+	AuthToken *v1.Token `protobuf:"bytes,1,opt,name=auth_token,json=authToken,proto3" json:"auth_token,omitempty"`
+	// The server ID of the homeserver that the auth token is from
+	ServerId string `protobuf:"bytes,2,opt,name=server_id,json=serverId,proto3" json:"server_id,omitempty"`
+}
+
+func (x *LoginFederatedRequest) Reset() {
+	*x = LoginFederatedRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_auth_v1_auth_proto_msgTypes[14]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *LoginFederatedRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*LoginFederatedRequest) ProtoMessage() {}
+
+func (x *LoginFederatedRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_auth_v1_auth_proto_msgTypes[14]
+	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 LoginFederatedRequest.ProtoReflect.Descriptor instead.
+func (*LoginFederatedRequest) Descriptor() ([]byte, []int) {
+	return file_auth_v1_auth_proto_rawDescGZIP(), []int{14}
+}
+
+func (x *LoginFederatedRequest) GetAuthToken() *v1.Token {
+	if x != nil {
+		return x.AuthToken
+	}
+	return nil
+}
+
+func (x *LoginFederatedRequest) GetServerId() string {
+	if x != nil {
+		return x.ServerId
+	}
+	return ""
+}
+
+// Used in `LoginFederated` endpoint.
+type LoginFederatedResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The user's session.
+	Session *Session `protobuf:"bytes,1,opt,name=session,proto3" json:"session,omitempty"`
+}
+
+func (x *LoginFederatedResponse) Reset() {
+	*x = LoginFederatedResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_auth_v1_auth_proto_msgTypes[15]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *LoginFederatedResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*LoginFederatedResponse) ProtoMessage() {}
+
+func (x *LoginFederatedResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_auth_v1_auth_proto_msgTypes[15]
+	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 LoginFederatedResponse.ProtoReflect.Descriptor instead.
+func (*LoginFederatedResponse) Descriptor() ([]byte, []int) {
+	return file_auth_v1_auth_proto_rawDescGZIP(), []int{15}
+}
+
+func (x *LoginFederatedResponse) GetSession() *Session {
+	if x != nil {
+		return x.Session
+	}
+	return nil
+}
+
+// Information sent by a client's homeserver, in a `harmonytypes.v1.Token`.
+// It will be sent to a foreignserver by the client.
+type TokenData struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The client's user ID on the homeserver.
+	UserId uint64 `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
+	// The foreignserver's server ID.
+	ServerId string `protobuf:"bytes,2,opt,name=server_id,json=serverId,proto3" json:"server_id,omitempty"`
+	// The username of the client.
+	Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"`
+	// The avatar of the client.
+	Avatar *string `protobuf:"bytes,4,opt,name=avatar,proto3,oneof" json:"avatar,omitempty"`
+}
+
+func (x *TokenData) Reset() {
+	*x = TokenData{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_auth_v1_auth_proto_msgTypes[16]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *TokenData) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*TokenData) ProtoMessage() {}
+
+func (x *TokenData) ProtoReflect() protoreflect.Message {
+	mi := &file_auth_v1_auth_proto_msgTypes[16]
+	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 TokenData.ProtoReflect.Descriptor instead.
+func (*TokenData) Descriptor() ([]byte, []int) {
+	return file_auth_v1_auth_proto_rawDescGZIP(), []int{16}
+}
+
+func (x *TokenData) GetUserId() uint64 {
+	if x != nil {
+		return x.UserId
+	}
+	return 0
+}
+
+func (x *TokenData) GetServerId() string {
+	if x != nil {
+		return x.ServerId
+	}
+	return ""
+}
+
+func (x *TokenData) GetUsername() string {
+	if x != nil {
+		return x.Username
+	}
+	return ""
+}
+
+func (x *TokenData) GetAvatar() string {
+	if x != nil && x.Avatar != nil {
+		return *x.Avatar
+	}
+	return ""
+}
+
+// Used in `CheckLoggedIn` endpoint.
+type CheckLoggedInRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *CheckLoggedInRequest) Reset() {
+	*x = CheckLoggedInRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_auth_v1_auth_proto_msgTypes[17]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *CheckLoggedInRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CheckLoggedInRequest) ProtoMessage() {}
+
+func (x *CheckLoggedInRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_auth_v1_auth_proto_msgTypes[17]
+	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 CheckLoggedInRequest.ProtoReflect.Descriptor instead.
+func (*CheckLoggedInRequest) Descriptor() ([]byte, []int) {
+	return file_auth_v1_auth_proto_rawDescGZIP(), []int{17}
+}
+
+// Used in `CheckLoggedIn` endpoint.
+type CheckLoggedInResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *CheckLoggedInResponse) Reset() {
+	*x = CheckLoggedInResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_auth_v1_auth_proto_msgTypes[18]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *CheckLoggedInResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CheckLoggedInResponse) ProtoMessage() {}
+
+func (x *CheckLoggedInResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_auth_v1_auth_proto_msgTypes[18]
+	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 CheckLoggedInResponse.ProtoReflect.Descriptor instead.
+func (*CheckLoggedInResponse) Descriptor() ([]byte, []int) {
+	return file_auth_v1_auth_proto_rawDescGZIP(), []int{18}
+}
+
+// Choice
+// A step which allows the user to choose from a range of options
+// Allows you to show a heading by specifying title
+type AuthStep_Choice struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// title: the title of the list of choices
+	Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"`
+	// options: a list of choices, one of these
+	// should be sent in nextstep
+	Options []string `protobuf:"bytes,2,rep,name=options,proto3" json:"options,omitempty"`
+}
+
+func (x *AuthStep_Choice) Reset() {
+	*x = AuthStep_Choice{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_auth_v1_auth_proto_msgTypes[19]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *AuthStep_Choice) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*AuthStep_Choice) ProtoMessage() {}
+
+func (x *AuthStep_Choice) ProtoReflect() protoreflect.Message {
+	mi := &file_auth_v1_auth_proto_msgTypes[19]
+	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 AuthStep_Choice.ProtoReflect.Descriptor instead.
+func (*AuthStep_Choice) Descriptor() ([]byte, []int) {
+	return file_auth_v1_auth_proto_rawDescGZIP(), []int{3, 0}
+}
+
+func (x *AuthStep_Choice) GetTitle() string {
+	if x != nil {
+		return x.Title
+	}
+	return ""
+}
+
+func (x *AuthStep_Choice) GetOptions() []string {
+	if x != nil {
+		return x.Options
+	}
+	return nil
+}
+
+// Form
+// A step which requires the user to input information
+// Allows you to show a heading by specifying title
+type AuthStep_Form struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// title: the title of this form
+	Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"`
+	// fields: all the fields in this form
+	Fields []*AuthStep_Form_FormField `protobuf:"bytes,2,rep,name=fields,proto3" json:"fields,omitempty"`
+}
+
+func (x *AuthStep_Form) Reset() {
+	*x = AuthStep_Form{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_auth_v1_auth_proto_msgTypes[20]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *AuthStep_Form) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*AuthStep_Form) ProtoMessage() {}
+
+func (x *AuthStep_Form) ProtoReflect() protoreflect.Message {
+	mi := &file_auth_v1_auth_proto_msgTypes[20]
+	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 AuthStep_Form.ProtoReflect.Descriptor instead.
+func (*AuthStep_Form) Descriptor() ([]byte, []int) {
+	return file_auth_v1_auth_proto_rawDescGZIP(), []int{3, 1}
+}
+
+func (x *AuthStep_Form) GetTitle() string {
+	if x != nil {
+		return x.Title
+	}
+	return ""
+}
+
+func (x *AuthStep_Form) GetFields() []*AuthStep_Form_FormField {
+	if x != nil {
+		return x.Fields
+	}
+	return nil
+}
+
+// Waiting
+// A step which requires the user to perform an external action
+// The title and description should explain to the user
+// what they should do to complete this step
+type AuthStep_Waiting struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// title: the title of this waiting screen
+	Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"`
+	// description: the explanation of what's being waited on
+	Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"`
+}
+
+func (x *AuthStep_Waiting) Reset() {
+	*x = AuthStep_Waiting{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_auth_v1_auth_proto_msgTypes[21]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *AuthStep_Waiting) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*AuthStep_Waiting) ProtoMessage() {}
+
+func (x *AuthStep_Waiting) ProtoReflect() protoreflect.Message {
+	mi := &file_auth_v1_auth_proto_msgTypes[21]
+	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 AuthStep_Waiting.ProtoReflect.Descriptor instead.
+func (*AuthStep_Waiting) Descriptor() ([]byte, []int) {
+	return file_auth_v1_auth_proto_rawDescGZIP(), []int{3, 2}
+}
+
+func (x *AuthStep_Waiting) GetTitle() string {
+	if x != nil {
+		return x.Title
+	}
+	return ""
+}
+
+func (x *AuthStep_Waiting) GetDescription() string {
+	if x != nil {
+		return x.Description
+	}
+	return ""
+}
+
+// FormField
+// A field in the form, containing information on how it should
+// be rendered
+// Here is a list of form types that need to be supported:
+// email: a field type that has to contain a valid email
+// password: a field type that has to contain a password
+// new-password: a field type for new passwords
+// text: a field type that has to contain text
+// number: a field type that has to contain a number
+type AuthStep_Form_FormField struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// name: the identifier for the form field
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	// type: the type of the form field, as documented above
+	Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"`
+}
+
+func (x *AuthStep_Form_FormField) Reset() {
+	*x = AuthStep_Form_FormField{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_auth_v1_auth_proto_msgTypes[22]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *AuthStep_Form_FormField) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*AuthStep_Form_FormField) ProtoMessage() {}
+
+func (x *AuthStep_Form_FormField) ProtoReflect() protoreflect.Message {
+	mi := &file_auth_v1_auth_proto_msgTypes[22]
+	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 AuthStep_Form_FormField.ProtoReflect.Descriptor instead.
+func (*AuthStep_Form_FormField) Descriptor() ([]byte, []int) {
+	return file_auth_v1_auth_proto_rawDescGZIP(), []int{3, 1, 0}
+}
+
+func (x *AuthStep_Form_FormField) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *AuthStep_Form_FormField) GetType() string {
+	if x != nil {
+		return x.Type
+	}
+	return ""
+}
+
+// A simple choice string indicating which option the user chose
+type NextStepRequest_Choice struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// choice: the choice the user picked
+	Choice string `protobuf:"bytes,1,opt,name=choice,proto3" json:"choice,omitempty"`
+}
+
+func (x *NextStepRequest_Choice) Reset() {
+	*x = NextStepRequest_Choice{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_auth_v1_auth_proto_msgTypes[23]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *NextStepRequest_Choice) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*NextStepRequest_Choice) ProtoMessage() {}
+
+func (x *NextStepRequest_Choice) ProtoReflect() protoreflect.Message {
+	mi := &file_auth_v1_auth_proto_msgTypes[23]
+	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 NextStepRequest_Choice.ProtoReflect.Descriptor instead.
+func (*NextStepRequest_Choice) Descriptor() ([]byte, []int) {
+	return file_auth_v1_auth_proto_rawDescGZIP(), []int{4, 0}
+}
+
+func (x *NextStepRequest_Choice) GetChoice() string {
+	if x != nil {
+		return x.Choice
+	}
+	return ""
+}
+
+// Form fields can either be bytes, string, or int64.
+type NextStepRequest_FormFields struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// field: the data for a form field
+	//
+	// Types that are assignable to Field:
+	//	*NextStepRequest_FormFields_Bytes
+	//	*NextStepRequest_FormFields_String_
+	//	*NextStepRequest_FormFields_Number
+	Field isNextStepRequest_FormFields_Field `protobuf_oneof:"field"`
+}
+
+func (x *NextStepRequest_FormFields) Reset() {
+	*x = NextStepRequest_FormFields{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_auth_v1_auth_proto_msgTypes[24]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *NextStepRequest_FormFields) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*NextStepRequest_FormFields) ProtoMessage() {}
+
+func (x *NextStepRequest_FormFields) ProtoReflect() protoreflect.Message {
+	mi := &file_auth_v1_auth_proto_msgTypes[24]
+	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 NextStepRequest_FormFields.ProtoReflect.Descriptor instead.
+func (*NextStepRequest_FormFields) Descriptor() ([]byte, []int) {
+	return file_auth_v1_auth_proto_rawDescGZIP(), []int{4, 1}
+}
+
+func (m *NextStepRequest_FormFields) GetField() isNextStepRequest_FormFields_Field {
+	if m != nil {
+		return m.Field
+	}
+	return nil
+}
+
+func (x *NextStepRequest_FormFields) GetBytes() []byte {
+	if x, ok := x.GetField().(*NextStepRequest_FormFields_Bytes); ok {
+		return x.Bytes
+	}
+	return nil
+}
+
+func (x *NextStepRequest_FormFields) GetString_() string {
+	if x, ok := x.GetField().(*NextStepRequest_FormFields_String_); ok {
+		return x.String_
+	}
+	return ""
+}
+
+func (x *NextStepRequest_FormFields) GetNumber() int64 {
+	if x, ok := x.GetField().(*NextStepRequest_FormFields_Number); ok {
+		return x.Number
+	}
+	return 0
+}
+
+type isNextStepRequest_FormFields_Field interface {
+	isNextStepRequest_FormFields_Field()
+}
+
+type NextStepRequest_FormFields_Bytes struct {
+	// bytes: the form field's data is a byte array
+	Bytes []byte `protobuf:"bytes,1,opt,name=bytes,proto3,oneof"`
+}
+
+type NextStepRequest_FormFields_String_ struct {
+	// string: the form field's data is a string
+	String_ string `protobuf:"bytes,2,opt,name=string,proto3,oneof"`
+}
+
+type NextStepRequest_FormFields_Number struct {
+	// number: the form field's data is a number
+	Number int64 `protobuf:"varint,3,opt,name=number,proto3,oneof"`
+}
+
+func (*NextStepRequest_FormFields_Bytes) isNextStepRequest_FormFields_Field() {}
+
+func (*NextStepRequest_FormFields_String_) isNextStepRequest_FormFields_Field() {}
+
+func (*NextStepRequest_FormFields_Number) isNextStepRequest_FormFields_Field() {}
+
+// An array of form fields, in the same order they came in from the server
+type NextStepRequest_Form struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// fields: the fields the user filled out
+	Fields []*NextStepRequest_FormFields `protobuf:"bytes,1,rep,name=fields,proto3" json:"fields,omitempty"`
+}
+
+func (x *NextStepRequest_Form) Reset() {
+	*x = NextStepRequest_Form{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_auth_v1_auth_proto_msgTypes[25]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *NextStepRequest_Form) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*NextStepRequest_Form) ProtoMessage() {}
+
+func (x *NextStepRequest_Form) ProtoReflect() protoreflect.Message {
+	mi := &file_auth_v1_auth_proto_msgTypes[25]
+	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 NextStepRequest_Form.ProtoReflect.Descriptor instead.
+func (*NextStepRequest_Form) Descriptor() ([]byte, []int) {
+	return file_auth_v1_auth_proto_rawDescGZIP(), []int{4, 2}
+}
+
+func (x *NextStepRequest_Form) GetFields() []*NextStepRequest_FormFields {
+	if x != nil {
+		return x.Fields
+	}
+	return nil
+}
+
+var File_auth_v1_auth_proto protoreflect.FileDescriptor
+
+var file_auth_v1_auth_proto_rawDesc = []byte{
+	0x0a, 0x12, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x12, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x61,
+	0x75, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x1a, 0x1b, 0x68, 0x61, 0x72, 0x6d, 0x6f, 0x6e, 0x79, 0x74,
+	0x79, 0x70, 0x65, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x22, 0x12, 0x0a, 0x10, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x41, 0x75, 0x74, 0x68,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x2c, 0x0a, 0x11, 0x42, 0x65, 0x67, 0x69, 0x6e,
+	0x41, 0x75, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x17, 0x0a, 0x07,
+	0x61, 0x75, 0x74, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61,
+	0x75, 0x74, 0x68, 0x49, 0x64, 0x22, 0x47, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e,
+	0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x04, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x65, 0x73,
+	0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xd4,
+	0x04, 0x0a, 0x08, 0x41, 0x75, 0x74, 0x68, 0x53, 0x74, 0x65, 0x70, 0x12, 0x21, 0x0a, 0x0c, 0x66,
+	0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x0b, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x55, 0x72, 0x6c, 0x12, 0x1e,
+	0x0a, 0x0b, 0x63, 0x61, 0x6e, 0x5f, 0x67, 0x6f, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x61, 0x6e, 0x47, 0x6f, 0x42, 0x61, 0x63, 0x6b, 0x12, 0x3b,
+	0x0a, 0x06, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x76,
+	0x31, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x53, 0x74, 0x65, 0x70, 0x2e, 0x43, 0x68, 0x6f, 0x69, 0x63,
+	0x65, 0x48, 0x00, 0x52, 0x06, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x12, 0x35, 0x0a, 0x04, 0x66,
+	0x6f, 0x72, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74,
+	0x68, 0x53, 0x74, 0x65, 0x70, 0x2e, 0x46, 0x6f, 0x72, 0x6d, 0x48, 0x00, 0x52, 0x04, 0x66, 0x6f,
+	0x72, 0x6d, 0x12, 0x35, 0x0a, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x61,
+	0x75, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x00,
+	0x52, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x07, 0x77, 0x61, 0x69,
+	0x74, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75,
+	0x74, 0x68, 0x53, 0x74, 0x65, 0x70, 0x2e, 0x57, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x48, 0x00,
+	0x52, 0x07, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x1a, 0x38, 0x0a, 0x06, 0x43, 0x68, 0x6f,
+	0x69, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x70, 0x74,
+	0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69,
+	0x6f, 0x6e, 0x73, 0x1a, 0x94, 0x01, 0x0a, 0x04, 0x46, 0x6f, 0x72, 0x6d, 0x12, 0x14, 0x0a, 0x05,
+	0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74,
+	0x6c, 0x65, 0x12, 0x41, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03,
+	0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x61, 0x75,
+	0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x53, 0x74, 0x65, 0x70, 0x2e, 0x46,
+	0x6f, 0x72, 0x6d, 0x2e, 0x46, 0x6f, 0x72, 0x6d, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x06, 0x66,
+	0x69, 0x65, 0x6c, 0x64, 0x73, 0x1a, 0x33, 0x0a, 0x09, 0x46, 0x6f, 0x72, 0x6d, 0x46, 0x69, 0x65,
+	0x6c, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x1a, 0x41, 0x0a, 0x07, 0x57, 0x61,
+	0x69, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64,
+	0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x06, 0x0a,
+	0x04, 0x73, 0x74, 0x65, 0x70, 0x22, 0x87, 0x03, 0x0a, 0x0f, 0x4e, 0x65, 0x78, 0x74, 0x53, 0x74,
+	0x65, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x61, 0x75, 0x74,
+	0x68, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x75, 0x74, 0x68,
+	0x49, 0x64, 0x12, 0x42, 0x0a, 0x06, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x61, 0x75,
+	0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x65, 0x78, 0x74, 0x53, 0x74, 0x65, 0x70, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x48, 0x00, 0x52, 0x06,
+	0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x12, 0x3c, 0x0a, 0x04, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x03,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e,
+	0x61, 0x75, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x65, 0x78, 0x74, 0x53, 0x74, 0x65, 0x70,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x6f, 0x72, 0x6d, 0x48, 0x00, 0x52, 0x04,
+	0x66, 0x6f, 0x72, 0x6d, 0x1a, 0x20, 0x0a, 0x06, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x12, 0x16,
+	0x0a, 0x06, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
+	0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x1a, 0x61, 0x0a, 0x0a, 0x46, 0x6f, 0x72, 0x6d, 0x46, 0x69,
+	0x65, 0x6c, 0x64, 0x73, 0x12, 0x16, 0x0a, 0x05, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x05, 0x62, 0x79, 0x74, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x06,
+	0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06,
+	0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x18, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72,
+	0x42, 0x07, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x1a, 0x4c, 0x0a, 0x04, 0x46, 0x6f, 0x72,
+	0x6d, 0x12, 0x44, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28,
+	0x0b, 0x32, 0x2c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x61, 0x75, 0x74,
+	0x68, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x65, 0x78, 0x74, 0x53, 0x74, 0x65, 0x70, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x6f, 0x72, 0x6d, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x52,
+	0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x42, 0x06, 0x0a, 0x04, 0x73, 0x74, 0x65, 0x70, 0x22,
+	0x42, 0x0a, 0x10, 0x4e, 0x65, 0x78, 0x74, 0x53, 0x74, 0x65, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x04, 0x73, 0x74, 0x65, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x61, 0x75, 0x74,
+	0x68, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x53, 0x74, 0x65, 0x70, 0x52, 0x04, 0x73,
+	0x74, 0x65, 0x70, 0x22, 0x2a, 0x0a, 0x0f, 0x53, 0x74, 0x65, 0x70, 0x42, 0x61, 0x63, 0x6b, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x69,
+	0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x75, 0x74, 0x68, 0x49, 0x64, 0x22,
+	0x42, 0x0a, 0x10, 0x53, 0x74, 0x65, 0x70, 0x42, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x04, 0x73, 0x74, 0x65, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x61, 0x75, 0x74,
+	0x68, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x53, 0x74, 0x65, 0x70, 0x52, 0x04, 0x73,
+	0x74, 0x65, 0x70, 0x22, 0x2d, 0x0a, 0x12, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x65,
+	0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x61, 0x75, 0x74,
+	0x68, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x75, 0x74, 0x68,
+	0x49, 0x64, 0x22, 0x45, 0x0a, 0x13, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x65, 0x70,
+	0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x04, 0x73, 0x74, 0x65,
+	0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63,
+	0x6f, 0x6c, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x53,
+	0x74, 0x65, 0x70, 0x52, 0x04, 0x73, 0x74, 0x65, 0x70, 0x22, 0x2e, 0x0a, 0x0f, 0x46, 0x65, 0x64,
+	0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09,
+	0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x08, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x64, 0x22, 0x49, 0x0a, 0x10, 0x46, 0x65, 0x64,
+	0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a,
+	0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x68, 0x61, 0x72, 0x6d, 0x6f, 0x6e, 0x79, 0x74,
+	0x79, 0x70, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x05, 0x74,
+	0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x0c, 0x0a, 0x0a, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x22, 0x1f, 0x0a, 0x0b, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03,
+	0x6b, 0x65, 0x79, 0x22, 0x74, 0x0a, 0x15, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x46, 0x65, 0x64, 0x65,
+	0x72, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x0a,
+	0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x68, 0x61, 0x72, 0x6d,
+	0x6f, 0x6e, 0x79, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x6b, 0x65,
+	0x6e, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1b, 0x0a, 0x09,
+	0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x08, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x64, 0x22, 0x4d, 0x0a, 0x16, 0x4c, 0x6f, 0x67,
+	0x69, 0x6e, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e,
+	0x61, 0x75, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52,
+	0x07, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x85, 0x01, 0x0a, 0x09, 0x54, 0x6f, 0x6b,
+	0x65, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69,
+	0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12,
+	0x1b, 0x0a, 0x09, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08,
+	0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,
+	0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x06, 0x61, 0x76, 0x61, 0x74,
+	0x61, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x61, 0x76, 0x61, 0x74,
+	0x61, 0x72, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72,
+	0x22, 0x16, 0x0a, 0x14, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x4c, 0x6f, 0x67, 0x67, 0x65, 0x64, 0x49,
+	0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x17, 0x0a, 0x15, 0x43, 0x68, 0x65, 0x63,
+	0x6b, 0x4c, 0x6f, 0x67, 0x67, 0x65, 0x64, 0x49, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x32, 0xcc, 0x05, 0x0a, 0x0b, 0x41, 0x75, 0x74, 0x68, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,
+	0x65, 0x12, 0x51, 0x0a, 0x08, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x21, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x76, 0x31,
+	0x2e, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x22, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x61, 0x75, 0x74, 0x68,
+	0x2e, 0x76, 0x31, 0x2e, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x63, 0x0a, 0x0e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x46, 0x65, 0x64,
+	0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x12, 0x27, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f,
+	0x6c, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x46,
+	0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+	0x28, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e,
+	0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x65,
+	0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x03, 0x4b, 0x65, 0x79,
+	0x12, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x61, 0x75, 0x74, 0x68,
+	0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x76,
+	0x31, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54, 0x0a,
+	0x09, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x41, 0x75, 0x74, 0x68, 0x12, 0x22, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x65,
+	0x67, 0x69, 0x6e, 0x41, 0x75, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x76,
+	0x31, 0x2e, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x41, 0x75, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x08, 0x4e, 0x65, 0x78, 0x74, 0x53, 0x74, 0x65, 0x70, 0x12,
+	0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e,
+	0x76, 0x31, 0x2e, 0x4e, 0x65, 0x78, 0x74, 0x53, 0x74, 0x65, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x1a, 0x22, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x61, 0x75,
+	0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x65, 0x78, 0x74, 0x53, 0x74, 0x65, 0x70, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x08, 0x53, 0x74, 0x65, 0x70, 0x42, 0x61,
+	0x63, 0x6b, 0x12, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x61, 0x75,
+	0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x65, 0x70, 0x42, 0x61, 0x63, 0x6b, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c,
+	0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x65, 0x70, 0x42, 0x61, 0x63,
+	0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x0b, 0x53, 0x74, 0x72,
+	0x65, 0x61, 0x6d, 0x53, 0x74, 0x65, 0x70, 0x73, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x63, 0x6f, 0x6c, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65,
+	0x61, 0x6d, 0x53, 0x74, 0x65, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x76,
+	0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x65, 0x70, 0x73, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x67, 0x0a, 0x0d, 0x43, 0x68, 0x65, 0x63, 0x6b,
+	0x4c, 0x6f, 0x67, 0x67, 0x65, 0x64, 0x49, 0x6e, 0x12, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x63, 0x6f, 0x6c, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63,
+	0x6b, 0x4c, 0x6f, 0x67, 0x67, 0x65, 0x64, 0x49, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x27, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x61, 0x75, 0x74, 0x68,
+	0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x4c, 0x6f, 0x67, 0x67, 0x65, 0x64, 0x49,
+	0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x05, 0x9a, 0x44, 0x02, 0x08, 0x01,
+	0x42, 0xbf, 0x01, 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f,
+	0x6c, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x42, 0x09, 0x41, 0x75, 0x74, 0x68, 0x50,
+	0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63,
+	0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x72, 0x6d, 0x6f, 0x6e, 0x79, 0x2d, 0x64, 0x65, 0x76, 0x65, 0x6c,
+	0x6f, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x73, 0x68, 0x69, 0x62, 0x73, 0x68, 0x69, 0x62, 0x2f,
+	0x67, 0x65, 0x6e, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x75, 0x74, 0x68,
+	0x76, 0x31, 0xa2, 0x02, 0x03, 0x50, 0x41, 0x58, 0xaa, 0x02, 0x10, 0x50, 0x72, 0x6f, 0x74, 0x6f,
+	0x63, 0x6f, 0x6c, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x10, 0x50, 0x72,
+	0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5c, 0x41, 0x75, 0x74, 0x68, 0x5c, 0x56, 0x31, 0xe2, 0x02,
+	0x1c, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5c, 0x41, 0x75, 0x74, 0x68, 0x5c, 0x56,
+	0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x12,
+	0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x3a, 0x3a, 0x41, 0x75, 0x74, 0x68, 0x3a, 0x3a,
+	0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_auth_v1_auth_proto_rawDescOnce sync.Once
+	file_auth_v1_auth_proto_rawDescData = file_auth_v1_auth_proto_rawDesc
+)
+
+func file_auth_v1_auth_proto_rawDescGZIP() []byte {
+	file_auth_v1_auth_proto_rawDescOnce.Do(func() {
+		file_auth_v1_auth_proto_rawDescData = protoimpl.X.CompressGZIP(file_auth_v1_auth_proto_rawDescData)
+	})
+	return file_auth_v1_auth_proto_rawDescData
+}
+
+var file_auth_v1_auth_proto_msgTypes = make([]protoimpl.MessageInfo, 26)
+var file_auth_v1_auth_proto_goTypes = []interface{}{
+	(*BeginAuthRequest)(nil),           // 0: protocol.auth.v1.BeginAuthRequest
+	(*BeginAuthResponse)(nil),          // 1: protocol.auth.v1.BeginAuthResponse
+	(*Session)(nil),                    // 2: protocol.auth.v1.Session
+	(*AuthStep)(nil),                   // 3: protocol.auth.v1.AuthStep
+	(*NextStepRequest)(nil),            // 4: protocol.auth.v1.NextStepRequest
+	(*NextStepResponse)(nil),           // 5: protocol.auth.v1.NextStepResponse
+	(*StepBackRequest)(nil),            // 6: protocol.auth.v1.StepBackRequest
+	(*StepBackResponse)(nil),           // 7: protocol.auth.v1.StepBackResponse
+	(*StreamStepsRequest)(nil),         // 8: protocol.auth.v1.StreamStepsRequest
+	(*StreamStepsResponse)(nil),        // 9: protocol.auth.v1.StreamStepsResponse
+	(*FederateRequest)(nil),            // 10: protocol.auth.v1.FederateRequest
+	(*FederateResponse)(nil),           // 11: protocol.auth.v1.FederateResponse
+	(*KeyRequest)(nil),                 // 12: protocol.auth.v1.KeyRequest
+	(*KeyResponse)(nil),                // 13: protocol.auth.v1.KeyResponse
+	(*LoginFederatedRequest)(nil),      // 14: protocol.auth.v1.LoginFederatedRequest
+	(*LoginFederatedResponse)(nil),     // 15: protocol.auth.v1.LoginFederatedResponse
+	(*TokenData)(nil),                  // 16: protocol.auth.v1.TokenData
+	(*CheckLoggedInRequest)(nil),       // 17: protocol.auth.v1.CheckLoggedInRequest
+	(*CheckLoggedInResponse)(nil),      // 18: protocol.auth.v1.CheckLoggedInResponse
+	(*AuthStep_Choice)(nil),            // 19: protocol.auth.v1.AuthStep.Choice
+	(*AuthStep_Form)(nil),              // 20: protocol.auth.v1.AuthStep.Form
+	(*AuthStep_Waiting)(nil),           // 21: protocol.auth.v1.AuthStep.Waiting
+	(*AuthStep_Form_FormField)(nil),    // 22: protocol.auth.v1.AuthStep.Form.FormField
+	(*NextStepRequest_Choice)(nil),     // 23: protocol.auth.v1.NextStepRequest.Choice
+	(*NextStepRequest_FormFields)(nil), // 24: protocol.auth.v1.NextStepRequest.FormFields
+	(*NextStepRequest_Form)(nil),       // 25: protocol.auth.v1.NextStepRequest.Form
+	(*v1.Token)(nil),                   // 26: protocol.harmonytypes.v1.Token
+}
+var file_auth_v1_auth_proto_depIdxs = []int32{
+	19, // 0: protocol.auth.v1.AuthStep.choice:type_name -> protocol.auth.v1.AuthStep.Choice
+	20, // 1: protocol.auth.v1.AuthStep.form:type_name -> protocol.auth.v1.AuthStep.Form
+	2,  // 2: protocol.auth.v1.AuthStep.session:type_name -> protocol.auth.v1.Session
+	21, // 3: protocol.auth.v1.AuthStep.waiting:type_name -> protocol.auth.v1.AuthStep.Waiting
+	23, // 4: protocol.auth.v1.NextStepRequest.choice:type_name -> protocol.auth.v1.NextStepRequest.Choice
+	25, // 5: protocol.auth.v1.NextStepRequest.form:type_name -> protocol.auth.v1.NextStepRequest.Form
+	3,  // 6: protocol.auth.v1.NextStepResponse.step:type_name -> protocol.auth.v1.AuthStep
+	3,  // 7: protocol.auth.v1.StepBackResponse.step:type_name -> protocol.auth.v1.AuthStep
+	3,  // 8: protocol.auth.v1.StreamStepsResponse.step:type_name -> protocol.auth.v1.AuthStep
+	26, // 9: protocol.auth.v1.FederateResponse.token:type_name -> protocol.harmonytypes.v1.Token
+	26, // 10: protocol.auth.v1.LoginFederatedRequest.auth_token:type_name -> protocol.harmonytypes.v1.Token
+	2,  // 11: protocol.auth.v1.LoginFederatedResponse.session:type_name -> protocol.auth.v1.Session
+	22, // 12: protocol.auth.v1.AuthStep.Form.fields:type_name -> protocol.auth.v1.AuthStep.Form.FormField
+	24, // 13: protocol.auth.v1.NextStepRequest.Form.fields:type_name -> protocol.auth.v1.NextStepRequest.FormFields
+	10, // 14: protocol.auth.v1.AuthService.Federate:input_type -> protocol.auth.v1.FederateRequest
+	14, // 15: protocol.auth.v1.AuthService.LoginFederated:input_type -> protocol.auth.v1.LoginFederatedRequest
+	12, // 16: protocol.auth.v1.AuthService.Key:input_type -> protocol.auth.v1.KeyRequest
+	0,  // 17: protocol.auth.v1.AuthService.BeginAuth:input_type -> protocol.auth.v1.BeginAuthRequest
+	4,  // 18: protocol.auth.v1.AuthService.NextStep:input_type -> protocol.auth.v1.NextStepRequest
+	6,  // 19: protocol.auth.v1.AuthService.StepBack:input_type -> protocol.auth.v1.StepBackRequest
+	8,  // 20: protocol.auth.v1.AuthService.StreamSteps:input_type -> protocol.auth.v1.StreamStepsRequest
+	17, // 21: protocol.auth.v1.AuthService.CheckLoggedIn:input_type -> protocol.auth.v1.CheckLoggedInRequest
+	11, // 22: protocol.auth.v1.AuthService.Federate:output_type -> protocol.auth.v1.FederateResponse
+	15, // 23: protocol.auth.v1.AuthService.LoginFederated:output_type -> protocol.auth.v1.LoginFederatedResponse
+	13, // 24: protocol.auth.v1.AuthService.Key:output_type -> protocol.auth.v1.KeyResponse
+	1,  // 25: protocol.auth.v1.AuthService.BeginAuth:output_type -> protocol.auth.v1.BeginAuthResponse
+	5,  // 26: protocol.auth.v1.AuthService.NextStep:output_type -> protocol.auth.v1.NextStepResponse
+	7,  // 27: protocol.auth.v1.AuthService.StepBack:output_type -> protocol.auth.v1.StepBackResponse
+	9,  // 28: protocol.auth.v1.AuthService.StreamSteps:output_type -> protocol.auth.v1.StreamStepsResponse
+	18, // 29: protocol.auth.v1.AuthService.CheckLoggedIn:output_type -> protocol.auth.v1.CheckLoggedInResponse
+	22, // [22:30] is the sub-list for method output_type
+	14, // [14:22] is the sub-list for method input_type
+	14, // [14:14] is the sub-list for extension type_name
+	14, // [14:14] is the sub-list for extension extendee
+	0,  // [0:14] is the sub-list for field type_name
+}
+
+func init() { file_auth_v1_auth_proto_init() }
+func file_auth_v1_auth_proto_init() {
+	if File_auth_v1_auth_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_auth_v1_auth_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*BeginAuthRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_auth_v1_auth_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*BeginAuthResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_auth_v1_auth_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Session); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_auth_v1_auth_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*AuthStep); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_auth_v1_auth_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*NextStepRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_auth_v1_auth_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*NextStepResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_auth_v1_auth_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StepBackRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_auth_v1_auth_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StepBackResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_auth_v1_auth_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamStepsRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_auth_v1_auth_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamStepsResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_auth_v1_auth_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*FederateRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_auth_v1_auth_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*FederateResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_auth_v1_auth_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*KeyRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_auth_v1_auth_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*KeyResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_auth_v1_auth_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*LoginFederatedRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_auth_v1_auth_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*LoginFederatedResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_auth_v1_auth_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*TokenData); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_auth_v1_auth_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*CheckLoggedInRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_auth_v1_auth_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*CheckLoggedInResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_auth_v1_auth_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*AuthStep_Choice); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_auth_v1_auth_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*AuthStep_Form); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_auth_v1_auth_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*AuthStep_Waiting); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_auth_v1_auth_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*AuthStep_Form_FormField); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_auth_v1_auth_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*NextStepRequest_Choice); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_auth_v1_auth_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*NextStepRequest_FormFields); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_auth_v1_auth_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*NextStepRequest_Form); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	file_auth_v1_auth_proto_msgTypes[3].OneofWrappers = []interface{}{
+		(*AuthStep_Choice_)(nil),
+		(*AuthStep_Form_)(nil),
+		(*AuthStep_Session)(nil),
+		(*AuthStep_Waiting_)(nil),
+	}
+	file_auth_v1_auth_proto_msgTypes[4].OneofWrappers = []interface{}{
+		(*NextStepRequest_Choice_)(nil),
+		(*NextStepRequest_Form_)(nil),
+	}
+	file_auth_v1_auth_proto_msgTypes[16].OneofWrappers = []interface{}{}
+	file_auth_v1_auth_proto_msgTypes[24].OneofWrappers = []interface{}{
+		(*NextStepRequest_FormFields_Bytes)(nil),
+		(*NextStepRequest_FormFields_String_)(nil),
+		(*NextStepRequest_FormFields_Number)(nil),
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_auth_v1_auth_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   26,
+			NumExtensions: 0,
+			NumServices:   1,
+		},
+		GoTypes:           file_auth_v1_auth_proto_goTypes,
+		DependencyIndexes: file_auth_v1_auth_proto_depIdxs,
+		MessageInfos:      file_auth_v1_auth_proto_msgTypes,
+	}.Build()
+	File_auth_v1_auth_proto = out.File
+	file_auth_v1_auth_proto_rawDesc = nil
+	file_auth_v1_auth_proto_goTypes = nil
+	file_auth_v1_auth_proto_depIdxs = nil
+}
diff --git a/vendor/github.com/harmony-development/shibshib/gen/auth/v1/auth_hrpc_client.pb.go b/vendor/github.com/harmony-development/shibshib/gen/auth/v1/auth_hrpc_client.pb.go
new file mode 100644
index 00000000..c8b96885
--- /dev/null
+++ b/vendor/github.com/harmony-development/shibshib/gen/auth/v1/auth_hrpc_client.pb.go
@@ -0,0 +1,416 @@
+// Code generated by protoc-gen-go-hrpc. DO NOT EDIT.
+
+package authv1
+
+import (
+	bytes "bytes"
+	context "context"
+	errors "errors"
+	proto "google.golang.org/protobuf/proto"
+	ioutil "io/ioutil"
+	http "net/http"
+	httptest "net/http/httptest"
+)
+
+type AuthServiceClient interface {
+	// Federate with a foreignserver, obtaining a token
+	// you can use to call LoginFederated on it
+	Federate(context.Context, *FederateRequest) (*FederateResponse, error)
+	// Present a token to a foreignserver from a Federate call
+	// on your homeserver in order to login
+	LoginFederated(context.Context, *LoginFederatedRequest) (*LoginFederatedResponse, error)
+	// Returns the public key of this server
+	Key(context.Context, *KeyRequest) (*KeyResponse, error)
+	// Begins an authentication session
+	BeginAuth(context.Context, *BeginAuthRequest) (*BeginAuthResponse, error)
+	// Goes to the next step of the authentication session,
+	// possibly presenting user input
+	NextStep(context.Context, *NextStepRequest) (*NextStepResponse, error)
+	// Goes to the previous step of the authentication session
+	// if possible
+	StepBack(context.Context, *StepBackRequest) (*StepBackResponse, error)
+	// Consume the steps of an authentication session
+	// as a stream
+	StreamSteps(context.Context, chan *StreamStepsRequest) (chan *StreamStepsResponse, error)
+	// Check whether or not you're logged in and the session is valid
+	CheckLoggedIn(context.Context, *CheckLoggedInRequest) (*CheckLoggedInResponse, error)
+}
+
+type HTTPAuthServiceClient struct {
+	Client         http.Client
+	BaseURL        string
+	WebsocketProto string
+	WebsocketHost  string
+	Header         http.Header
+}
+
+func (client *HTTPAuthServiceClient) Federate(req *FederateRequest) (*FederateResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.auth.v1.AuthService/Federate", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &FederateResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPAuthServiceClient) LoginFederated(req *LoginFederatedRequest) (*LoginFederatedResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.auth.v1.AuthService/LoginFederated", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &LoginFederatedResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPAuthServiceClient) Key(req *KeyRequest) (*KeyResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.auth.v1.AuthService/Key", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &KeyResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPAuthServiceClient) BeginAuth(req *BeginAuthRequest) (*BeginAuthResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.auth.v1.AuthService/BeginAuth", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &BeginAuthResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPAuthServiceClient) NextStep(req *NextStepRequest) (*NextStepResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.auth.v1.AuthService/NextStep", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &NextStepResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPAuthServiceClient) StepBack(req *StepBackRequest) (*StepBackResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.auth.v1.AuthService/StepBack", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &StepBackResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPAuthServiceClient) StreamSteps(req *StreamStepsRequest) (chan *StreamStepsResponse, error) {
+	return nil, errors.New("unimplemented")
+}
+func (client *HTTPAuthServiceClient) CheckLoggedIn(req *CheckLoggedInRequest) (*CheckLoggedInResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.auth.v1.AuthService/CheckLoggedIn", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &CheckLoggedInResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+
+type HTTPTestAuthServiceClient struct {
+	Client interface {
+		Test(*http.Request, ...int) (*http.Response, error)
+	}
+}
+
+func (client *HTTPTestAuthServiceClient) Federate(req *FederateRequest) (*FederateResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.auth.v1.AuthService/Federate", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &FederateResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestAuthServiceClient) LoginFederated(req *LoginFederatedRequest) (*LoginFederatedResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.auth.v1.AuthService/LoginFederated", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &LoginFederatedResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestAuthServiceClient) Key(req *KeyRequest) (*KeyResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.auth.v1.AuthService/Key", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &KeyResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestAuthServiceClient) BeginAuth(req *BeginAuthRequest) (*BeginAuthResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.auth.v1.AuthService/BeginAuth", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &BeginAuthResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestAuthServiceClient) NextStep(req *NextStepRequest) (*NextStepResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.auth.v1.AuthService/NextStep", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &NextStepResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestAuthServiceClient) StepBack(req *StepBackRequest) (*StepBackResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.auth.v1.AuthService/StepBack", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &StepBackResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestAuthServiceClient) StreamSteps(req *StreamStepsRequest) (chan *StreamStepsResponse, error) {
+	return nil, errors.New("unimplemented")
+}
+func (client *HTTPTestAuthServiceClient) CheckLoggedIn(req *CheckLoggedInRequest) (*CheckLoggedInResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.auth.v1.AuthService/CheckLoggedIn", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &CheckLoggedInResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
diff --git a/vendor/github.com/harmony-development/shibshib/gen/chat/v1/channels.pb.go b/vendor/github.com/harmony-development/shibshib/gen/chat/v1/channels.pb.go
new file mode 100644
index 00000000..392dc089
--- /dev/null
+++ b/vendor/github.com/harmony-development/shibshib/gen/chat/v1/channels.pb.go
@@ -0,0 +1,1368 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.23.0
+// 	protoc        v3.17.3
+// source: chat/v1/channels.proto
+
+package chatv1
+
+import (
+	proto "github.com/golang/protobuf/proto"
+	v1 "github.com/harmony-development/shibshib/gen/harmonytypes/v1"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
+
+// What kind the channel is.
+type ChannelKind int32
+
+const (
+	// A text channel. Allows you to simply send messages to a group of people.
+	ChannelKind_CHANNEL_KIND_TEXT_UNSPECIFIED ChannelKind = 0
+	// A voice channel. Allows you to talk to other people with voice.
+	ChannelKind_CHANNEL_KIND_VOICE_MEDIA ChannelKind = 1
+	// A category channel. All channels under this channel down to another
+	// category channel belongs to this category channel.
+	ChannelKind_CHANNEL_KIND_CATEGORY ChannelKind = 2
+)
+
+// Enum value maps for ChannelKind.
+var (
+	ChannelKind_name = map[int32]string{
+		0: "CHANNEL_KIND_TEXT_UNSPECIFIED",
+		1: "CHANNEL_KIND_VOICE_MEDIA",
+		2: "CHANNEL_KIND_CATEGORY",
+	}
+	ChannelKind_value = map[string]int32{
+		"CHANNEL_KIND_TEXT_UNSPECIFIED": 0,
+		"CHANNEL_KIND_VOICE_MEDIA":      1,
+		"CHANNEL_KIND_CATEGORY":         2,
+	}
+)
+
+func (x ChannelKind) Enum() *ChannelKind {
+	p := new(ChannelKind)
+	*p = x
+	return p
+}
+
+func (x ChannelKind) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (ChannelKind) Descriptor() protoreflect.EnumDescriptor {
+	return file_chat_v1_channels_proto_enumTypes[0].Descriptor()
+}
+
+func (ChannelKind) Type() protoreflect.EnumType {
+	return &file_chat_v1_channels_proto_enumTypes[0]
+}
+
+func (x ChannelKind) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use ChannelKind.Descriptor instead.
+func (ChannelKind) EnumDescriptor() ([]byte, []int) {
+	return file_chat_v1_channels_proto_rawDescGZIP(), []int{0}
+}
+
+// An object representing a channel, without the ID.
+type Channel struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The name of this channel.
+	ChannelName string `protobuf:"bytes,1,opt,name=channel_name,json=channelName,proto3" json:"channel_name,omitempty"`
+	// The kind of channel this is.
+	// Data does not get inherently stored in the Channel type
+	// Instead, clients who understand a certain ChannelKind should
+	// fetch them from a separate RPC.
+	Kind ChannelKind `protobuf:"varint,2,opt,name=kind,proto3,enum=protocol.chat.v1.ChannelKind" json:"kind,omitempty"`
+	// The metadata of this channel.
+	Metadata *v1.Metadata `protobuf:"bytes,3,opt,name=metadata,proto3,oneof" json:"metadata,omitempty"`
+}
+
+func (x *Channel) Reset() {
+	*x = Channel{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_channels_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Channel) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Channel) ProtoMessage() {}
+
+func (x *Channel) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_channels_proto_msgTypes[0]
+	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 Channel.ProtoReflect.Descriptor instead.
+func (*Channel) Descriptor() ([]byte, []int) {
+	return file_chat_v1_channels_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *Channel) GetChannelName() string {
+	if x != nil {
+		return x.ChannelName
+	}
+	return ""
+}
+
+func (x *Channel) GetKind() ChannelKind {
+	if x != nil {
+		return x.Kind
+	}
+	return ChannelKind_CHANNEL_KIND_TEXT_UNSPECIFIED
+}
+
+func (x *Channel) GetMetadata() *v1.Metadata {
+	if x != nil {
+		return x.Metadata
+	}
+	return nil
+}
+
+// The channel alongside with an ID.
+type ChannelWithId struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// ID of the channel.
+	ChannelId uint64 `protobuf:"varint,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
+	// The channel data.
+	Channel *Channel `protobuf:"bytes,2,opt,name=channel,proto3" json:"channel,omitempty"`
+}
+
+func (x *ChannelWithId) Reset() {
+	*x = ChannelWithId{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_channels_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ChannelWithId) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ChannelWithId) ProtoMessage() {}
+
+func (x *ChannelWithId) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_channels_proto_msgTypes[1]
+	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 ChannelWithId.ProtoReflect.Descriptor instead.
+func (*ChannelWithId) Descriptor() ([]byte, []int) {
+	return file_chat_v1_channels_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *ChannelWithId) GetChannelId() uint64 {
+	if x != nil {
+		return x.ChannelId
+	}
+	return 0
+}
+
+func (x *ChannelWithId) GetChannel() *Channel {
+	if x != nil {
+		return x.Channel
+	}
+	return nil
+}
+
+// Channel Kinds:
+//
+// Channel kinds specified in an official Harmony protocol will start with a
+// "h." prefix. Third-party extensions should not use the "h." prefix. If no
+// kind is specified, the channel is a text channel.
+//
+// Kinds indicate additional functionality a channel may have: for example,
+// h.voice can indicate that a channel has voice functionalities alongside
+// the usual text fare.
+//
+// Used in the `CreateChannel` endpoint.
+type CreateChannelRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild to create a channel in.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// The name of this channel.
+	ChannelName string `protobuf:"bytes,2,opt,name=channel_name,json=channelName,proto3" json:"channel_name,omitempty"`
+	// The kind of this channel.
+	Kind ChannelKind `protobuf:"varint,3,opt,name=kind,proto3,enum=protocol.chat.v1.ChannelKind" json:"kind,omitempty"`
+	// The metadata of this channel.
+	Metadata *v1.Metadata `protobuf:"bytes,4,opt,name=metadata,proto3,oneof" json:"metadata,omitempty"`
+	// The position of your new channel in the channel list.
+	//
+	// If not specified, it will be put at the bottom of the channel list.
+	Position *v1.ItemPosition `protobuf:"bytes,5,opt,name=position,proto3,oneof" json:"position,omitempty"`
+}
+
+func (x *CreateChannelRequest) Reset() {
+	*x = CreateChannelRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_channels_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *CreateChannelRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CreateChannelRequest) ProtoMessage() {}
+
+func (x *CreateChannelRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_channels_proto_msgTypes[2]
+	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 CreateChannelRequest.ProtoReflect.Descriptor instead.
+func (*CreateChannelRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_channels_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *CreateChannelRequest) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *CreateChannelRequest) GetChannelName() string {
+	if x != nil {
+		return x.ChannelName
+	}
+	return ""
+}
+
+func (x *CreateChannelRequest) GetKind() ChannelKind {
+	if x != nil {
+		return x.Kind
+	}
+	return ChannelKind_CHANNEL_KIND_TEXT_UNSPECIFIED
+}
+
+func (x *CreateChannelRequest) GetMetadata() *v1.Metadata {
+	if x != nil {
+		return x.Metadata
+	}
+	return nil
+}
+
+func (x *CreateChannelRequest) GetPosition() *v1.ItemPosition {
+	if x != nil {
+		return x.Position
+	}
+	return nil
+}
+
+// Used in the `CreateChannel` endpoint.
+type CreateChannelResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// ID of the channel that was created.
+	ChannelId uint64 `protobuf:"varint,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
+}
+
+func (x *CreateChannelResponse) Reset() {
+	*x = CreateChannelResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_channels_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *CreateChannelResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CreateChannelResponse) ProtoMessage() {}
+
+func (x *CreateChannelResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_channels_proto_msgTypes[3]
+	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 CreateChannelResponse.ProtoReflect.Descriptor instead.
+func (*CreateChannelResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_channels_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *CreateChannelResponse) GetChannelId() uint64 {
+	if x != nil {
+		return x.ChannelId
+	}
+	return 0
+}
+
+// Used in the `GetGuildChannels` endpoint.
+type GetGuildChannelsRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild you want to get channels from.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+}
+
+func (x *GetGuildChannelsRequest) Reset() {
+	*x = GetGuildChannelsRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_channels_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetGuildChannelsRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetGuildChannelsRequest) ProtoMessage() {}
+
+func (x *GetGuildChannelsRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_channels_proto_msgTypes[4]
+	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 GetGuildChannelsRequest.ProtoReflect.Descriptor instead.
+func (*GetGuildChannelsRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_channels_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *GetGuildChannelsRequest) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+// Used in the `GetGuildChannels` endpoint.
+type GetGuildChannelsResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Channels' data and ID the server responded with.
+	Channels []*ChannelWithId `protobuf:"bytes,1,rep,name=channels,proto3" json:"channels,omitempty"`
+}
+
+func (x *GetGuildChannelsResponse) Reset() {
+	*x = GetGuildChannelsResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_channels_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetGuildChannelsResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetGuildChannelsResponse) ProtoMessage() {}
+
+func (x *GetGuildChannelsResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_channels_proto_msgTypes[5]
+	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 GetGuildChannelsResponse.ProtoReflect.Descriptor instead.
+func (*GetGuildChannelsResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_channels_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *GetGuildChannelsResponse) GetChannels() []*ChannelWithId {
+	if x != nil {
+		return x.Channels
+	}
+	return nil
+}
+
+// Used in the `UpdateChannelInformation` endpoint.
+type UpdateChannelInformationRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild where the channel is.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// Channel ID of the channel you want to change the information of.
+	ChannelId uint64 `protobuf:"varint,2,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
+	// New name to set for this channel.
+	NewName *string `protobuf:"bytes,3,opt,name=new_name,json=newName,proto3,oneof" json:"new_name,omitempty"`
+	// New metadata to set for this channel.
+	NewMetadata *v1.Metadata `protobuf:"bytes,4,opt,name=new_metadata,json=newMetadata,proto3,oneof" json:"new_metadata,omitempty"`
+}
+
+func (x *UpdateChannelInformationRequest) Reset() {
+	*x = UpdateChannelInformationRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_channels_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *UpdateChannelInformationRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UpdateChannelInformationRequest) ProtoMessage() {}
+
+func (x *UpdateChannelInformationRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_channels_proto_msgTypes[6]
+	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 UpdateChannelInformationRequest.ProtoReflect.Descriptor instead.
+func (*UpdateChannelInformationRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_channels_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *UpdateChannelInformationRequest) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *UpdateChannelInformationRequest) GetChannelId() uint64 {
+	if x != nil {
+		return x.ChannelId
+	}
+	return 0
+}
+
+func (x *UpdateChannelInformationRequest) GetNewName() string {
+	if x != nil && x.NewName != nil {
+		return *x.NewName
+	}
+	return ""
+}
+
+func (x *UpdateChannelInformationRequest) GetNewMetadata() *v1.Metadata {
+	if x != nil {
+		return x.NewMetadata
+	}
+	return nil
+}
+
+// Used in the `UpdateChannelInformation` endpoint.
+type UpdateChannelInformationResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *UpdateChannelInformationResponse) Reset() {
+	*x = UpdateChannelInformationResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_channels_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *UpdateChannelInformationResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UpdateChannelInformationResponse) ProtoMessage() {}
+
+func (x *UpdateChannelInformationResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_channels_proto_msgTypes[7]
+	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 UpdateChannelInformationResponse.ProtoReflect.Descriptor instead.
+func (*UpdateChannelInformationResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_channels_proto_rawDescGZIP(), []int{7}
+}
+
+// Used in the `UpdateChannelOrder` endpoint.
+type UpdateChannelOrderRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild that has the channel.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// Channel ID of the channel that you want to move.
+	ChannelId uint64 `protobuf:"varint,2,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
+	// The new position of this channel.
+	NewPosition *v1.ItemPosition `protobuf:"bytes,3,opt,name=new_position,json=newPosition,proto3" json:"new_position,omitempty"`
+}
+
+func (x *UpdateChannelOrderRequest) Reset() {
+	*x = UpdateChannelOrderRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_channels_proto_msgTypes[8]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *UpdateChannelOrderRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UpdateChannelOrderRequest) ProtoMessage() {}
+
+func (x *UpdateChannelOrderRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_channels_proto_msgTypes[8]
+	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 UpdateChannelOrderRequest.ProtoReflect.Descriptor instead.
+func (*UpdateChannelOrderRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_channels_proto_rawDescGZIP(), []int{8}
+}
+
+func (x *UpdateChannelOrderRequest) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *UpdateChannelOrderRequest) GetChannelId() uint64 {
+	if x != nil {
+		return x.ChannelId
+	}
+	return 0
+}
+
+func (x *UpdateChannelOrderRequest) GetNewPosition() *v1.ItemPosition {
+	if x != nil {
+		return x.NewPosition
+	}
+	return nil
+}
+
+// Used in the `UpdateChannelOrder` endpoint.
+type UpdateChannelOrderResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *UpdateChannelOrderResponse) Reset() {
+	*x = UpdateChannelOrderResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_channels_proto_msgTypes[9]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *UpdateChannelOrderResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UpdateChannelOrderResponse) ProtoMessage() {}
+
+func (x *UpdateChannelOrderResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_channels_proto_msgTypes[9]
+	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 UpdateChannelOrderResponse.ProtoReflect.Descriptor instead.
+func (*UpdateChannelOrderResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_channels_proto_rawDescGZIP(), []int{9}
+}
+
+// Request specifiying the order of all channels in a guild at once
+type UpdateAllChannelOrderRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// guild_id: the guild to specify the new channel order for
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// channel_ids: the new order of channel ids
+	ChannelIds []uint64 `protobuf:"varint,2,rep,packed,name=channel_ids,json=channelIds,proto3" json:"channel_ids,omitempty"`
+}
+
+func (x *UpdateAllChannelOrderRequest) Reset() {
+	*x = UpdateAllChannelOrderRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_channels_proto_msgTypes[10]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *UpdateAllChannelOrderRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UpdateAllChannelOrderRequest) ProtoMessage() {}
+
+func (x *UpdateAllChannelOrderRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_channels_proto_msgTypes[10]
+	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 UpdateAllChannelOrderRequest.ProtoReflect.Descriptor instead.
+func (*UpdateAllChannelOrderRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_channels_proto_rawDescGZIP(), []int{10}
+}
+
+func (x *UpdateAllChannelOrderRequest) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *UpdateAllChannelOrderRequest) GetChannelIds() []uint64 {
+	if x != nil {
+		return x.ChannelIds
+	}
+	return nil
+}
+
+// Used in the `UpdateAllChannelOrder` endpoint.
+type UpdateAllChannelOrderResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *UpdateAllChannelOrderResponse) Reset() {
+	*x = UpdateAllChannelOrderResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_channels_proto_msgTypes[11]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *UpdateAllChannelOrderResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UpdateAllChannelOrderResponse) ProtoMessage() {}
+
+func (x *UpdateAllChannelOrderResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_channels_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 UpdateAllChannelOrderResponse.ProtoReflect.Descriptor instead.
+func (*UpdateAllChannelOrderResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_channels_proto_rawDescGZIP(), []int{11}
+}
+
+// Used in the `DeleteChannel` endpoint.
+type DeleteChannelRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild that has the channel.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// Channel ID of the channel you want to delete.
+	ChannelId uint64 `protobuf:"varint,2,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
+}
+
+func (x *DeleteChannelRequest) Reset() {
+	*x = DeleteChannelRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_channels_proto_msgTypes[12]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DeleteChannelRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeleteChannelRequest) ProtoMessage() {}
+
+func (x *DeleteChannelRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_channels_proto_msgTypes[12]
+	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 DeleteChannelRequest.ProtoReflect.Descriptor instead.
+func (*DeleteChannelRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_channels_proto_rawDescGZIP(), []int{12}
+}
+
+func (x *DeleteChannelRequest) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *DeleteChannelRequest) GetChannelId() uint64 {
+	if x != nil {
+		return x.ChannelId
+	}
+	return 0
+}
+
+// Used in the `DeleteChannel` endpoint.
+type DeleteChannelResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *DeleteChannelResponse) Reset() {
+	*x = DeleteChannelResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_channels_proto_msgTypes[13]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DeleteChannelResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeleteChannelResponse) ProtoMessage() {}
+
+func (x *DeleteChannelResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_channels_proto_msgTypes[13]
+	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 DeleteChannelResponse.ProtoReflect.Descriptor instead.
+func (*DeleteChannelResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_channels_proto_rawDescGZIP(), []int{13}
+}
+
+// Used in `Typing` endpoint.
+type TypingRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The guild id of the channel the user is typing in.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// The channel id of the channel the user is typing in.
+	ChannelId uint64 `protobuf:"varint,2,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
+}
+
+func (x *TypingRequest) Reset() {
+	*x = TypingRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_channels_proto_msgTypes[14]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *TypingRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*TypingRequest) ProtoMessage() {}
+
+func (x *TypingRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_channels_proto_msgTypes[14]
+	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 TypingRequest.ProtoReflect.Descriptor instead.
+func (*TypingRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_channels_proto_rawDescGZIP(), []int{14}
+}
+
+func (x *TypingRequest) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *TypingRequest) GetChannelId() uint64 {
+	if x != nil {
+		return x.ChannelId
+	}
+	return 0
+}
+
+// Used in `Typing` endpoint.
+type TypingResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *TypingResponse) Reset() {
+	*x = TypingResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_channels_proto_msgTypes[15]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *TypingResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*TypingResponse) ProtoMessage() {}
+
+func (x *TypingResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_channels_proto_msgTypes[15]
+	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 TypingResponse.ProtoReflect.Descriptor instead.
+func (*TypingResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_channels_proto_rawDescGZIP(), []int{15}
+}
+
+var File_chat_v1_channels_proto protoreflect.FileDescriptor
+
+var file_chat_v1_channels_proto_rawDesc = []byte{
+	0x0a, 0x16, 0x63, 0x68, 0x61, 0x74, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65,
+	0x6c, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63,
+	0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x1a, 0x1b, 0x68, 0x61, 0x72, 0x6d,
+	0x6f, 0x6e, 0x79, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x79, 0x70, 0x65,
+	0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb1, 0x01, 0x0a, 0x07, 0x43, 0x68, 0x61, 0x6e,
+	0x6e, 0x65, 0x6c, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x6e,
+	0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x6e,
+	0x65, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x31, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e,
+	0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4b,
+	0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x43, 0x0a, 0x08, 0x6d, 0x65, 0x74,
+	0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x68, 0x61, 0x72, 0x6d, 0x6f, 0x6e, 0x79, 0x74, 0x79,
+	0x70, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x48,
+	0x00, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x88, 0x01, 0x01, 0x42, 0x0b,
+	0x0a, 0x09, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x63, 0x0a, 0x0d, 0x43,
+	0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x57, 0x69, 0x74, 0x68, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a,
+	0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04,
+	0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x07, 0x63,
+	0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e,
+	0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c,
+	0x22, 0xaf, 0x02, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x6e,
+	0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69,
+	0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69,
+	0x6c, 0x64, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f,
+	0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x68, 0x61, 0x6e,
+	0x6e, 0x65, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x31, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c,
+	0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c,
+	0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x43, 0x0a, 0x08, 0x6d, 0x65,
+	0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x68, 0x61, 0x72, 0x6d, 0x6f, 0x6e, 0x79, 0x74,
+	0x79, 0x70, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,
+	0x48, 0x00, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x88, 0x01, 0x01, 0x12,
+	0x47, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x68, 0x61, 0x72,
+	0x6d, 0x6f, 0x6e, 0x79, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x74, 0x65,
+	0x6d, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x01, 0x52, 0x08, 0x70, 0x6f, 0x73,
+	0x69, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x65, 0x74,
+	0x61, 0x64, 0x61, 0x74, 0x61, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69,
+	0x6f, 0x6e, 0x22, 0x36, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e,
+	0x6e, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63,
+	0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52,
+	0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x22, 0x34, 0x0a, 0x17, 0x47, 0x65,
+	0x74, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69,
+	0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64,
+	0x22, 0x57, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x43, 0x68, 0x61, 0x6e,
+	0x6e, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x08,
+	0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76,
+	0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x57, 0x69, 0x74, 0x68, 0x49, 0x64, 0x52,
+	0x08, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x22, 0xe5, 0x01, 0x0a, 0x1f, 0x55, 0x70,
+	0x64, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x72,
+	0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a,
+	0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52,
+	0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e,
+	0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x63, 0x68,
+	0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x5f, 0x6e,
+	0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x6e, 0x65, 0x77,
+	0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x4a, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x5f, 0x6d,
+	0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x68, 0x61, 0x72, 0x6d, 0x6f, 0x6e, 0x79,
+	0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74,
+	0x61, 0x48, 0x01, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,
+	0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65,
+	0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74,
+	0x61, 0x22, 0x22, 0x0a, 0x20, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x6e,
+	0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa0, 0x01, 0x0a, 0x19, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
+	0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x1d,
+	0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x04, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x49, 0x0a,
+	0x0c, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x68,
+	0x61, 0x72, 0x6d, 0x6f, 0x6e, 0x79, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x49,
+	0x74, 0x65, 0x6d, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x6e, 0x65, 0x77,
+	0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x1c, 0x0a, 0x1a, 0x55, 0x70, 0x64, 0x61,
+	0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5a, 0x0a, 0x1c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
+	0x41, 0x6c, 0x6c, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f,
+	0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49,
+	0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x73,
+	0x18, 0x02, 0x20, 0x03, 0x28, 0x04, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49,
+	0x64, 0x73, 0x22, 0x1f, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x6c, 0x6c, 0x43,
+	0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x22, 0x50, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x68, 0x61,
+	0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67,
+	0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67,
+	0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65,
+	0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e,
+	0x6e, 0x65, 0x6c, 0x49, 0x64, 0x22, 0x17, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43,
+	0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x49,
+	0x0a, 0x0d, 0x54, 0x79, 0x70, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
+	0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68,
+	0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09,
+	0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x22, 0x10, 0x0a, 0x0e, 0x54, 0x79, 0x70,
+	0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x69, 0x0a, 0x0b, 0x43,
+	0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x21, 0x0a, 0x1d, 0x43, 0x48,
+	0x41, 0x4e, 0x4e, 0x45, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x54, 0x45, 0x58, 0x54, 0x5f,
+	0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1c, 0x0a,
+	0x18, 0x43, 0x48, 0x41, 0x4e, 0x4e, 0x45, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x56, 0x4f,
+	0x49, 0x43, 0x45, 0x5f, 0x4d, 0x45, 0x44, 0x49, 0x41, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x43,
+	0x48, 0x41, 0x4e, 0x4e, 0x45, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x43, 0x41, 0x54, 0x45,
+	0x47, 0x4f, 0x52, 0x59, 0x10, 0x02, 0x42, 0xc3, 0x01, 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x42,
+	0x0d, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01,
+	0x5a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x72,
+	0x6d, 0x6f, 0x6e, 0x79, 0x2d, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x6d, 0x65, 0x6e, 0x74,
+	0x2f, 0x73, 0x68, 0x69, 0x62, 0x73, 0x68, 0x69, 0x62, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x63, 0x68,
+	0x61, 0x74, 0x2f, 0x76, 0x31, 0x3b, 0x63, 0x68, 0x61, 0x74, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x50,
+	0x43, 0x58, 0xaa, 0x02, 0x10, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x43, 0x68,
+	0x61, 0x74, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x10, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c,
+	0x5c, 0x43, 0x68, 0x61, 0x74, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x1c, 0x50, 0x72, 0x6f, 0x74, 0x6f,
+	0x63, 0x6f, 0x6c, 0x5c, 0x43, 0x68, 0x61, 0x74, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d,
+	0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x12, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63,
+	0x6f, 0x6c, 0x3a, 0x3a, 0x43, 0x68, 0x61, 0x74, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_chat_v1_channels_proto_rawDescOnce sync.Once
+	file_chat_v1_channels_proto_rawDescData = file_chat_v1_channels_proto_rawDesc
+)
+
+func file_chat_v1_channels_proto_rawDescGZIP() []byte {
+	file_chat_v1_channels_proto_rawDescOnce.Do(func() {
+		file_chat_v1_channels_proto_rawDescData = protoimpl.X.CompressGZIP(file_chat_v1_channels_proto_rawDescData)
+	})
+	return file_chat_v1_channels_proto_rawDescData
+}
+
+var file_chat_v1_channels_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
+var file_chat_v1_channels_proto_msgTypes = make([]protoimpl.MessageInfo, 16)
+var file_chat_v1_channels_proto_goTypes = []interface{}{
+	(ChannelKind)(0),                         // 0: protocol.chat.v1.ChannelKind
+	(*Channel)(nil),                          // 1: protocol.chat.v1.Channel
+	(*ChannelWithId)(nil),                    // 2: protocol.chat.v1.ChannelWithId
+	(*CreateChannelRequest)(nil),             // 3: protocol.chat.v1.CreateChannelRequest
+	(*CreateChannelResponse)(nil),            // 4: protocol.chat.v1.CreateChannelResponse
+	(*GetGuildChannelsRequest)(nil),          // 5: protocol.chat.v1.GetGuildChannelsRequest
+	(*GetGuildChannelsResponse)(nil),         // 6: protocol.chat.v1.GetGuildChannelsResponse
+	(*UpdateChannelInformationRequest)(nil),  // 7: protocol.chat.v1.UpdateChannelInformationRequest
+	(*UpdateChannelInformationResponse)(nil), // 8: protocol.chat.v1.UpdateChannelInformationResponse
+	(*UpdateChannelOrderRequest)(nil),        // 9: protocol.chat.v1.UpdateChannelOrderRequest
+	(*UpdateChannelOrderResponse)(nil),       // 10: protocol.chat.v1.UpdateChannelOrderResponse
+	(*UpdateAllChannelOrderRequest)(nil),     // 11: protocol.chat.v1.UpdateAllChannelOrderRequest
+	(*UpdateAllChannelOrderResponse)(nil),    // 12: protocol.chat.v1.UpdateAllChannelOrderResponse
+	(*DeleteChannelRequest)(nil),             // 13: protocol.chat.v1.DeleteChannelRequest
+	(*DeleteChannelResponse)(nil),            // 14: protocol.chat.v1.DeleteChannelResponse
+	(*TypingRequest)(nil),                    // 15: protocol.chat.v1.TypingRequest
+	(*TypingResponse)(nil),                   // 16: protocol.chat.v1.TypingResponse
+	(*v1.Metadata)(nil),                      // 17: protocol.harmonytypes.v1.Metadata
+	(*v1.ItemPosition)(nil),                  // 18: protocol.harmonytypes.v1.ItemPosition
+}
+var file_chat_v1_channels_proto_depIdxs = []int32{
+	0,  // 0: protocol.chat.v1.Channel.kind:type_name -> protocol.chat.v1.ChannelKind
+	17, // 1: protocol.chat.v1.Channel.metadata:type_name -> protocol.harmonytypes.v1.Metadata
+	1,  // 2: protocol.chat.v1.ChannelWithId.channel:type_name -> protocol.chat.v1.Channel
+	0,  // 3: protocol.chat.v1.CreateChannelRequest.kind:type_name -> protocol.chat.v1.ChannelKind
+	17, // 4: protocol.chat.v1.CreateChannelRequest.metadata:type_name -> protocol.harmonytypes.v1.Metadata
+	18, // 5: protocol.chat.v1.CreateChannelRequest.position:type_name -> protocol.harmonytypes.v1.ItemPosition
+	2,  // 6: protocol.chat.v1.GetGuildChannelsResponse.channels:type_name -> protocol.chat.v1.ChannelWithId
+	17, // 7: protocol.chat.v1.UpdateChannelInformationRequest.new_metadata:type_name -> protocol.harmonytypes.v1.Metadata
+	18, // 8: protocol.chat.v1.UpdateChannelOrderRequest.new_position:type_name -> protocol.harmonytypes.v1.ItemPosition
+	9,  // [9:9] is the sub-list for method output_type
+	9,  // [9:9] is the sub-list for method input_type
+	9,  // [9:9] is the sub-list for extension type_name
+	9,  // [9:9] is the sub-list for extension extendee
+	0,  // [0:9] is the sub-list for field type_name
+}
+
+func init() { file_chat_v1_channels_proto_init() }
+func file_chat_v1_channels_proto_init() {
+	if File_chat_v1_channels_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_chat_v1_channels_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Channel); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_channels_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ChannelWithId); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_channels_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*CreateChannelRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_channels_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*CreateChannelResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_channels_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetGuildChannelsRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_channels_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetGuildChannelsResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_channels_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*UpdateChannelInformationRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_channels_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*UpdateChannelInformationResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_channels_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*UpdateChannelOrderRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_channels_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*UpdateChannelOrderResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_channels_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*UpdateAllChannelOrderRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_channels_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*UpdateAllChannelOrderResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_channels_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DeleteChannelRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_channels_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DeleteChannelResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_channels_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*TypingRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_channels_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*TypingResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	file_chat_v1_channels_proto_msgTypes[0].OneofWrappers = []interface{}{}
+	file_chat_v1_channels_proto_msgTypes[2].OneofWrappers = []interface{}{}
+	file_chat_v1_channels_proto_msgTypes[6].OneofWrappers = []interface{}{}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_chat_v1_channels_proto_rawDesc,
+			NumEnums:      1,
+			NumMessages:   16,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_chat_v1_channels_proto_goTypes,
+		DependencyIndexes: file_chat_v1_channels_proto_depIdxs,
+		EnumInfos:         file_chat_v1_channels_proto_enumTypes,
+		MessageInfos:      file_chat_v1_channels_proto_msgTypes,
+	}.Build()
+	File_chat_v1_channels_proto = out.File
+	file_chat_v1_channels_proto_rawDesc = nil
+	file_chat_v1_channels_proto_goTypes = nil
+	file_chat_v1_channels_proto_depIdxs = nil
+}
diff --git a/vendor/github.com/harmony-development/shibshib/gen/chat/v1/chat.pb.go b/vendor/github.com/harmony-development/shibshib/gen/chat/v1/chat.pb.go
new file mode 100644
index 00000000..0de13c16
--- /dev/null
+++ b/vendor/github.com/harmony-development/shibshib/gen/chat/v1/chat.pb.go
@@ -0,0 +1,716 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.23.0
+// 	protoc        v3.17.3
+// source: chat/v1/chat.proto
+
+package chatv1
+
+import (
+	proto "github.com/golang/protobuf/proto"
+	_ "github.com/harmony-development/shibshib/gen/harmonytypes/v1"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
+
+var File_chat_v1_chat_proto protoreflect.FileDescriptor
+
+var file_chat_v1_chat_proto_rawDesc = []byte{
+	0x0a, 0x12, 0x63, 0x68, 0x61, 0x74, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x12, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63,
+	0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x1a, 0x1b, 0x68, 0x61, 0x72, 0x6d, 0x6f, 0x6e, 0x79, 0x74,
+	0x79, 0x70, 0x65, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x1a, 0x14, 0x63, 0x68, 0x61, 0x74, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x75, 0x69,
+	0x6c, 0x64, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x16, 0x63, 0x68, 0x61, 0x74, 0x2f,
+	0x76, 0x31, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x1a, 0x16, 0x63, 0x68, 0x61, 0x74, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x65, 0x73, 0x73, 0x61,
+	0x67, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x63, 0x68, 0x61, 0x74, 0x2f,
+	0x76, 0x31, 0x2f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x14, 0x63, 0x68, 0x61, 0x74, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74,
+	0x72, 0x65, 0x61, 0x6d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0xd4, 0x32, 0x0a, 0x0b, 0x43,
+	0x68, 0x61, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x61, 0x0a, 0x0b, 0x43, 0x72,
+	0x65, 0x61, 0x74, 0x65, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65,
+	0x61, 0x74, 0x65, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+	0x25, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e,
+	0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x05, 0x9a, 0x44, 0x02, 0x08, 0x01, 0x12, 0x5e, 0x0a,
+	0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6f, 0x6d, 0x12, 0x23, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43,
+	0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6f, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74,
+	0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6f, 0x6d, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x05, 0x9a, 0x44, 0x02, 0x08, 0x01, 0x12, 0x79, 0x0a,
+	0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x73,
+	0x73, 0x61, 0x67, 0x65, 0x12, 0x2c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e,
+	0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x69,
+	0x72, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68,
+	0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x69, 0x72, 0x65,
+	0x63, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x22, 0x05, 0x9a, 0x44, 0x02, 0x08, 0x01, 0x12, 0x78, 0x0a, 0x12, 0x55, 0x70, 0x67, 0x72,
+	0x61, 0x64, 0x65, 0x52, 0x6f, 0x6f, 0x6d, 0x54, 0x6f, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x2b,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76,
+	0x31, 0x2e, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x6f, 0x6f, 0x6d, 0x54, 0x6f, 0x47,
+	0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x55,
+	0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x6f, 0x6f, 0x6d, 0x54, 0x6f, 0x47, 0x75, 0x69, 0x6c,
+	0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x07, 0x9a, 0x44, 0x04, 0x08, 0x01,
+	0x20, 0x01, 0x12, 0x7b, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x76, 0x69,
+	0x74, 0x65, 0x12, 0x25, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68,
+	0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x76, 0x69,
+	0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65,
+	0x61, 0x74, 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x22, 0x1c, 0x9a, 0x44, 0x19, 0x08, 0x01, 0x1a, 0x15, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65,
+	0x73, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12,
+	0x7f, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c,
+	0x12, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74,
+	0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65,
+	0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61,
+	0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x22, 0x1d, 0x9a, 0x44, 0x1a, 0x08, 0x01, 0x1a, 0x16, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65,
+	0x6c, 0x73, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65,
+	0x12, 0x64, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x4c, 0x69, 0x73, 0x74,
+	0x12, 0x25, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74,
+	0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x4c, 0x69, 0x73, 0x74,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63,
+	0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x75,
+	0x69, 0x6c, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
+	0x05, 0x9a, 0x44, 0x02, 0x08, 0x01, 0x12, 0x8a, 0x01, 0x0a, 0x11, 0x49, 0x6e, 0x76, 0x69, 0x74,
+	0x65, 0x55, 0x73, 0x65, 0x72, 0x54, 0x6f, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x2a, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e,
+	0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x54, 0x6f, 0x47, 0x75, 0x69, 0x6c,
+	0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x76, 0x69,
+	0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x54, 0x6f, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1c, 0x9a, 0x44, 0x19, 0x08, 0x01, 0x1a, 0x15, 0x69, 0x6e,
+	0x76, 0x69, 0x74, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x2e, 0x63, 0x72, 0x65,
+	0x61, 0x74, 0x65, 0x12, 0x73, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e,
+	0x67, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x12, 0x2a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50,
+	0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e,
+	0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x65, 0x6e, 0x64, 0x69,
+	0x6e, 0x67, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x22, 0x05, 0x9a, 0x44, 0x02, 0x08, 0x01, 0x12, 0x79, 0x0a, 0x13, 0x52, 0x65, 0x6a, 0x65,
+	0x63, 0x74, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x12,
+	0x2c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e,
+	0x76, 0x31, 0x2e, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67,
+	0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31,
+	0x2e, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x49, 0x6e,
+	0x76, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x05, 0x9a, 0x44,
+	0x02, 0x08, 0x01, 0x12, 0x79, 0x0a, 0x13, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x50, 0x65, 0x6e,
+	0x64, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x12, 0x2c, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x67,
+	0x6e, 0x6f, 0x72, 0x65, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x76, 0x69, 0x74,
+	0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x67, 0x6e, 0x6f,
+	0x72, 0x65, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x05, 0x9a, 0x44, 0x02, 0x08, 0x01, 0x12, 0x58,
+	0x0a, 0x08, 0x47, 0x65, 0x74, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x21, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65,
+	0x74, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31,
+	0x2e, 0x47, 0x65, 0x74, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x22, 0x05, 0x9a, 0x44, 0x02, 0x08, 0x01, 0x12, 0x7b, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x47,
+	0x75, 0x69, 0x6c, 0x64, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x12, 0x28, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47,
+	0x65, 0x74, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c,
+	0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x75, 0x69, 0x6c,
+	0x64, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x22, 0x13, 0x9a, 0x44, 0x10, 0x08, 0x01, 0x1a, 0x0c, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73,
+	0x2e, 0x76, 0x69, 0x65, 0x77, 0x12, 0x6d, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x47, 0x75, 0x69, 0x6c,
+	0x64, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x28, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x47,
+	0x75, 0x69, 0x6c, 0x64, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x1a, 0x29, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68,
+	0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x4d, 0x65,
+	0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x05, 0x9a,
+	0x44, 0x02, 0x08, 0x01, 0x12, 0x70, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x47, 0x75, 0x69, 0x6c, 0x64,
+	0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x29, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x47,
+	0x75, 0x69, 0x6c, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63,
+	0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x43,
+	0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
+	0x05, 0x9a, 0x44, 0x02, 0x08, 0x01, 0x12, 0x85, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x68,
+	0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, 0x2b, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31,
+	0x2e, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61,
+	0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65,
+	0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x9a, 0x44, 0x11, 0x08, 0x01, 0x1a,
+	0x0d, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x12, 0x6d,
+	0x0a, 0x0a, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x23, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e,
+	0x47, 0x65, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x1a, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61,
+	0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x9a, 0x44, 0x11, 0x08, 0x01, 0x1a, 0x0d,
+	0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x12, 0xa3, 0x01,
+	0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x6e, 0x66,
+	0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61,
+	0x74, 0x65, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69,
+	0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64,
+	0x61, 0x74, 0x65, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74,
+	0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x9a, 0x44, 0x23,
+	0x08, 0x01, 0x1a, 0x1f, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65,
+	0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2d, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74,
+	0x69, 0x6f, 0x6e, 0x12, 0xac, 0x01, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x68,
+	0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+	0x12, 0x31, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74,
+	0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65,
+	0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63,
+	0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61,
+	0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x9a, 0x44, 0x26, 0x08, 0x01, 0x1a, 0x22,
+	0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x2e,
+	0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2d, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69,
+	0x6f, 0x6e, 0x12, 0x8c, 0x01, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61,
+	0x6e, 0x6e, 0x65, 0x6c, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x2b, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64,
+	0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f,
+	0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
+	0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x9a, 0x44, 0x18, 0x08, 0x01, 0x1a, 0x14, 0x63, 0x68, 0x61,
+	0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x2e, 0x6d, 0x6f, 0x76,
+	0x65, 0x12, 0x95, 0x01, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x6c, 0x6c, 0x43,
+	0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x2e, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x55,
+	0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x6c, 0x6c, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4f,
+	0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x55,
+	0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x6c, 0x6c, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4f,
+	0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x9a, 0x44,
+	0x18, 0x08, 0x01, 0x1a, 0x14, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x2e, 0x6d, 0x61,
+	0x6e, 0x61, 0x67, 0x65, 0x2e, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x82, 0x01, 0x0a, 0x11, 0x55, 0x70,
+	0x64, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x65, 0x78, 0x74, 0x12,
+	0x2a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e,
+	0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
+	0x54, 0x65, 0x78, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x55,
+	0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x65, 0x78, 0x74,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x9a, 0x44, 0x11, 0x08, 0x01, 0x1a,
+	0x0d, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x73, 0x65, 0x6e, 0x64, 0x12, 0x63,
+	0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x24, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31,
+	0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63,
+	0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x75, 0x69,
+	0x6c, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x07, 0x9a, 0x44, 0x04, 0x08,
+	0x01, 0x20, 0x01, 0x12, 0x7b, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x76,
+	0x69, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63,
+	0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x76,
+	0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65,
+	0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x22, 0x1c, 0x9a, 0x44, 0x19, 0x08, 0x01, 0x1a, 0x15, 0x69, 0x6e, 0x76, 0x69, 0x74,
+	0x65, 0x73, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x2e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65,
+	0x12, 0x7f, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65,
+	0x6c, 0x12, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61,
+	0x74, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x6e,
+	0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c,
+	0x65, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x22, 0x1d, 0x9a, 0x44, 0x1a, 0x08, 0x01, 0x1a, 0x16, 0x63, 0x68, 0x61, 0x6e, 0x6e,
+	0x65, 0x6c, 0x73, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x2e, 0x64, 0x65, 0x6c, 0x65, 0x74,
+	0x65, 0x12, 0x67, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61,
+	0x67, 0x65, 0x12, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68,
+	0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x65, 0x73, 0x73,
+	0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65,
+	0x6c, 0x65, 0x74, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x22, 0x05, 0x9a, 0x44, 0x02, 0x08, 0x01, 0x12, 0x5b, 0x0a, 0x09, 0x4a, 0x6f,
+	0x69, 0x6e, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x22, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63,
+	0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x47,
+	0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4a,
+	0x6f, 0x69, 0x6e, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x22, 0x05, 0x9a, 0x44, 0x02, 0x08, 0x01, 0x12, 0x5e, 0x0a, 0x0a, 0x4c, 0x65, 0x61, 0x76, 0x65,
+	0x47, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x23, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c,
+	0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x47, 0x75,
+	0x69, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x65,
+	0x61, 0x76, 0x65, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x22, 0x05, 0x9a, 0x44, 0x02, 0x08, 0x01, 0x12, 0x78, 0x0a, 0x0d, 0x54, 0x72, 0x69, 0x67, 0x67,
+	0x65, 0x72, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x69, 0x67,
+	0x67, 0x65, 0x72, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x27, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74,
+	0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x41, 0x63, 0x74, 0x69, 0x6f,
+	0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x9a, 0x44, 0x13, 0x08, 0x01,
+	0x1a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65,
+	0x72, 0x12, 0x70, 0x0a, 0x0b, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
+	0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74,
+	0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f,
+	0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65,
+	0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x9a,
+	0x44, 0x11, 0x08, 0x01, 0x1a, 0x0d, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x73,
+	0x65, 0x6e, 0x64, 0x12, 0x76, 0x0a, 0x12, 0x51, 0x75, 0x65, 0x72, 0x79, 0x48, 0x61, 0x73, 0x50,
+	0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65,
+	0x72, 0x79, 0x48, 0x61, 0x73, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f,
+	0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x48,
+	0x61, 0x73, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x05, 0x9a, 0x44, 0x02, 0x08, 0x01, 0x12, 0x82, 0x01, 0x0a, 0x0e,
+	0x53, 0x65, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x27,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76,
+	0x31, 0x2e, 0x53, 0x65, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63,
+	0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x50, 0x65,
+	0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x22, 0x1d, 0x9a, 0x44, 0x1a, 0x08, 0x01, 0x1a, 0x16, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73,
+	0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x2e, 0x73, 0x65, 0x74,
+	0x12, 0x82, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69,
+	0x6f, 0x6e, 0x73, 0x12, 0x27, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63,
+	0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73,
+	0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e,
+	0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, 0x9a, 0x44, 0x1a, 0x08, 0x01, 0x1a, 0x16, 0x70,
+	0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67,
+	0x65, 0x2e, 0x67, 0x65, 0x74, 0x12, 0x66, 0x0a, 0x08, 0x4d, 0x6f, 0x76, 0x65, 0x52, 0x6f, 0x6c,
+	0x65, 0x12, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61,
+	0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e,
+	0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x52, 0x6f, 0x6c, 0x65,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x9a, 0x44, 0x10, 0x08, 0x01, 0x1a,
+	0x0c, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x12, 0x72, 0x0a,
+	0x0d, 0x47, 0x65, 0x74, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x26,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76,
+	0x31, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f,
+	0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x75, 0x69,
+	0x6c, 0x64, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
+	0x10, 0x9a, 0x44, 0x0d, 0x08, 0x01, 0x1a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x65,
+	0x74, 0x12, 0x72, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x6f, 0x6c,
+	0x65, 0x12, 0x25, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61,
+	0x74, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x6f, 0x6c,
+	0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x47,
+	0x75, 0x69, 0x6c, 0x64, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x22, 0x13, 0x9a, 0x44, 0x10, 0x08, 0x01, 0x1a, 0x0c, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2e, 0x6d,
+	0x61, 0x6e, 0x61, 0x67, 0x65, 0x12, 0x7b, 0x0a, 0x0f, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x47,
+	0x75, 0x69, 0x6c, 0x64, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x28, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x6f, 0x64, 0x69,
+	0x66, 0x79, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x1a, 0x29, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68,
+	0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x47, 0x75, 0x69, 0x6c,
+	0x64, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x9a,
+	0x44, 0x10, 0x08, 0x01, 0x1a, 0x0c, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x6e, 0x61,
+	0x67, 0x65, 0x12, 0x7b, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x75, 0x69, 0x6c,
+	0x64, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x28, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c,
+	0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47,
+	0x75, 0x69, 0x6c, 0x64, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+	0x29, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e,
+	0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x6f,
+	0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x9a, 0x44, 0x10, 0x08,
+	0x01, 0x1a, 0x0c, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x12,
+	0x80, 0x01, 0x0a, 0x0f, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x6f,
+	0x6c, 0x65, 0x73, 0x12, 0x28, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63,
+	0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x55, 0x73, 0x65,
+	0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31,
+	0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x9a, 0x44, 0x15, 0x08, 0x01, 0x1a,
+	0x11, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x6d, 0x61, 0x6e, 0x61,
+	0x67, 0x65, 0x12, 0x64, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x6f, 0x6c,
+	0x65, 0x73, 0x12, 0x25, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68,
+	0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x6f, 0x6c,
+	0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74,
+	0x55, 0x73, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x22, 0x05, 0x9a, 0x44, 0x02, 0x08, 0x01, 0x12, 0x61, 0x0a, 0x06, 0x54, 0x79, 0x70, 0x69,
+	0x6e, 0x67, 0x12, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68,
+	0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x79, 0x70, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63,
+	0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x79, 0x70, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x9a, 0x44, 0x11, 0x08, 0x01, 0x1a, 0x0d, 0x6d, 0x65,
+	0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x73, 0x65, 0x6e, 0x64, 0x12, 0x62, 0x0a, 0x0c, 0x50,
+	0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x25, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50,
+	0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x1a, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68,
+	0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x47, 0x75, 0x69,
+	0x6c, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x9a, 0x44, 0x00, 0x12,
+	0x8b, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x42, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x55, 0x73, 0x65,
+	0x72, 0x73, 0x12, 0x27, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68,
+	0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x55,
+	0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47,
+	0x65, 0x74, 0x42, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x9a, 0x44, 0x23, 0x08, 0x01, 0x1a, 0x1f, 0x67, 0x75,
+	0x69, 0x6c, 0x64, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67,
+	0x65, 0x2d, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x66, 0x0a,
+	0x07, 0x42, 0x61, 0x6e, 0x55, 0x73, 0x65, 0x72, 0x12, 0x20, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x6e, 0x55,
+	0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61,
+	0x6e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x9a,
+	0x44, 0x13, 0x08, 0x01, 0x1a, 0x0f, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67,
+	0x65, 0x2e, 0x62, 0x61, 0x6e, 0x12, 0x6a, 0x0a, 0x08, 0x4b, 0x69, 0x63, 0x6b, 0x55, 0x73, 0x65,
+	0x72, 0x12, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61,
+	0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x69, 0x63, 0x6b, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e,
+	0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x69, 0x63, 0x6b, 0x55, 0x73, 0x65, 0x72,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x9a, 0x44, 0x14, 0x08, 0x01, 0x1a,
+	0x10, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x2e, 0x6b, 0x69, 0x63,
+	0x6b, 0x12, 0x6e, 0x0a, 0x09, 0x55, 0x6e, 0x62, 0x61, 0x6e, 0x55, 0x73, 0x65, 0x72, 0x12, 0x22,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76,
+	0x31, 0x2e, 0x55, 0x6e, 0x62, 0x61, 0x6e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x1a, 0x23, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68,
+	0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x62, 0x61, 0x6e, 0x55, 0x73, 0x65, 0x72, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x9a, 0x44, 0x15, 0x08, 0x01, 0x1a, 0x11,
+	0x75, 0x73, 0x65, 0x72, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x2e, 0x75, 0x6e, 0x62, 0x61,
+	0x6e, 0x12, 0x82, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x50, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x4d,
+	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, 0x2a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63,
+	0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x69,
+	0x6e, 0x6e, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63,
+	0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x69, 0x6e, 0x6e, 0x65, 0x64,
+	0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x22, 0x14, 0x9a, 0x44, 0x11, 0x08, 0x01, 0x1a, 0x0d, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
+	0x73, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x12, 0x71, 0x0a, 0x0a, 0x50, 0x69, 0x6e, 0x4d, 0x65, 0x73,
+	0x73, 0x61, 0x67, 0x65, 0x12, 0x23, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e,
+	0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x69, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61,
+	0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x69, 0x6e,
+	0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
+	0x18, 0x9a, 0x44, 0x15, 0x08, 0x01, 0x1a, 0x11, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73,
+	0x2e, 0x70, 0x69, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x64, 0x12, 0x7a, 0x0a, 0x0c, 0x55, 0x6e, 0x70,
+	0x69, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x25, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x70,
+	0x69, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74,
+	0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x70, 0x69, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x9a, 0x44, 0x18, 0x08, 0x01, 0x1a,
+	0x14, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x70, 0x69, 0x6e, 0x73, 0x2e, 0x72,
+	0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x68, 0x0a, 0x0c, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45,
+	0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x25, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c,
+	0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45,
+	0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e,
+	0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x05, 0x9a, 0x44, 0x02, 0x08, 0x01, 0x28, 0x01, 0x30, 0x01, 0x12,
+	0x79, 0x0a, 0x0b, 0x41, 0x64, 0x64, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76,
+	0x31, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e,
+	0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x61, 0x63, 0x74,
+	0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, 0x9a, 0x44, 0x1a,
+	0x08, 0x01, 0x1a, 0x16, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x72, 0x65, 0x61,
+	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x64, 0x12, 0x85, 0x01, 0x0a, 0x0e, 0x52,
+	0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31,
+	0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f,
+	0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65,
+	0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x22, 0x20, 0x9a, 0x44, 0x1d, 0x08, 0x01, 0x1a, 0x19, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
+	0x73, 0x2e, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x72, 0x65, 0x6d, 0x6f,
+	0x76, 0x65, 0x12, 0x6c, 0x0a, 0x0e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72,
+	0x73, 0x68, 0x69, 0x70, 0x12, 0x27, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e,
+	0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x4f, 0x77, 0x6e,
+	0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31,
+	0x2e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x07, 0x9a, 0x44, 0x04, 0x08, 0x01, 0x20, 0x01,
+	0x12, 0x6f, 0x0a, 0x0f, 0x47, 0x69, 0x76, 0x65, 0x55, 0x70, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73,
+	0x68, 0x69, 0x70, 0x12, 0x28, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63,
+	0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x69, 0x76, 0x65, 0x55, 0x70, 0x4f, 0x77, 0x6e,
+	0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31,
+	0x2e, 0x47, 0x69, 0x76, 0x65, 0x55, 0x70, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x07, 0x9a, 0x44, 0x04, 0x08, 0x01, 0x20,
+	0x01, 0x42, 0xbf, 0x01, 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63,
+	0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x42, 0x09, 0x43, 0x68, 0x61, 0x74,
+	0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e,
+	0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x72, 0x6d, 0x6f, 0x6e, 0x79, 0x2d, 0x64, 0x65, 0x76, 0x65,
+	0x6c, 0x6f, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x73, 0x68, 0x69, 0x62, 0x73, 0x68, 0x69, 0x62,
+	0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x63, 0x68, 0x61, 0x74, 0x2f, 0x76, 0x31, 0x3b, 0x63, 0x68, 0x61,
+	0x74, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x50, 0x43, 0x58, 0xaa, 0x02, 0x10, 0x50, 0x72, 0x6f, 0x74,
+	0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x74, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x10, 0x50,
+	0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5c, 0x43, 0x68, 0x61, 0x74, 0x5c, 0x56, 0x31, 0xe2,
+	0x02, 0x1c, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5c, 0x43, 0x68, 0x61, 0x74, 0x5c,
+	0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02,
+	0x12, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x3a, 0x3a, 0x43, 0x68, 0x61, 0x74, 0x3a,
+	0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var file_chat_v1_chat_proto_goTypes = []interface{}{
+	(*CreateGuildRequest)(nil),               // 0: protocol.chat.v1.CreateGuildRequest
+	(*CreateRoomRequest)(nil),                // 1: protocol.chat.v1.CreateRoomRequest
+	(*CreateDirectMessageRequest)(nil),       // 2: protocol.chat.v1.CreateDirectMessageRequest
+	(*UpgradeRoomToGuildRequest)(nil),        // 3: protocol.chat.v1.UpgradeRoomToGuildRequest
+	(*CreateInviteRequest)(nil),              // 4: protocol.chat.v1.CreateInviteRequest
+	(*CreateChannelRequest)(nil),             // 5: protocol.chat.v1.CreateChannelRequest
+	(*GetGuildListRequest)(nil),              // 6: protocol.chat.v1.GetGuildListRequest
+	(*InviteUserToGuildRequest)(nil),         // 7: protocol.chat.v1.InviteUserToGuildRequest
+	(*GetPendingInvitesRequest)(nil),         // 8: protocol.chat.v1.GetPendingInvitesRequest
+	(*RejectPendingInviteRequest)(nil),       // 9: protocol.chat.v1.RejectPendingInviteRequest
+	(*IgnorePendingInviteRequest)(nil),       // 10: protocol.chat.v1.IgnorePendingInviteRequest
+	(*GetGuildRequest)(nil),                  // 11: protocol.chat.v1.GetGuildRequest
+	(*GetGuildInvitesRequest)(nil),           // 12: protocol.chat.v1.GetGuildInvitesRequest
+	(*GetGuildMembersRequest)(nil),           // 13: protocol.chat.v1.GetGuildMembersRequest
+	(*GetGuildChannelsRequest)(nil),          // 14: protocol.chat.v1.GetGuildChannelsRequest
+	(*GetChannelMessagesRequest)(nil),        // 15: protocol.chat.v1.GetChannelMessagesRequest
+	(*GetMessageRequest)(nil),                // 16: protocol.chat.v1.GetMessageRequest
+	(*UpdateGuildInformationRequest)(nil),    // 17: protocol.chat.v1.UpdateGuildInformationRequest
+	(*UpdateChannelInformationRequest)(nil),  // 18: protocol.chat.v1.UpdateChannelInformationRequest
+	(*UpdateChannelOrderRequest)(nil),        // 19: protocol.chat.v1.UpdateChannelOrderRequest
+	(*UpdateAllChannelOrderRequest)(nil),     // 20: protocol.chat.v1.UpdateAllChannelOrderRequest
+	(*UpdateMessageTextRequest)(nil),         // 21: protocol.chat.v1.UpdateMessageTextRequest
+	(*DeleteGuildRequest)(nil),               // 22: protocol.chat.v1.DeleteGuildRequest
+	(*DeleteInviteRequest)(nil),              // 23: protocol.chat.v1.DeleteInviteRequest
+	(*DeleteChannelRequest)(nil),             // 24: protocol.chat.v1.DeleteChannelRequest
+	(*DeleteMessageRequest)(nil),             // 25: protocol.chat.v1.DeleteMessageRequest
+	(*JoinGuildRequest)(nil),                 // 26: protocol.chat.v1.JoinGuildRequest
+	(*LeaveGuildRequest)(nil),                // 27: protocol.chat.v1.LeaveGuildRequest
+	(*TriggerActionRequest)(nil),             // 28: protocol.chat.v1.TriggerActionRequest
+	(*SendMessageRequest)(nil),               // 29: protocol.chat.v1.SendMessageRequest
+	(*QueryHasPermissionRequest)(nil),        // 30: protocol.chat.v1.QueryHasPermissionRequest
+	(*SetPermissionsRequest)(nil),            // 31: protocol.chat.v1.SetPermissionsRequest
+	(*GetPermissionsRequest)(nil),            // 32: protocol.chat.v1.GetPermissionsRequest
+	(*MoveRoleRequest)(nil),                  // 33: protocol.chat.v1.MoveRoleRequest
+	(*GetGuildRolesRequest)(nil),             // 34: protocol.chat.v1.GetGuildRolesRequest
+	(*AddGuildRoleRequest)(nil),              // 35: protocol.chat.v1.AddGuildRoleRequest
+	(*ModifyGuildRoleRequest)(nil),           // 36: protocol.chat.v1.ModifyGuildRoleRequest
+	(*DeleteGuildRoleRequest)(nil),           // 37: protocol.chat.v1.DeleteGuildRoleRequest
+	(*ManageUserRolesRequest)(nil),           // 38: protocol.chat.v1.ManageUserRolesRequest
+	(*GetUserRolesRequest)(nil),              // 39: protocol.chat.v1.GetUserRolesRequest
+	(*TypingRequest)(nil),                    // 40: protocol.chat.v1.TypingRequest
+	(*PreviewGuildRequest)(nil),              // 41: protocol.chat.v1.PreviewGuildRequest
+	(*GetBannedUsersRequest)(nil),            // 42: protocol.chat.v1.GetBannedUsersRequest
+	(*BanUserRequest)(nil),                   // 43: protocol.chat.v1.BanUserRequest
+	(*KickUserRequest)(nil),                  // 44: protocol.chat.v1.KickUserRequest
+	(*UnbanUserRequest)(nil),                 // 45: protocol.chat.v1.UnbanUserRequest
+	(*GetPinnedMessagesRequest)(nil),         // 46: protocol.chat.v1.GetPinnedMessagesRequest
+	(*PinMessageRequest)(nil),                // 47: protocol.chat.v1.PinMessageRequest
+	(*UnpinMessageRequest)(nil),              // 48: protocol.chat.v1.UnpinMessageRequest
+	(*StreamEventsRequest)(nil),              // 49: protocol.chat.v1.StreamEventsRequest
+	(*AddReactionRequest)(nil),               // 50: protocol.chat.v1.AddReactionRequest
+	(*RemoveReactionRequest)(nil),            // 51: protocol.chat.v1.RemoveReactionRequest
+	(*GrantOwnershipRequest)(nil),            // 52: protocol.chat.v1.GrantOwnershipRequest
+	(*GiveUpOwnershipRequest)(nil),           // 53: protocol.chat.v1.GiveUpOwnershipRequest
+	(*CreateGuildResponse)(nil),              // 54: protocol.chat.v1.CreateGuildResponse
+	(*CreateRoomResponse)(nil),               // 55: protocol.chat.v1.CreateRoomResponse
+	(*CreateDirectMessageResponse)(nil),      // 56: protocol.chat.v1.CreateDirectMessageResponse
+	(*UpgradeRoomToGuildResponse)(nil),       // 57: protocol.chat.v1.UpgradeRoomToGuildResponse
+	(*CreateInviteResponse)(nil),             // 58: protocol.chat.v1.CreateInviteResponse
+	(*CreateChannelResponse)(nil),            // 59: protocol.chat.v1.CreateChannelResponse
+	(*GetGuildListResponse)(nil),             // 60: protocol.chat.v1.GetGuildListResponse
+	(*InviteUserToGuildResponse)(nil),        // 61: protocol.chat.v1.InviteUserToGuildResponse
+	(*GetPendingInvitesResponse)(nil),        // 62: protocol.chat.v1.GetPendingInvitesResponse
+	(*RejectPendingInviteResponse)(nil),      // 63: protocol.chat.v1.RejectPendingInviteResponse
+	(*IgnorePendingInviteResponse)(nil),      // 64: protocol.chat.v1.IgnorePendingInviteResponse
+	(*GetGuildResponse)(nil),                 // 65: protocol.chat.v1.GetGuildResponse
+	(*GetGuildInvitesResponse)(nil),          // 66: protocol.chat.v1.GetGuildInvitesResponse
+	(*GetGuildMembersResponse)(nil),          // 67: protocol.chat.v1.GetGuildMembersResponse
+	(*GetGuildChannelsResponse)(nil),         // 68: protocol.chat.v1.GetGuildChannelsResponse
+	(*GetChannelMessagesResponse)(nil),       // 69: protocol.chat.v1.GetChannelMessagesResponse
+	(*GetMessageResponse)(nil),               // 70: protocol.chat.v1.GetMessageResponse
+	(*UpdateGuildInformationResponse)(nil),   // 71: protocol.chat.v1.UpdateGuildInformationResponse
+	(*UpdateChannelInformationResponse)(nil), // 72: protocol.chat.v1.UpdateChannelInformationResponse
+	(*UpdateChannelOrderResponse)(nil),       // 73: protocol.chat.v1.UpdateChannelOrderResponse
+	(*UpdateAllChannelOrderResponse)(nil),    // 74: protocol.chat.v1.UpdateAllChannelOrderResponse
+	(*UpdateMessageTextResponse)(nil),        // 75: protocol.chat.v1.UpdateMessageTextResponse
+	(*DeleteGuildResponse)(nil),              // 76: protocol.chat.v1.DeleteGuildResponse
+	(*DeleteInviteResponse)(nil),             // 77: protocol.chat.v1.DeleteInviteResponse
+	(*DeleteChannelResponse)(nil),            // 78: protocol.chat.v1.DeleteChannelResponse
+	(*DeleteMessageResponse)(nil),            // 79: protocol.chat.v1.DeleteMessageResponse
+	(*JoinGuildResponse)(nil),                // 80: protocol.chat.v1.JoinGuildResponse
+	(*LeaveGuildResponse)(nil),               // 81: protocol.chat.v1.LeaveGuildResponse
+	(*TriggerActionResponse)(nil),            // 82: protocol.chat.v1.TriggerActionResponse
+	(*SendMessageResponse)(nil),              // 83: protocol.chat.v1.SendMessageResponse
+	(*QueryHasPermissionResponse)(nil),       // 84: protocol.chat.v1.QueryHasPermissionResponse
+	(*SetPermissionsResponse)(nil),           // 85: protocol.chat.v1.SetPermissionsResponse
+	(*GetPermissionsResponse)(nil),           // 86: protocol.chat.v1.GetPermissionsResponse
+	(*MoveRoleResponse)(nil),                 // 87: protocol.chat.v1.MoveRoleResponse
+	(*GetGuildRolesResponse)(nil),            // 88: protocol.chat.v1.GetGuildRolesResponse
+	(*AddGuildRoleResponse)(nil),             // 89: protocol.chat.v1.AddGuildRoleResponse
+	(*ModifyGuildRoleResponse)(nil),          // 90: protocol.chat.v1.ModifyGuildRoleResponse
+	(*DeleteGuildRoleResponse)(nil),          // 91: protocol.chat.v1.DeleteGuildRoleResponse
+	(*ManageUserRolesResponse)(nil),          // 92: protocol.chat.v1.ManageUserRolesResponse
+	(*GetUserRolesResponse)(nil),             // 93: protocol.chat.v1.GetUserRolesResponse
+	(*TypingResponse)(nil),                   // 94: protocol.chat.v1.TypingResponse
+	(*PreviewGuildResponse)(nil),             // 95: protocol.chat.v1.PreviewGuildResponse
+	(*GetBannedUsersResponse)(nil),           // 96: protocol.chat.v1.GetBannedUsersResponse
+	(*BanUserResponse)(nil),                  // 97: protocol.chat.v1.BanUserResponse
+	(*KickUserResponse)(nil),                 // 98: protocol.chat.v1.KickUserResponse
+	(*UnbanUserResponse)(nil),                // 99: protocol.chat.v1.UnbanUserResponse
+	(*GetPinnedMessagesResponse)(nil),        // 100: protocol.chat.v1.GetPinnedMessagesResponse
+	(*PinMessageResponse)(nil),               // 101: protocol.chat.v1.PinMessageResponse
+	(*UnpinMessageResponse)(nil),             // 102: protocol.chat.v1.UnpinMessageResponse
+	(*StreamEventsResponse)(nil),             // 103: protocol.chat.v1.StreamEventsResponse
+	(*AddReactionResponse)(nil),              // 104: protocol.chat.v1.AddReactionResponse
+	(*RemoveReactionResponse)(nil),           // 105: protocol.chat.v1.RemoveReactionResponse
+	(*GrantOwnershipResponse)(nil),           // 106: protocol.chat.v1.GrantOwnershipResponse
+	(*GiveUpOwnershipResponse)(nil),          // 107: protocol.chat.v1.GiveUpOwnershipResponse
+}
+var file_chat_v1_chat_proto_depIdxs = []int32{
+	0,   // 0: protocol.chat.v1.ChatService.CreateGuild:input_type -> protocol.chat.v1.CreateGuildRequest
+	1,   // 1: protocol.chat.v1.ChatService.CreateRoom:input_type -> protocol.chat.v1.CreateRoomRequest
+	2,   // 2: protocol.chat.v1.ChatService.CreateDirectMessage:input_type -> protocol.chat.v1.CreateDirectMessageRequest
+	3,   // 3: protocol.chat.v1.ChatService.UpgradeRoomToGuild:input_type -> protocol.chat.v1.UpgradeRoomToGuildRequest
+	4,   // 4: protocol.chat.v1.ChatService.CreateInvite:input_type -> protocol.chat.v1.CreateInviteRequest
+	5,   // 5: protocol.chat.v1.ChatService.CreateChannel:input_type -> protocol.chat.v1.CreateChannelRequest
+	6,   // 6: protocol.chat.v1.ChatService.GetGuildList:input_type -> protocol.chat.v1.GetGuildListRequest
+	7,   // 7: protocol.chat.v1.ChatService.InviteUserToGuild:input_type -> protocol.chat.v1.InviteUserToGuildRequest
+	8,   // 8: protocol.chat.v1.ChatService.GetPendingInvites:input_type -> protocol.chat.v1.GetPendingInvitesRequest
+	9,   // 9: protocol.chat.v1.ChatService.RejectPendingInvite:input_type -> protocol.chat.v1.RejectPendingInviteRequest
+	10,  // 10: protocol.chat.v1.ChatService.IgnorePendingInvite:input_type -> protocol.chat.v1.IgnorePendingInviteRequest
+	11,  // 11: protocol.chat.v1.ChatService.GetGuild:input_type -> protocol.chat.v1.GetGuildRequest
+	12,  // 12: protocol.chat.v1.ChatService.GetGuildInvites:input_type -> protocol.chat.v1.GetGuildInvitesRequest
+	13,  // 13: protocol.chat.v1.ChatService.GetGuildMembers:input_type -> protocol.chat.v1.GetGuildMembersRequest
+	14,  // 14: protocol.chat.v1.ChatService.GetGuildChannels:input_type -> protocol.chat.v1.GetGuildChannelsRequest
+	15,  // 15: protocol.chat.v1.ChatService.GetChannelMessages:input_type -> protocol.chat.v1.GetChannelMessagesRequest
+	16,  // 16: protocol.chat.v1.ChatService.GetMessage:input_type -> protocol.chat.v1.GetMessageRequest
+	17,  // 17: protocol.chat.v1.ChatService.UpdateGuildInformation:input_type -> protocol.chat.v1.UpdateGuildInformationRequest
+	18,  // 18: protocol.chat.v1.ChatService.UpdateChannelInformation:input_type -> protocol.chat.v1.UpdateChannelInformationRequest
+	19,  // 19: protocol.chat.v1.ChatService.UpdateChannelOrder:input_type -> protocol.chat.v1.UpdateChannelOrderRequest
+	20,  // 20: protocol.chat.v1.ChatService.UpdateAllChannelOrder:input_type -> protocol.chat.v1.UpdateAllChannelOrderRequest
+	21,  // 21: protocol.chat.v1.ChatService.UpdateMessageText:input_type -> protocol.chat.v1.UpdateMessageTextRequest
+	22,  // 22: protocol.chat.v1.ChatService.DeleteGuild:input_type -> protocol.chat.v1.DeleteGuildRequest
+	23,  // 23: protocol.chat.v1.ChatService.DeleteInvite:input_type -> protocol.chat.v1.DeleteInviteRequest
+	24,  // 24: protocol.chat.v1.ChatService.DeleteChannel:input_type -> protocol.chat.v1.DeleteChannelRequest
+	25,  // 25: protocol.chat.v1.ChatService.DeleteMessage:input_type -> protocol.chat.v1.DeleteMessageRequest
+	26,  // 26: protocol.chat.v1.ChatService.JoinGuild:input_type -> protocol.chat.v1.JoinGuildRequest
+	27,  // 27: protocol.chat.v1.ChatService.LeaveGuild:input_type -> protocol.chat.v1.LeaveGuildRequest
+	28,  // 28: protocol.chat.v1.ChatService.TriggerAction:input_type -> protocol.chat.v1.TriggerActionRequest
+	29,  // 29: protocol.chat.v1.ChatService.SendMessage:input_type -> protocol.chat.v1.SendMessageRequest
+	30,  // 30: protocol.chat.v1.ChatService.QueryHasPermission:input_type -> protocol.chat.v1.QueryHasPermissionRequest
+	31,  // 31: protocol.chat.v1.ChatService.SetPermissions:input_type -> protocol.chat.v1.SetPermissionsRequest
+	32,  // 32: protocol.chat.v1.ChatService.GetPermissions:input_type -> protocol.chat.v1.GetPermissionsRequest
+	33,  // 33: protocol.chat.v1.ChatService.MoveRole:input_type -> protocol.chat.v1.MoveRoleRequest
+	34,  // 34: protocol.chat.v1.ChatService.GetGuildRoles:input_type -> protocol.chat.v1.GetGuildRolesRequest
+	35,  // 35: protocol.chat.v1.ChatService.AddGuildRole:input_type -> protocol.chat.v1.AddGuildRoleRequest
+	36,  // 36: protocol.chat.v1.ChatService.ModifyGuildRole:input_type -> protocol.chat.v1.ModifyGuildRoleRequest
+	37,  // 37: protocol.chat.v1.ChatService.DeleteGuildRole:input_type -> protocol.chat.v1.DeleteGuildRoleRequest
+	38,  // 38: protocol.chat.v1.ChatService.ManageUserRoles:input_type -> protocol.chat.v1.ManageUserRolesRequest
+	39,  // 39: protocol.chat.v1.ChatService.GetUserRoles:input_type -> protocol.chat.v1.GetUserRolesRequest
+	40,  // 40: protocol.chat.v1.ChatService.Typing:input_type -> protocol.chat.v1.TypingRequest
+	41,  // 41: protocol.chat.v1.ChatService.PreviewGuild:input_type -> protocol.chat.v1.PreviewGuildRequest
+	42,  // 42: protocol.chat.v1.ChatService.GetBannedUsers:input_type -> protocol.chat.v1.GetBannedUsersRequest
+	43,  // 43: protocol.chat.v1.ChatService.BanUser:input_type -> protocol.chat.v1.BanUserRequest
+	44,  // 44: protocol.chat.v1.ChatService.KickUser:input_type -> protocol.chat.v1.KickUserRequest
+	45,  // 45: protocol.chat.v1.ChatService.UnbanUser:input_type -> protocol.chat.v1.UnbanUserRequest
+	46,  // 46: protocol.chat.v1.ChatService.GetPinnedMessages:input_type -> protocol.chat.v1.GetPinnedMessagesRequest
+	47,  // 47: protocol.chat.v1.ChatService.PinMessage:input_type -> protocol.chat.v1.PinMessageRequest
+	48,  // 48: protocol.chat.v1.ChatService.UnpinMessage:input_type -> protocol.chat.v1.UnpinMessageRequest
+	49,  // 49: protocol.chat.v1.ChatService.StreamEvents:input_type -> protocol.chat.v1.StreamEventsRequest
+	50,  // 50: protocol.chat.v1.ChatService.AddReaction:input_type -> protocol.chat.v1.AddReactionRequest
+	51,  // 51: protocol.chat.v1.ChatService.RemoveReaction:input_type -> protocol.chat.v1.RemoveReactionRequest
+	52,  // 52: protocol.chat.v1.ChatService.GrantOwnership:input_type -> protocol.chat.v1.GrantOwnershipRequest
+	53,  // 53: protocol.chat.v1.ChatService.GiveUpOwnership:input_type -> protocol.chat.v1.GiveUpOwnershipRequest
+	54,  // 54: protocol.chat.v1.ChatService.CreateGuild:output_type -> protocol.chat.v1.CreateGuildResponse
+	55,  // 55: protocol.chat.v1.ChatService.CreateRoom:output_type -> protocol.chat.v1.CreateRoomResponse
+	56,  // 56: protocol.chat.v1.ChatService.CreateDirectMessage:output_type -> protocol.chat.v1.CreateDirectMessageResponse
+	57,  // 57: protocol.chat.v1.ChatService.UpgradeRoomToGuild:output_type -> protocol.chat.v1.UpgradeRoomToGuildResponse
+	58,  // 58: protocol.chat.v1.ChatService.CreateInvite:output_type -> protocol.chat.v1.CreateInviteResponse
+	59,  // 59: protocol.chat.v1.ChatService.CreateChannel:output_type -> protocol.chat.v1.CreateChannelResponse
+	60,  // 60: protocol.chat.v1.ChatService.GetGuildList:output_type -> protocol.chat.v1.GetGuildListResponse
+	61,  // 61: protocol.chat.v1.ChatService.InviteUserToGuild:output_type -> protocol.chat.v1.InviteUserToGuildResponse
+	62,  // 62: protocol.chat.v1.ChatService.GetPendingInvites:output_type -> protocol.chat.v1.GetPendingInvitesResponse
+	63,  // 63: protocol.chat.v1.ChatService.RejectPendingInvite:output_type -> protocol.chat.v1.RejectPendingInviteResponse
+	64,  // 64: protocol.chat.v1.ChatService.IgnorePendingInvite:output_type -> protocol.chat.v1.IgnorePendingInviteResponse
+	65,  // 65: protocol.chat.v1.ChatService.GetGuild:output_type -> protocol.chat.v1.GetGuildResponse
+	66,  // 66: protocol.chat.v1.ChatService.GetGuildInvites:output_type -> protocol.chat.v1.GetGuildInvitesResponse
+	67,  // 67: protocol.chat.v1.ChatService.GetGuildMembers:output_type -> protocol.chat.v1.GetGuildMembersResponse
+	68,  // 68: protocol.chat.v1.ChatService.GetGuildChannels:output_type -> protocol.chat.v1.GetGuildChannelsResponse
+	69,  // 69: protocol.chat.v1.ChatService.GetChannelMessages:output_type -> protocol.chat.v1.GetChannelMessagesResponse
+	70,  // 70: protocol.chat.v1.ChatService.GetMessage:output_type -> protocol.chat.v1.GetMessageResponse
+	71,  // 71: protocol.chat.v1.ChatService.UpdateGuildInformation:output_type -> protocol.chat.v1.UpdateGuildInformationResponse
+	72,  // 72: protocol.chat.v1.ChatService.UpdateChannelInformation:output_type -> protocol.chat.v1.UpdateChannelInformationResponse
+	73,  // 73: protocol.chat.v1.ChatService.UpdateChannelOrder:output_type -> protocol.chat.v1.UpdateChannelOrderResponse
+	74,  // 74: protocol.chat.v1.ChatService.UpdateAllChannelOrder:output_type -> protocol.chat.v1.UpdateAllChannelOrderResponse
+	75,  // 75: protocol.chat.v1.ChatService.UpdateMessageText:output_type -> protocol.chat.v1.UpdateMessageTextResponse
+	76,  // 76: protocol.chat.v1.ChatService.DeleteGuild:output_type -> protocol.chat.v1.DeleteGuildResponse
+	77,  // 77: protocol.chat.v1.ChatService.DeleteInvite:output_type -> protocol.chat.v1.DeleteInviteResponse
+	78,  // 78: protocol.chat.v1.ChatService.DeleteChannel:output_type -> protocol.chat.v1.DeleteChannelResponse
+	79,  // 79: protocol.chat.v1.ChatService.DeleteMessage:output_type -> protocol.chat.v1.DeleteMessageResponse
+	80,  // 80: protocol.chat.v1.ChatService.JoinGuild:output_type -> protocol.chat.v1.JoinGuildResponse
+	81,  // 81: protocol.chat.v1.ChatService.LeaveGuild:output_type -> protocol.chat.v1.LeaveGuildResponse
+	82,  // 82: protocol.chat.v1.ChatService.TriggerAction:output_type -> protocol.chat.v1.TriggerActionResponse
+	83,  // 83: protocol.chat.v1.ChatService.SendMessage:output_type -> protocol.chat.v1.SendMessageResponse
+	84,  // 84: protocol.chat.v1.ChatService.QueryHasPermission:output_type -> protocol.chat.v1.QueryHasPermissionResponse
+	85,  // 85: protocol.chat.v1.ChatService.SetPermissions:output_type -> protocol.chat.v1.SetPermissionsResponse
+	86,  // 86: protocol.chat.v1.ChatService.GetPermissions:output_type -> protocol.chat.v1.GetPermissionsResponse
+	87,  // 87: protocol.chat.v1.ChatService.MoveRole:output_type -> protocol.chat.v1.MoveRoleResponse
+	88,  // 88: protocol.chat.v1.ChatService.GetGuildRoles:output_type -> protocol.chat.v1.GetGuildRolesResponse
+	89,  // 89: protocol.chat.v1.ChatService.AddGuildRole:output_type -> protocol.chat.v1.AddGuildRoleResponse
+	90,  // 90: protocol.chat.v1.ChatService.ModifyGuildRole:output_type -> protocol.chat.v1.ModifyGuildRoleResponse
+	91,  // 91: protocol.chat.v1.ChatService.DeleteGuildRole:output_type -> protocol.chat.v1.DeleteGuildRoleResponse
+	92,  // 92: protocol.chat.v1.ChatService.ManageUserRoles:output_type -> protocol.chat.v1.ManageUserRolesResponse
+	93,  // 93: protocol.chat.v1.ChatService.GetUserRoles:output_type -> protocol.chat.v1.GetUserRolesResponse
+	94,  // 94: protocol.chat.v1.ChatService.Typing:output_type -> protocol.chat.v1.TypingResponse
+	95,  // 95: protocol.chat.v1.ChatService.PreviewGuild:output_type -> protocol.chat.v1.PreviewGuildResponse
+	96,  // 96: protocol.chat.v1.ChatService.GetBannedUsers:output_type -> protocol.chat.v1.GetBannedUsersResponse
+	97,  // 97: protocol.chat.v1.ChatService.BanUser:output_type -> protocol.chat.v1.BanUserResponse
+	98,  // 98: protocol.chat.v1.ChatService.KickUser:output_type -> protocol.chat.v1.KickUserResponse
+	99,  // 99: protocol.chat.v1.ChatService.UnbanUser:output_type -> protocol.chat.v1.UnbanUserResponse
+	100, // 100: protocol.chat.v1.ChatService.GetPinnedMessages:output_type -> protocol.chat.v1.GetPinnedMessagesResponse
+	101, // 101: protocol.chat.v1.ChatService.PinMessage:output_type -> protocol.chat.v1.PinMessageResponse
+	102, // 102: protocol.chat.v1.ChatService.UnpinMessage:output_type -> protocol.chat.v1.UnpinMessageResponse
+	103, // 103: protocol.chat.v1.ChatService.StreamEvents:output_type -> protocol.chat.v1.StreamEventsResponse
+	104, // 104: protocol.chat.v1.ChatService.AddReaction:output_type -> protocol.chat.v1.AddReactionResponse
+	105, // 105: protocol.chat.v1.ChatService.RemoveReaction:output_type -> protocol.chat.v1.RemoveReactionResponse
+	106, // 106: protocol.chat.v1.ChatService.GrantOwnership:output_type -> protocol.chat.v1.GrantOwnershipResponse
+	107, // 107: protocol.chat.v1.ChatService.GiveUpOwnership:output_type -> protocol.chat.v1.GiveUpOwnershipResponse
+	54,  // [54:108] is the sub-list for method output_type
+	0,   // [0:54] is the sub-list for method input_type
+	0,   // [0:0] is the sub-list for extension type_name
+	0,   // [0:0] is the sub-list for extension extendee
+	0,   // [0:0] is the sub-list for field type_name
+}
+
+func init() { file_chat_v1_chat_proto_init() }
+func file_chat_v1_chat_proto_init() {
+	if File_chat_v1_chat_proto != nil {
+		return
+	}
+	file_chat_v1_guilds_proto_init()
+	file_chat_v1_channels_proto_init()
+	file_chat_v1_messages_proto_init()
+	file_chat_v1_permissions_proto_init()
+	file_chat_v1_stream_proto_init()
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_chat_v1_chat_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   0,
+			NumExtensions: 0,
+			NumServices:   1,
+		},
+		GoTypes:           file_chat_v1_chat_proto_goTypes,
+		DependencyIndexes: file_chat_v1_chat_proto_depIdxs,
+	}.Build()
+	File_chat_v1_chat_proto = out.File
+	file_chat_v1_chat_proto_rawDesc = nil
+	file_chat_v1_chat_proto_goTypes = nil
+	file_chat_v1_chat_proto_depIdxs = nil
+}
diff --git a/vendor/github.com/harmony-development/shibshib/gen/chat/v1/chat_hrpc_client.pb.go b/vendor/github.com/harmony-development/shibshib/gen/chat/v1/chat_hrpc_client.pb.go
new file mode 100644
index 00000000..62c02415
--- /dev/null
+++ b/vendor/github.com/harmony-development/shibshib/gen/chat/v1/chat_hrpc_client.pb.go
@@ -0,0 +1,2946 @@
+// Code generated by protoc-gen-go-hrpc. DO NOT EDIT.
+
+package chatv1
+
+import (
+	bytes "bytes"
+	context "context"
+	errors "errors"
+	websocket "github.com/gorilla/websocket"
+	proto "google.golang.org/protobuf/proto"
+	ioutil "io/ioutil"
+	http "net/http"
+	httptest "net/http/httptest"
+	url "net/url"
+)
+
+type ChatServiceClient interface {
+	// Endpoint to create a guild.
+	CreateGuild(context.Context, *CreateGuildRequest) (*CreateGuildResponse, error)
+	// Endpoint to create a "room" guild.
+	CreateRoom(context.Context, *CreateRoomRequest) (*CreateRoomResponse, error)
+	// Endpoint to create a "direct message" guild.
+	//
+	// - The inviter and the invitee that join the created guild will both be owners.
+	// - The guild should be created on the server that inviter is on.
+	// - The server should send a guild invite to the invitee (specified in the request),
+	// using the `UserInvited` postbox event if the invitee is on another server,
+	// otherwise see the below item.
+	// - The server should process this as follows: adding the invite to their pending
+	// invite list and sending an `InviteReceived` event over their event stream if
+	// the invitee is on this server.
+	// - The invitee may or may not use the invite. Only the invitee may use the invite.
+	CreateDirectMessage(context.Context, *CreateDirectMessageRequest) (*CreateDirectMessageResponse, error)
+	// Endpoint to upgrade a "room" guild to a "normal" guild.
+	UpgradeRoomToGuild(context.Context, *UpgradeRoomToGuildRequest) (*UpgradeRoomToGuildResponse, error)
+	// Endpoint to create an invite.
+	CreateInvite(context.Context, *CreateInviteRequest) (*CreateInviteResponse, error)
+	// Endpoint to create a channel.
+	CreateChannel(context.Context, *CreateChannelRequest) (*CreateChannelResponse, error)
+	// Endpoint to get your guild list.
+	GetGuildList(context.Context, *GetGuildListRequest) (*GetGuildListResponse, error)
+	// Endpoint to invite a user to a guild.
+	InviteUserToGuild(context.Context, *InviteUserToGuildRequest) (*InviteUserToGuildResponse, error)
+	// Endpoint to get your pending invites.
+	GetPendingInvites(context.Context, *GetPendingInvitesRequest) (*GetPendingInvitesResponse, error)
+	// Endpoint to reject (delete with notification to the inviter) an invite
+	// from your pending invite list.
+	//
+	// If the invitee is on a different server than the inviter, the invitee's
+	// server should send a `UserRejectedInvite` postbox event to the inviter's
+	// server.
+	//
+	// The "notification" is sending a `InviteRejected` stream event to the
+	// inviter. If the guild's kind is `DirectMessage`, the server should also
+	// set the `rejected` field of the guild's kind to `true`.
+	RejectPendingInvite(context.Context, *RejectPendingInviteRequest) (*RejectPendingInviteResponse, error)
+	// Endpoint to ignore (delete without notification to the inviter) an
+	// invite from your pending invite list.
+	IgnorePendingInvite(context.Context, *IgnorePendingInviteRequest) (*IgnorePendingInviteResponse, error)
+	// Endpoint to get information about a guild.
+	GetGuild(context.Context, *GetGuildRequest) (*GetGuildResponse, error)
+	// Endpoint to get the invites of a guild.
+	//
+	// This requires the "invites.view" permission.
+	GetGuildInvites(context.Context, *GetGuildInvitesRequest) (*GetGuildInvitesResponse, error)
+	// Endpoint to get the members of a guild.
+	GetGuildMembers(context.Context, *GetGuildMembersRequest) (*GetGuildMembersResponse, error)
+	// Endpoint to get the channels of a guild.
+	//
+	// You will only be informed of channels you have the "messages.view"
+	// permission for.
+	GetGuildChannels(context.Context, *GetGuildChannelsRequest) (*GetGuildChannelsResponse, error)
+	// Endpoint to get the messages from a guild channel.
+	GetChannelMessages(context.Context, *GetChannelMessagesRequest) (*GetChannelMessagesResponse, error)
+	// Endpoint to get a single message from a guild channel.
+	GetMessage(context.Context, *GetMessageRequest) (*GetMessageResponse, error)
+	// Endpoint to update a guild's information.
+	UpdateGuildInformation(context.Context, *UpdateGuildInformationRequest) (*UpdateGuildInformationResponse, error)
+	// Endpoint to update a channel's information.
+	UpdateChannelInformation(context.Context, *UpdateChannelInformationRequest) (*UpdateChannelInformationResponse, error)
+	// Endpoint to change the position of a channel in the channel list.
+	UpdateChannelOrder(context.Context, *UpdateChannelOrderRequest) (*UpdateChannelOrderResponse, error)
+	// Endpoint to change the position of all channels in the guild;
+	// must specifcy all channels or fails
+	UpdateAllChannelOrder(context.Context, *UpdateAllChannelOrderRequest) (*UpdateAllChannelOrderResponse, error)
+	// Endpoint to change the text of a message.
+	UpdateMessageText(context.Context, *UpdateMessageTextRequest) (*UpdateMessageTextResponse, error)
+	// Endpoint to delete a guild.
+	// Can only be invoked if there's one owner.
+	DeleteGuild(context.Context, *DeleteGuildRequest) (*DeleteGuildResponse, error)
+	// Endpoint to delete an invite.
+	DeleteInvite(context.Context, *DeleteInviteRequest) (*DeleteInviteResponse, error)
+	// Endpoint to delete a channel.
+	DeleteChannel(context.Context, *DeleteChannelRequest) (*DeleteChannelResponse, error)
+	// Endpoint to delete a message.
+	//
+	// This requires the "messages.manage.delete" permission if you are not the
+	// message author.
+	DeleteMessage(context.Context, *DeleteMessageRequest) (*DeleteMessageResponse, error)
+	// Endpoint to join a guild.
+	//
+	// - If the invite used is in a user's "pending invites" list, it should be
+	// removed from there.
+	JoinGuild(context.Context, *JoinGuildRequest) (*JoinGuildResponse, error)
+	// Endpoint to leave a guild.
+	//
+	// - If you're the only owner, you can't leave a guild. Exception to this
+	// rule are "direct message" guilds.
+	// - When the last member in a "direct message" guild leaves it, that guild
+	// should be deleted.
+	LeaveGuild(context.Context, *LeaveGuildRequest) (*LeaveGuildResponse, error)
+	// Endpont to trigger an action.
+	TriggerAction(context.Context, *TriggerActionRequest) (*TriggerActionResponse, error)
+	// Endpoint to send a message.
+	SendMessage(context.Context, *SendMessageRequest) (*SendMessageResponse, error)
+	// Endpoint to query if a user has a permission.
+	QueryHasPermission(context.Context, *QueryHasPermissionRequest) (*QueryHasPermissionResponse, error)
+	// Endpoint to set permissions for a role in a guild.
+	SetPermissions(context.Context, *SetPermissionsRequest) (*SetPermissionsResponse, error)
+	// Endpoint to get permissions for a role in a guild.
+	GetPermissions(context.Context, *GetPermissionsRequest) (*GetPermissionsResponse, error)
+	// Endpoint to change the position of a role in the role list in a guild.
+	MoveRole(context.Context, *MoveRoleRequest) (*MoveRoleResponse, error)
+	// Endpoint to get the roles from a guild.
+	GetGuildRoles(context.Context, *GetGuildRolesRequest) (*GetGuildRolesResponse, error)
+	// Endpoint to add a role to a guild.
+	AddGuildRole(context.Context, *AddGuildRoleRequest) (*AddGuildRoleResponse, error)
+	// Endpoint to a modify a role from a guild.
+	ModifyGuildRole(context.Context, *ModifyGuildRoleRequest) (*ModifyGuildRoleResponse, error)
+	// Endpoint to delete a role from a guild.
+	DeleteGuildRole(context.Context, *DeleteGuildRoleRequest) (*DeleteGuildRoleResponse, error)
+	// Endpoint to manage the roles of a guild member.
+	ManageUserRoles(context.Context, *ManageUserRolesRequest) (*ManageUserRolesResponse, error)
+	// Endpoint to get the roles a guild member has.
+	GetUserRoles(context.Context, *GetUserRolesRequest) (*GetUserRolesResponse, error)
+	// Endpoint to send a typing notification in a guild channel.
+	Typing(context.Context, *TypingRequest) (*TypingResponse, error)
+	// Endpoint to "preview" a guild, which returns some information about a
+	// guild.
+	//
+	// - Guilds with the "direct message" kind can only be previewed
+	// by the user who is invited to the guild.
+	PreviewGuild(context.Context, *PreviewGuildRequest) (*PreviewGuildResponse, error)
+	// Endpoint to get banned users in a guild.
+	GetBannedUsers(context.Context, *GetBannedUsersRequest) (*GetBannedUsersResponse, error)
+	// Endpoint to ban a user from a guild.
+	BanUser(context.Context, *BanUserRequest) (*BanUserResponse, error)
+	// Endpoint to kick a user from a guild.
+	KickUser(context.Context, *KickUserRequest) (*KickUserResponse, error)
+	// Endpoint to unban a user from a guild.
+	UnbanUser(context.Context, *UnbanUserRequest) (*UnbanUserResponse, error)
+	// Endpoint to get all pinned messages in a guild channel.
+	GetPinnedMessages(context.Context, *GetPinnedMessagesRequest) (*GetPinnedMessagesResponse, error)
+	// Endpoint to pin a message in a guild channel.
+	PinMessage(context.Context, *PinMessageRequest) (*PinMessageResponse, error)
+	// Endpoint to unpin a message in a guild channel.
+	UnpinMessage(context.Context, *UnpinMessageRequest) (*UnpinMessageResponse, error)
+	// Endpoint to stream events from the homeserver.
+	StreamEvents(context.Context, chan *StreamEventsRequest) (chan *StreamEventsResponse, error)
+	// Endpoint to add a reaction to a message.
+	AddReaction(context.Context, *AddReactionRequest) (*AddReactionResponse, error)
+	// Endpoint to remove a reaction from a message.
+	RemoveReaction(context.Context, *RemoveReactionRequest) (*RemoveReactionResponse, error)
+	// Endpoint to give ownership to someone else.
+	GrantOwnership(context.Context, *GrantOwnershipRequest) (*GrantOwnershipResponse, error)
+	// Endpoint to give up your own ownership.
+	// Requires that at least one other person will still be owner.
+	GiveUpOwnership(context.Context, *GiveUpOwnershipRequest) (*GiveUpOwnershipResponse, error)
+}
+
+type HTTPChatServiceClient struct {
+	Client         http.Client
+	BaseURL        string
+	WebsocketProto string
+	WebsocketHost  string
+	Header         http.Header
+}
+
+func (client *HTTPChatServiceClient) CreateGuild(req *CreateGuildRequest) (*CreateGuildResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/CreateGuild", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &CreateGuildResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) CreateRoom(req *CreateRoomRequest) (*CreateRoomResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/CreateRoom", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &CreateRoomResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) CreateDirectMessage(req *CreateDirectMessageRequest) (*CreateDirectMessageResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/CreateDirectMessage", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &CreateDirectMessageResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) UpgradeRoomToGuild(req *UpgradeRoomToGuildRequest) (*UpgradeRoomToGuildResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/UpgradeRoomToGuild", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &UpgradeRoomToGuildResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) CreateInvite(req *CreateInviteRequest) (*CreateInviteResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/CreateInvite", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &CreateInviteResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) CreateChannel(req *CreateChannelRequest) (*CreateChannelResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/CreateChannel", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &CreateChannelResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) GetGuildList(req *GetGuildListRequest) (*GetGuildListResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/GetGuildList", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &GetGuildListResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) InviteUserToGuild(req *InviteUserToGuildRequest) (*InviteUserToGuildResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/InviteUserToGuild", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &InviteUserToGuildResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) GetPendingInvites(req *GetPendingInvitesRequest) (*GetPendingInvitesResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/GetPendingInvites", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &GetPendingInvitesResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) RejectPendingInvite(req *RejectPendingInviteRequest) (*RejectPendingInviteResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/RejectPendingInvite", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &RejectPendingInviteResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) IgnorePendingInvite(req *IgnorePendingInviteRequest) (*IgnorePendingInviteResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/IgnorePendingInvite", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &IgnorePendingInviteResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) GetGuild(req *GetGuildRequest) (*GetGuildResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/GetGuild", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &GetGuildResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) GetGuildInvites(req *GetGuildInvitesRequest) (*GetGuildInvitesResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/GetGuildInvites", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &GetGuildInvitesResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) GetGuildMembers(req *GetGuildMembersRequest) (*GetGuildMembersResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/GetGuildMembers", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &GetGuildMembersResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) GetGuildChannels(req *GetGuildChannelsRequest) (*GetGuildChannelsResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/GetGuildChannels", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &GetGuildChannelsResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) GetChannelMessages(req *GetChannelMessagesRequest) (*GetChannelMessagesResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/GetChannelMessages", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &GetChannelMessagesResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) GetMessage(req *GetMessageRequest) (*GetMessageResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/GetMessage", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &GetMessageResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) UpdateGuildInformation(req *UpdateGuildInformationRequest) (*UpdateGuildInformationResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/UpdateGuildInformation", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &UpdateGuildInformationResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) UpdateChannelInformation(req *UpdateChannelInformationRequest) (*UpdateChannelInformationResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/UpdateChannelInformation", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &UpdateChannelInformationResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) UpdateChannelOrder(req *UpdateChannelOrderRequest) (*UpdateChannelOrderResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/UpdateChannelOrder", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &UpdateChannelOrderResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) UpdateAllChannelOrder(req *UpdateAllChannelOrderRequest) (*UpdateAllChannelOrderResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/UpdateAllChannelOrder", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &UpdateAllChannelOrderResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) UpdateMessageText(req *UpdateMessageTextRequest) (*UpdateMessageTextResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/UpdateMessageText", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &UpdateMessageTextResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) DeleteGuild(req *DeleteGuildRequest) (*DeleteGuildResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/DeleteGuild", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &DeleteGuildResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) DeleteInvite(req *DeleteInviteRequest) (*DeleteInviteResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/DeleteInvite", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &DeleteInviteResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) DeleteChannel(req *DeleteChannelRequest) (*DeleteChannelResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/DeleteChannel", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &DeleteChannelResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) DeleteMessage(req *DeleteMessageRequest) (*DeleteMessageResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/DeleteMessage", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &DeleteMessageResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) JoinGuild(req *JoinGuildRequest) (*JoinGuildResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/JoinGuild", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &JoinGuildResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) LeaveGuild(req *LeaveGuildRequest) (*LeaveGuildResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/LeaveGuild", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &LeaveGuildResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) TriggerAction(req *TriggerActionRequest) (*TriggerActionResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/TriggerAction", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &TriggerActionResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) SendMessage(req *SendMessageRequest) (*SendMessageResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/SendMessage", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &SendMessageResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) QueryHasPermission(req *QueryHasPermissionRequest) (*QueryHasPermissionResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/QueryHasPermission", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &QueryHasPermissionResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) SetPermissions(req *SetPermissionsRequest) (*SetPermissionsResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/SetPermissions", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &SetPermissionsResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) GetPermissions(req *GetPermissionsRequest) (*GetPermissionsResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/GetPermissions", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &GetPermissionsResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) MoveRole(req *MoveRoleRequest) (*MoveRoleResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/MoveRole", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &MoveRoleResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) GetGuildRoles(req *GetGuildRolesRequest) (*GetGuildRolesResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/GetGuildRoles", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &GetGuildRolesResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) AddGuildRole(req *AddGuildRoleRequest) (*AddGuildRoleResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/AddGuildRole", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &AddGuildRoleResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) ModifyGuildRole(req *ModifyGuildRoleRequest) (*ModifyGuildRoleResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/ModifyGuildRole", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &ModifyGuildRoleResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) DeleteGuildRole(req *DeleteGuildRoleRequest) (*DeleteGuildRoleResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/DeleteGuildRole", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &DeleteGuildRoleResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) ManageUserRoles(req *ManageUserRolesRequest) (*ManageUserRolesResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/ManageUserRoles", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &ManageUserRolesResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) GetUserRoles(req *GetUserRolesRequest) (*GetUserRolesResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/GetUserRoles", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &GetUserRolesResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) Typing(req *TypingRequest) (*TypingResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/Typing", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &TypingResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) PreviewGuild(req *PreviewGuildRequest) (*PreviewGuildResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/PreviewGuild", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &PreviewGuildResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) GetBannedUsers(req *GetBannedUsersRequest) (*GetBannedUsersResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/GetBannedUsers", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &GetBannedUsersResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) BanUser(req *BanUserRequest) (*BanUserResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/BanUser", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &BanUserResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) KickUser(req *KickUserRequest) (*KickUserResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/KickUser", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &KickUserResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) UnbanUser(req *UnbanUserRequest) (*UnbanUserResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/UnbanUser", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &UnbanUserResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) GetPinnedMessages(req *GetPinnedMessagesRequest) (*GetPinnedMessagesResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/GetPinnedMessages", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &GetPinnedMessagesResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) PinMessage(req *PinMessageRequest) (*PinMessageResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/PinMessage", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &PinMessageResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) UnpinMessage(req *UnpinMessageRequest) (*UnpinMessageResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/UnpinMessage", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &UnpinMessageResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) StreamEvents(req chan *StreamEventsRequest) (chan *StreamEventsResponse, error) {
+	u := url.URL{Scheme: client.WebsocketProto, Host: client.WebsocketHost, Path: "/protocol.chat.v1.ChatService/StreamEvents"}
+	inC := req
+	outC := make(chan *StreamEventsResponse)
+	c, _, err := websocket.DefaultDialer.Dial(u.String(), client.Header)
+	if err != nil {
+		return nil, err
+	}
+	go func() {
+		defer c.Close()
+		msgs := make(chan []byte)
+		go func() {
+			for {
+				_, message, err := c.ReadMessage()
+				if err != nil {
+					close(msgs)
+					break
+				}
+				msgs <- message
+			}
+		}()
+		for {
+			select {
+			case msg, ok := <-msgs:
+				if !ok {
+					close(inC)
+					close(outC)
+					return
+				}
+				thing := &StreamEventsResponse{}
+				err := proto.Unmarshal(msg[1:], thing)
+				if err != nil {
+					close(inC)
+					close(outC)
+					return
+				}
+				outC <- thing
+			case send, ok := <-inC:
+				if !ok {
+					close(outC)
+					return
+				}
+				data, err := proto.Marshal(send)
+				if err != nil {
+					return
+				}
+				err = c.WriteMessage(websocket.BinaryMessage, data)
+				if err != nil {
+					return
+				}
+			}
+		}
+	}()
+	return outC, nil
+}
+func (client *HTTPChatServiceClient) AddReaction(req *AddReactionRequest) (*AddReactionResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/AddReaction", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &AddReactionResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) RemoveReaction(req *RemoveReactionRequest) (*RemoveReactionResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/RemoveReaction", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &RemoveReactionResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) GrantOwnership(req *GrantOwnershipRequest) (*GrantOwnershipResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/GrantOwnership", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &GrantOwnershipResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPChatServiceClient) GiveUpOwnership(req *GiveUpOwnershipRequest) (*GiveUpOwnershipResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.chat.v1.ChatService/GiveUpOwnership", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &GiveUpOwnershipResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+
+type HTTPTestChatServiceClient struct {
+	Client interface {
+		Test(*http.Request, ...int) (*http.Response, error)
+	}
+}
+
+func (client *HTTPTestChatServiceClient) CreateGuild(req *CreateGuildRequest) (*CreateGuildResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/CreateGuild", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &CreateGuildResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) CreateRoom(req *CreateRoomRequest) (*CreateRoomResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/CreateRoom", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &CreateRoomResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) CreateDirectMessage(req *CreateDirectMessageRequest) (*CreateDirectMessageResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/CreateDirectMessage", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &CreateDirectMessageResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) UpgradeRoomToGuild(req *UpgradeRoomToGuildRequest) (*UpgradeRoomToGuildResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/UpgradeRoomToGuild", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &UpgradeRoomToGuildResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) CreateInvite(req *CreateInviteRequest) (*CreateInviteResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/CreateInvite", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &CreateInviteResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) CreateChannel(req *CreateChannelRequest) (*CreateChannelResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/CreateChannel", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &CreateChannelResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) GetGuildList(req *GetGuildListRequest) (*GetGuildListResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/GetGuildList", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &GetGuildListResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) InviteUserToGuild(req *InviteUserToGuildRequest) (*InviteUserToGuildResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/InviteUserToGuild", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &InviteUserToGuildResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) GetPendingInvites(req *GetPendingInvitesRequest) (*GetPendingInvitesResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/GetPendingInvites", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &GetPendingInvitesResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) RejectPendingInvite(req *RejectPendingInviteRequest) (*RejectPendingInviteResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/RejectPendingInvite", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &RejectPendingInviteResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) IgnorePendingInvite(req *IgnorePendingInviteRequest) (*IgnorePendingInviteResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/IgnorePendingInvite", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &IgnorePendingInviteResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) GetGuild(req *GetGuildRequest) (*GetGuildResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/GetGuild", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &GetGuildResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) GetGuildInvites(req *GetGuildInvitesRequest) (*GetGuildInvitesResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/GetGuildInvites", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &GetGuildInvitesResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) GetGuildMembers(req *GetGuildMembersRequest) (*GetGuildMembersResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/GetGuildMembers", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &GetGuildMembersResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) GetGuildChannels(req *GetGuildChannelsRequest) (*GetGuildChannelsResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/GetGuildChannels", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &GetGuildChannelsResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) GetChannelMessages(req *GetChannelMessagesRequest) (*GetChannelMessagesResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/GetChannelMessages", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &GetChannelMessagesResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) GetMessage(req *GetMessageRequest) (*GetMessageResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/GetMessage", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &GetMessageResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) UpdateGuildInformation(req *UpdateGuildInformationRequest) (*UpdateGuildInformationResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/UpdateGuildInformation", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &UpdateGuildInformationResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) UpdateChannelInformation(req *UpdateChannelInformationRequest) (*UpdateChannelInformationResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/UpdateChannelInformation", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &UpdateChannelInformationResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) UpdateChannelOrder(req *UpdateChannelOrderRequest) (*UpdateChannelOrderResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/UpdateChannelOrder", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &UpdateChannelOrderResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) UpdateAllChannelOrder(req *UpdateAllChannelOrderRequest) (*UpdateAllChannelOrderResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/UpdateAllChannelOrder", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &UpdateAllChannelOrderResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) UpdateMessageText(req *UpdateMessageTextRequest) (*UpdateMessageTextResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/UpdateMessageText", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &UpdateMessageTextResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) DeleteGuild(req *DeleteGuildRequest) (*DeleteGuildResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/DeleteGuild", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &DeleteGuildResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) DeleteInvite(req *DeleteInviteRequest) (*DeleteInviteResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/DeleteInvite", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &DeleteInviteResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) DeleteChannel(req *DeleteChannelRequest) (*DeleteChannelResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/DeleteChannel", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &DeleteChannelResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) DeleteMessage(req *DeleteMessageRequest) (*DeleteMessageResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/DeleteMessage", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &DeleteMessageResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) JoinGuild(req *JoinGuildRequest) (*JoinGuildResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/JoinGuild", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &JoinGuildResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) LeaveGuild(req *LeaveGuildRequest) (*LeaveGuildResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/LeaveGuild", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &LeaveGuildResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) TriggerAction(req *TriggerActionRequest) (*TriggerActionResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/TriggerAction", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &TriggerActionResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) SendMessage(req *SendMessageRequest) (*SendMessageResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/SendMessage", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &SendMessageResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) QueryHasPermission(req *QueryHasPermissionRequest) (*QueryHasPermissionResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/QueryHasPermission", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &QueryHasPermissionResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) SetPermissions(req *SetPermissionsRequest) (*SetPermissionsResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/SetPermissions", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &SetPermissionsResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) GetPermissions(req *GetPermissionsRequest) (*GetPermissionsResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/GetPermissions", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &GetPermissionsResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) MoveRole(req *MoveRoleRequest) (*MoveRoleResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/MoveRole", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &MoveRoleResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) GetGuildRoles(req *GetGuildRolesRequest) (*GetGuildRolesResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/GetGuildRoles", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &GetGuildRolesResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) AddGuildRole(req *AddGuildRoleRequest) (*AddGuildRoleResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/AddGuildRole", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &AddGuildRoleResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) ModifyGuildRole(req *ModifyGuildRoleRequest) (*ModifyGuildRoleResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/ModifyGuildRole", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &ModifyGuildRoleResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) DeleteGuildRole(req *DeleteGuildRoleRequest) (*DeleteGuildRoleResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/DeleteGuildRole", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &DeleteGuildRoleResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) ManageUserRoles(req *ManageUserRolesRequest) (*ManageUserRolesResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/ManageUserRoles", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &ManageUserRolesResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) GetUserRoles(req *GetUserRolesRequest) (*GetUserRolesResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/GetUserRoles", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &GetUserRolesResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) Typing(req *TypingRequest) (*TypingResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/Typing", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &TypingResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) PreviewGuild(req *PreviewGuildRequest) (*PreviewGuildResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/PreviewGuild", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &PreviewGuildResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) GetBannedUsers(req *GetBannedUsersRequest) (*GetBannedUsersResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/GetBannedUsers", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &GetBannedUsersResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) BanUser(req *BanUserRequest) (*BanUserResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/BanUser", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &BanUserResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) KickUser(req *KickUserRequest) (*KickUserResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/KickUser", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &KickUserResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) UnbanUser(req *UnbanUserRequest) (*UnbanUserResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/UnbanUser", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &UnbanUserResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) GetPinnedMessages(req *GetPinnedMessagesRequest) (*GetPinnedMessagesResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/GetPinnedMessages", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &GetPinnedMessagesResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) PinMessage(req *PinMessageRequest) (*PinMessageResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/PinMessage", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &PinMessageResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) UnpinMessage(req *UnpinMessageRequest) (*UnpinMessageResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/UnpinMessage", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &UnpinMessageResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) StreamEvents(req chan *StreamEventsRequest) (chan *StreamEventsResponse, error) {
+	return nil, errors.New("unimplemented")
+}
+func (client *HTTPTestChatServiceClient) AddReaction(req *AddReactionRequest) (*AddReactionResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/AddReaction", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &AddReactionResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) RemoveReaction(req *RemoveReactionRequest) (*RemoveReactionResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/RemoveReaction", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &RemoveReactionResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) GrantOwnership(req *GrantOwnershipRequest) (*GrantOwnershipResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/GrantOwnership", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &GrantOwnershipResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestChatServiceClient) GiveUpOwnership(req *GiveUpOwnershipRequest) (*GiveUpOwnershipResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.chat.v1.ChatService/GiveUpOwnership", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &GiveUpOwnershipResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
diff --git a/vendor/github.com/harmony-development/shibshib/gen/chat/v1/guilds.pb.go b/vendor/github.com/harmony-development/shibshib/gen/chat/v1/guilds.pb.go
new file mode 100644
index 00000000..b60867fb
--- /dev/null
+++ b/vendor/github.com/harmony-development/shibshib/gen/chat/v1/guilds.pb.go
@@ -0,0 +1,4279 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.23.0
+// 	protoc        v3.17.3
+// source: chat/v1/guilds.proto
+
+package chatv1
+
+import (
+	proto "github.com/golang/protobuf/proto"
+	v1 "github.com/harmony-development/shibshib/gen/harmonytypes/v1"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
+
+// A reason for why a user has left a guild.
+type LeaveReason int32
+
+const (
+	// The user left the guild willingly.
+	LeaveReason_LEAVE_REASON_WILLINGLY_UNSPECIFIED LeaveReason = 0
+	// The user was banned from the guild.
+	LeaveReason_LEAVE_REASON_BANNED LeaveReason = 1
+	// The user was kicked from the guild.
+	LeaveReason_LEAVE_REASON_KICKED LeaveReason = 2
+)
+
+// Enum value maps for LeaveReason.
+var (
+	LeaveReason_name = map[int32]string{
+		0: "LEAVE_REASON_WILLINGLY_UNSPECIFIED",
+		1: "LEAVE_REASON_BANNED",
+		2: "LEAVE_REASON_KICKED",
+	}
+	LeaveReason_value = map[string]int32{
+		"LEAVE_REASON_WILLINGLY_UNSPECIFIED": 0,
+		"LEAVE_REASON_BANNED":                1,
+		"LEAVE_REASON_KICKED":                2,
+	}
+)
+
+func (x LeaveReason) Enum() *LeaveReason {
+	p := new(LeaveReason)
+	*p = x
+	return p
+}
+
+func (x LeaveReason) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (LeaveReason) Descriptor() protoreflect.EnumDescriptor {
+	return file_chat_v1_guilds_proto_enumTypes[0].Descriptor()
+}
+
+func (LeaveReason) Type() protoreflect.EnumType {
+	return &file_chat_v1_guilds_proto_enumTypes[0]
+}
+
+func (x LeaveReason) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use LeaveReason.Descriptor instead.
+func (LeaveReason) EnumDescriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{0}
+}
+
+// The kind of a guild.
+type GuildKind struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The kind. If this is empty, assume it is `Normal`.
+	//
+	// Types that are assignable to Kind:
+	//	*GuildKind_Normal_
+	//	*GuildKind_Room_
+	//	*GuildKind_DirectMessage_
+	Kind isGuildKind_Kind `protobuf_oneof:"kind"`
+}
+
+func (x *GuildKind) Reset() {
+	*x = GuildKind{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GuildKind) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GuildKind) ProtoMessage() {}
+
+func (x *GuildKind) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[0]
+	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 GuildKind.ProtoReflect.Descriptor instead.
+func (*GuildKind) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{0}
+}
+
+func (m *GuildKind) GetKind() isGuildKind_Kind {
+	if m != nil {
+		return m.Kind
+	}
+	return nil
+}
+
+func (x *GuildKind) GetNormal() *GuildKind_Normal {
+	if x, ok := x.GetKind().(*GuildKind_Normal_); ok {
+		return x.Normal
+	}
+	return nil
+}
+
+func (x *GuildKind) GetRoom() *GuildKind_Room {
+	if x, ok := x.GetKind().(*GuildKind_Room_); ok {
+		return x.Room
+	}
+	return nil
+}
+
+func (x *GuildKind) GetDirectMessage() *GuildKind_DirectMessage {
+	if x, ok := x.GetKind().(*GuildKind_DirectMessage_); ok {
+		return x.DirectMessage
+	}
+	return nil
+}
+
+type isGuildKind_Kind interface {
+	isGuildKind_Kind()
+}
+
+type GuildKind_Normal_ struct {
+	// A "normal" guild.
+	Normal *GuildKind_Normal `protobuf:"bytes,1,opt,name=normal,proto3,oneof"`
+}
+
+type GuildKind_Room_ struct {
+	// A "room" guild.
+	Room *GuildKind_Room `protobuf:"bytes,2,opt,name=room,proto3,oneof"`
+}
+
+type GuildKind_DirectMessage_ struct {
+	// A "direct message" guild.
+	DirectMessage *GuildKind_DirectMessage `protobuf:"bytes,3,opt,name=direct_message,json=directMessage,proto3,oneof"`
+}
+
+func (*GuildKind_Normal_) isGuildKind_Kind() {}
+
+func (*GuildKind_Room_) isGuildKind_Kind() {}
+
+func (*GuildKind_DirectMessage_) isGuildKind_Kind() {}
+
+// Object representing a guild without the ID part.
+type Guild struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The name of the guild.
+	//
+	// This will be empty if the guild kind is "direct message". See
+	// the documentation of "direct message" guild kind on how to display
+	// a name for those guilds.
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	// The picture HMC of the guild.
+	Picture *string `protobuf:"bytes,2,opt,name=picture,proto3,oneof" json:"picture,omitempty"`
+	// User ID of the owners of the guild.
+	OwnerIds []uint64 `protobuf:"varint,3,rep,packed,name=owner_ids,json=ownerIds,proto3" json:"owner_ids,omitempty"`
+	// The kind of this guild.
+	Kind *GuildKind `protobuf:"bytes,4,opt,name=kind,proto3" json:"kind,omitempty"`
+	// Metadata of the guild.
+	Metadata *v1.Metadata `protobuf:"bytes,5,opt,name=metadata,proto3,oneof" json:"metadata,omitempty"`
+}
+
+func (x *Guild) Reset() {
+	*x = Guild{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Guild) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Guild) ProtoMessage() {}
+
+func (x *Guild) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[1]
+	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 Guild.ProtoReflect.Descriptor instead.
+func (*Guild) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *Guild) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *Guild) GetPicture() string {
+	if x != nil && x.Picture != nil {
+		return *x.Picture
+	}
+	return ""
+}
+
+func (x *Guild) GetOwnerIds() []uint64 {
+	if x != nil {
+		return x.OwnerIds
+	}
+	return nil
+}
+
+func (x *Guild) GetKind() *GuildKind {
+	if x != nil {
+		return x.Kind
+	}
+	return nil
+}
+
+func (x *Guild) GetMetadata() *v1.Metadata {
+	if x != nil {
+		return x.Metadata
+	}
+	return nil
+}
+
+// Object representing an invite without the ID part.
+type Invite struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Possible uses of this invite. A use of `0` means infinite uses.
+	PossibleUses uint32 `protobuf:"varint,1,opt,name=possible_uses,json=possibleUses,proto3" json:"possible_uses,omitempty"`
+	// Total use count of this invite.
+	UseCount uint32 `protobuf:"varint,2,opt,name=use_count,json=useCount,proto3" json:"use_count,omitempty"`
+}
+
+func (x *Invite) Reset() {
+	*x = Invite{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Invite) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Invite) ProtoMessage() {}
+
+func (x *Invite) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[2]
+	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 Invite.ProtoReflect.Descriptor instead.
+func (*Invite) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *Invite) GetPossibleUses() uint32 {
+	if x != nil {
+		return x.PossibleUses
+	}
+	return 0
+}
+
+func (x *Invite) GetUseCount() uint32 {
+	if x != nil {
+		return x.UseCount
+	}
+	return 0
+}
+
+// Invite with ID.
+type InviteWithId struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// ID of the invite.
+	InviteId string `protobuf:"bytes,1,opt,name=invite_id,json=inviteId,proto3" json:"invite_id,omitempty"`
+	// The invite data.
+	Invite *Invite `protobuf:"bytes,2,opt,name=invite,proto3" json:"invite,omitempty"`
+}
+
+func (x *InviteWithId) Reset() {
+	*x = InviteWithId{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *InviteWithId) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*InviteWithId) ProtoMessage() {}
+
+func (x *InviteWithId) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[3]
+	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 InviteWithId.ProtoReflect.Descriptor instead.
+func (*InviteWithId) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *InviteWithId) GetInviteId() string {
+	if x != nil {
+		return x.InviteId
+	}
+	return ""
+}
+
+func (x *InviteWithId) GetInvite() *Invite {
+	if x != nil {
+		return x.Invite
+	}
+	return nil
+}
+
+// A pending invite.
+type PendingInvite struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Invite ID of the invite.
+	InviteId string `protobuf:"bytes,1,opt,name=invite_id,json=inviteId,proto3" json:"invite_id,omitempty"`
+	// Server ID of the server the inviter is on.
+	ServerId *string `protobuf:"bytes,2,opt,name=server_id,json=serverId,proto3,oneof" json:"server_id,omitempty"`
+	// User ID of the inviter.
+	InviterId uint64 `protobuf:"varint,3,opt,name=inviter_id,json=inviterId,proto3" json:"inviter_id,omitempty"`
+}
+
+func (x *PendingInvite) Reset() {
+	*x = PendingInvite{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *PendingInvite) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*PendingInvite) ProtoMessage() {}
+
+func (x *PendingInvite) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[4]
+	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 PendingInvite.ProtoReflect.Descriptor instead.
+func (*PendingInvite) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *PendingInvite) GetInviteId() string {
+	if x != nil {
+		return x.InviteId
+	}
+	return ""
+}
+
+func (x *PendingInvite) GetServerId() string {
+	if x != nil && x.ServerId != nil {
+		return *x.ServerId
+	}
+	return ""
+}
+
+func (x *PendingInvite) GetInviterId() uint64 {
+	if x != nil {
+		return x.InviterId
+	}
+	return 0
+}
+
+// Object representing a guild list entry.
+type GuildListEntry struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of this guild entry.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// Server ID of the homeserver of this guild.
+	ServerId string `protobuf:"bytes,2,opt,name=server_id,json=serverId,proto3" json:"server_id,omitempty"`
+}
+
+func (x *GuildListEntry) Reset() {
+	*x = GuildListEntry{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GuildListEntry) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GuildListEntry) ProtoMessage() {}
+
+func (x *GuildListEntry) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[5]
+	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 GuildListEntry.ProtoReflect.Descriptor instead.
+func (*GuildListEntry) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *GuildListEntry) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *GuildListEntry) GetServerId() string {
+	if x != nil {
+		return x.ServerId
+	}
+	return ""
+}
+
+// Request type used in `CreateGuild` endpoint.
+type CreateGuildRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The name of the guild.
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	// The picture HMC of the guild.
+	Picture *string `protobuf:"bytes,2,opt,name=picture,proto3,oneof" json:"picture,omitempty"`
+	// Metadata of the guild.
+	Metadata *v1.Metadata `protobuf:"bytes,3,opt,name=metadata,proto3,oneof" json:"metadata,omitempty"`
+}
+
+func (x *CreateGuildRequest) Reset() {
+	*x = CreateGuildRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *CreateGuildRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CreateGuildRequest) ProtoMessage() {}
+
+func (x *CreateGuildRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[6]
+	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 CreateGuildRequest.ProtoReflect.Descriptor instead.
+func (*CreateGuildRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *CreateGuildRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *CreateGuildRequest) GetPicture() string {
+	if x != nil && x.Picture != nil {
+		return *x.Picture
+	}
+	return ""
+}
+
+func (x *CreateGuildRequest) GetMetadata() *v1.Metadata {
+	if x != nil {
+		return x.Metadata
+	}
+	return nil
+}
+
+// Used in the `CreateGuild` endpoint.
+type CreateGuildResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild that was created.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+}
+
+func (x *CreateGuildResponse) Reset() {
+	*x = CreateGuildResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *CreateGuildResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CreateGuildResponse) ProtoMessage() {}
+
+func (x *CreateGuildResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[7]
+	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 CreateGuildResponse.ProtoReflect.Descriptor instead.
+func (*CreateGuildResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *CreateGuildResponse) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+// Request type used in `CreateRoom` endpoint.
+type CreateRoomRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The name of the guild.
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	// The picture HMC of the guild.
+	Picture *string `protobuf:"bytes,2,opt,name=picture,proto3,oneof" json:"picture,omitempty"`
+	// Metadata of the guild.
+	Metadata *v1.Metadata `protobuf:"bytes,3,opt,name=metadata,proto3,oneof" json:"metadata,omitempty"`
+}
+
+func (x *CreateRoomRequest) Reset() {
+	*x = CreateRoomRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[8]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *CreateRoomRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CreateRoomRequest) ProtoMessage() {}
+
+func (x *CreateRoomRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[8]
+	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 CreateRoomRequest.ProtoReflect.Descriptor instead.
+func (*CreateRoomRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{8}
+}
+
+func (x *CreateRoomRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *CreateRoomRequest) GetPicture() string {
+	if x != nil && x.Picture != nil {
+		return *x.Picture
+	}
+	return ""
+}
+
+func (x *CreateRoomRequest) GetMetadata() *v1.Metadata {
+	if x != nil {
+		return x.Metadata
+	}
+	return nil
+}
+
+// Used in the `CreateRoom` endpoint.
+type CreateRoomResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild that was created.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+}
+
+func (x *CreateRoomResponse) Reset() {
+	*x = CreateRoomResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[9]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *CreateRoomResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CreateRoomResponse) ProtoMessage() {}
+
+func (x *CreateRoomResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[9]
+	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 CreateRoomResponse.ProtoReflect.Descriptor instead.
+func (*CreateRoomResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{9}
+}
+
+func (x *CreateRoomResponse) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+// Used in the `CreateDirectMessage` endpoint.
+type CreateDirectMessageRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The user name of the user to DM with.
+	UserName string `protobuf:"bytes,1,opt,name=user_name,json=userName,proto3" json:"user_name,omitempty"`
+	// The server ID of the server the user is on.
+	//
+	// Should be left unspecified if it's a user on the homeserver.
+	ServerId *string `protobuf:"bytes,2,opt,name=server_id,json=serverId,proto3,oneof" json:"server_id,omitempty"`
+}
+
+func (x *CreateDirectMessageRequest) Reset() {
+	*x = CreateDirectMessageRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[10]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *CreateDirectMessageRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CreateDirectMessageRequest) ProtoMessage() {}
+
+func (x *CreateDirectMessageRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[10]
+	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 CreateDirectMessageRequest.ProtoReflect.Descriptor instead.
+func (*CreateDirectMessageRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{10}
+}
+
+func (x *CreateDirectMessageRequest) GetUserName() string {
+	if x != nil {
+		return x.UserName
+	}
+	return ""
+}
+
+func (x *CreateDirectMessageRequest) GetServerId() string {
+	if x != nil && x.ServerId != nil {
+		return *x.ServerId
+	}
+	return ""
+}
+
+// Used in the `CreateDirectMessage` endpoint.
+type CreateDirectMessageResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the just created "direct message" guild.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+}
+
+func (x *CreateDirectMessageResponse) Reset() {
+	*x = CreateDirectMessageResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[11]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *CreateDirectMessageResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CreateDirectMessageResponse) ProtoMessage() {}
+
+func (x *CreateDirectMessageResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_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 CreateDirectMessageResponse.ProtoReflect.Descriptor instead.
+func (*CreateDirectMessageResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{11}
+}
+
+func (x *CreateDirectMessageResponse) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+// Used in the `CreateInvite` endpoint.
+type CreateInviteRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild to create an invite in.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// The name of the invite.
+	Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
+	// The possible uses of the invite.
+	//
+	// A possible use of `0` means that the invite can be used infinitely many times.
+	PossibleUses uint32 `protobuf:"varint,3,opt,name=possible_uses,json=possibleUses,proto3" json:"possible_uses,omitempty"`
+}
+
+func (x *CreateInviteRequest) Reset() {
+	*x = CreateInviteRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[12]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *CreateInviteRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CreateInviteRequest) ProtoMessage() {}
+
+func (x *CreateInviteRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[12]
+	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 CreateInviteRequest.ProtoReflect.Descriptor instead.
+func (*CreateInviteRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{12}
+}
+
+func (x *CreateInviteRequest) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *CreateInviteRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *CreateInviteRequest) GetPossibleUses() uint32 {
+	if x != nil {
+		return x.PossibleUses
+	}
+	return 0
+}
+
+// Used in the `CreateInvite` endpoint.
+type CreateInviteResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The invite ID of the invite that was created.
+	InviteId string `protobuf:"bytes,1,opt,name=invite_id,json=inviteId,proto3" json:"invite_id,omitempty"`
+}
+
+func (x *CreateInviteResponse) Reset() {
+	*x = CreateInviteResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[13]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *CreateInviteResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CreateInviteResponse) ProtoMessage() {}
+
+func (x *CreateInviteResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[13]
+	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 CreateInviteResponse.ProtoReflect.Descriptor instead.
+func (*CreateInviteResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{13}
+}
+
+func (x *CreateInviteResponse) GetInviteId() string {
+	if x != nil {
+		return x.InviteId
+	}
+	return ""
+}
+
+// Used in the `GetGuildList` endpoint.
+type GetGuildListRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *GetGuildListRequest) Reset() {
+	*x = GetGuildListRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[14]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetGuildListRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetGuildListRequest) ProtoMessage() {}
+
+func (x *GetGuildListRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[14]
+	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 GetGuildListRequest.ProtoReflect.Descriptor instead.
+func (*GetGuildListRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{14}
+}
+
+// Used in the `GetGuildList` endpoint.
+type GetGuildListResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild list returned by the server.
+	Guilds []*GuildListEntry `protobuf:"bytes,1,rep,name=guilds,proto3" json:"guilds,omitempty"`
+}
+
+func (x *GetGuildListResponse) Reset() {
+	*x = GetGuildListResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[15]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetGuildListResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetGuildListResponse) ProtoMessage() {}
+
+func (x *GetGuildListResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[15]
+	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 GetGuildListResponse.ProtoReflect.Descriptor instead.
+func (*GetGuildListResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{15}
+}
+
+func (x *GetGuildListResponse) GetGuilds() []*GuildListEntry {
+	if x != nil {
+		return x.Guilds
+	}
+	return nil
+}
+
+// Used in the `GetGuild` endpoint.
+type GetGuildRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild to get information about.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+}
+
+func (x *GetGuildRequest) Reset() {
+	*x = GetGuildRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[16]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetGuildRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetGuildRequest) ProtoMessage() {}
+
+func (x *GetGuildRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[16]
+	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 GetGuildRequest.ProtoReflect.Descriptor instead.
+func (*GetGuildRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{16}
+}
+
+func (x *GetGuildRequest) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+// Used in the `GetGuild` endpoint.
+type GetGuildResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The information of the guild requested.
+	Guild *Guild `protobuf:"bytes,1,opt,name=guild,proto3" json:"guild,omitempty"`
+}
+
+func (x *GetGuildResponse) Reset() {
+	*x = GetGuildResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[17]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetGuildResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetGuildResponse) ProtoMessage() {}
+
+func (x *GetGuildResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[17]
+	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 GetGuildResponse.ProtoReflect.Descriptor instead.
+func (*GetGuildResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{17}
+}
+
+func (x *GetGuildResponse) GetGuild() *Guild {
+	if x != nil {
+		return x.Guild
+	}
+	return nil
+}
+
+// Used in the `GetGuildInvites` endpoint.
+type GetGuildInvitesRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild you want to get invites of.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+}
+
+func (x *GetGuildInvitesRequest) Reset() {
+	*x = GetGuildInvitesRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[18]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetGuildInvitesRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetGuildInvitesRequest) ProtoMessage() {}
+
+func (x *GetGuildInvitesRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[18]
+	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 GetGuildInvitesRequest.ProtoReflect.Descriptor instead.
+func (*GetGuildInvitesRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{18}
+}
+
+func (x *GetGuildInvitesRequest) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+// Used in the `GetGuildInvites` endpoint.
+type GetGuildInvitesResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The invites of the guild, with IDs.
+	Invites []*InviteWithId `protobuf:"bytes,1,rep,name=invites,proto3" json:"invites,omitempty"`
+}
+
+func (x *GetGuildInvitesResponse) Reset() {
+	*x = GetGuildInvitesResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[19]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetGuildInvitesResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetGuildInvitesResponse) ProtoMessage() {}
+
+func (x *GetGuildInvitesResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[19]
+	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 GetGuildInvitesResponse.ProtoReflect.Descriptor instead.
+func (*GetGuildInvitesResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{19}
+}
+
+func (x *GetGuildInvitesResponse) GetInvites() []*InviteWithId {
+	if x != nil {
+		return x.Invites
+	}
+	return nil
+}
+
+// Used in the `GetGuildMembers` endpoint.
+type GetGuildMembersRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild you want to get members of.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+}
+
+func (x *GetGuildMembersRequest) Reset() {
+	*x = GetGuildMembersRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[20]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetGuildMembersRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetGuildMembersRequest) ProtoMessage() {}
+
+func (x *GetGuildMembersRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[20]
+	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 GetGuildMembersRequest.ProtoReflect.Descriptor instead.
+func (*GetGuildMembersRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{20}
+}
+
+func (x *GetGuildMembersRequest) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+// Used in the `GetGuildMembers` endpoint.
+type GetGuildMembersResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// User IDs of all the guild members.
+	Members []uint64 `protobuf:"varint,1,rep,packed,name=members,proto3" json:"members,omitempty"`
+}
+
+func (x *GetGuildMembersResponse) Reset() {
+	*x = GetGuildMembersResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[21]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetGuildMembersResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetGuildMembersResponse) ProtoMessage() {}
+
+func (x *GetGuildMembersResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[21]
+	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 GetGuildMembersResponse.ProtoReflect.Descriptor instead.
+func (*GetGuildMembersResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{21}
+}
+
+func (x *GetGuildMembersResponse) GetMembers() []uint64 {
+	if x != nil {
+		return x.Members
+	}
+	return nil
+}
+
+// Used in the `UpdateGuildInformation` endpoint.
+type UpdateGuildInformationRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild you want to update the information of.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// New name for the guild.
+	NewName *string `protobuf:"bytes,2,opt,name=new_name,json=newName,proto3,oneof" json:"new_name,omitempty"`
+	// New picture for the guild.
+	NewPicture *string `protobuf:"bytes,3,opt,name=new_picture,json=newPicture,proto3,oneof" json:"new_picture,omitempty"`
+	// New metadata for the guild.
+	NewMetadata *v1.Metadata `protobuf:"bytes,4,opt,name=new_metadata,json=newMetadata,proto3,oneof" json:"new_metadata,omitempty"`
+}
+
+func (x *UpdateGuildInformationRequest) Reset() {
+	*x = UpdateGuildInformationRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[22]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *UpdateGuildInformationRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UpdateGuildInformationRequest) ProtoMessage() {}
+
+func (x *UpdateGuildInformationRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[22]
+	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 UpdateGuildInformationRequest.ProtoReflect.Descriptor instead.
+func (*UpdateGuildInformationRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{22}
+}
+
+func (x *UpdateGuildInformationRequest) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *UpdateGuildInformationRequest) GetNewName() string {
+	if x != nil && x.NewName != nil {
+		return *x.NewName
+	}
+	return ""
+}
+
+func (x *UpdateGuildInformationRequest) GetNewPicture() string {
+	if x != nil && x.NewPicture != nil {
+		return *x.NewPicture
+	}
+	return ""
+}
+
+func (x *UpdateGuildInformationRequest) GetNewMetadata() *v1.Metadata {
+	if x != nil {
+		return x.NewMetadata
+	}
+	return nil
+}
+
+// Used in the `UpdateGuildInformation` endpoint.
+type UpdateGuildInformationResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *UpdateGuildInformationResponse) Reset() {
+	*x = UpdateGuildInformationResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[23]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *UpdateGuildInformationResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UpdateGuildInformationResponse) ProtoMessage() {}
+
+func (x *UpdateGuildInformationResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[23]
+	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 UpdateGuildInformationResponse.ProtoReflect.Descriptor instead.
+func (*UpdateGuildInformationResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{23}
+}
+
+// Used in the `UpgradeRoomToGuild` endpoint.
+type UpgradeRoomToGuildRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the "room" guild to upgrade to a "normal" guild.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+}
+
+func (x *UpgradeRoomToGuildRequest) Reset() {
+	*x = UpgradeRoomToGuildRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[24]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *UpgradeRoomToGuildRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UpgradeRoomToGuildRequest) ProtoMessage() {}
+
+func (x *UpgradeRoomToGuildRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[24]
+	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 UpgradeRoomToGuildRequest.ProtoReflect.Descriptor instead.
+func (*UpgradeRoomToGuildRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{24}
+}
+
+func (x *UpgradeRoomToGuildRequest) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+// Used in the `UpgradeRoomToGuild` endpoint.
+type UpgradeRoomToGuildResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *UpgradeRoomToGuildResponse) Reset() {
+	*x = UpgradeRoomToGuildResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[25]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *UpgradeRoomToGuildResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UpgradeRoomToGuildResponse) ProtoMessage() {}
+
+func (x *UpgradeRoomToGuildResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[25]
+	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 UpgradeRoomToGuildResponse.ProtoReflect.Descriptor instead.
+func (*UpgradeRoomToGuildResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{25}
+}
+
+// Used in the `DeleteGuild` endpoint.
+type DeleteGuildRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild you want to delete.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+}
+
+func (x *DeleteGuildRequest) Reset() {
+	*x = DeleteGuildRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[26]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DeleteGuildRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeleteGuildRequest) ProtoMessage() {}
+
+func (x *DeleteGuildRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[26]
+	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 DeleteGuildRequest.ProtoReflect.Descriptor instead.
+func (*DeleteGuildRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{26}
+}
+
+func (x *DeleteGuildRequest) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+// Used in the `DeleteGuild` endpoint.
+type DeleteGuildResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *DeleteGuildResponse) Reset() {
+	*x = DeleteGuildResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[27]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DeleteGuildResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeleteGuildResponse) ProtoMessage() {}
+
+func (x *DeleteGuildResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[27]
+	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 DeleteGuildResponse.ProtoReflect.Descriptor instead.
+func (*DeleteGuildResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{27}
+}
+
+// Used in the `DeleteInvite` endpoint.
+type DeleteInviteRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild where the invite is located.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// Invite ID of the invite you want to delete.
+	InviteId string `protobuf:"bytes,2,opt,name=invite_id,json=inviteId,proto3" json:"invite_id,omitempty"`
+}
+
+func (x *DeleteInviteRequest) Reset() {
+	*x = DeleteInviteRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[28]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DeleteInviteRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeleteInviteRequest) ProtoMessage() {}
+
+func (x *DeleteInviteRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[28]
+	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 DeleteInviteRequest.ProtoReflect.Descriptor instead.
+func (*DeleteInviteRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{28}
+}
+
+func (x *DeleteInviteRequest) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *DeleteInviteRequest) GetInviteId() string {
+	if x != nil {
+		return x.InviteId
+	}
+	return ""
+}
+
+// Used in the `DeleteInvite` endpoint.
+type DeleteInviteResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *DeleteInviteResponse) Reset() {
+	*x = DeleteInviteResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[29]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DeleteInviteResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeleteInviteResponse) ProtoMessage() {}
+
+func (x *DeleteInviteResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[29]
+	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 DeleteInviteResponse.ProtoReflect.Descriptor instead.
+func (*DeleteInviteResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{29}
+}
+
+// Used in the `JoinGuild` endpoint.
+type JoinGuildRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Invite ID of the guild you want to join.
+	InviteId string `protobuf:"bytes,1,opt,name=invite_id,json=inviteId,proto3" json:"invite_id,omitempty"`
+}
+
+func (x *JoinGuildRequest) Reset() {
+	*x = JoinGuildRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[30]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *JoinGuildRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*JoinGuildRequest) ProtoMessage() {}
+
+func (x *JoinGuildRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[30]
+	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 JoinGuildRequest.ProtoReflect.Descriptor instead.
+func (*JoinGuildRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{30}
+}
+
+func (x *JoinGuildRequest) GetInviteId() string {
+	if x != nil {
+		return x.InviteId
+	}
+	return ""
+}
+
+// Used in the `JoinGuild` endpoint.
+type JoinGuildResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild you joined.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+}
+
+func (x *JoinGuildResponse) Reset() {
+	*x = JoinGuildResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[31]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *JoinGuildResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*JoinGuildResponse) ProtoMessage() {}
+
+func (x *JoinGuildResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[31]
+	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 JoinGuildResponse.ProtoReflect.Descriptor instead.
+func (*JoinGuildResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{31}
+}
+
+func (x *JoinGuildResponse) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+// Used in the `PreviewGuild` endpoint.
+type PreviewGuildRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Invite ID of the guild you want to get information from.
+	InviteId string `protobuf:"bytes,1,opt,name=invite_id,json=inviteId,proto3" json:"invite_id,omitempty"`
+}
+
+func (x *PreviewGuildRequest) Reset() {
+	*x = PreviewGuildRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[32]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *PreviewGuildRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*PreviewGuildRequest) ProtoMessage() {}
+
+func (x *PreviewGuildRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[32]
+	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 PreviewGuildRequest.ProtoReflect.Descriptor instead.
+func (*PreviewGuildRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{32}
+}
+
+func (x *PreviewGuildRequest) GetInviteId() string {
+	if x != nil {
+		return x.InviteId
+	}
+	return ""
+}
+
+// Used in the `PreviewGuild` endpoint.
+type PreviewGuildResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Name of the guild requested.
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	// Picture of the guild requested.
+	Picture *string `protobuf:"bytes,2,opt,name=picture,proto3,oneof" json:"picture,omitempty"`
+	// Member count of the guild requested.
+	MemberCount uint64 `protobuf:"varint,3,opt,name=member_count,json=memberCount,proto3" json:"member_count,omitempty"`
+}
+
+func (x *PreviewGuildResponse) Reset() {
+	*x = PreviewGuildResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[33]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *PreviewGuildResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*PreviewGuildResponse) ProtoMessage() {}
+
+func (x *PreviewGuildResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[33]
+	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 PreviewGuildResponse.ProtoReflect.Descriptor instead.
+func (*PreviewGuildResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{33}
+}
+
+func (x *PreviewGuildResponse) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *PreviewGuildResponse) GetPicture() string {
+	if x != nil && x.Picture != nil {
+		return *x.Picture
+	}
+	return ""
+}
+
+func (x *PreviewGuildResponse) GetMemberCount() uint64 {
+	if x != nil {
+		return x.MemberCount
+	}
+	return 0
+}
+
+// Used in the `LeaveGuild` endpoint.
+type LeaveGuildRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild you want to leave.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+}
+
+func (x *LeaveGuildRequest) Reset() {
+	*x = LeaveGuildRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[34]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *LeaveGuildRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*LeaveGuildRequest) ProtoMessage() {}
+
+func (x *LeaveGuildRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[34]
+	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 LeaveGuildRequest.ProtoReflect.Descriptor instead.
+func (*LeaveGuildRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{34}
+}
+
+func (x *LeaveGuildRequest) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+// Used in the `LeaveGuild` endpoint.
+type LeaveGuildResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *LeaveGuildResponse) Reset() {
+	*x = LeaveGuildResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[35]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *LeaveGuildResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*LeaveGuildResponse) ProtoMessage() {}
+
+func (x *LeaveGuildResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[35]
+	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 LeaveGuildResponse.ProtoReflect.Descriptor instead.
+func (*LeaveGuildResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{35}
+}
+
+// Used in `BanUser` endpoint.
+type BanUserRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The guild ID of the guild to ban the user from.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// The ID of the user to ban.
+	UserId uint64 `protobuf:"varint,2,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
+}
+
+func (x *BanUserRequest) Reset() {
+	*x = BanUserRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[36]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *BanUserRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*BanUserRequest) ProtoMessage() {}
+
+func (x *BanUserRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[36]
+	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 BanUserRequest.ProtoReflect.Descriptor instead.
+func (*BanUserRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{36}
+}
+
+func (x *BanUserRequest) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *BanUserRequest) GetUserId() uint64 {
+	if x != nil {
+		return x.UserId
+	}
+	return 0
+}
+
+// Used in `BanUser` endpoint.
+type BanUserResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *BanUserResponse) Reset() {
+	*x = BanUserResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[37]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *BanUserResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*BanUserResponse) ProtoMessage() {}
+
+func (x *BanUserResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[37]
+	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 BanUserResponse.ProtoReflect.Descriptor instead.
+func (*BanUserResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{37}
+}
+
+// Used in `KickUser` endpoint.
+type KickUserRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The guild ID of the guild to kick the user from.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// The user ID of the user to kick.
+	UserId uint64 `protobuf:"varint,2,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
+}
+
+func (x *KickUserRequest) Reset() {
+	*x = KickUserRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[38]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *KickUserRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*KickUserRequest) ProtoMessage() {}
+
+func (x *KickUserRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[38]
+	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 KickUserRequest.ProtoReflect.Descriptor instead.
+func (*KickUserRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{38}
+}
+
+func (x *KickUserRequest) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *KickUserRequest) GetUserId() uint64 {
+	if x != nil {
+		return x.UserId
+	}
+	return 0
+}
+
+// Used in `KickUser` endpoint.
+type KickUserResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *KickUserResponse) Reset() {
+	*x = KickUserResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[39]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *KickUserResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*KickUserResponse) ProtoMessage() {}
+
+func (x *KickUserResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[39]
+	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 KickUserResponse.ProtoReflect.Descriptor instead.
+func (*KickUserResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{39}
+}
+
+// Used in `UnbanUser` endpoint.
+type UnbanUserRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The guild ID of the guild to unban the user from.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// The user ID of the user to unban.
+	UserId uint64 `protobuf:"varint,2,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
+}
+
+func (x *UnbanUserRequest) Reset() {
+	*x = UnbanUserRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[40]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *UnbanUserRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UnbanUserRequest) ProtoMessage() {}
+
+func (x *UnbanUserRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[40]
+	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 UnbanUserRequest.ProtoReflect.Descriptor instead.
+func (*UnbanUserRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{40}
+}
+
+func (x *UnbanUserRequest) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *UnbanUserRequest) GetUserId() uint64 {
+	if x != nil {
+		return x.UserId
+	}
+	return 0
+}
+
+// Used in `UnbanUser` endpoint.
+type UnbanUserResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *UnbanUserResponse) Reset() {
+	*x = UnbanUserResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[41]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *UnbanUserResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UnbanUserResponse) ProtoMessage() {}
+
+func (x *UnbanUserResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[41]
+	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 UnbanUserResponse.ProtoReflect.Descriptor instead.
+func (*UnbanUserResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{41}
+}
+
+// Used in `GetBannedUsers` endpoint.
+type GetBannedUsersRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID to get banned users for.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+}
+
+func (x *GetBannedUsersRequest) Reset() {
+	*x = GetBannedUsersRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[42]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetBannedUsersRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetBannedUsersRequest) ProtoMessage() {}
+
+func (x *GetBannedUsersRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[42]
+	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 GetBannedUsersRequest.ProtoReflect.Descriptor instead.
+func (*GetBannedUsersRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{42}
+}
+
+func (x *GetBannedUsersRequest) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+// Used in `GetBannedUsers` endpoint.
+type GetBannedUsersResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The user IDs of banned users.
+	BannedUsers []uint64 `protobuf:"varint,1,rep,packed,name=banned_users,json=bannedUsers,proto3" json:"banned_users,omitempty"`
+}
+
+func (x *GetBannedUsersResponse) Reset() {
+	*x = GetBannedUsersResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[43]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetBannedUsersResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetBannedUsersResponse) ProtoMessage() {}
+
+func (x *GetBannedUsersResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[43]
+	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 GetBannedUsersResponse.ProtoReflect.Descriptor instead.
+func (*GetBannedUsersResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{43}
+}
+
+func (x *GetBannedUsersResponse) GetBannedUsers() []uint64 {
+	if x != nil {
+		return x.BannedUsers
+	}
+	return nil
+}
+
+// Request for GrantOwnership
+type GrantOwnershipRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild to give a user ownership on.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// The ID of the new owner to add.
+	NewOwnerId uint64 `protobuf:"varint,2,opt,name=new_owner_id,json=newOwnerId,proto3" json:"new_owner_id,omitempty"`
+}
+
+func (x *GrantOwnershipRequest) Reset() {
+	*x = GrantOwnershipRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[44]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GrantOwnershipRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GrantOwnershipRequest) ProtoMessage() {}
+
+func (x *GrantOwnershipRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[44]
+	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 GrantOwnershipRequest.ProtoReflect.Descriptor instead.
+func (*GrantOwnershipRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{44}
+}
+
+func (x *GrantOwnershipRequest) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *GrantOwnershipRequest) GetNewOwnerId() uint64 {
+	if x != nil {
+		return x.NewOwnerId
+	}
+	return 0
+}
+
+// Response for GrantOwnership
+type GrantOwnershipResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *GrantOwnershipResponse) Reset() {
+	*x = GrantOwnershipResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[45]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GrantOwnershipResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GrantOwnershipResponse) ProtoMessage() {}
+
+func (x *GrantOwnershipResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[45]
+	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 GrantOwnershipResponse.ProtoReflect.Descriptor instead.
+func (*GrantOwnershipResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{45}
+}
+
+// Request for GiveUpOwnership
+type GiveUpOwnershipRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID to give up your ownership on.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+}
+
+func (x *GiveUpOwnershipRequest) Reset() {
+	*x = GiveUpOwnershipRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[46]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GiveUpOwnershipRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GiveUpOwnershipRequest) ProtoMessage() {}
+
+func (x *GiveUpOwnershipRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[46]
+	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 GiveUpOwnershipRequest.ProtoReflect.Descriptor instead.
+func (*GiveUpOwnershipRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{46}
+}
+
+func (x *GiveUpOwnershipRequest) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+// Response for GiveUpOwnership
+type GiveUpOwnershipResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *GiveUpOwnershipResponse) Reset() {
+	*x = GiveUpOwnershipResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[47]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GiveUpOwnershipResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GiveUpOwnershipResponse) ProtoMessage() {}
+
+func (x *GiveUpOwnershipResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[47]
+	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 GiveUpOwnershipResponse.ProtoReflect.Descriptor instead.
+func (*GiveUpOwnershipResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{47}
+}
+
+// Used in `GetPendingInvites` endpoint.
+type GetPendingInvitesRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *GetPendingInvitesRequest) Reset() {
+	*x = GetPendingInvitesRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[48]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetPendingInvitesRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetPendingInvitesRequest) ProtoMessage() {}
+
+func (x *GetPendingInvitesRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[48]
+	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 GetPendingInvitesRequest.ProtoReflect.Descriptor instead.
+func (*GetPendingInvitesRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{48}
+}
+
+// Used in `GetPendingInvites` endpoint.
+type GetPendingInvitesResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The pending invite(s).
+	PendingInvites []*PendingInvite `protobuf:"bytes,1,rep,name=pending_invites,json=pendingInvites,proto3" json:"pending_invites,omitempty"`
+}
+
+func (x *GetPendingInvitesResponse) Reset() {
+	*x = GetPendingInvitesResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[49]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetPendingInvitesResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetPendingInvitesResponse) ProtoMessage() {}
+
+func (x *GetPendingInvitesResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[49]
+	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 GetPendingInvitesResponse.ProtoReflect.Descriptor instead.
+func (*GetPendingInvitesResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{49}
+}
+
+func (x *GetPendingInvitesResponse) GetPendingInvites() []*PendingInvite {
+	if x != nil {
+		return x.PendingInvites
+	}
+	return nil
+}
+
+// Used in `RejectPendingInvite` endpoint.
+type RejectPendingInviteRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Invite ID of the pending invite to reject.
+	InviteId string `protobuf:"bytes,1,opt,name=invite_id,json=inviteId,proto3" json:"invite_id,omitempty"`
+	// Server ID of the pending invite to reject.
+	ServerId *string `protobuf:"bytes,2,opt,name=server_id,json=serverId,proto3,oneof" json:"server_id,omitempty"`
+}
+
+func (x *RejectPendingInviteRequest) Reset() {
+	*x = RejectPendingInviteRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[50]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *RejectPendingInviteRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RejectPendingInviteRequest) ProtoMessage() {}
+
+func (x *RejectPendingInviteRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[50]
+	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 RejectPendingInviteRequest.ProtoReflect.Descriptor instead.
+func (*RejectPendingInviteRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{50}
+}
+
+func (x *RejectPendingInviteRequest) GetInviteId() string {
+	if x != nil {
+		return x.InviteId
+	}
+	return ""
+}
+
+func (x *RejectPendingInviteRequest) GetServerId() string {
+	if x != nil && x.ServerId != nil {
+		return *x.ServerId
+	}
+	return ""
+}
+
+// Used in `RejectPendingInvite` endpoint.
+type RejectPendingInviteResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *RejectPendingInviteResponse) Reset() {
+	*x = RejectPendingInviteResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[51]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *RejectPendingInviteResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RejectPendingInviteResponse) ProtoMessage() {}
+
+func (x *RejectPendingInviteResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[51]
+	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 RejectPendingInviteResponse.ProtoReflect.Descriptor instead.
+func (*RejectPendingInviteResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{51}
+}
+
+// Used in `IgnorePendingInvite` endpoint.
+type IgnorePendingInviteRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// ID of the pending invite to ignore.
+	InviteId string `protobuf:"bytes,1,opt,name=invite_id,json=inviteId,proto3" json:"invite_id,omitempty"`
+	// Server ID of the pending invite to reject.
+	ServerId *string `protobuf:"bytes,2,opt,name=server_id,json=serverId,proto3,oneof" json:"server_id,omitempty"`
+}
+
+func (x *IgnorePendingInviteRequest) Reset() {
+	*x = IgnorePendingInviteRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[52]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *IgnorePendingInviteRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*IgnorePendingInviteRequest) ProtoMessage() {}
+
+func (x *IgnorePendingInviteRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[52]
+	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 IgnorePendingInviteRequest.ProtoReflect.Descriptor instead.
+func (*IgnorePendingInviteRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{52}
+}
+
+func (x *IgnorePendingInviteRequest) GetInviteId() string {
+	if x != nil {
+		return x.InviteId
+	}
+	return ""
+}
+
+func (x *IgnorePendingInviteRequest) GetServerId() string {
+	if x != nil && x.ServerId != nil {
+		return *x.ServerId
+	}
+	return ""
+}
+
+// Used in `IgnorePendingInvite` endpoint.
+type IgnorePendingInviteResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *IgnorePendingInviteResponse) Reset() {
+	*x = IgnorePendingInviteResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[53]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *IgnorePendingInviteResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*IgnorePendingInviteResponse) ProtoMessage() {}
+
+func (x *IgnorePendingInviteResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[53]
+	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 IgnorePendingInviteResponse.ProtoReflect.Descriptor instead.
+func (*IgnorePendingInviteResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{53}
+}
+
+// Used in `InviteUserToGuild` endpoint.
+type InviteUserToGuildRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// User name of the user to invite.
+	UserName string `protobuf:"bytes,1,opt,name=user_name,json=userName,proto3" json:"user_name,omitempty"`
+	// Server ID of the user if they are on another server.
+	ServerId *string `protobuf:"bytes,2,opt,name=server_id,json=serverId,proto3,oneof" json:"server_id,omitempty"`
+	// Guild ID of the guild to invite to.
+	GuildId uint64 `protobuf:"varint,3,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+}
+
+func (x *InviteUserToGuildRequest) Reset() {
+	*x = InviteUserToGuildRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[54]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *InviteUserToGuildRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*InviteUserToGuildRequest) ProtoMessage() {}
+
+func (x *InviteUserToGuildRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[54]
+	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 InviteUserToGuildRequest.ProtoReflect.Descriptor instead.
+func (*InviteUserToGuildRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{54}
+}
+
+func (x *InviteUserToGuildRequest) GetUserName() string {
+	if x != nil {
+		return x.UserName
+	}
+	return ""
+}
+
+func (x *InviteUserToGuildRequest) GetServerId() string {
+	if x != nil && x.ServerId != nil {
+		return *x.ServerId
+	}
+	return ""
+}
+
+func (x *InviteUserToGuildRequest) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+// Used in `InviteUserToGuild` endpoint.
+type InviteUserToGuildResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *InviteUserToGuildResponse) Reset() {
+	*x = InviteUserToGuildResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[55]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *InviteUserToGuildResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*InviteUserToGuildResponse) ProtoMessage() {}
+
+func (x *InviteUserToGuildResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[55]
+	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 InviteUserToGuildResponse.ProtoReflect.Descriptor instead.
+func (*InviteUserToGuildResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{55}
+}
+
+// A "normal" guild as in a guild that allows multiple channels.
+type GuildKind_Normal struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *GuildKind_Normal) Reset() {
+	*x = GuildKind_Normal{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[56]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GuildKind_Normal) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GuildKind_Normal) ProtoMessage() {}
+
+func (x *GuildKind_Normal) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[56]
+	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 GuildKind_Normal.ProtoReflect.Descriptor instead.
+func (*GuildKind_Normal) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{0, 0}
+}
+
+// A "room" guild as in a guild that only has one channel.
+//
+// - Clients should not show a channel list for guilds of this type.
+type GuildKind_Room struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *GuildKind_Room) Reset() {
+	*x = GuildKind_Room{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[57]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GuildKind_Room) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GuildKind_Room) ProtoMessage() {}
+
+func (x *GuildKind_Room) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[57]
+	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 GuildKind_Room.ProtoReflect.Descriptor instead.
+func (*GuildKind_Room) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{0, 1}
+}
+
+// A "direct message" guild as in a guild that has at most two members,
+// and has only one channel.
+//
+// - Clients should not show a channel list for guilds of this type.
+// - Clients should show this guild in the guild list with the profile picture
+// and the username of the other user.
+// - Servers should "upgrade" this guild to a "room" guild if another
+// user joins the guild. A name should be crafted using the algorithm
+// described below:
+//   - Get at most 3 members' usernames, by their
+//   - Concat them with ", " as a seperator.
+type GuildKind_DirectMessage struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Whether this direct message was rejected by the invitee or not.
+	Rejected bool `protobuf:"varint,1,opt,name=rejected,proto3" json:"rejected,omitempty"`
+}
+
+func (x *GuildKind_DirectMessage) Reset() {
+	*x = GuildKind_DirectMessage{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_guilds_proto_msgTypes[58]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GuildKind_DirectMessage) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GuildKind_DirectMessage) ProtoMessage() {}
+
+func (x *GuildKind_DirectMessage) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_guilds_proto_msgTypes[58]
+	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 GuildKind_DirectMessage.ProtoReflect.Descriptor instead.
+func (*GuildKind_DirectMessage) Descriptor() ([]byte, []int) {
+	return file_chat_v1_guilds_proto_rawDescGZIP(), []int{0, 2}
+}
+
+func (x *GuildKind_DirectMessage) GetRejected() bool {
+	if x != nil {
+		return x.Rejected
+	}
+	return false
+}
+
+var File_chat_v1_guilds_proto protoreflect.FileDescriptor
+
+var file_chat_v1_guilds_proto_rawDesc = []byte{
+	0x0a, 0x14, 0x63, 0x68, 0x61, 0x74, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x73,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c,
+	0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x1a, 0x1b, 0x68, 0x61, 0x72, 0x6d, 0x6f, 0x6e,
+	0x79, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x9c, 0x02, 0x0a, 0x09, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x4b,
+	0x69, 0x6e, 0x64, 0x12, 0x3c, 0x0a, 0x06, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63,
+	0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x69, 0x6e, 0x64,
+	0x2e, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x48, 0x00, 0x52, 0x06, 0x6e, 0x6f, 0x72, 0x6d, 0x61,
+	0x6c, 0x12, 0x36, 0x0a, 0x04, 0x72, 0x6f, 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x20, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e,
+	0x76, 0x31, 0x2e, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x69, 0x6e, 0x64, 0x2e, 0x52, 0x6f, 0x6f,
+	0x6d, 0x48, 0x00, 0x52, 0x04, 0x72, 0x6f, 0x6f, 0x6d, 0x12, 0x52, 0x0a, 0x0e, 0x64, 0x69, 0x72,
+	0x65, 0x63, 0x74, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x29, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61,
+	0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x69, 0x6e, 0x64, 0x2e, 0x44,
+	0x69, 0x72, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x0d,
+	0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x08, 0x0a,
+	0x06, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x1a, 0x06, 0x0a, 0x04, 0x52, 0x6f, 0x6f, 0x6d, 0x1a,
+	0x2b, 0x0a, 0x0d, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
+	0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x06, 0x0a, 0x04,
+	0x6b, 0x69, 0x6e, 0x64, 0x22, 0xe6, 0x01, 0x0a, 0x05, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x12,
+	0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,
+	0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x88, 0x01,
+	0x01, 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03,
+	0x20, 0x03, 0x28, 0x04, 0x52, 0x08, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x2f,
+	0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e,
+	0x47, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12,
+	0x43, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x68, 0x61, 0x72,
+	0x6d, 0x6f, 0x6e, 0x79, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74,
+	0x61, 0x64, 0x61, 0x74, 0x61, 0x48, 0x01, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74,
+	0x61, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65,
+	0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x4a, 0x0a,
+	0x06, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x6f, 0x73, 0x73, 0x69,
+	0x62, 0x6c, 0x65, 0x5f, 0x75, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c,
+	0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x55, 0x73, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09,
+	0x75, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52,
+	0x08, 0x75, 0x73, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x5d, 0x0a, 0x0c, 0x49, 0x6e, 0x76,
+	0x69, 0x74, 0x65, 0x57, 0x69, 0x74, 0x68, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x6e, 0x76,
+	0x69, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6e,
+	0x76, 0x69, 0x74, 0x65, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x06, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f,
+	0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65,
+	0x52, 0x06, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x22, 0x7b, 0x0a, 0x0d, 0x50, 0x65, 0x6e, 0x64,
+	0x69, 0x6e, 0x67, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x6e, 0x76,
+	0x69, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6e,
+	0x76, 0x69, 0x74, 0x65, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x09, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72,
+	0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x73, 0x65, 0x72,
+	0x76, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x6e, 0x76, 0x69,
+	0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x69, 0x6e,
+	0x76, 0x69, 0x74, 0x65, 0x72, 0x49, 0x64, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x73, 0x65, 0x72, 0x76,
+	0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x48, 0x0a, 0x0e, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x4c, 0x69,
+	0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64,
+	0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64,
+	0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x64, 0x22,
+	0xa5, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x70, 0x69,
+	0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x70,
+	0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x88, 0x01, 0x01, 0x12, 0x43, 0x0a, 0x08, 0x6d, 0x65, 0x74,
+	0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x68, 0x61, 0x72, 0x6d, 0x6f, 0x6e, 0x79, 0x74, 0x79,
+	0x70, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x48,
+	0x01, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x88, 0x01, 0x01, 0x42, 0x0a,
+	0x0a, 0x08, 0x5f, 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d,
+	0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x30, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74,
+	0x65, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x19,
+	0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04,
+	0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x22, 0xa4, 0x01, 0x0a, 0x11, 0x43, 0x72,
+	0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6f, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
+	0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,
+	0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x88,
+	0x01, 0x01, 0x12, 0x43, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e,
+	0x68, 0x61, 0x72, 0x6d, 0x6f, 0x6e, 0x79, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e,
+	0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x48, 0x01, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61,
+	0x64, 0x61, 0x74, 0x61, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x70, 0x69, 0x63, 0x74,
+	0x75, 0x72, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,
+	0x22, 0x2f, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6f, 0x6d, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f,
+	0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49,
+	0x64, 0x22, 0x69, 0x0a, 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x69, 0x72, 0x65, 0x63,
+	0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
+	0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x09,
+	0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48,
+	0x00, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x42, 0x0c,
+	0x0a, 0x0a, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x38, 0x0a, 0x1b,
+	0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x73, 0x73,
+	0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x67,
+	0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67,
+	0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x22, 0x69, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
+	0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a,
+	0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52,
+	0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d,
+	0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x75, 0x73, 0x65, 0x73, 0x18, 0x03, 0x20,
+	0x01, 0x28, 0x0d, 0x52, 0x0c, 0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x55, 0x73, 0x65,
+	0x73, 0x22, 0x33, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74,
+	0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x6e, 0x76,
+	0x69, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6e,
+	0x76, 0x69, 0x74, 0x65, 0x49, 0x64, 0x22, 0x15, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x47, 0x75, 0x69,
+	0x6c, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x50, 0x0a,
+	0x14, 0x47, 0x65, 0x74, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x06, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x18,
+	0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c,
+	0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x4c, 0x69,
+	0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x22,
+	0x2c, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x22, 0x41, 0x0a,
+	0x10, 0x47, 0x65, 0x74, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x12, 0x2d, 0x0a, 0x05, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74,
+	0x2e, 0x76, 0x31, 0x2e, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x05, 0x67, 0x75, 0x69, 0x6c, 0x64,
+	0x22, 0x33, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x6e, 0x76, 0x69,
+	0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75,
+	0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75,
+	0x69, 0x6c, 0x64, 0x49, 0x64, 0x22, 0x53, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x47, 0x75, 0x69, 0x6c,
+	0x64, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x12, 0x38, 0x0a, 0x07, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28,
+	0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61,
+	0x74, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x57, 0x69, 0x74, 0x68, 0x49,
+	0x64, 0x52, 0x07, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x22, 0x33, 0x0a, 0x16, 0x47, 0x65,
+	0x74, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x22,
+	0x33, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x4d, 0x65, 0x6d, 0x62, 0x65,
+	0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65,
+	0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x04, 0x52, 0x07, 0x6d, 0x65, 0x6d,
+	0x62, 0x65, 0x72, 0x73, 0x22, 0xfa, 0x01, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47,
+	0x75, 0x69, 0x6c, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f,
+	0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49,
+	0x64, 0x12, 0x1e, 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x6e, 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01,
+	0x01, 0x12, 0x24, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0a, 0x6e, 0x65, 0x77, 0x50, 0x69, 0x63,
+	0x74, 0x75, 0x72, 0x65, 0x88, 0x01, 0x01, 0x12, 0x4a, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x5f, 0x6d,
+	0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x68, 0x61, 0x72, 0x6d, 0x6f, 0x6e, 0x79,
+	0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74,
+	0x61, 0x48, 0x02, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,
+	0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65,
+	0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65,
+	0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74,
+	0x61, 0x22, 0x20, 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x75, 0x69, 0x6c, 0x64,
+	0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x22, 0x36, 0x0a, 0x19, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x6f,
+	0x6f, 0x6d, 0x54, 0x6f, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x22, 0x1c, 0x0a, 0x1a, 0x55,
+	0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x6f, 0x6f, 0x6d, 0x54, 0x6f, 0x47, 0x75, 0x69, 0x6c,
+	0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, 0x0a, 0x12, 0x44, 0x65, 0x6c,
+	0x65, 0x74, 0x65, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
+	0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x22, 0x15, 0x0a, 0x13, 0x44, 0x65,
+	0x6c, 0x65, 0x74, 0x65, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x22, 0x4d, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74,
+	0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c,
+	0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c,
+	0x64, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x5f, 0x69, 0x64,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x49, 0x64,
+	0x22, 0x16, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, 0x0a, 0x10, 0x4a, 0x6f, 0x69, 0x6e,
+	0x47, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09,
+	0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x08, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x49, 0x64, 0x22, 0x2e, 0x0a, 0x11, 0x4a, 0x6f, 0x69,
+	0x6e, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x19,
+	0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04,
+	0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x22, 0x32, 0x0a, 0x13, 0x50, 0x72, 0x65,
+	0x76, 0x69, 0x65, 0x77, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x12, 0x1b, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x49, 0x64, 0x22, 0x78, 0x0a,
+	0x14, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x70, 0x69, 0x63,
+	0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x70, 0x69,
+	0x63, 0x74, 0x75, 0x72, 0x65, 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, 0x6d, 0x62,
+	0x65, 0x72, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b,
+	0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x42, 0x0a, 0x0a, 0x08, 0x5f,
+	0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x22, 0x2e, 0x0a, 0x11, 0x4c, 0x65, 0x61, 0x76, 0x65,
+	0x47, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08,
+	0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07,
+	0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x22, 0x14, 0x0a, 0x12, 0x4c, 0x65, 0x61, 0x76, 0x65,
+	0x47, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x44, 0x0a,
+	0x0e, 0x42, 0x61, 0x6e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
+	0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73,
+	0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x73, 0x65,
+	0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x42, 0x61, 0x6e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x45, 0x0a, 0x0f, 0x4b, 0x69, 0x63, 0x6b, 0x55, 0x73,
+	0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69,
+	0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69,
+	0x6c, 0x64, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x12, 0x0a,
+	0x10, 0x4b, 0x69, 0x63, 0x6b, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x22, 0x46, 0x0a, 0x10, 0x55, 0x6e, 0x62, 0x61, 0x6e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69,
+	0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64,
+	0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x04, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x13, 0x0a, 0x11, 0x55, 0x6e, 0x62,
+	0x61, 0x6e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32,
+	0x0a, 0x15, 0x47, 0x65, 0x74, 0x42, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x73,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64,
+	0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64,
+	0x49, 0x64, 0x22, 0x3b, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x42, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x55,
+	0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c,
+	0x62, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03,
+	0x28, 0x04, 0x52, 0x0b, 0x62, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x73, 0x22,
+	0x54, 0x0a, 0x15, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69,
+	0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c,
+	0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c,
+	0x64, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72,
+	0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x6e, 0x65, 0x77, 0x4f, 0x77,
+	0x6e, 0x65, 0x72, 0x49, 0x64, 0x22, 0x18, 0x0a, 0x16, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x4f, 0x77,
+	0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
+	0x33, 0x0a, 0x16, 0x47, 0x69, 0x76, 0x65, 0x55, 0x70, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68,
+	0x69, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69,
+	0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69,
+	0x6c, 0x64, 0x49, 0x64, 0x22, 0x19, 0x0a, 0x17, 0x47, 0x69, 0x76, 0x65, 0x55, 0x70, 0x4f, 0x77,
+	0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
+	0x1a, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x76,
+	0x69, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x65, 0x0a, 0x19, 0x47,
+	0x65, 0x74, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0f, 0x70, 0x65, 0x6e, 0x64,
+	0x69, 0x6e, 0x67, 0x5f, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28,
+	0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61,
+	0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x76, 0x69,
+	0x74, 0x65, 0x52, 0x0e, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x76, 0x69, 0x74,
+	0x65, 0x73, 0x22, 0x69, 0x0a, 0x1a, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x50, 0x65, 0x6e, 0x64,
+	0x69, 0x6e, 0x67, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x12, 0x1b, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x49, 0x64, 0x12, 0x20, 0x0a,
+	0x09, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+	0x48, 0x00, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x42,
+	0x0c, 0x0a, 0x0a, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x1d, 0x0a,
+	0x1b, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x49, 0x6e,
+	0x76, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x69, 0x0a, 0x1a,
+	0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x76,
+	0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x6e,
+	0x76, 0x69, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69,
+	0x6e, 0x76, 0x69, 0x74, 0x65, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x09, 0x73, 0x65, 0x72, 0x76, 0x65,
+	0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x73, 0x65,
+	0x72, 0x76, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x73, 0x65,
+	0x72, 0x76, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x1d, 0x0a, 0x1b, 0x49, 0x67, 0x6e, 0x6f, 0x72,
+	0x65, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x82, 0x01, 0x0a, 0x18, 0x49, 0x6e, 0x76, 0x69, 0x74,
+	0x65, 0x55, 0x73, 0x65, 0x72, 0x54, 0x6f, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65,
+	0x12, 0x20, 0x0a, 0x09, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x64, 0x88,
+	0x01, 0x01, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x03,
+	0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x42, 0x0c, 0x0a,
+	0x0a, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x1b, 0x0a, 0x19, 0x49,
+	0x6e, 0x76, 0x69, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x54, 0x6f, 0x47, 0x75, 0x69, 0x6c, 0x64,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x67, 0x0a, 0x0b, 0x4c, 0x65, 0x61, 0x76,
+	0x65, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x22, 0x4c, 0x45, 0x41, 0x56, 0x45,
+	0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x57, 0x49, 0x4c, 0x4c, 0x49, 0x4e, 0x47, 0x4c,
+	0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12,
+	0x17, 0x0a, 0x13, 0x4c, 0x45, 0x41, 0x56, 0x45, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f,
+	0x42, 0x41, 0x4e, 0x4e, 0x45, 0x44, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x4c, 0x45, 0x41, 0x56,
+	0x45, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x4b, 0x49, 0x43, 0x4b, 0x45, 0x44, 0x10,
+	0x02, 0x42, 0xc1, 0x01, 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63,
+	0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x42, 0x0b, 0x47, 0x75, 0x69, 0x6c,
+	0x64, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75,
+	0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x72, 0x6d, 0x6f, 0x6e, 0x79, 0x2d, 0x64, 0x65,
+	0x76, 0x65, 0x6c, 0x6f, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x73, 0x68, 0x69, 0x62, 0x73, 0x68,
+	0x69, 0x62, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x63, 0x68, 0x61, 0x74, 0x2f, 0x76, 0x31, 0x3b, 0x63,
+	0x68, 0x61, 0x74, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x50, 0x43, 0x58, 0xaa, 0x02, 0x10, 0x50, 0x72,
+	0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x74, 0x2e, 0x56, 0x31, 0xca, 0x02,
+	0x10, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5c, 0x43, 0x68, 0x61, 0x74, 0x5c, 0x56,
+	0x31, 0xe2, 0x02, 0x1c, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5c, 0x43, 0x68, 0x61,
+	0x74, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,
+	0xea, 0x02, 0x12, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x3a, 0x3a, 0x43, 0x68, 0x61,
+	0x74, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_chat_v1_guilds_proto_rawDescOnce sync.Once
+	file_chat_v1_guilds_proto_rawDescData = file_chat_v1_guilds_proto_rawDesc
+)
+
+func file_chat_v1_guilds_proto_rawDescGZIP() []byte {
+	file_chat_v1_guilds_proto_rawDescOnce.Do(func() {
+		file_chat_v1_guilds_proto_rawDescData = protoimpl.X.CompressGZIP(file_chat_v1_guilds_proto_rawDescData)
+	})
+	return file_chat_v1_guilds_proto_rawDescData
+}
+
+var file_chat_v1_guilds_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
+var file_chat_v1_guilds_proto_msgTypes = make([]protoimpl.MessageInfo, 59)
+var file_chat_v1_guilds_proto_goTypes = []interface{}{
+	(LeaveReason)(0),                       // 0: protocol.chat.v1.LeaveReason
+	(*GuildKind)(nil),                      // 1: protocol.chat.v1.GuildKind
+	(*Guild)(nil),                          // 2: protocol.chat.v1.Guild
+	(*Invite)(nil),                         // 3: protocol.chat.v1.Invite
+	(*InviteWithId)(nil),                   // 4: protocol.chat.v1.InviteWithId
+	(*PendingInvite)(nil),                  // 5: protocol.chat.v1.PendingInvite
+	(*GuildListEntry)(nil),                 // 6: protocol.chat.v1.GuildListEntry
+	(*CreateGuildRequest)(nil),             // 7: protocol.chat.v1.CreateGuildRequest
+	(*CreateGuildResponse)(nil),            // 8: protocol.chat.v1.CreateGuildResponse
+	(*CreateRoomRequest)(nil),              // 9: protocol.chat.v1.CreateRoomRequest
+	(*CreateRoomResponse)(nil),             // 10: protocol.chat.v1.CreateRoomResponse
+	(*CreateDirectMessageRequest)(nil),     // 11: protocol.chat.v1.CreateDirectMessageRequest
+	(*CreateDirectMessageResponse)(nil),    // 12: protocol.chat.v1.CreateDirectMessageResponse
+	(*CreateInviteRequest)(nil),            // 13: protocol.chat.v1.CreateInviteRequest
+	(*CreateInviteResponse)(nil),           // 14: protocol.chat.v1.CreateInviteResponse
+	(*GetGuildListRequest)(nil),            // 15: protocol.chat.v1.GetGuildListRequest
+	(*GetGuildListResponse)(nil),           // 16: protocol.chat.v1.GetGuildListResponse
+	(*GetGuildRequest)(nil),                // 17: protocol.chat.v1.GetGuildRequest
+	(*GetGuildResponse)(nil),               // 18: protocol.chat.v1.GetGuildResponse
+	(*GetGuildInvitesRequest)(nil),         // 19: protocol.chat.v1.GetGuildInvitesRequest
+	(*GetGuildInvitesResponse)(nil),        // 20: protocol.chat.v1.GetGuildInvitesResponse
+	(*GetGuildMembersRequest)(nil),         // 21: protocol.chat.v1.GetGuildMembersRequest
+	(*GetGuildMembersResponse)(nil),        // 22: protocol.chat.v1.GetGuildMembersResponse
+	(*UpdateGuildInformationRequest)(nil),  // 23: protocol.chat.v1.UpdateGuildInformationRequest
+	(*UpdateGuildInformationResponse)(nil), // 24: protocol.chat.v1.UpdateGuildInformationResponse
+	(*UpgradeRoomToGuildRequest)(nil),      // 25: protocol.chat.v1.UpgradeRoomToGuildRequest
+	(*UpgradeRoomToGuildResponse)(nil),     // 26: protocol.chat.v1.UpgradeRoomToGuildResponse
+	(*DeleteGuildRequest)(nil),             // 27: protocol.chat.v1.DeleteGuildRequest
+	(*DeleteGuildResponse)(nil),            // 28: protocol.chat.v1.DeleteGuildResponse
+	(*DeleteInviteRequest)(nil),            // 29: protocol.chat.v1.DeleteInviteRequest
+	(*DeleteInviteResponse)(nil),           // 30: protocol.chat.v1.DeleteInviteResponse
+	(*JoinGuildRequest)(nil),               // 31: protocol.chat.v1.JoinGuildRequest
+	(*JoinGuildResponse)(nil),              // 32: protocol.chat.v1.JoinGuildResponse
+	(*PreviewGuildRequest)(nil),            // 33: protocol.chat.v1.PreviewGuildRequest
+	(*PreviewGuildResponse)(nil),           // 34: protocol.chat.v1.PreviewGuildResponse
+	(*LeaveGuildRequest)(nil),              // 35: protocol.chat.v1.LeaveGuildRequest
+	(*LeaveGuildResponse)(nil),             // 36: protocol.chat.v1.LeaveGuildResponse
+	(*BanUserRequest)(nil),                 // 37: protocol.chat.v1.BanUserRequest
+	(*BanUserResponse)(nil),                // 38: protocol.chat.v1.BanUserResponse
+	(*KickUserRequest)(nil),                // 39: protocol.chat.v1.KickUserRequest
+	(*KickUserResponse)(nil),               // 40: protocol.chat.v1.KickUserResponse
+	(*UnbanUserRequest)(nil),               // 41: protocol.chat.v1.UnbanUserRequest
+	(*UnbanUserResponse)(nil),              // 42: protocol.chat.v1.UnbanUserResponse
+	(*GetBannedUsersRequest)(nil),          // 43: protocol.chat.v1.GetBannedUsersRequest
+	(*GetBannedUsersResponse)(nil),         // 44: protocol.chat.v1.GetBannedUsersResponse
+	(*GrantOwnershipRequest)(nil),          // 45: protocol.chat.v1.GrantOwnershipRequest
+	(*GrantOwnershipResponse)(nil),         // 46: protocol.chat.v1.GrantOwnershipResponse
+	(*GiveUpOwnershipRequest)(nil),         // 47: protocol.chat.v1.GiveUpOwnershipRequest
+	(*GiveUpOwnershipResponse)(nil),        // 48: protocol.chat.v1.GiveUpOwnershipResponse
+	(*GetPendingInvitesRequest)(nil),       // 49: protocol.chat.v1.GetPendingInvitesRequest
+	(*GetPendingInvitesResponse)(nil),      // 50: protocol.chat.v1.GetPendingInvitesResponse
+	(*RejectPendingInviteRequest)(nil),     // 51: protocol.chat.v1.RejectPendingInviteRequest
+	(*RejectPendingInviteResponse)(nil),    // 52: protocol.chat.v1.RejectPendingInviteResponse
+	(*IgnorePendingInviteRequest)(nil),     // 53: protocol.chat.v1.IgnorePendingInviteRequest
+	(*IgnorePendingInviteResponse)(nil),    // 54: protocol.chat.v1.IgnorePendingInviteResponse
+	(*InviteUserToGuildRequest)(nil),       // 55: protocol.chat.v1.InviteUserToGuildRequest
+	(*InviteUserToGuildResponse)(nil),      // 56: protocol.chat.v1.InviteUserToGuildResponse
+	(*GuildKind_Normal)(nil),               // 57: protocol.chat.v1.GuildKind.Normal
+	(*GuildKind_Room)(nil),                 // 58: protocol.chat.v1.GuildKind.Room
+	(*GuildKind_DirectMessage)(nil),        // 59: protocol.chat.v1.GuildKind.DirectMessage
+	(*v1.Metadata)(nil),                    // 60: protocol.harmonytypes.v1.Metadata
+}
+var file_chat_v1_guilds_proto_depIdxs = []int32{
+	57, // 0: protocol.chat.v1.GuildKind.normal:type_name -> protocol.chat.v1.GuildKind.Normal
+	58, // 1: protocol.chat.v1.GuildKind.room:type_name -> protocol.chat.v1.GuildKind.Room
+	59, // 2: protocol.chat.v1.GuildKind.direct_message:type_name -> protocol.chat.v1.GuildKind.DirectMessage
+	1,  // 3: protocol.chat.v1.Guild.kind:type_name -> protocol.chat.v1.GuildKind
+	60, // 4: protocol.chat.v1.Guild.metadata:type_name -> protocol.harmonytypes.v1.Metadata
+	3,  // 5: protocol.chat.v1.InviteWithId.invite:type_name -> protocol.chat.v1.Invite
+	60, // 6: protocol.chat.v1.CreateGuildRequest.metadata:type_name -> protocol.harmonytypes.v1.Metadata
+	60, // 7: protocol.chat.v1.CreateRoomRequest.metadata:type_name -> protocol.harmonytypes.v1.Metadata
+	6,  // 8: protocol.chat.v1.GetGuildListResponse.guilds:type_name -> protocol.chat.v1.GuildListEntry
+	2,  // 9: protocol.chat.v1.GetGuildResponse.guild:type_name -> protocol.chat.v1.Guild
+	4,  // 10: protocol.chat.v1.GetGuildInvitesResponse.invites:type_name -> protocol.chat.v1.InviteWithId
+	60, // 11: protocol.chat.v1.UpdateGuildInformationRequest.new_metadata:type_name -> protocol.harmonytypes.v1.Metadata
+	5,  // 12: protocol.chat.v1.GetPendingInvitesResponse.pending_invites:type_name -> protocol.chat.v1.PendingInvite
+	13, // [13:13] is the sub-list for method output_type
+	13, // [13:13] is the sub-list for method input_type
+	13, // [13:13] is the sub-list for extension type_name
+	13, // [13:13] is the sub-list for extension extendee
+	0,  // [0:13] is the sub-list for field type_name
+}
+
+func init() { file_chat_v1_guilds_proto_init() }
+func file_chat_v1_guilds_proto_init() {
+	if File_chat_v1_guilds_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_chat_v1_guilds_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GuildKind); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Guild); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Invite); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*InviteWithId); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*PendingInvite); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GuildListEntry); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*CreateGuildRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*CreateGuildResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*CreateRoomRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*CreateRoomResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*CreateDirectMessageRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*CreateDirectMessageResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*CreateInviteRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*CreateInviteResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetGuildListRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetGuildListResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetGuildRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetGuildResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetGuildInvitesRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetGuildInvitesResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetGuildMembersRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetGuildMembersResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*UpdateGuildInformationRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*UpdateGuildInformationResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*UpgradeRoomToGuildRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*UpgradeRoomToGuildResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DeleteGuildRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DeleteGuildResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DeleteInviteRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DeleteInviteResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*JoinGuildRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*JoinGuildResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*PreviewGuildRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*PreviewGuildResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*LeaveGuildRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*LeaveGuildResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*BanUserRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*BanUserResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*KickUserRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*KickUserResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*UnbanUserRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*UnbanUserResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetBannedUsersRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetBannedUsersResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GrantOwnershipRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GrantOwnershipResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GiveUpOwnershipRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GiveUpOwnershipResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetPendingInvitesRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetPendingInvitesResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*RejectPendingInviteRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*RejectPendingInviteResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*IgnorePendingInviteRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*IgnorePendingInviteResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*InviteUserToGuildRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*InviteUserToGuildResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GuildKind_Normal); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GuildKind_Room); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_guilds_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GuildKind_DirectMessage); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	file_chat_v1_guilds_proto_msgTypes[0].OneofWrappers = []interface{}{
+		(*GuildKind_Normal_)(nil),
+		(*GuildKind_Room_)(nil),
+		(*GuildKind_DirectMessage_)(nil),
+	}
+	file_chat_v1_guilds_proto_msgTypes[1].OneofWrappers = []interface{}{}
+	file_chat_v1_guilds_proto_msgTypes[4].OneofWrappers = []interface{}{}
+	file_chat_v1_guilds_proto_msgTypes[6].OneofWrappers = []interface{}{}
+	file_chat_v1_guilds_proto_msgTypes[8].OneofWrappers = []interface{}{}
+	file_chat_v1_guilds_proto_msgTypes[10].OneofWrappers = []interface{}{}
+	file_chat_v1_guilds_proto_msgTypes[22].OneofWrappers = []interface{}{}
+	file_chat_v1_guilds_proto_msgTypes[33].OneofWrappers = []interface{}{}
+	file_chat_v1_guilds_proto_msgTypes[50].OneofWrappers = []interface{}{}
+	file_chat_v1_guilds_proto_msgTypes[52].OneofWrappers = []interface{}{}
+	file_chat_v1_guilds_proto_msgTypes[54].OneofWrappers = []interface{}{}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_chat_v1_guilds_proto_rawDesc,
+			NumEnums:      1,
+			NumMessages:   59,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_chat_v1_guilds_proto_goTypes,
+		DependencyIndexes: file_chat_v1_guilds_proto_depIdxs,
+		EnumInfos:         file_chat_v1_guilds_proto_enumTypes,
+		MessageInfos:      file_chat_v1_guilds_proto_msgTypes,
+	}.Build()
+	File_chat_v1_guilds_proto = out.File
+	file_chat_v1_guilds_proto_rawDesc = nil
+	file_chat_v1_guilds_proto_goTypes = nil
+	file_chat_v1_guilds_proto_depIdxs = nil
+}
diff --git a/vendor/github.com/harmony-development/shibshib/gen/chat/v1/messages.pb.go b/vendor/github.com/harmony-development/shibshib/gen/chat/v1/messages.pb.go
new file mode 100644
index 00000000..d14636f2
--- /dev/null
+++ b/vendor/github.com/harmony-development/shibshib/gen/chat/v1/messages.pb.go
@@ -0,0 +1,6224 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.23.0
+// 	protoc        v3.17.3
+// source: chat/v1/messages.proto
+
+package chatv1
+
+import (
+	proto "github.com/golang/protobuf/proto"
+	v11 "github.com/harmony-development/shibshib/gen/emote/v1"
+	v1 "github.com/harmony-development/shibshib/gen/harmonytypes/v1"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
+
+// The action type. This is primarily used to change the look of the action to
+// the user (example: Destructive actions will have a red background).
+type Action_Type int32
+
+const (
+	// a normal action.
+	Action_TYPE_NORMAL_UNSPECIFIED Action_Type = 0
+	// a primary action.
+	Action_TYPE_PRIMARY Action_Type = 1
+	// A destructive / dangerous action.
+	Action_TYPE_DESTRUCTIVE Action_Type = 2
+)
+
+// Enum value maps for Action_Type.
+var (
+	Action_Type_name = map[int32]string{
+		0: "TYPE_NORMAL_UNSPECIFIED",
+		1: "TYPE_PRIMARY",
+		2: "TYPE_DESTRUCTIVE",
+	}
+	Action_Type_value = map[string]int32{
+		"TYPE_NORMAL_UNSPECIFIED": 0,
+		"TYPE_PRIMARY":            1,
+		"TYPE_DESTRUCTIVE":        2,
+	}
+)
+
+func (x Action_Type) Enum() *Action_Type {
+	p := new(Action_Type)
+	*p = x
+	return p
+}
+
+func (x Action_Type) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Action_Type) Descriptor() protoreflect.EnumDescriptor {
+	return file_chat_v1_messages_proto_enumTypes[0].Descriptor()
+}
+
+func (Action_Type) Type() protoreflect.EnumType {
+	return &file_chat_v1_messages_proto_enumTypes[0]
+}
+
+func (x Action_Type) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use Action_Type.Descriptor instead.
+func (Action_Type) EnumDescriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{2, 0}
+}
+
+// Type representing how to present an embed field.
+type Embed_EmbedField_Presentation int32
+
+const (
+	// Show the field as data.
+	Embed_EmbedField_PRESENTATION_DATA_UNSPECIFIED Embed_EmbedField_Presentation = 0
+	// Show the field as a captioned image.
+	Embed_EmbedField_PRESENTATION_CAPTIONED_IMAGE Embed_EmbedField_Presentation = 1
+	// Show the field as a row.
+	Embed_EmbedField_PRESENTATION_ROW Embed_EmbedField_Presentation = 2
+)
+
+// Enum value maps for Embed_EmbedField_Presentation.
+var (
+	Embed_EmbedField_Presentation_name = map[int32]string{
+		0: "PRESENTATION_DATA_UNSPECIFIED",
+		1: "PRESENTATION_CAPTIONED_IMAGE",
+		2: "PRESENTATION_ROW",
+	}
+	Embed_EmbedField_Presentation_value = map[string]int32{
+		"PRESENTATION_DATA_UNSPECIFIED": 0,
+		"PRESENTATION_CAPTIONED_IMAGE":  1,
+		"PRESENTATION_ROW":              2,
+	}
+)
+
+func (x Embed_EmbedField_Presentation) Enum() *Embed_EmbedField_Presentation {
+	p := new(Embed_EmbedField_Presentation)
+	*p = x
+	return p
+}
+
+func (x Embed_EmbedField_Presentation) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Embed_EmbedField_Presentation) Descriptor() protoreflect.EnumDescriptor {
+	return file_chat_v1_messages_proto_enumTypes[1].Descriptor()
+}
+
+func (Embed_EmbedField_Presentation) Type() protoreflect.EnumType {
+	return &file_chat_v1_messages_proto_enumTypes[1]
+}
+
+func (x Embed_EmbedField_Presentation) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use Embed_EmbedField_Presentation.Descriptor instead.
+func (Embed_EmbedField_Presentation) EnumDescriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{3, 1, 0}
+}
+
+// The kind of colour modification to apply
+type Format_Color_Kind int32
+
+const (
+	// Dimmed colour
+	Format_Color_KIND_DIM_UNSPECIFIED Format_Color_Kind = 0
+	// Brightened colour
+	Format_Color_KIND_BRIGHT Format_Color_Kind = 1
+	// Negative colour (usually red)
+	Format_Color_KIND_NEGATIVE Format_Color_Kind = 2
+	// Positive colour (usually green)
+	Format_Color_KIND_POSITIVE Format_Color_Kind = 3
+	// Informational colour (usually blue)
+	Format_Color_KIND_INFO Format_Color_Kind = 4
+	// Warning colour (usually yellow-orange)
+	Format_Color_KIND_WARNING Format_Color_Kind = 5
+)
+
+// Enum value maps for Format_Color_Kind.
+var (
+	Format_Color_Kind_name = map[int32]string{
+		0: "KIND_DIM_UNSPECIFIED",
+		1: "KIND_BRIGHT",
+		2: "KIND_NEGATIVE",
+		3: "KIND_POSITIVE",
+		4: "KIND_INFO",
+		5: "KIND_WARNING",
+	}
+	Format_Color_Kind_value = map[string]int32{
+		"KIND_DIM_UNSPECIFIED": 0,
+		"KIND_BRIGHT":          1,
+		"KIND_NEGATIVE":        2,
+		"KIND_POSITIVE":        3,
+		"KIND_INFO":            4,
+		"KIND_WARNING":         5,
+	}
+)
+
+func (x Format_Color_Kind) Enum() *Format_Color_Kind {
+	p := new(Format_Color_Kind)
+	*p = x
+	return p
+}
+
+func (x Format_Color_Kind) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Format_Color_Kind) Descriptor() protoreflect.EnumDescriptor {
+	return file_chat_v1_messages_proto_enumTypes[2].Descriptor()
+}
+
+func (Format_Color_Kind) Type() protoreflect.EnumType {
+	return &file_chat_v1_messages_proto_enumTypes[2]
+}
+
+func (x Format_Color_Kind) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use Format_Color_Kind.Descriptor instead.
+func (Format_Color_Kind) EnumDescriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{9, 12, 0}
+}
+
+// The direction relative to the `message_id` message to get messages from.
+type GetChannelMessagesRequest_Direction int32
+
+const (
+	// Get messages before the anchor.
+	GetChannelMessagesRequest_DIRECTION_BEFORE_UNSPECIFIED GetChannelMessagesRequest_Direction = 0
+	// Get messages around the anchor, including the anchor.
+	GetChannelMessagesRequest_DIRECTION_AROUND GetChannelMessagesRequest_Direction = 1
+	// Get messages after the anchor.
+	GetChannelMessagesRequest_DIRECTION_AFTER GetChannelMessagesRequest_Direction = 2
+)
+
+// Enum value maps for GetChannelMessagesRequest_Direction.
+var (
+	GetChannelMessagesRequest_Direction_name = map[int32]string{
+		0: "DIRECTION_BEFORE_UNSPECIFIED",
+		1: "DIRECTION_AROUND",
+		2: "DIRECTION_AFTER",
+	}
+	GetChannelMessagesRequest_Direction_value = map[string]int32{
+		"DIRECTION_BEFORE_UNSPECIFIED": 0,
+		"DIRECTION_AROUND":             1,
+		"DIRECTION_AFTER":              2,
+	}
+)
+
+func (x GetChannelMessagesRequest_Direction) Enum() *GetChannelMessagesRequest_Direction {
+	p := new(GetChannelMessagesRequest_Direction)
+	*p = x
+	return p
+}
+
+func (x GetChannelMessagesRequest_Direction) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (GetChannelMessagesRequest_Direction) Descriptor() protoreflect.EnumDescriptor {
+	return file_chat_v1_messages_proto_enumTypes[3].Descriptor()
+}
+
+func (GetChannelMessagesRequest_Direction) Type() protoreflect.EnumType {
+	return &file_chat_v1_messages_proto_enumTypes[3]
+}
+
+func (x GetChannelMessagesRequest_Direction) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use GetChannelMessagesRequest_Direction.Descriptor instead.
+func (GetChannelMessagesRequest_Direction) EnumDescriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{13, 0}
+}
+
+// Overrides provide a way to override the name and avatar of a message.
+type Overrides struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// the overridden username.
+	Username *string `protobuf:"bytes,1,opt,name=username,proto3,oneof" json:"username,omitempty"`
+	// the overridden avatar.
+	Avatar *string `protobuf:"bytes,2,opt,name=avatar,proto3,oneof" json:"avatar,omitempty"`
+	// the reason for overriding username and avatar.
+	//
+	// Types that are assignable to Reason:
+	//	*Overrides_UserDefined
+	//	*Overrides_Webhook
+	//	*Overrides_SystemPlurality
+	//	*Overrides_SystemMessage
+	//	*Overrides_Bridge
+	Reason isOverrides_Reason `protobuf_oneof:"reason"`
+}
+
+func (x *Overrides) Reset() {
+	*x = Overrides{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Overrides) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Overrides) ProtoMessage() {}
+
+func (x *Overrides) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[0]
+	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 Overrides.ProtoReflect.Descriptor instead.
+func (*Overrides) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *Overrides) GetUsername() string {
+	if x != nil && x.Username != nil {
+		return *x.Username
+	}
+	return ""
+}
+
+func (x *Overrides) GetAvatar() string {
+	if x != nil && x.Avatar != nil {
+		return *x.Avatar
+	}
+	return ""
+}
+
+func (m *Overrides) GetReason() isOverrides_Reason {
+	if m != nil {
+		return m.Reason
+	}
+	return nil
+}
+
+func (x *Overrides) GetUserDefined() string {
+	if x, ok := x.GetReason().(*Overrides_UserDefined); ok {
+		return x.UserDefined
+	}
+	return ""
+}
+
+func (x *Overrides) GetWebhook() *v1.Empty {
+	if x, ok := x.GetReason().(*Overrides_Webhook); ok {
+		return x.Webhook
+	}
+	return nil
+}
+
+func (x *Overrides) GetSystemPlurality() *v1.Empty {
+	if x, ok := x.GetReason().(*Overrides_SystemPlurality); ok {
+		return x.SystemPlurality
+	}
+	return nil
+}
+
+func (x *Overrides) GetSystemMessage() *v1.Empty {
+	if x, ok := x.GetReason().(*Overrides_SystemMessage); ok {
+		return x.SystemMessage
+	}
+	return nil
+}
+
+func (x *Overrides) GetBridge() *v1.Empty {
+	if x, ok := x.GetReason().(*Overrides_Bridge); ok {
+		return x.Bridge
+	}
+	return nil
+}
+
+type isOverrides_Reason interface {
+	isOverrides_Reason()
+}
+
+type Overrides_UserDefined struct {
+	// a custom reason in case the builtin ones don't fit
+	UserDefined string `protobuf:"bytes,3,opt,name=user_defined,json=userDefined,proto3,oneof"`
+}
+
+type Overrides_Webhook struct {
+	// the override occured because of a webhook
+	Webhook *v1.Empty `protobuf:"bytes,4,opt,name=webhook,proto3,oneof"`
+}
+
+type Overrides_SystemPlurality struct {
+	// plurality, not system as in computer
+	SystemPlurality *v1.Empty `protobuf:"bytes,5,opt,name=system_plurality,json=systemPlurality,proto3,oneof"`
+}
+
+type Overrides_SystemMessage struct {
+	// the override occured because it was made by the server
+	//
+	// Servers should reject messages sent by users with this override.
+	SystemMessage *v1.Empty `protobuf:"bytes,6,opt,name=system_message,json=systemMessage,proto3,oneof"`
+}
+
+type Overrides_Bridge struct {
+	// the override occured because of bridging
+	Bridge *v1.Empty `protobuf:"bytes,7,opt,name=bridge,proto3,oneof"`
+}
+
+func (*Overrides_UserDefined) isOverrides_Reason() {}
+
+func (*Overrides_Webhook) isOverrides_Reason() {}
+
+func (*Overrides_SystemPlurality) isOverrides_Reason() {}
+
+func (*Overrides_SystemMessage) isOverrides_Reason() {}
+
+func (*Overrides_Bridge) isOverrides_Reason() {}
+
+// The payload sent to the bot when an action is triggered.
+type ActionPayload struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The payload data
+	//
+	// Types that are assignable to Payload:
+	//	*ActionPayload_Button_
+	//	*ActionPayload_Dropdown_
+	//	*ActionPayload_Input_
+	Payload isActionPayload_Payload `protobuf_oneof:"payload"`
+}
+
+func (x *ActionPayload) Reset() {
+	*x = ActionPayload{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ActionPayload) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ActionPayload) ProtoMessage() {}
+
+func (x *ActionPayload) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[1]
+	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 ActionPayload.ProtoReflect.Descriptor instead.
+func (*ActionPayload) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{1}
+}
+
+func (m *ActionPayload) GetPayload() isActionPayload_Payload {
+	if m != nil {
+		return m.Payload
+	}
+	return nil
+}
+
+func (x *ActionPayload) GetButton() *ActionPayload_Button {
+	if x, ok := x.GetPayload().(*ActionPayload_Button_); ok {
+		return x.Button
+	}
+	return nil
+}
+
+func (x *ActionPayload) GetDropdown() *ActionPayload_Dropdown {
+	if x, ok := x.GetPayload().(*ActionPayload_Dropdown_); ok {
+		return x.Dropdown
+	}
+	return nil
+}
+
+func (x *ActionPayload) GetInput() *ActionPayload_Input {
+	if x, ok := x.GetPayload().(*ActionPayload_Input_); ok {
+		return x.Input
+	}
+	return nil
+}
+
+type isActionPayload_Payload interface {
+	isActionPayload_Payload()
+}
+
+type ActionPayload_Button_ struct {
+	// Payload for a button
+	Button *ActionPayload_Button `protobuf:"bytes,1,opt,name=button,proto3,oneof"`
+}
+
+type ActionPayload_Dropdown_ struct {
+	// Payload for a dropdown
+	Dropdown *ActionPayload_Dropdown `protobuf:"bytes,2,opt,name=dropdown,proto3,oneof"`
+}
+
+type ActionPayload_Input_ struct {
+	// Payload for a text input
+	Input *ActionPayload_Input `protobuf:"bytes,3,opt,name=input,proto3,oneof"`
+}
+
+func (*ActionPayload_Button_) isActionPayload_Payload() {}
+
+func (*ActionPayload_Dropdown_) isActionPayload_Payload() {}
+
+func (*ActionPayload_Input_) isActionPayload_Payload() {}
+
+// Actions are interactive elements that can exist within an embed.
+type Action struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Type of the action.
+	ActionType Action_Type `protobuf:"varint,1,opt,name=action_type,json=actionType,proto3,enum=protocol.chat.v1.Action_Type" json:"action_type,omitempty"`
+	// The kind of the action.
+	//
+	// Types that are assignable to Kind:
+	//	*Action_Button_
+	//	*Action_Dropdown_
+	//	*Action_Input_
+	Kind isAction_Kind `protobuf_oneof:"kind"`
+}
+
+func (x *Action) Reset() {
+	*x = Action{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Action) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Action) ProtoMessage() {}
+
+func (x *Action) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[2]
+	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 Action.ProtoReflect.Descriptor instead.
+func (*Action) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *Action) GetActionType() Action_Type {
+	if x != nil {
+		return x.ActionType
+	}
+	return Action_TYPE_NORMAL_UNSPECIFIED
+}
+
+func (m *Action) GetKind() isAction_Kind {
+	if m != nil {
+		return m.Kind
+	}
+	return nil
+}
+
+func (x *Action) GetButton() *Action_Button {
+	if x, ok := x.GetKind().(*Action_Button_); ok {
+		return x.Button
+	}
+	return nil
+}
+
+func (x *Action) GetDropdown() *Action_Dropdown {
+	if x, ok := x.GetKind().(*Action_Dropdown_); ok {
+		return x.Dropdown
+	}
+	return nil
+}
+
+func (x *Action) GetInput() *Action_Input {
+	if x, ok := x.GetKind().(*Action_Input_); ok {
+		return x.Input
+	}
+	return nil
+}
+
+type isAction_Kind interface {
+	isAction_Kind()
+}
+
+type Action_Button_ struct {
+	// Button action.
+	Button *Action_Button `protobuf:"bytes,2,opt,name=button,proto3,oneof"`
+}
+
+type Action_Dropdown_ struct {
+	// Dropdown action.
+	Dropdown *Action_Dropdown `protobuf:"bytes,3,opt,name=dropdown,proto3,oneof"`
+}
+
+type Action_Input_ struct {
+	// Input action.
+	Input *Action_Input `protobuf:"bytes,4,opt,name=input,proto3,oneof"`
+}
+
+func (*Action_Button_) isAction_Kind() {}
+
+func (*Action_Dropdown_) isAction_Kind() {}
+
+func (*Action_Input_) isAction_Kind() {}
+
+// Object representing a message embed.
+type Embed struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Title of this embed.
+	Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"`
+	// Body text of this embed.
+	Body *FormattedText `protobuf:"bytes,2,opt,name=body,proto3,oneof" json:"body,omitempty"`
+	// Color of this embed.
+	Color *int32 `protobuf:"varint,3,opt,name=color,proto3,oneof" json:"color,omitempty"`
+	// Embed heading for the header.
+	Header *Embed_EmbedHeading `protobuf:"bytes,4,opt,name=header,proto3,oneof" json:"header,omitempty"`
+	// Embed heading for the footer.
+	Footer *Embed_EmbedHeading `protobuf:"bytes,5,opt,name=footer,proto3,oneof" json:"footer,omitempty"`
+	// Fields of this embed.
+	Fields []*Embed_EmbedField `protobuf:"bytes,6,rep,name=fields,proto3" json:"fields,omitempty"`
+}
+
+func (x *Embed) Reset() {
+	*x = Embed{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Embed) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Embed) ProtoMessage() {}
+
+func (x *Embed) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[3]
+	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 Embed.ProtoReflect.Descriptor instead.
+func (*Embed) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *Embed) GetTitle() string {
+	if x != nil {
+		return x.Title
+	}
+	return ""
+}
+
+func (x *Embed) GetBody() *FormattedText {
+	if x != nil {
+		return x.Body
+	}
+	return nil
+}
+
+func (x *Embed) GetColor() int32 {
+	if x != nil && x.Color != nil {
+		return *x.Color
+	}
+	return 0
+}
+
+func (x *Embed) GetHeader() *Embed_EmbedHeading {
+	if x != nil {
+		return x.Header
+	}
+	return nil
+}
+
+func (x *Embed) GetFooter() *Embed_EmbedHeading {
+	if x != nil {
+		return x.Footer
+	}
+	return nil
+}
+
+func (x *Embed) GetFields() []*Embed_EmbedField {
+	if x != nil {
+		return x.Fields
+	}
+	return nil
+}
+
+//
+// Minithumbnail is an extremely low-quality JPEG thumbnail.
+//
+// The resolution is usually no larger than 64x64.
+type Minithumbnail struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The width of the minithumbnail
+	Width uint32 `protobuf:"varint,1,opt,name=width,proto3" json:"width,omitempty"`
+	// The height of the minithumbnail
+	Height uint32 `protobuf:"varint,2,opt,name=height,proto3" json:"height,omitempty"`
+	// The JPEG data of the minithumbnail
+	Data []byte `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"`
+}
+
+func (x *Minithumbnail) Reset() {
+	*x = Minithumbnail{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Minithumbnail) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Minithumbnail) ProtoMessage() {}
+
+func (x *Minithumbnail) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[4]
+	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 Minithumbnail.ProtoReflect.Descriptor instead.
+func (*Minithumbnail) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *Minithumbnail) GetWidth() uint32 {
+	if x != nil {
+		return x.Width
+	}
+	return 0
+}
+
+func (x *Minithumbnail) GetHeight() uint32 {
+	if x != nil {
+		return x.Height
+	}
+	return 0
+}
+
+func (x *Minithumbnail) GetData() []byte {
+	if x != nil {
+		return x.Data
+	}
+	return nil
+}
+
+//
+// Photo contains data about a photo.
+//
+// Photo are always JPEG, and are
+// constrained to the following rules:
+//
+// - width+height <= 10_000
+// - width <= height*20
+// - height <= width*20
+//
+// Photos are preferably no more than 10MB
+// in size, and servers may compress as necessary.
+type Photo struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The HMC URL of the photo.
+	Hmc string `protobuf:"bytes,1,opt,name=hmc,proto3" json:"hmc,omitempty"`
+	// The filename of the photo.
+	Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
+	// The size of the photo.
+	FileSize uint32 `protobuf:"varint,3,opt,name=file_size,json=fileSize,proto3" json:"file_size,omitempty"`
+	// The height of the photo, in pixels.
+	Height uint32 `protobuf:"varint,4,opt,name=height,proto3" json:"height,omitempty"`
+	// The width of the photo, in pixels.
+	Width uint32 `protobuf:"varint,5,opt,name=width,proto3" json:"width,omitempty"`
+	// The photo's caption.
+	Caption *FormattedText `protobuf:"bytes,6,opt,name=caption,proto3" json:"caption,omitempty"`
+	// A thumbnail representing the photo.
+	Minithumbnail *Minithumbnail `protobuf:"bytes,7,opt,name=minithumbnail,proto3" json:"minithumbnail,omitempty"`
+}
+
+func (x *Photo) Reset() {
+	*x = Photo{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Photo) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Photo) ProtoMessage() {}
+
+func (x *Photo) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[5]
+	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 Photo.ProtoReflect.Descriptor instead.
+func (*Photo) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *Photo) GetHmc() string {
+	if x != nil {
+		return x.Hmc
+	}
+	return ""
+}
+
+func (x *Photo) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *Photo) GetFileSize() uint32 {
+	if x != nil {
+		return x.FileSize
+	}
+	return 0
+}
+
+func (x *Photo) GetHeight() uint32 {
+	if x != nil {
+		return x.Height
+	}
+	return 0
+}
+
+func (x *Photo) GetWidth() uint32 {
+	if x != nil {
+		return x.Width
+	}
+	return 0
+}
+
+func (x *Photo) GetCaption() *FormattedText {
+	if x != nil {
+		return x.Caption
+	}
+	return nil
+}
+
+func (x *Photo) GetMinithumbnail() *Minithumbnail {
+	if x != nil {
+		return x.Minithumbnail
+	}
+	return nil
+}
+
+// Object representing a generic message attachment.
+type Attachment struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// File ID of this attachment.
+	Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+	// Filename of this attachment.
+	Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
+	// Mimetype of this attachment.
+	Mimetype string `protobuf:"bytes,3,opt,name=mimetype,proto3" json:"mimetype,omitempty"`
+	// Size of this attachment.
+	Size uint32 `protobuf:"varint,4,opt,name=size,proto3" json:"size,omitempty"`
+	// Caption of this attachment.
+	Caption *FormattedText `protobuf:"bytes,5,opt,name=caption,proto3,oneof" json:"caption,omitempty"`
+}
+
+func (x *Attachment) Reset() {
+	*x = Attachment{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Attachment) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Attachment) ProtoMessage() {}
+
+func (x *Attachment) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[6]
+	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 Attachment.ProtoReflect.Descriptor instead.
+func (*Attachment) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *Attachment) GetId() string {
+	if x != nil {
+		return x.Id
+	}
+	return ""
+}
+
+func (x *Attachment) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *Attachment) GetMimetype() string {
+	if x != nil {
+		return x.Mimetype
+	}
+	return ""
+}
+
+func (x *Attachment) GetSize() uint32 {
+	if x != nil {
+		return x.Size
+	}
+	return 0
+}
+
+func (x *Attachment) GetCaption() *FormattedText {
+	if x != nil {
+		return x.Caption
+	}
+	return nil
+}
+
+// Object representing a message's content.
+type Content struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Content data.
+	//
+	// Types that are assignable to Content:
+	//	*Content_TextMessage
+	//	*Content_EmbedMessage
+	//	*Content_AttachmentMessage
+	//	*Content_PhotoMessage
+	//	*Content_InviteRejected_
+	//	*Content_InviteAccepted_
+	//	*Content_RoomUpgradedToGuild_
+	Content isContent_Content `protobuf_oneof:"content"`
+}
+
+func (x *Content) Reset() {
+	*x = Content{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Content) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Content) ProtoMessage() {}
+
+func (x *Content) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[7]
+	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 Content.ProtoReflect.Descriptor instead.
+func (*Content) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{7}
+}
+
+func (m *Content) GetContent() isContent_Content {
+	if m != nil {
+		return m.Content
+	}
+	return nil
+}
+
+func (x *Content) GetTextMessage() *Content_TextContent {
+	if x, ok := x.GetContent().(*Content_TextMessage); ok {
+		return x.TextMessage
+	}
+	return nil
+}
+
+func (x *Content) GetEmbedMessage() *Content_EmbedContent {
+	if x, ok := x.GetContent().(*Content_EmbedMessage); ok {
+		return x.EmbedMessage
+	}
+	return nil
+}
+
+func (x *Content) GetAttachmentMessage() *Content_AttachmentContent {
+	if x, ok := x.GetContent().(*Content_AttachmentMessage); ok {
+		return x.AttachmentMessage
+	}
+	return nil
+}
+
+func (x *Content) GetPhotoMessage() *Content_PhotoContent {
+	if x, ok := x.GetContent().(*Content_PhotoMessage); ok {
+		return x.PhotoMessage
+	}
+	return nil
+}
+
+func (x *Content) GetInviteRejected() *Content_InviteRejected {
+	if x, ok := x.GetContent().(*Content_InviteRejected_); ok {
+		return x.InviteRejected
+	}
+	return nil
+}
+
+func (x *Content) GetInviteAccepted() *Content_InviteAccepted {
+	if x, ok := x.GetContent().(*Content_InviteAccepted_); ok {
+		return x.InviteAccepted
+	}
+	return nil
+}
+
+func (x *Content) GetRoomUpgradedToGuild() *Content_RoomUpgradedToGuild {
+	if x, ok := x.GetContent().(*Content_RoomUpgradedToGuild_); ok {
+		return x.RoomUpgradedToGuild
+	}
+	return nil
+}
+
+type isContent_Content interface {
+	isContent_Content()
+}
+
+type Content_TextMessage struct {
+	// Text content.
+	TextMessage *Content_TextContent `protobuf:"bytes,1,opt,name=text_message,json=textMessage,proto3,oneof"`
+}
+
+type Content_EmbedMessage struct {
+	// Embed content.
+	EmbedMessage *Content_EmbedContent `protobuf:"bytes,2,opt,name=embed_message,json=embedMessage,proto3,oneof"`
+}
+
+type Content_AttachmentMessage struct {
+	// Attachment content.
+	AttachmentMessage *Content_AttachmentContent `protobuf:"bytes,3,opt,name=attachment_message,json=attachmentMessage,proto3,oneof"`
+}
+
+type Content_PhotoMessage struct {
+	// Photo content.
+	PhotoMessage *Content_PhotoContent `protobuf:"bytes,4,opt,name=photo_message,json=photoMessage,proto3,oneof"`
+}
+
+type Content_InviteRejected_ struct {
+	// A user rejected an invite.
+	InviteRejected *Content_InviteRejected `protobuf:"bytes,5,opt,name=invite_rejected,json=inviteRejected,proto3,oneof"`
+}
+
+type Content_InviteAccepted_ struct {
+	// A user accepted an invite.
+	InviteAccepted *Content_InviteAccepted `protobuf:"bytes,6,opt,name=invite_accepted,json=inviteAccepted,proto3,oneof"`
+}
+
+type Content_RoomUpgradedToGuild_ struct {
+	// A user upgraded a guild from "room" to "normal".
+	RoomUpgradedToGuild *Content_RoomUpgradedToGuild `protobuf:"bytes,7,opt,name=room_upgraded_to_guild,json=roomUpgradedToGuild,proto3,oneof"`
+}
+
+func (*Content_TextMessage) isContent_Content() {}
+
+func (*Content_EmbedMessage) isContent_Content() {}
+
+func (*Content_AttachmentMessage) isContent_Content() {}
+
+func (*Content_PhotoMessage) isContent_Content() {}
+
+func (*Content_InviteRejected_) isContent_Content() {}
+
+func (*Content_InviteAccepted_) isContent_Content() {}
+
+func (*Content_RoomUpgradedToGuild_) isContent_Content() {}
+
+// Object representing a reaction.
+type Reaction struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Emote data for this reaction.
+	//
+	// Emote's image ID is used as an identifier for unique reactions.
+	// Emotes with the same names should be "deduplicated" by a client, by suffixing
+	// their names with `~1`, `~2` and so on.
+	Emote *v11.Emote `protobuf:"bytes,1,opt,name=emote,proto3" json:"emote,omitempty"`
+	// How many reactions this reaction has.
+	Count uint32 `protobuf:"varint,2,opt,name=count,proto3" json:"count,omitempty"`
+}
+
+func (x *Reaction) Reset() {
+	*x = Reaction{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[8]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Reaction) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Reaction) ProtoMessage() {}
+
+func (x *Reaction) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[8]
+	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 Reaction.ProtoReflect.Descriptor instead.
+func (*Reaction) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{8}
+}
+
+func (x *Reaction) GetEmote() *v11.Emote {
+	if x != nil {
+		return x.Emote
+	}
+	return nil
+}
+
+func (x *Reaction) GetCount() uint32 {
+	if x != nil {
+		return x.Count
+	}
+	return 0
+}
+
+// A format for text
+type Format struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// where the format begins to apply to
+	Start uint32 `protobuf:"varint,1,opt,name=start,proto3" json:"start,omitempty"`
+	// how many characters the format is
+	Length uint32 `protobuf:"varint,2,opt,name=length,proto3" json:"length,omitempty"`
+	// the style if format to apply to this text
+	//
+	// Types that are assignable to Format:
+	//	*Format_Bold_
+	//	*Format_Italic_
+	//	*Format_Underline_
+	//	*Format_Monospace_
+	//	*Format_Superscript_
+	//	*Format_Subscript_
+	//	*Format_CodeBlock_
+	//	*Format_UserMention_
+	//	*Format_RoleMention_
+	//	*Format_ChannelMention_
+	//	*Format_GuildMention_
+	//	*Format_Emoji_
+	//	*Format_Color_
+	//	*Format_Localization_
+	Format isFormat_Format `protobuf_oneof:"format"`
+}
+
+func (x *Format) Reset() {
+	*x = Format{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[9]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Format) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Format) ProtoMessage() {}
+
+func (x *Format) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[9]
+	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 Format.ProtoReflect.Descriptor instead.
+func (*Format) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{9}
+}
+
+func (x *Format) GetStart() uint32 {
+	if x != nil {
+		return x.Start
+	}
+	return 0
+}
+
+func (x *Format) GetLength() uint32 {
+	if x != nil {
+		return x.Length
+	}
+	return 0
+}
+
+func (m *Format) GetFormat() isFormat_Format {
+	if m != nil {
+		return m.Format
+	}
+	return nil
+}
+
+func (x *Format) GetBold() *Format_Bold {
+	if x, ok := x.GetFormat().(*Format_Bold_); ok {
+		return x.Bold
+	}
+	return nil
+}
+
+func (x *Format) GetItalic() *Format_Italic {
+	if x, ok := x.GetFormat().(*Format_Italic_); ok {
+		return x.Italic
+	}
+	return nil
+}
+
+func (x *Format) GetUnderline() *Format_Underline {
+	if x, ok := x.GetFormat().(*Format_Underline_); ok {
+		return x.Underline
+	}
+	return nil
+}
+
+func (x *Format) GetMonospace() *Format_Monospace {
+	if x, ok := x.GetFormat().(*Format_Monospace_); ok {
+		return x.Monospace
+	}
+	return nil
+}
+
+func (x *Format) GetSuperscript() *Format_Superscript {
+	if x, ok := x.GetFormat().(*Format_Superscript_); ok {
+		return x.Superscript
+	}
+	return nil
+}
+
+func (x *Format) GetSubscript() *Format_Subscript {
+	if x, ok := x.GetFormat().(*Format_Subscript_); ok {
+		return x.Subscript
+	}
+	return nil
+}
+
+func (x *Format) GetCodeBlock() *Format_CodeBlock {
+	if x, ok := x.GetFormat().(*Format_CodeBlock_); ok {
+		return x.CodeBlock
+	}
+	return nil
+}
+
+func (x *Format) GetUserMention() *Format_UserMention {
+	if x, ok := x.GetFormat().(*Format_UserMention_); ok {
+		return x.UserMention
+	}
+	return nil
+}
+
+func (x *Format) GetRoleMention() *Format_RoleMention {
+	if x, ok := x.GetFormat().(*Format_RoleMention_); ok {
+		return x.RoleMention
+	}
+	return nil
+}
+
+func (x *Format) GetChannelMention() *Format_ChannelMention {
+	if x, ok := x.GetFormat().(*Format_ChannelMention_); ok {
+		return x.ChannelMention
+	}
+	return nil
+}
+
+func (x *Format) GetGuildMention() *Format_GuildMention {
+	if x, ok := x.GetFormat().(*Format_GuildMention_); ok {
+		return x.GuildMention
+	}
+	return nil
+}
+
+func (x *Format) GetEmoji() *Format_Emoji {
+	if x, ok := x.GetFormat().(*Format_Emoji_); ok {
+		return x.Emoji
+	}
+	return nil
+}
+
+func (x *Format) GetColor() *Format_Color {
+	if x, ok := x.GetFormat().(*Format_Color_); ok {
+		return x.Color
+	}
+	return nil
+}
+
+func (x *Format) GetLocalization() *Format_Localization {
+	if x, ok := x.GetFormat().(*Format_Localization_); ok {
+		return x.Localization
+	}
+	return nil
+}
+
+type isFormat_Format interface {
+	isFormat_Format()
+}
+
+type Format_Bold_ struct {
+	// a text format for bold text
+	Bold *Format_Bold `protobuf:"bytes,3,opt,name=bold,proto3,oneof"`
+}
+
+type Format_Italic_ struct {
+	// a text format for italic text
+	Italic *Format_Italic `protobuf:"bytes,4,opt,name=italic,proto3,oneof"`
+}
+
+type Format_Underline_ struct {
+	// a text format for underline text
+	Underline *Format_Underline `protobuf:"bytes,5,opt,name=underline,proto3,oneof"`
+}
+
+type Format_Monospace_ struct {
+	// a text format for monospace text
+	Monospace *Format_Monospace `protobuf:"bytes,6,opt,name=monospace,proto3,oneof"`
+}
+
+type Format_Superscript_ struct {
+	// a text format for superscript text
+	Superscript *Format_Superscript `protobuf:"bytes,7,opt,name=superscript,proto3,oneof"`
+}
+
+type Format_Subscript_ struct {
+	// a text format for subscript text
+	Subscript *Format_Subscript `protobuf:"bytes,8,opt,name=subscript,proto3,oneof"`
+}
+
+type Format_CodeBlock_ struct {
+	// a text format for a codeblock
+	CodeBlock *Format_CodeBlock `protobuf:"bytes,9,opt,name=code_block,json=codeBlock,proto3,oneof"`
+}
+
+type Format_UserMention_ struct {
+	// a text format for a user mention
+	UserMention *Format_UserMention `protobuf:"bytes,10,opt,name=user_mention,json=userMention,proto3,oneof"`
+}
+
+type Format_RoleMention_ struct {
+	// a text format for a role mention
+	RoleMention *Format_RoleMention `protobuf:"bytes,11,opt,name=role_mention,json=roleMention,proto3,oneof"`
+}
+
+type Format_ChannelMention_ struct {
+	// a text format for a channel mention
+	ChannelMention *Format_ChannelMention `protobuf:"bytes,12,opt,name=channel_mention,json=channelMention,proto3,oneof"`
+}
+
+type Format_GuildMention_ struct {
+	// a text format for a guild mention
+	GuildMention *Format_GuildMention `protobuf:"bytes,13,opt,name=guild_mention,json=guildMention,proto3,oneof"`
+}
+
+type Format_Emoji_ struct {
+	// a text format for an emoji
+	Emoji *Format_Emoji `protobuf:"bytes,14,opt,name=emoji,proto3,oneof"`
+}
+
+type Format_Color_ struct {
+	// a text format for coloured text
+	Color *Format_Color `protobuf:"bytes,15,opt,name=color,proto3,oneof"`
+}
+
+type Format_Localization_ struct {
+	// a text format for localization
+	Localization *Format_Localization `protobuf:"bytes,16,opt,name=localization,proto3,oneof"`
+}
+
+func (*Format_Bold_) isFormat_Format() {}
+
+func (*Format_Italic_) isFormat_Format() {}
+
+func (*Format_Underline_) isFormat_Format() {}
+
+func (*Format_Monospace_) isFormat_Format() {}
+
+func (*Format_Superscript_) isFormat_Format() {}
+
+func (*Format_Subscript_) isFormat_Format() {}
+
+func (*Format_CodeBlock_) isFormat_Format() {}
+
+func (*Format_UserMention_) isFormat_Format() {}
+
+func (*Format_RoleMention_) isFormat_Format() {}
+
+func (*Format_ChannelMention_) isFormat_Format() {}
+
+func (*Format_GuildMention_) isFormat_Format() {}
+
+func (*Format_Emoji_) isFormat_Format() {}
+
+func (*Format_Color_) isFormat_Format() {}
+
+func (*Format_Localization_) isFormat_Format() {}
+
+// Formatted text
+type FormattedText struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The textual content of a message
+	Text string `protobuf:"bytes,1,opt,name=text,proto3" json:"text,omitempty"`
+	// The formats for a message
+	Format []*Format `protobuf:"bytes,2,rep,name=format,proto3" json:"format,omitempty"`
+}
+
+func (x *FormattedText) Reset() {
+	*x = FormattedText{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[10]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *FormattedText) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*FormattedText) ProtoMessage() {}
+
+func (x *FormattedText) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[10]
+	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 FormattedText.ProtoReflect.Descriptor instead.
+func (*FormattedText) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{10}
+}
+
+func (x *FormattedText) GetText() string {
+	if x != nil {
+		return x.Text
+	}
+	return ""
+}
+
+func (x *FormattedText) GetFormat() []*Format {
+	if x != nil {
+		return x.Format
+	}
+	return nil
+}
+
+// Object representing a message without the ID part.
+type Message struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Metadata of this message.
+	Metadata *v1.Metadata `protobuf:"bytes,1,opt,name=metadata,proto3,oneof" json:"metadata,omitempty"`
+	// Overrides of this message.
+	Overrides *Overrides `protobuf:"bytes,2,opt,name=overrides,proto3" json:"overrides,omitempty"`
+	// User ID of the user who sent this message.
+	AuthorId uint64 `protobuf:"varint,3,opt,name=author_id,json=authorId,proto3" json:"author_id,omitempty"`
+	// When this message was created, in miliseconds since unix epoch
+	CreatedAt uint64 `protobuf:"varint,4,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"`
+	// The most recent time this message was edited, in milliseconds since unix epoch
+	EditedAt *uint64 `protobuf:"varint,5,opt,name=edited_at,json=editedAt,proto3,oneof" json:"edited_at,omitempty"`
+	// The message this message is a reply to.
+	InReplyTo *uint64 `protobuf:"varint,6,opt,name=in_reply_to,json=inReplyTo,proto3,oneof" json:"in_reply_to,omitempty"`
+	// The content of the message.
+	Content *Content `protobuf:"bytes,7,opt,name=content,proto3" json:"content,omitempty"`
+	// The reactions of the message.
+	Reactions []*Reaction `protobuf:"bytes,8,rep,name=reactions,proto3" json:"reactions,omitempty"`
+}
+
+func (x *Message) Reset() {
+	*x = Message{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[11]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Message) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Message) ProtoMessage() {}
+
+func (x *Message) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_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 Message.ProtoReflect.Descriptor instead.
+func (*Message) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{11}
+}
+
+func (x *Message) GetMetadata() *v1.Metadata {
+	if x != nil {
+		return x.Metadata
+	}
+	return nil
+}
+
+func (x *Message) GetOverrides() *Overrides {
+	if x != nil {
+		return x.Overrides
+	}
+	return nil
+}
+
+func (x *Message) GetAuthorId() uint64 {
+	if x != nil {
+		return x.AuthorId
+	}
+	return 0
+}
+
+func (x *Message) GetCreatedAt() uint64 {
+	if x != nil {
+		return x.CreatedAt
+	}
+	return 0
+}
+
+func (x *Message) GetEditedAt() uint64 {
+	if x != nil && x.EditedAt != nil {
+		return *x.EditedAt
+	}
+	return 0
+}
+
+func (x *Message) GetInReplyTo() uint64 {
+	if x != nil && x.InReplyTo != nil {
+		return *x.InReplyTo
+	}
+	return 0
+}
+
+func (x *Message) GetContent() *Content {
+	if x != nil {
+		return x.Content
+	}
+	return nil
+}
+
+func (x *Message) GetReactions() []*Reaction {
+	if x != nil {
+		return x.Reactions
+	}
+	return nil
+}
+
+// Object representing a message with it's ID.
+type MessageWithId struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// ID of the message.
+	MessageId uint64 `protobuf:"varint,1,opt,name=message_id,json=messageId,proto3" json:"message_id,omitempty"`
+	// The message data.
+	Message *Message `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"`
+}
+
+func (x *MessageWithId) Reset() {
+	*x = MessageWithId{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[12]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *MessageWithId) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MessageWithId) ProtoMessage() {}
+
+func (x *MessageWithId) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[12]
+	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 MessageWithId.ProtoReflect.Descriptor instead.
+func (*MessageWithId) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{12}
+}
+
+func (x *MessageWithId) GetMessageId() uint64 {
+	if x != nil {
+		return x.MessageId
+	}
+	return 0
+}
+
+func (x *MessageWithId) GetMessage() *Message {
+	if x != nil {
+		return x.Message
+	}
+	return nil
+}
+
+// Used in the `GetChannelMessages` endpoint.
+type GetChannelMessagesRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild that has the channel.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// Channel ID of the channel to get messages from.
+	ChannelId uint64 `protobuf:"varint,2,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
+	// The ID of the message that will be used as an "anchor" point to figure out
+	// where to get the messages.
+	// If not specified, the `direction` will be ignored and the newest messages
+	// will be returned.
+	MessageId *uint64 `protobuf:"varint,3,opt,name=message_id,json=messageId,proto3,oneof" json:"message_id,omitempty"`
+	// On which direction to get the messages.
+	//
+	// - By default, it is "before", which means you will get messages before the
+	// `message_id` message.
+	// - If it is "around", you will get the messages around the `message_id`
+	// message. This will include the `message_id` message itself, as the middle
+	// item of the list returned.
+	// - If it is "after", you will get the messages after the `message_id`
+	// message.
+	Direction *GetChannelMessagesRequest_Direction `protobuf:"varint,4,opt,name=direction,proto3,enum=protocol.chat.v1.GetChannelMessagesRequest_Direction,oneof" json:"direction,omitempty"`
+	// How many messages to get.
+	//
+	// - If `0`, a recommended message count to return is 25. If the direction is
+	// "around", the recommended value is 12.
+	// - If the direction to get the messages is "around", this count will not be
+	// the *total* count of messages to return, but instead the count of messages
+	// to return *for each direction*, before and after.
+	// - Servers should enforce their own maximum limit, and clamp this value to
+	// the limit.
+	Count *uint32 `protobuf:"varint,5,opt,name=count,proto3,oneof" json:"count,omitempty"`
+}
+
+func (x *GetChannelMessagesRequest) Reset() {
+	*x = GetChannelMessagesRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[13]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetChannelMessagesRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetChannelMessagesRequest) ProtoMessage() {}
+
+func (x *GetChannelMessagesRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[13]
+	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 GetChannelMessagesRequest.ProtoReflect.Descriptor instead.
+func (*GetChannelMessagesRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{13}
+}
+
+func (x *GetChannelMessagesRequest) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *GetChannelMessagesRequest) GetChannelId() uint64 {
+	if x != nil {
+		return x.ChannelId
+	}
+	return 0
+}
+
+func (x *GetChannelMessagesRequest) GetMessageId() uint64 {
+	if x != nil && x.MessageId != nil {
+		return *x.MessageId
+	}
+	return 0
+}
+
+func (x *GetChannelMessagesRequest) GetDirection() GetChannelMessagesRequest_Direction {
+	if x != nil && x.Direction != nil {
+		return *x.Direction
+	}
+	return GetChannelMessagesRequest_DIRECTION_BEFORE_UNSPECIFIED
+}
+
+func (x *GetChannelMessagesRequest) GetCount() uint32 {
+	if x != nil && x.Count != nil {
+		return *x.Count
+	}
+	return 0
+}
+
+// Used in the `GetChannelMessages` endpoint.
+type GetChannelMessagesResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Has reached the top (first message) of the message history.
+	ReachedTop bool `protobuf:"varint,1,opt,name=reached_top,json=reachedTop,proto3" json:"reached_top,omitempty"`
+	// Has reached the bottom (last message) of the message history.
+	ReachedBottom bool `protobuf:"varint,2,opt,name=reached_bottom,json=reachedBottom,proto3" json:"reached_bottom,omitempty"`
+	// The messages requested.
+	Messages []*MessageWithId `protobuf:"bytes,3,rep,name=messages,proto3" json:"messages,omitempty"`
+}
+
+func (x *GetChannelMessagesResponse) Reset() {
+	*x = GetChannelMessagesResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[14]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetChannelMessagesResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetChannelMessagesResponse) ProtoMessage() {}
+
+func (x *GetChannelMessagesResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[14]
+	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 GetChannelMessagesResponse.ProtoReflect.Descriptor instead.
+func (*GetChannelMessagesResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{14}
+}
+
+func (x *GetChannelMessagesResponse) GetReachedTop() bool {
+	if x != nil {
+		return x.ReachedTop
+	}
+	return false
+}
+
+func (x *GetChannelMessagesResponse) GetReachedBottom() bool {
+	if x != nil {
+		return x.ReachedBottom
+	}
+	return false
+}
+
+func (x *GetChannelMessagesResponse) GetMessages() []*MessageWithId {
+	if x != nil {
+		return x.Messages
+	}
+	return nil
+}
+
+// Used in the `GetMessage` endpoint.
+type GetMessageRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild where the channel is.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// Channel ID of the channel where the message is.
+	ChannelId uint64 `protobuf:"varint,2,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
+	// Message ID of the message you want to get.
+	MessageId uint64 `protobuf:"varint,3,opt,name=message_id,json=messageId,proto3" json:"message_id,omitempty"`
+}
+
+func (x *GetMessageRequest) Reset() {
+	*x = GetMessageRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[15]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetMessageRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetMessageRequest) ProtoMessage() {}
+
+func (x *GetMessageRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[15]
+	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 GetMessageRequest.ProtoReflect.Descriptor instead.
+func (*GetMessageRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{15}
+}
+
+func (x *GetMessageRequest) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *GetMessageRequest) GetChannelId() uint64 {
+	if x != nil {
+		return x.ChannelId
+	}
+	return 0
+}
+
+func (x *GetMessageRequest) GetMessageId() uint64 {
+	if x != nil {
+		return x.MessageId
+	}
+	return 0
+}
+
+// Used in the `GetMessage` endpoint.
+type GetMessageResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The message requested.
+	Message *Message `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"`
+}
+
+func (x *GetMessageResponse) Reset() {
+	*x = GetMessageResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[16]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetMessageResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetMessageResponse) ProtoMessage() {}
+
+func (x *GetMessageResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[16]
+	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 GetMessageResponse.ProtoReflect.Descriptor instead.
+func (*GetMessageResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{16}
+}
+
+func (x *GetMessageResponse) GetMessage() *Message {
+	if x != nil {
+		return x.Message
+	}
+	return nil
+}
+
+// Used in the `DeleteMessage` endpoint.
+type DeleteMessageRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild where the channel is.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// Channel ID of the channel where the message is.
+	ChannelId uint64 `protobuf:"varint,2,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
+	// Message ID of the message you want to delete.
+	MessageId uint64 `protobuf:"varint,3,opt,name=message_id,json=messageId,proto3" json:"message_id,omitempty"`
+}
+
+func (x *DeleteMessageRequest) Reset() {
+	*x = DeleteMessageRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[17]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DeleteMessageRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeleteMessageRequest) ProtoMessage() {}
+
+func (x *DeleteMessageRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[17]
+	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 DeleteMessageRequest.ProtoReflect.Descriptor instead.
+func (*DeleteMessageRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{17}
+}
+
+func (x *DeleteMessageRequest) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *DeleteMessageRequest) GetChannelId() uint64 {
+	if x != nil {
+		return x.ChannelId
+	}
+	return 0
+}
+
+func (x *DeleteMessageRequest) GetMessageId() uint64 {
+	if x != nil {
+		return x.MessageId
+	}
+	return 0
+}
+
+// Used in the `DeleteMessage` endpoint.
+type DeleteMessageResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *DeleteMessageResponse) Reset() {
+	*x = DeleteMessageResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[18]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DeleteMessageResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeleteMessageResponse) ProtoMessage() {}
+
+func (x *DeleteMessageResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[18]
+	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 DeleteMessageResponse.ProtoReflect.Descriptor instead.
+func (*DeleteMessageResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{18}
+}
+
+// Used in the `TriggerAction` endpoint.
+type TriggerActionRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild where the channel is.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// Channel ID of the channel where the message is.
+	ChannelId uint64 `protobuf:"varint,2,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
+	// Message ID of the message you want to trigger an action in.
+	MessageId uint64 `protobuf:"varint,3,opt,name=message_id,json=messageId,proto3" json:"message_id,omitempty"`
+	// Payload of action data.
+	Payload *ActionPayload `protobuf:"bytes,4,opt,name=payload,proto3" json:"payload,omitempty"`
+}
+
+func (x *TriggerActionRequest) Reset() {
+	*x = TriggerActionRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[19]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *TriggerActionRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*TriggerActionRequest) ProtoMessage() {}
+
+func (x *TriggerActionRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[19]
+	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 TriggerActionRequest.ProtoReflect.Descriptor instead.
+func (*TriggerActionRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{19}
+}
+
+func (x *TriggerActionRequest) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *TriggerActionRequest) GetChannelId() uint64 {
+	if x != nil {
+		return x.ChannelId
+	}
+	return 0
+}
+
+func (x *TriggerActionRequest) GetMessageId() uint64 {
+	if x != nil {
+		return x.MessageId
+	}
+	return 0
+}
+
+func (x *TriggerActionRequest) GetPayload() *ActionPayload {
+	if x != nil {
+		return x.Payload
+	}
+	return nil
+}
+
+// Used in the `TriggerAction` endpoint.
+type TriggerActionResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *TriggerActionResponse) Reset() {
+	*x = TriggerActionResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[20]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *TriggerActionResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*TriggerActionResponse) ProtoMessage() {}
+
+func (x *TriggerActionResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[20]
+	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 TriggerActionResponse.ProtoReflect.Descriptor instead.
+func (*TriggerActionResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{20}
+}
+
+// Used in the `SendMessage` endpoint.
+type SendMessageRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild where the channel is.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// Channel ID of the channel you want to send a message in.
+	ChannelId uint64 `protobuf:"varint,2,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
+	// Content of the new message.
+	Content *Content `protobuf:"bytes,3,opt,name=content,proto3" json:"content,omitempty"`
+	// Echo ID of the new message. This can be used by clients to
+	// determine whether a message is sent.
+	EchoId *uint64 `protobuf:"varint,4,opt,name=echo_id,json=echoId,proto3,oneof" json:"echo_id,omitempty"`
+	// The overrides of this new message.
+	Overrides *Overrides `protobuf:"bytes,6,opt,name=overrides,proto3,oneof" json:"overrides,omitempty"`
+	// The message this new message is a reply to.
+	InReplyTo *uint64 `protobuf:"varint,7,opt,name=in_reply_to,json=inReplyTo,proto3,oneof" json:"in_reply_to,omitempty"`
+	// The metadata of this new message.
+	Metadata *v1.Metadata `protobuf:"bytes,5,opt,name=metadata,proto3,oneof" json:"metadata,omitempty"`
+}
+
+func (x *SendMessageRequest) Reset() {
+	*x = SendMessageRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[21]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SendMessageRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SendMessageRequest) ProtoMessage() {}
+
+func (x *SendMessageRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[21]
+	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 SendMessageRequest.ProtoReflect.Descriptor instead.
+func (*SendMessageRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{21}
+}
+
+func (x *SendMessageRequest) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *SendMessageRequest) GetChannelId() uint64 {
+	if x != nil {
+		return x.ChannelId
+	}
+	return 0
+}
+
+func (x *SendMessageRequest) GetContent() *Content {
+	if x != nil {
+		return x.Content
+	}
+	return nil
+}
+
+func (x *SendMessageRequest) GetEchoId() uint64 {
+	if x != nil && x.EchoId != nil {
+		return *x.EchoId
+	}
+	return 0
+}
+
+func (x *SendMessageRequest) GetOverrides() *Overrides {
+	if x != nil {
+		return x.Overrides
+	}
+	return nil
+}
+
+func (x *SendMessageRequest) GetInReplyTo() uint64 {
+	if x != nil && x.InReplyTo != nil {
+		return *x.InReplyTo
+	}
+	return 0
+}
+
+func (x *SendMessageRequest) GetMetadata() *v1.Metadata {
+	if x != nil {
+		return x.Metadata
+	}
+	return nil
+}
+
+// Used in the `SendMessage` endpoint.
+type SendMessageResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Message ID of the message sent.
+	MessageId uint64 `protobuf:"varint,1,opt,name=message_id,json=messageId,proto3" json:"message_id,omitempty"`
+}
+
+func (x *SendMessageResponse) Reset() {
+	*x = SendMessageResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[22]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SendMessageResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SendMessageResponse) ProtoMessage() {}
+
+func (x *SendMessageResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[22]
+	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 SendMessageResponse.ProtoReflect.Descriptor instead.
+func (*SendMessageResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{22}
+}
+
+func (x *SendMessageResponse) GetMessageId() uint64 {
+	if x != nil {
+		return x.MessageId
+	}
+	return 0
+}
+
+// Used in the `UpdateMessageText` endpoint.
+type UpdateMessageTextRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild where the channel is.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// Channel ID of the channel where the message is.
+	ChannelId uint64 `protobuf:"varint,2,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
+	// Message ID of the message you want to edit the text of.
+	MessageId uint64 `protobuf:"varint,3,opt,name=message_id,json=messageId,proto3" json:"message_id,omitempty"`
+	// New content for this message.
+	NewContent *FormattedText `protobuf:"bytes,4,opt,name=new_content,json=newContent,proto3" json:"new_content,omitempty"`
+}
+
+func (x *UpdateMessageTextRequest) Reset() {
+	*x = UpdateMessageTextRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[23]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *UpdateMessageTextRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UpdateMessageTextRequest) ProtoMessage() {}
+
+func (x *UpdateMessageTextRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[23]
+	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 UpdateMessageTextRequest.ProtoReflect.Descriptor instead.
+func (*UpdateMessageTextRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{23}
+}
+
+func (x *UpdateMessageTextRequest) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *UpdateMessageTextRequest) GetChannelId() uint64 {
+	if x != nil {
+		return x.ChannelId
+	}
+	return 0
+}
+
+func (x *UpdateMessageTextRequest) GetMessageId() uint64 {
+	if x != nil {
+		return x.MessageId
+	}
+	return 0
+}
+
+func (x *UpdateMessageTextRequest) GetNewContent() *FormattedText {
+	if x != nil {
+		return x.NewContent
+	}
+	return nil
+}
+
+// Used in the `UpdateMessageText` endpoint.
+type UpdateMessageTextResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *UpdateMessageTextResponse) Reset() {
+	*x = UpdateMessageTextResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[24]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *UpdateMessageTextResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UpdateMessageTextResponse) ProtoMessage() {}
+
+func (x *UpdateMessageTextResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[24]
+	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 UpdateMessageTextResponse.ProtoReflect.Descriptor instead.
+func (*UpdateMessageTextResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{24}
+}
+
+// Used in the `PinMessage` endpoint.
+type PinMessageRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild where the channel is.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// Channel ID of the channel where the message is.
+	ChannelId uint64 `protobuf:"varint,2,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
+	// Message ID of the message we want to pin.
+	MessageId uint64 `protobuf:"varint,3,opt,name=message_id,json=messageId,proto3" json:"message_id,omitempty"`
+}
+
+func (x *PinMessageRequest) Reset() {
+	*x = PinMessageRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[25]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *PinMessageRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*PinMessageRequest) ProtoMessage() {}
+
+func (x *PinMessageRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[25]
+	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 PinMessageRequest.ProtoReflect.Descriptor instead.
+func (*PinMessageRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{25}
+}
+
+func (x *PinMessageRequest) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *PinMessageRequest) GetChannelId() uint64 {
+	if x != nil {
+		return x.ChannelId
+	}
+	return 0
+}
+
+func (x *PinMessageRequest) GetMessageId() uint64 {
+	if x != nil {
+		return x.MessageId
+	}
+	return 0
+}
+
+// Used in the `UnpinMessage` endpoint.
+type PinMessageResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *PinMessageResponse) Reset() {
+	*x = PinMessageResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[26]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *PinMessageResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*PinMessageResponse) ProtoMessage() {}
+
+func (x *PinMessageResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[26]
+	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 PinMessageResponse.ProtoReflect.Descriptor instead.
+func (*PinMessageResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{26}
+}
+
+// Used in the `UnpinMessage` endpoint.
+type UnpinMessageRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild where the channel is.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// Channel ID of the channel where the message is.
+	ChannelId uint64 `protobuf:"varint,2,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
+	// Message ID of the message we want to unpin.
+	MessageId uint64 `protobuf:"varint,3,opt,name=message_id,json=messageId,proto3" json:"message_id,omitempty"`
+}
+
+func (x *UnpinMessageRequest) Reset() {
+	*x = UnpinMessageRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[27]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *UnpinMessageRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UnpinMessageRequest) ProtoMessage() {}
+
+func (x *UnpinMessageRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[27]
+	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 UnpinMessageRequest.ProtoReflect.Descriptor instead.
+func (*UnpinMessageRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{27}
+}
+
+func (x *UnpinMessageRequest) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *UnpinMessageRequest) GetChannelId() uint64 {
+	if x != nil {
+		return x.ChannelId
+	}
+	return 0
+}
+
+func (x *UnpinMessageRequest) GetMessageId() uint64 {
+	if x != nil {
+		return x.MessageId
+	}
+	return 0
+}
+
+// Used in the `UnpinMessage` endpoint.
+type UnpinMessageResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *UnpinMessageResponse) Reset() {
+	*x = UnpinMessageResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[28]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *UnpinMessageResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UnpinMessageResponse) ProtoMessage() {}
+
+func (x *UnpinMessageResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[28]
+	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 UnpinMessageResponse.ProtoReflect.Descriptor instead.
+func (*UnpinMessageResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{28}
+}
+
+// Used in the `GetPinnedMessages` endpoint.
+type GetPinnedMessagesRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild where the channel is.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// Channel ID of the channel we want to get pins of.
+	ChannelId uint64 `protobuf:"varint,2,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
+}
+
+func (x *GetPinnedMessagesRequest) Reset() {
+	*x = GetPinnedMessagesRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[29]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetPinnedMessagesRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetPinnedMessagesRequest) ProtoMessage() {}
+
+func (x *GetPinnedMessagesRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[29]
+	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 GetPinnedMessagesRequest.ProtoReflect.Descriptor instead.
+func (*GetPinnedMessagesRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{29}
+}
+
+func (x *GetPinnedMessagesRequest) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *GetPinnedMessagesRequest) GetChannelId() uint64 {
+	if x != nil {
+		return x.ChannelId
+	}
+	return 0
+}
+
+// Used in the `GetPinnedMessages` endpoint.
+type GetPinnedMessagesResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The IDs of the pinned messages.
+	PinnedMessageIds []uint64 `protobuf:"varint,1,rep,packed,name=pinned_message_ids,json=pinnedMessageIds,proto3" json:"pinned_message_ids,omitempty"`
+}
+
+func (x *GetPinnedMessagesResponse) Reset() {
+	*x = GetPinnedMessagesResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[30]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetPinnedMessagesResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetPinnedMessagesResponse) ProtoMessage() {}
+
+func (x *GetPinnedMessagesResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[30]
+	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 GetPinnedMessagesResponse.ProtoReflect.Descriptor instead.
+func (*GetPinnedMessagesResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{30}
+}
+
+func (x *GetPinnedMessagesResponse) GetPinnedMessageIds() []uint64 {
+	if x != nil {
+		return x.PinnedMessageIds
+	}
+	return nil
+}
+
+// Used in `AddReaction` endpoint.
+type AddReactionRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild where the channel is.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// Channel ID of the channel where the message is.
+	ChannelId uint64 `protobuf:"varint,2,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
+	// Message ID of the message we want to add a reaction to.
+	MessageId uint64 `protobuf:"varint,3,opt,name=message_id,json=messageId,proto3" json:"message_id,omitempty"`
+	// The emote we want to react with.
+	Emote *v11.Emote `protobuf:"bytes,4,opt,name=emote,proto3" json:"emote,omitempty"`
+}
+
+func (x *AddReactionRequest) Reset() {
+	*x = AddReactionRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[31]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *AddReactionRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*AddReactionRequest) ProtoMessage() {}
+
+func (x *AddReactionRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[31]
+	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 AddReactionRequest.ProtoReflect.Descriptor instead.
+func (*AddReactionRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{31}
+}
+
+func (x *AddReactionRequest) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *AddReactionRequest) GetChannelId() uint64 {
+	if x != nil {
+		return x.ChannelId
+	}
+	return 0
+}
+
+func (x *AddReactionRequest) GetMessageId() uint64 {
+	if x != nil {
+		return x.MessageId
+	}
+	return 0
+}
+
+func (x *AddReactionRequest) GetEmote() *v11.Emote {
+	if x != nil {
+		return x.Emote
+	}
+	return nil
+}
+
+// Used in `AddReaction` endpoint.
+type AddReactionResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *AddReactionResponse) Reset() {
+	*x = AddReactionResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[32]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *AddReactionResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*AddReactionResponse) ProtoMessage() {}
+
+func (x *AddReactionResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[32]
+	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 AddReactionResponse.ProtoReflect.Descriptor instead.
+func (*AddReactionResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{32}
+}
+
+// Used in `RemoveReaction` endpoint.
+type RemoveReactionRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild where the channel is.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// Channel ID of the channel where the message is.
+	ChannelId uint64 `protobuf:"varint,2,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
+	// Message ID of the message we want to remove a reaction.
+	MessageId uint64 `protobuf:"varint,3,opt,name=message_id,json=messageId,proto3" json:"message_id,omitempty"`
+	// The emote we want to remove the react of.
+	Emote *v11.Emote `protobuf:"bytes,4,opt,name=emote,proto3" json:"emote,omitempty"`
+}
+
+func (x *RemoveReactionRequest) Reset() {
+	*x = RemoveReactionRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[33]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *RemoveReactionRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RemoveReactionRequest) ProtoMessage() {}
+
+func (x *RemoveReactionRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[33]
+	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 RemoveReactionRequest.ProtoReflect.Descriptor instead.
+func (*RemoveReactionRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{33}
+}
+
+func (x *RemoveReactionRequest) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *RemoveReactionRequest) GetChannelId() uint64 {
+	if x != nil {
+		return x.ChannelId
+	}
+	return 0
+}
+
+func (x *RemoveReactionRequest) GetMessageId() uint64 {
+	if x != nil {
+		return x.MessageId
+	}
+	return 0
+}
+
+func (x *RemoveReactionRequest) GetEmote() *v11.Emote {
+	if x != nil {
+		return x.Emote
+	}
+	return nil
+}
+
+// Used in `RemoveReaction` endpoint.
+type RemoveReactionResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *RemoveReactionResponse) Reset() {
+	*x = RemoveReactionResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[34]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *RemoveReactionResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RemoveReactionResponse) ProtoMessage() {}
+
+func (x *RemoveReactionResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[34]
+	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 RemoveReactionResponse.ProtoReflect.Descriptor instead.
+func (*RemoveReactionResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{34}
+}
+
+// The payload data for a button action
+type ActionPayload_Button struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The data from the Button action
+	Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"`
+}
+
+func (x *ActionPayload_Button) Reset() {
+	*x = ActionPayload_Button{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[35]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ActionPayload_Button) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ActionPayload_Button) ProtoMessage() {}
+
+func (x *ActionPayload_Button) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[35]
+	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 ActionPayload_Button.ProtoReflect.Descriptor instead.
+func (*ActionPayload_Button) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{1, 0}
+}
+
+func (x *ActionPayload_Button) GetData() []byte {
+	if x != nil {
+		return x.Data
+	}
+	return nil
+}
+
+// The payload for a dropdown action
+type ActionPayload_Dropdown struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The user choice from the dropdown.
+	Choice []byte `protobuf:"bytes,1,opt,name=choice,proto3" json:"choice,omitempty"`
+}
+
+func (x *ActionPayload_Dropdown) Reset() {
+	*x = ActionPayload_Dropdown{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[36]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ActionPayload_Dropdown) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ActionPayload_Dropdown) ProtoMessage() {}
+
+func (x *ActionPayload_Dropdown) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[36]
+	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 ActionPayload_Dropdown.ProtoReflect.Descriptor instead.
+func (*ActionPayload_Dropdown) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{1, 1}
+}
+
+func (x *ActionPayload_Dropdown) GetChoice() []byte {
+	if x != nil {
+		return x.Choice
+	}
+	return nil
+}
+
+// The payload for a text input action
+type ActionPayload_Input struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The user input.
+	Input string `protobuf:"bytes,1,opt,name=input,proto3" json:"input,omitempty"`
+	// The bot-provided data
+	Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"`
+}
+
+func (x *ActionPayload_Input) Reset() {
+	*x = ActionPayload_Input{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[37]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ActionPayload_Input) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ActionPayload_Input) ProtoMessage() {}
+
+func (x *ActionPayload_Input) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[37]
+	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 ActionPayload_Input.ProtoReflect.Descriptor instead.
+func (*ActionPayload_Input) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{1, 2}
+}
+
+func (x *ActionPayload_Input) GetInput() string {
+	if x != nil {
+		return x.Input
+	}
+	return ""
+}
+
+func (x *ActionPayload_Input) GetData() []byte {
+	if x != nil {
+		return x.Data
+	}
+	return nil
+}
+
+// A button that users can click on to trigger an action.
+type Action_Button struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The text to show on the button.
+	Text string `protobuf:"bytes,1,opt,name=text,proto3" json:"text,omitempty"`
+	// Action data, which should be used in the call to perform the action.
+	Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"`
+	// An external URL that the button links to.
+	// This makes it so that tapping this button will open said URL instead
+	// of triggering the action.
+	Url *string `protobuf:"bytes,3,opt,name=url,proto3,oneof" json:"url,omitempty"`
+}
+
+func (x *Action_Button) Reset() {
+	*x = Action_Button{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[38]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Action_Button) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Action_Button) ProtoMessage() {}
+
+func (x *Action_Button) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[38]
+	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 Action_Button.ProtoReflect.Descriptor instead.
+func (*Action_Button) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{2, 0}
+}
+
+func (x *Action_Button) GetText() string {
+	if x != nil {
+		return x.Text
+	}
+	return ""
+}
+
+func (x *Action_Button) GetData() []byte {
+	if x != nil {
+		return x.Data
+	}
+	return nil
+}
+
+func (x *Action_Button) GetUrl() string {
+	if x != nil && x.Url != nil {
+		return *x.Url
+	}
+	return ""
+}
+
+// A dropdown menu that users can click on to trigger an action.
+type Action_Dropdown struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The text describing the dropdown.
+	Label string `protobuf:"bytes,1,opt,name=label,proto3" json:"label,omitempty"`
+	// The options in the dropdown.
+	Entries []*Action_Dropdown_Entry `protobuf:"bytes,2,rep,name=entries,proto3" json:"entries,omitempty"`
+}
+
+func (x *Action_Dropdown) Reset() {
+	*x = Action_Dropdown{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[39]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Action_Dropdown) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Action_Dropdown) ProtoMessage() {}
+
+func (x *Action_Dropdown) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[39]
+	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 Action_Dropdown.ProtoReflect.Descriptor instead.
+func (*Action_Dropdown) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{2, 1}
+}
+
+func (x *Action_Dropdown) GetLabel() string {
+	if x != nil {
+		return x.Label
+	}
+	return ""
+}
+
+func (x *Action_Dropdown) GetEntries() []*Action_Dropdown_Entry {
+	if x != nil {
+		return x.Entries
+	}
+	return nil
+}
+
+// A text input that users can type in to trigger an action.
+type Action_Input struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The label describing the input.
+	Label string `protobuf:"bytes,1,opt,name=label,proto3" json:"label,omitempty"`
+	// Whether this text input should be a multiline one or not.
+	Multiline bool `protobuf:"varint,2,opt,name=multiline,proto3" json:"multiline,omitempty"`
+	// Contextual data allowing the bot to discern what the user input is for
+	Data []byte `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"`
+}
+
+func (x *Action_Input) Reset() {
+	*x = Action_Input{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[40]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Action_Input) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Action_Input) ProtoMessage() {}
+
+func (x *Action_Input) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[40]
+	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 Action_Input.ProtoReflect.Descriptor instead.
+func (*Action_Input) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{2, 2}
+}
+
+func (x *Action_Input) GetLabel() string {
+	if x != nil {
+		return x.Label
+	}
+	return ""
+}
+
+func (x *Action_Input) GetMultiline() bool {
+	if x != nil {
+		return x.Multiline
+	}
+	return false
+}
+
+func (x *Action_Input) GetData() []byte {
+	if x != nil {
+		return x.Data
+	}
+	return nil
+}
+
+// An entry in the dropdown
+type Action_Dropdown_Entry struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The dropdown's UI label.
+	Label string `protobuf:"bytes,1,opt,name=label,proto3" json:"label,omitempty"`
+	// The dropdown's associated data.
+	Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"`
+}
+
+func (x *Action_Dropdown_Entry) Reset() {
+	*x = Action_Dropdown_Entry{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[41]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Action_Dropdown_Entry) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Action_Dropdown_Entry) ProtoMessage() {}
+
+func (x *Action_Dropdown_Entry) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[41]
+	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 Action_Dropdown_Entry.ProtoReflect.Descriptor instead.
+func (*Action_Dropdown_Entry) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{2, 1, 0}
+}
+
+func (x *Action_Dropdown_Entry) GetLabel() string {
+	if x != nil {
+		return x.Label
+	}
+	return ""
+}
+
+func (x *Action_Dropdown_Entry) GetData() []byte {
+	if x != nil {
+		return x.Data
+	}
+	return nil
+}
+
+// Object representing an embed heading.
+type Embed_EmbedHeading struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Text of the heading.
+	Text string `protobuf:"bytes,1,opt,name=text,proto3" json:"text,omitempty"`
+	// Subtext of the heading.
+	Subtext *string `protobuf:"bytes,2,opt,name=subtext,proto3,oneof" json:"subtext,omitempty"`
+	// URL of the heading.
+	Url *string `protobuf:"bytes,3,opt,name=url,proto3,oneof" json:"url,omitempty"`
+	// Icon of the heading.
+	Icon *string `protobuf:"bytes,4,opt,name=icon,proto3,oneof" json:"icon,omitempty"`
+}
+
+func (x *Embed_EmbedHeading) Reset() {
+	*x = Embed_EmbedHeading{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[42]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Embed_EmbedHeading) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Embed_EmbedHeading) ProtoMessage() {}
+
+func (x *Embed_EmbedHeading) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[42]
+	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 Embed_EmbedHeading.ProtoReflect.Descriptor instead.
+func (*Embed_EmbedHeading) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{3, 0}
+}
+
+func (x *Embed_EmbedHeading) GetText() string {
+	if x != nil {
+		return x.Text
+	}
+	return ""
+}
+
+func (x *Embed_EmbedHeading) GetSubtext() string {
+	if x != nil && x.Subtext != nil {
+		return *x.Subtext
+	}
+	return ""
+}
+
+func (x *Embed_EmbedHeading) GetUrl() string {
+	if x != nil && x.Url != nil {
+		return *x.Url
+	}
+	return ""
+}
+
+func (x *Embed_EmbedHeading) GetIcon() string {
+	if x != nil && x.Icon != nil {
+		return *x.Icon
+	}
+	return ""
+}
+
+// Object representing an embed field.
+type Embed_EmbedField struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Title of this field.
+	Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"`
+	// Subtitle of this field.
+	Subtitle *string `protobuf:"bytes,2,opt,name=subtitle,proto3,oneof" json:"subtitle,omitempty"`
+	// Body text of this field (eg. a description).
+	Body *FormattedText `protobuf:"bytes,3,opt,name=body,proto3,oneof" json:"body,omitempty"`
+	// Image URL of this field.
+	ImageUrl *string `protobuf:"bytes,4,opt,name=image_url,json=imageUrl,proto3,oneof" json:"image_url,omitempty"`
+	// How to present this field.
+	Presentation Embed_EmbedField_Presentation `protobuf:"varint,5,opt,name=presentation,proto3,enum=protocol.chat.v1.Embed_EmbedField_Presentation" json:"presentation,omitempty"`
+	// Actions of this field.
+	Actions []*Action `protobuf:"bytes,6,rep,name=actions,proto3" json:"actions,omitempty"`
+}
+
+func (x *Embed_EmbedField) Reset() {
+	*x = Embed_EmbedField{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[43]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Embed_EmbedField) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Embed_EmbedField) ProtoMessage() {}
+
+func (x *Embed_EmbedField) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[43]
+	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 Embed_EmbedField.ProtoReflect.Descriptor instead.
+func (*Embed_EmbedField) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{3, 1}
+}
+
+func (x *Embed_EmbedField) GetTitle() string {
+	if x != nil {
+		return x.Title
+	}
+	return ""
+}
+
+func (x *Embed_EmbedField) GetSubtitle() string {
+	if x != nil && x.Subtitle != nil {
+		return *x.Subtitle
+	}
+	return ""
+}
+
+func (x *Embed_EmbedField) GetBody() *FormattedText {
+	if x != nil {
+		return x.Body
+	}
+	return nil
+}
+
+func (x *Embed_EmbedField) GetImageUrl() string {
+	if x != nil && x.ImageUrl != nil {
+		return *x.ImageUrl
+	}
+	return ""
+}
+
+func (x *Embed_EmbedField) GetPresentation() Embed_EmbedField_Presentation {
+	if x != nil {
+		return x.Presentation
+	}
+	return Embed_EmbedField_PRESENTATION_DATA_UNSPECIFIED
+}
+
+func (x *Embed_EmbedField) GetActions() []*Action {
+	if x != nil {
+		return x.Actions
+	}
+	return nil
+}
+
+// Object representing text content.
+type Content_TextContent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Text content.
+	Content *FormattedText `protobuf:"bytes,1,opt,name=content,proto3" json:"content,omitempty"`
+}
+
+func (x *Content_TextContent) Reset() {
+	*x = Content_TextContent{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[44]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Content_TextContent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Content_TextContent) ProtoMessage() {}
+
+func (x *Content_TextContent) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[44]
+	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 Content_TextContent.ProtoReflect.Descriptor instead.
+func (*Content_TextContent) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{7, 0}
+}
+
+func (x *Content_TextContent) GetContent() *FormattedText {
+	if x != nil {
+		return x.Content
+	}
+	return nil
+}
+
+// Object representing embed content.
+type Content_EmbedContent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Embed content.
+	Embeds []*Embed `protobuf:"bytes,1,rep,name=embeds,proto3" json:"embeds,omitempty"`
+}
+
+func (x *Content_EmbedContent) Reset() {
+	*x = Content_EmbedContent{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[45]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Content_EmbedContent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Content_EmbedContent) ProtoMessage() {}
+
+func (x *Content_EmbedContent) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[45]
+	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 Content_EmbedContent.ProtoReflect.Descriptor instead.
+func (*Content_EmbedContent) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{7, 1}
+}
+
+func (x *Content_EmbedContent) GetEmbeds() []*Embed {
+	if x != nil {
+		return x.Embeds
+	}
+	return nil
+}
+
+// Object representing attachment content.
+type Content_AttachmentContent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// A list of attachments.
+	Files []*Attachment `protobuf:"bytes,1,rep,name=files,proto3" json:"files,omitempty"`
+}
+
+func (x *Content_AttachmentContent) Reset() {
+	*x = Content_AttachmentContent{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[46]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Content_AttachmentContent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Content_AttachmentContent) ProtoMessage() {}
+
+func (x *Content_AttachmentContent) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[46]
+	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 Content_AttachmentContent.ProtoReflect.Descriptor instead.
+func (*Content_AttachmentContent) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{7, 2}
+}
+
+func (x *Content_AttachmentContent) GetFiles() []*Attachment {
+	if x != nil {
+		return x.Files
+	}
+	return nil
+}
+
+// Object representing photo content.
+type Content_PhotoContent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// A list of photos.
+	Photos []*Photo `protobuf:"bytes,1,rep,name=photos,proto3" json:"photos,omitempty"`
+}
+
+func (x *Content_PhotoContent) Reset() {
+	*x = Content_PhotoContent{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[47]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Content_PhotoContent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Content_PhotoContent) ProtoMessage() {}
+
+func (x *Content_PhotoContent) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[47]
+	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 Content_PhotoContent.ProtoReflect.Descriptor instead.
+func (*Content_PhotoContent) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{7, 3}
+}
+
+func (x *Content_PhotoContent) GetPhotos() []*Photo {
+	if x != nil {
+		return x.Photos
+	}
+	return nil
+}
+
+// Represents a user rejecting an invite.
+//
+// This can only be used by servers themselves. Servers should reject
+// messages with this content if they are sent by a user.
+type Content_InviteRejected struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// User ID of the invitee.
+	InviteeId uint64 `protobuf:"varint,1,opt,name=invitee_id,json=inviteeId,proto3" json:"invitee_id,omitempty"`
+	// User ID of the inviter.
+	InviterId uint64 `protobuf:"varint,2,opt,name=inviter_id,json=inviterId,proto3" json:"inviter_id,omitempty"`
+}
+
+func (x *Content_InviteRejected) Reset() {
+	*x = Content_InviteRejected{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[48]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Content_InviteRejected) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Content_InviteRejected) ProtoMessage() {}
+
+func (x *Content_InviteRejected) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[48]
+	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 Content_InviteRejected.ProtoReflect.Descriptor instead.
+func (*Content_InviteRejected) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{7, 4}
+}
+
+func (x *Content_InviteRejected) GetInviteeId() uint64 {
+	if x != nil {
+		return x.InviteeId
+	}
+	return 0
+}
+
+func (x *Content_InviteRejected) GetInviterId() uint64 {
+	if x != nil {
+		return x.InviterId
+	}
+	return 0
+}
+
+// Represents a user accepting an invite.
+//
+// This can only be used by servers themselves. Servers should reject
+// messages with this content if they are sent by a user.
+type Content_InviteAccepted struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// User ID of the invitee.
+	InviteeId uint64 `protobuf:"varint,1,opt,name=invitee_id,json=inviteeId,proto3" json:"invitee_id,omitempty"`
+	// User ID of the inviter.
+	InviterId uint64 `protobuf:"varint,2,opt,name=inviter_id,json=inviterId,proto3" json:"inviter_id,omitempty"`
+}
+
+func (x *Content_InviteAccepted) Reset() {
+	*x = Content_InviteAccepted{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[49]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Content_InviteAccepted) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Content_InviteAccepted) ProtoMessage() {}
+
+func (x *Content_InviteAccepted) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[49]
+	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 Content_InviteAccepted.ProtoReflect.Descriptor instead.
+func (*Content_InviteAccepted) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{7, 5}
+}
+
+func (x *Content_InviteAccepted) GetInviteeId() uint64 {
+	if x != nil {
+		return x.InviteeId
+	}
+	return 0
+}
+
+func (x *Content_InviteAccepted) GetInviterId() uint64 {
+	if x != nil {
+		return x.InviterId
+	}
+	return 0
+}
+
+// Represents a guild upgrade from "room" to "normal".
+//
+// This can only be used by servers themselves. Servers should reject
+// messages with this content if they are sent by a user.
+type Content_RoomUpgradedToGuild struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// User ID of the user that upgraded the guild.
+	UpgradedBy uint64 `protobuf:"varint,1,opt,name=upgraded_by,json=upgradedBy,proto3" json:"upgraded_by,omitempty"`
+}
+
+func (x *Content_RoomUpgradedToGuild) Reset() {
+	*x = Content_RoomUpgradedToGuild{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[50]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Content_RoomUpgradedToGuild) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Content_RoomUpgradedToGuild) ProtoMessage() {}
+
+func (x *Content_RoomUpgradedToGuild) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[50]
+	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 Content_RoomUpgradedToGuild.ProtoReflect.Descriptor instead.
+func (*Content_RoomUpgradedToGuild) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{7, 6}
+}
+
+func (x *Content_RoomUpgradedToGuild) GetUpgradedBy() uint64 {
+	if x != nil {
+		return x.UpgradedBy
+	}
+	return 0
+}
+
+// Bold text
+type Format_Bold struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *Format_Bold) Reset() {
+	*x = Format_Bold{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[51]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Format_Bold) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Format_Bold) ProtoMessage() {}
+
+func (x *Format_Bold) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[51]
+	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 Format_Bold.ProtoReflect.Descriptor instead.
+func (*Format_Bold) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{9, 0}
+}
+
+// Italic text
+type Format_Italic struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *Format_Italic) Reset() {
+	*x = Format_Italic{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[52]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Format_Italic) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Format_Italic) ProtoMessage() {}
+
+func (x *Format_Italic) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[52]
+	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 Format_Italic.ProtoReflect.Descriptor instead.
+func (*Format_Italic) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{9, 1}
+}
+
+// Underlined text
+type Format_Underline struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *Format_Underline) Reset() {
+	*x = Format_Underline{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[53]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Format_Underline) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Format_Underline) ProtoMessage() {}
+
+func (x *Format_Underline) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[53]
+	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 Format_Underline.ProtoReflect.Descriptor instead.
+func (*Format_Underline) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{9, 2}
+}
+
+// Monospace text
+type Format_Monospace struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *Format_Monospace) Reset() {
+	*x = Format_Monospace{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[54]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Format_Monospace) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Format_Monospace) ProtoMessage() {}
+
+func (x *Format_Monospace) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[54]
+	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 Format_Monospace.ProtoReflect.Descriptor instead.
+func (*Format_Monospace) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{9, 3}
+}
+
+// Superscript text
+type Format_Superscript struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *Format_Superscript) Reset() {
+	*x = Format_Superscript{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[55]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Format_Superscript) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Format_Superscript) ProtoMessage() {}
+
+func (x *Format_Superscript) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[55]
+	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 Format_Superscript.ProtoReflect.Descriptor instead.
+func (*Format_Superscript) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{9, 4}
+}
+
+// Subscript text
+type Format_Subscript struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *Format_Subscript) Reset() {
+	*x = Format_Subscript{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[56]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Format_Subscript) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Format_Subscript) ProtoMessage() {}
+
+func (x *Format_Subscript) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[56]
+	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 Format_Subscript.ProtoReflect.Descriptor instead.
+func (*Format_Subscript) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{9, 5}
+}
+
+// A larger codeblock, with a programming language specified
+// Clients should ideally not bound the width of codeblock messages,
+// possibly scrolling the codeblock horizontally separately from the
+// rest of the message
+type Format_CodeBlock struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// programming language of the code block
+	Language string `protobuf:"bytes,1,opt,name=language,proto3" json:"language,omitempty"`
+}
+
+func (x *Format_CodeBlock) Reset() {
+	*x = Format_CodeBlock{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[57]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Format_CodeBlock) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Format_CodeBlock) ProtoMessage() {}
+
+func (x *Format_CodeBlock) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[57]
+	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 Format_CodeBlock.ProtoReflect.Descriptor instead.
+func (*Format_CodeBlock) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{9, 6}
+}
+
+func (x *Format_CodeBlock) GetLanguage() string {
+	if x != nil {
+		return x.Language
+	}
+	return ""
+}
+
+// Mention of a user (on the current homeserver)
+type Format_UserMention struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// user_id of the user being mentioned
+	UserId uint64 `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
+}
+
+func (x *Format_UserMention) Reset() {
+	*x = Format_UserMention{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[58]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Format_UserMention) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Format_UserMention) ProtoMessage() {}
+
+func (x *Format_UserMention) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[58]
+	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 Format_UserMention.ProtoReflect.Descriptor instead.
+func (*Format_UserMention) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{9, 7}
+}
+
+func (x *Format_UserMention) GetUserId() uint64 {
+	if x != nil {
+		return x.UserId
+	}
+	return 0
+}
+
+// Mention of a role (on the current guild)
+type Format_RoleMention struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// the role being mentioned
+	RoleId uint64 `protobuf:"varint,1,opt,name=role_id,json=roleId,proto3" json:"role_id,omitempty"`
+}
+
+func (x *Format_RoleMention) Reset() {
+	*x = Format_RoleMention{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[59]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Format_RoleMention) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Format_RoleMention) ProtoMessage() {}
+
+func (x *Format_RoleMention) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[59]
+	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 Format_RoleMention.ProtoReflect.Descriptor instead.
+func (*Format_RoleMention) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{9, 8}
+}
+
+func (x *Format_RoleMention) GetRoleId() uint64 {
+	if x != nil {
+		return x.RoleId
+	}
+	return 0
+}
+
+// Mention of a channel (on the current guild)
+type Format_ChannelMention struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// the channel being mentioned
+	ChannelId uint64 `protobuf:"varint,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
+}
+
+func (x *Format_ChannelMention) Reset() {
+	*x = Format_ChannelMention{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[60]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Format_ChannelMention) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Format_ChannelMention) ProtoMessage() {}
+
+func (x *Format_ChannelMention) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[60]
+	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 Format_ChannelMention.ProtoReflect.Descriptor instead.
+func (*Format_ChannelMention) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{9, 9}
+}
+
+func (x *Format_ChannelMention) GetChannelId() uint64 {
+	if x != nil {
+		return x.ChannelId
+	}
+	return 0
+}
+
+// Mention of a guild
+type Format_GuildMention struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// the guild being mentioned
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// which homeserver it belongs to
+	Homeserver string `protobuf:"bytes,2,opt,name=homeserver,proto3" json:"homeserver,omitempty"`
+}
+
+func (x *Format_GuildMention) Reset() {
+	*x = Format_GuildMention{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[61]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Format_GuildMention) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Format_GuildMention) ProtoMessage() {}
+
+func (x *Format_GuildMention) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[61]
+	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 Format_GuildMention.ProtoReflect.Descriptor instead.
+func (*Format_GuildMention) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{9, 10}
+}
+
+func (x *Format_GuildMention) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *Format_GuildMention) GetHomeserver() string {
+	if x != nil {
+		return x.Homeserver
+	}
+	return ""
+}
+
+// An emoji
+type Format_Emoji struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The HMC URL of the emoji
+	ImageHmc string `protobuf:"bytes,1,opt,name=image_hmc,json=imageHmc,proto3" json:"image_hmc,omitempty"`
+	// The ID of the emoji pack the emoji is from
+	PackId uint64 `protobuf:"varint,2,opt,name=pack_id,json=packId,proto3" json:"pack_id,omitempty"`
+}
+
+func (x *Format_Emoji) Reset() {
+	*x = Format_Emoji{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[62]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Format_Emoji) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Format_Emoji) ProtoMessage() {}
+
+func (x *Format_Emoji) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[62]
+	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 Format_Emoji.ProtoReflect.Descriptor instead.
+func (*Format_Emoji) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{9, 11}
+}
+
+func (x *Format_Emoji) GetImageHmc() string {
+	if x != nil {
+		return x.ImageHmc
+	}
+	return ""
+}
+
+func (x *Format_Emoji) GetPackId() uint64 {
+	if x != nil {
+		return x.PackId
+	}
+	return 0
+}
+
+// Colour modification
+type Format_Color struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The kind of colour modification to apply
+	Kind Format_Color_Kind `protobuf:"varint,1,opt,name=kind,proto3,enum=protocol.chat.v1.Format_Color_Kind" json:"kind,omitempty"`
+}
+
+func (x *Format_Color) Reset() {
+	*x = Format_Color{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[63]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Format_Color) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Format_Color) ProtoMessage() {}
+
+func (x *Format_Color) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[63]
+	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 Format_Color.ProtoReflect.Descriptor instead.
+func (*Format_Color) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{9, 12}
+}
+
+func (x *Format_Color) GetKind() Format_Color_Kind {
+	if x != nil {
+		return x.Kind
+	}
+	return Format_Color_KIND_DIM_UNSPECIFIED
+}
+
+// Replace a part of the text with the text matching the i18n code.
+// If i18n code was not found, keep the original text.
+type Format_Localization struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// i18n code for the text.
+	I18NCode string `protobuf:"bytes,1,opt,name=i18n_code,json=i18nCode,proto3" json:"i18n_code,omitempty"`
+}
+
+func (x *Format_Localization) Reset() {
+	*x = Format_Localization{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_messages_proto_msgTypes[64]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Format_Localization) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Format_Localization) ProtoMessage() {}
+
+func (x *Format_Localization) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_messages_proto_msgTypes[64]
+	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 Format_Localization.ProtoReflect.Descriptor instead.
+func (*Format_Localization) Descriptor() ([]byte, []int) {
+	return file_chat_v1_messages_proto_rawDescGZIP(), []int{9, 13}
+}
+
+func (x *Format_Localization) GetI18NCode() string {
+	if x != nil {
+		return x.I18NCode
+	}
+	return ""
+}
+
+var File_chat_v1_messages_proto protoreflect.FileDescriptor
+
+var file_chat_v1_messages_proto_rawDesc = []byte{
+	0x0a, 0x16, 0x63, 0x68, 0x61, 0x74, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,
+	0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63,
+	0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x1a, 0x1b, 0x68, 0x61, 0x72, 0x6d,
+	0x6f, 0x6e, 0x79, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x79, 0x70, 0x65,
+	0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x14, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2f, 0x76,
+	0x31, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa0, 0x03,
+	0x0a, 0x09, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x08, 0x75,
+	0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52,
+	0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06,
+	0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x06,
+	0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x88, 0x01, 0x01, 0x12, 0x23, 0x0a, 0x0c, 0x75, 0x73, 0x65,
+	0x72, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48,
+	0x00, 0x52, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x12, 0x3b,
+	0x0a, 0x07, 0x77, 0x65, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x68, 0x61, 0x72, 0x6d, 0x6f,
+	0x6e, 0x79, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79,
+	0x48, 0x00, 0x52, 0x07, 0x77, 0x65, 0x62, 0x68, 0x6f, 0x6f, 0x6b, 0x12, 0x4c, 0x0a, 0x10, 0x73,
+	0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x70, 0x6c, 0x75, 0x72, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x18,
+	0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c,
+	0x2e, 0x68, 0x61, 0x72, 0x6d, 0x6f, 0x6e, 0x79, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x76, 0x31,
+	0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x48, 0x00, 0x52, 0x0f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d,
+	0x50, 0x6c, 0x75, 0x72, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x48, 0x0a, 0x0e, 0x73, 0x79, 0x73,
+	0x74, 0x65, 0x6d, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x68, 0x61, 0x72,
+	0x6d, 0x6f, 0x6e, 0x79, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6d, 0x70,
+	0x74, 0x79, 0x48, 0x00, 0x52, 0x0d, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4d, 0x65, 0x73, 0x73,
+	0x61, 0x67, 0x65, 0x12, 0x39, 0x0a, 0x06, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x18, 0x07, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x68,
+	0x61, 0x72, 0x6d, 0x6f, 0x6e, 0x79, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x45,
+	0x6d, 0x70, 0x74, 0x79, 0x48, 0x00, 0x52, 0x06, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x42, 0x08,
+	0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x75, 0x73, 0x65,
+	0x72, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72,
+	0x22, 0xd8, 0x02, 0x0a, 0x0d, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f,
+	0x61, 0x64, 0x12, 0x40, 0x0a, 0x06, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68,
+	0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x79, 0x6c,
+	0x6f, 0x61, 0x64, 0x2e, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x06, 0x62, 0x75,
+	0x74, 0x74, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x08, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f,
+	0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+	0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x44, 0x72, 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e,
+	0x48, 0x00, 0x52, 0x08, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x3d, 0x0a, 0x05,
+	0x69, 0x6e, 0x70, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x41,
+	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x49, 0x6e, 0x70,
+	0x75, 0x74, 0x48, 0x00, 0x52, 0x05, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x1c, 0x0a, 0x06, 0x42,
+	0x75, 0x74, 0x74, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x22, 0x0a, 0x08, 0x44, 0x72, 0x6f,
+	0x70, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x1a, 0x31, 0x0a,
+	0x05, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04,
+	0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61,
+	0x42, 0x09, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x8c, 0x05, 0x0a, 0x06,
+	0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x0b, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+	0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x41,
+	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x61, 0x63, 0x74, 0x69,
+	0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x39, 0x0a, 0x06, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f,
+	0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+	0x2e, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x06, 0x62, 0x75, 0x74, 0x74, 0x6f,
+	0x6e, 0x12, 0x3f, 0x0a, 0x08, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x18, 0x03, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63,
+	0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x44, 0x72,
+	0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x48, 0x00, 0x52, 0x08, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f,
+	0x77, 0x6e, 0x12, 0x36, 0x0a, 0x05, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61,
+	0x74, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x6e, 0x70, 0x75,
+	0x74, 0x48, 0x00, 0x52, 0x05, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x4f, 0x0a, 0x06, 0x42, 0x75,
+	0x74, 0x74, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x15, 0x0a, 0x03,
+	0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x03, 0x75, 0x72, 0x6c,
+	0x88, 0x01, 0x01, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x75, 0x72, 0x6c, 0x1a, 0x96, 0x01, 0x0a, 0x08,
+	0x44, 0x72, 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65,
+	0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x41,
+	0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32,
+	0x27, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e,
+	0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x44, 0x72, 0x6f, 0x70, 0x64, 0x6f,
+	0x77, 0x6e, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65,
+	0x73, 0x1a, 0x31, 0x0a, 0x05, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61,
+	0x62, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c,
+	0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04,
+	0x64, 0x61, 0x74, 0x61, 0x1a, 0x4f, 0x0a, 0x05, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a,
+	0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61,
+	0x62, 0x65, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x6c, 0x69, 0x6e, 0x65,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x6c, 0x69, 0x6e,
+	0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52,
+	0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x4b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a,
+	0x17, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x5f, 0x55, 0x4e, 0x53,
+	0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59,
+	0x50, 0x45, 0x5f, 0x50, 0x52, 0x49, 0x4d, 0x41, 0x52, 0x59, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10,
+	0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x45, 0x53, 0x54, 0x52, 0x55, 0x43, 0x54, 0x49, 0x56, 0x45,
+	0x10, 0x02, 0x42, 0x06, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0xa8, 0x07, 0x0a, 0x05, 0x45,
+	0x6d, 0x62, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x38, 0x0a, 0x04, 0x62, 0x6f,
+	0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x6f, 0x72, 0x6d,
+	0x61, 0x74, 0x74, 0x65, 0x64, 0x54, 0x65, 0x78, 0x74, 0x48, 0x00, 0x52, 0x04, 0x62, 0x6f, 0x64,
+	0x79, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x18, 0x03, 0x20,
+	0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x05, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12,
+	0x41, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e,
+	0x76, 0x31, 0x2e, 0x45, 0x6d, 0x62, 0x65, 0x64, 0x2e, 0x45, 0x6d, 0x62, 0x65, 0x64, 0x48, 0x65,
+	0x61, 0x64, 0x69, 0x6e, 0x67, 0x48, 0x02, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x88,
+	0x01, 0x01, 0x12, 0x41, 0x0a, 0x06, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68,
+	0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6d, 0x62, 0x65, 0x64, 0x2e, 0x45, 0x6d, 0x62, 0x65,
+	0x64, 0x48, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x48, 0x03, 0x52, 0x06, 0x66, 0x6f, 0x6f, 0x74,
+	0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18,
+	0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c,
+	0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6d, 0x62, 0x65, 0x64, 0x2e, 0x45,
+	0x6d, 0x62, 0x65, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64,
+	0x73, 0x1a, 0x8e, 0x01, 0x0a, 0x0c, 0x45, 0x6d, 0x62, 0x65, 0x64, 0x48, 0x65, 0x61, 0x64, 0x69,
+	0x6e, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1d, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x74, 0x65, 0x78,
+	0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x73, 0x75, 0x62, 0x74, 0x65,
+	0x78, 0x74, 0x88, 0x01, 0x01, 0x12, 0x15, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01,
+	0x28, 0x09, 0x48, 0x01, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x17, 0x0a, 0x04,
+	0x69, 0x63, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x04, 0x69, 0x63,
+	0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x73, 0x75, 0x62, 0x74, 0x65, 0x78,
+	0x74, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x75, 0x72, 0x6c, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x69, 0x63,
+	0x6f, 0x6e, 0x1a, 0xb7, 0x03, 0x0a, 0x0a, 0x45, 0x6d, 0x62, 0x65, 0x64, 0x46, 0x69, 0x65, 0x6c,
+	0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x1f, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x74, 0x69,
+	0x74, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x73, 0x75, 0x62,
+	0x74, 0x69, 0x74, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f,
+	0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74,
+	0x74, 0x65, 0x64, 0x54, 0x65, 0x78, 0x74, 0x48, 0x01, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x88,
+	0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18,
+	0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x08, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x55, 0x72,
+	0x6c, 0x88, 0x01, 0x01, 0x12, 0x53, 0x0a, 0x0c, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61,
+	0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6d,
+	0x62, 0x65, 0x64, 0x2e, 0x45, 0x6d, 0x62, 0x65, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x2e, 0x50,
+	0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x70, 0x72, 0x65,
+	0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x07, 0x61, 0x63, 0x74,
+	0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63,
+	0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x69, 0x0a,
+	0x0c, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a,
+	0x1d, 0x50, 0x52, 0x45, 0x53, 0x45, 0x4e, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x41,
+	0x54, 0x41, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00,
+	0x12, 0x20, 0x0a, 0x1c, 0x50, 0x52, 0x45, 0x53, 0x45, 0x4e, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e,
+	0x5f, 0x43, 0x41, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x45, 0x44, 0x5f, 0x49, 0x4d, 0x41, 0x47, 0x45,
+	0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x50, 0x52, 0x45, 0x53, 0x45, 0x4e, 0x54, 0x41, 0x54, 0x49,
+	0x4f, 0x4e, 0x5f, 0x52, 0x4f, 0x57, 0x10, 0x02, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x73, 0x75, 0x62,
+	0x74, 0x69, 0x74, 0x6c, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x42, 0x0c,
+	0x0a, 0x0a, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x42, 0x07, 0x0a, 0x05,
+	0x5f, 0x62, 0x6f, 0x64, 0x79, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x42,
+	0x09, 0x0a, 0x07, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x66,
+	0x6f, 0x6f, 0x74, 0x65, 0x72, 0x22, 0x51, 0x0a, 0x0d, 0x4d, 0x69, 0x6e, 0x69, 0x74, 0x68, 0x75,
+	0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x77, 0x69, 0x64, 0x74, 0x68, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x77, 0x69, 0x64, 0x74, 0x68, 0x12, 0x16, 0x0a, 0x06,
+	0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x68, 0x65,
+	0x69, 0x67, 0x68, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01,
+	0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xfa, 0x01, 0x0a, 0x05, 0x50, 0x68, 0x6f,
+	0x74, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x68, 0x6d, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x03, 0x68, 0x6d, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65,
+	0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x66, 0x69, 0x6c,
+	0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18,
+	0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x14, 0x0a,
+	0x05, 0x77, 0x69, 0x64, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x77, 0x69,
+	0x64, 0x74, 0x68, 0x12, 0x39, 0x0a, 0x07, 0x63, 0x61, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e,
+	0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, 0x65,
+	0x64, 0x54, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x61, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x45,
+	0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x69, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x18,
+	0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c,
+	0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x69, 0x6e, 0x69, 0x74, 0x68, 0x75,
+	0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x69, 0x74, 0x68, 0x75, 0x6d,
+	0x62, 0x6e, 0x61, 0x69, 0x6c, 0x22, 0xac, 0x01, 0x0a, 0x0a, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68,
+	0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x02, 0x69, 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, 0x6d, 0x69, 0x6d, 0x65,
+	0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x69, 0x6d, 0x65,
+	0x74, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01,
+	0x28, 0x0d, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x3e, 0x0a, 0x07, 0x63, 0x61, 0x70, 0x74,
+	0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x6f, 0x72,
+	0x6d, 0x61, 0x74, 0x74, 0x65, 0x64, 0x54, 0x65, 0x78, 0x74, 0x48, 0x00, 0x52, 0x07, 0x63, 0x61,
+	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x63, 0x61, 0x70,
+	0x74, 0x69, 0x6f, 0x6e, 0x22, 0xd9, 0x08, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
+	0x12, 0x4a, 0x0a, 0x0c, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f,
+	0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
+	0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52,
+	0x0b, 0x74, 0x65, 0x78, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x4d, 0x0a, 0x0d,
+	0x65, 0x6d, 0x62, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63,
+	0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x45,
+	0x6d, 0x62, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x65,
+	0x6d, 0x62, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x5c, 0x0a, 0x12, 0x61,
+	0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,
+	0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63,
+	0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65,
+	0x6e, 0x74, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e,
+	0x74, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x11, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65,
+	0x6e, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x4d, 0x0a, 0x0d, 0x70, 0x68, 0x6f,
+	0x74, 0x6f, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74,
+	0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x68, 0x6f, 0x74,
+	0x6f, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x70, 0x68, 0x6f, 0x74,
+	0x6f, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x53, 0x0a, 0x0f, 0x69, 0x6e, 0x76, 0x69,
+	0x74, 0x65, 0x5f, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x28, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61,
+	0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x49, 0x6e, 0x76,
+	0x69, 0x74, 0x65, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x0e, 0x69,
+	0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x53, 0x0a,
+	0x0f, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64,
+	0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f,
+	0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
+	0x74, 0x2e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64,
+	0x48, 0x00, 0x52, 0x0e, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74,
+	0x65, 0x64, 0x12, 0x64, 0x0a, 0x16, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61,
+	0x64, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x5f, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x07, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68,
+	0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x6f,
+	0x6f, 0x6d, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x64, 0x54, 0x6f, 0x47, 0x75, 0x69, 0x6c,
+	0x64, 0x48, 0x00, 0x52, 0x13, 0x72, 0x6f, 0x6f, 0x6d, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65,
+	0x64, 0x54, 0x6f, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x1a, 0x48, 0x0a, 0x0b, 0x54, 0x65, 0x78, 0x74,
+	0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x39, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65,
+	0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x6f, 0x72, 0x6d,
+	0x61, 0x74, 0x74, 0x65, 0x64, 0x54, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65,
+	0x6e, 0x74, 0x1a, 0x3f, 0x0a, 0x0c, 0x45, 0x6d, 0x62, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65,
+	0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x06, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03,
+	0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68,
+	0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6d, 0x62, 0x65, 0x64, 0x52, 0x06, 0x65, 0x6d, 0x62,
+	0x65, 0x64, 0x73, 0x1a, 0x47, 0x0a, 0x11, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e,
+	0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x32, 0x0a, 0x05, 0x66, 0x69, 0x6c, 0x65,
+	0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63,
+	0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63,
+	0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x1a, 0x3f, 0x0a, 0x0c,
+	0x50, 0x68, 0x6f, 0x74, 0x6f, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x06,
+	0x70, 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e,
+	0x50, 0x68, 0x6f, 0x74, 0x6f, 0x52, 0x06, 0x70, 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x1a, 0x4e, 0x0a,
+	0x0e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12,
+	0x1d, 0x0a, 0x0a, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x04, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x65, 0x49, 0x64, 0x12, 0x1d,
+	0x0a, 0x0a, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x04, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x72, 0x49, 0x64, 0x1a, 0x4e, 0x0a,
+	0x0e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x12,
+	0x1d, 0x0a, 0x0a, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x04, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x65, 0x49, 0x64, 0x12, 0x1d,
+	0x0a, 0x0a, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x04, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x72, 0x49, 0x64, 0x1a, 0x36, 0x0a,
+	0x13, 0x52, 0x6f, 0x6f, 0x6d, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x64, 0x54, 0x6f, 0x47,
+	0x75, 0x69, 0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x64,
+	0x5f, 0x62, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x75, 0x70, 0x67, 0x72, 0x61,
+	0x64, 0x65, 0x64, 0x42, 0x79, 0x42, 0x09, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
+	0x22, 0x50, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x05,
+	0x65, 0x6d, 0x6f, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e,
+	0x45, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x05, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05,
+	0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75,
+	0x6e, 0x74, 0x22, 0xe6, 0x0c, 0x0a, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x14, 0x0a,
+	0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74,
+	0x61, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x0d, 0x52, 0x06, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x33, 0x0a, 0x04, 0x62,
+	0x6f, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x6f, 0x72,
+	0x6d, 0x61, 0x74, 0x2e, 0x42, 0x6f, 0x6c, 0x64, 0x48, 0x00, 0x52, 0x04, 0x62, 0x6f, 0x6c, 0x64,
+	0x12, 0x39, 0x0a, 0x06, 0x69, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74,
+	0x2e, 0x76, 0x31, 0x2e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2e, 0x49, 0x74, 0x61, 0x6c, 0x69,
+	0x63, 0x48, 0x00, 0x52, 0x06, 0x69, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x12, 0x42, 0x0a, 0x09, 0x75,
+	0x6e, 0x64, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76,
+	0x31, 0x2e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2e, 0x55, 0x6e, 0x64, 0x65, 0x72, 0x6c, 0x69,
+	0x6e, 0x65, 0x48, 0x00, 0x52, 0x09, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x65, 0x12,
+	0x42, 0x0a, 0x09, 0x6d, 0x6f, 0x6e, 0x6f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68,
+	0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2e, 0x4d, 0x6f, 0x6e,
+	0x6f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x48, 0x00, 0x52, 0x09, 0x6d, 0x6f, 0x6e, 0x6f, 0x73, 0x70,
+	0x61, 0x63, 0x65, 0x12, 0x48, 0x0a, 0x0b, 0x73, 0x75, 0x70, 0x65, 0x72, 0x73, 0x63, 0x72, 0x69,
+	0x70, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x6f, 0x72, 0x6d,
+	0x61, 0x74, 0x2e, 0x53, 0x75, 0x70, 0x65, 0x72, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x48, 0x00,
+	0x52, 0x0b, 0x73, 0x75, 0x70, 0x65, 0x72, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x42, 0x0a,
+	0x09, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x22, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74,
+	0x2e, 0x76, 0x31, 0x2e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63,
+	0x72, 0x69, 0x70, 0x74, 0x48, 0x00, 0x52, 0x09, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70,
+	0x74, 0x12, 0x43, 0x0a, 0x0a, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18,
+	0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c,
+	0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2e,
+	0x43, 0x6f, 0x64, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x00, 0x52, 0x09, 0x63, 0x6f, 0x64,
+	0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x49, 0x0a, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6d,
+	0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e,
+	0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x6e, 0x74, 0x69,
+	0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x6e, 0x74, 0x69, 0x6f,
+	0x6e, 0x12, 0x49, 0x0a, 0x0c, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x6d, 0x65, 0x6e, 0x74, 0x69, 0x6f,
+	0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63,
+	0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x6f, 0x72, 0x6d, 0x61,
+	0x74, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52,
+	0x0b, 0x72, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x52, 0x0a, 0x0f,
+	0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x6d, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x18,
+	0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c,
+	0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2e,
+	0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00,
+	0x52, 0x0e, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e,
+	0x12, 0x4c, 0x0a, 0x0d, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x6d, 0x65, 0x6e, 0x74, 0x69, 0x6f,
+	0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63,
+	0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x6f, 0x72, 0x6d, 0x61,
+	0x74, 0x2e, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x4d, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00,
+	0x52, 0x0c, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x4d, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36,
+	0x0a, 0x05, 0x65, 0x6d, 0x6f, 0x6a, 0x69, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31,
+	0x2e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2e, 0x45, 0x6d, 0x6f, 0x6a, 0x69, 0x48, 0x00, 0x52,
+	0x05, 0x65, 0x6d, 0x6f, 0x6a, 0x69, 0x12, 0x36, 0x0a, 0x05, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x18,
+	0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c,
+	0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2e,
+	0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x05, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x12, 0x4b,
+	0x0a, 0x0c, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x10,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e,
+	0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2e, 0x4c,
+	0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0c, 0x6c,
+	0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x06, 0x0a, 0x04, 0x42,
+	0x6f, 0x6c, 0x64, 0x1a, 0x08, 0x0a, 0x06, 0x49, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x1a, 0x0b, 0x0a,
+	0x09, 0x55, 0x6e, 0x64, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x65, 0x1a, 0x0b, 0x0a, 0x09, 0x4d, 0x6f,
+	0x6e, 0x6f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x1a, 0x0d, 0x0a, 0x0b, 0x53, 0x75, 0x70, 0x65, 0x72,
+	0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x1a, 0x0b, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72,
+	0x69, 0x70, 0x74, 0x1a, 0x27, 0x0a, 0x09, 0x43, 0x6f, 0x64, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b,
+	0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x1a, 0x26, 0x0a, 0x0b,
+	0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x75,
+	0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x73,
+	0x65, 0x72, 0x49, 0x64, 0x1a, 0x26, 0x0a, 0x0b, 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6e, 0x74,
+	0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x72, 0x6f, 0x6c, 0x65, 0x49, 0x64, 0x1a, 0x2f, 0x0a, 0x0e,
+	0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d,
+	0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x04, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x1a, 0x49, 0x0a,
+	0x0c, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x4d, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a,
+	0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52,
+	0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x68, 0x6f, 0x6d, 0x65,
+	0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x68, 0x6f,
+	0x6d, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x1a, 0x3d, 0x0a, 0x05, 0x45, 0x6d, 0x6f, 0x6a,
+	0x69, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x68, 0x6d, 0x63, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x48, 0x6d, 0x63, 0x12, 0x17,
+	0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52,
+	0x06, 0x70, 0x61, 0x63, 0x6b, 0x49, 0x64, 0x1a, 0xba, 0x01, 0x0a, 0x05, 0x43, 0x6f, 0x6c, 0x6f,
+	0x72, 0x12, 0x37, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32,
+	0x23, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e,
+	0x76, 0x31, 0x2e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2e, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e,
+	0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x78, 0x0a, 0x04, 0x4b, 0x69,
+	0x6e, 0x64, 0x12, 0x18, 0x0a, 0x14, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x44, 0x49, 0x4d, 0x5f, 0x55,
+	0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b,
+	0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x42, 0x52, 0x49, 0x47, 0x48, 0x54, 0x10, 0x01, 0x12, 0x11, 0x0a,
+	0x0d, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4e, 0x45, 0x47, 0x41, 0x54, 0x49, 0x56, 0x45, 0x10, 0x02,
+	0x12, 0x11, 0x0a, 0x0d, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x56,
+	0x45, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x49, 0x4e, 0x46, 0x4f,
+	0x10, 0x04, 0x12, 0x10, 0x0a, 0x0c, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x57, 0x41, 0x52, 0x4e, 0x49,
+	0x4e, 0x47, 0x10, 0x05, 0x1a, 0x2b, 0x0a, 0x0c, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a, 0x61,
+	0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x31, 0x38, 0x6e, 0x5f, 0x63, 0x6f, 0x64,
+	0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x31, 0x38, 0x6e, 0x43, 0x6f, 0x64,
+	0x65, 0x42, 0x08, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x55, 0x0a, 0x0d, 0x46,
+	0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x64, 0x54, 0x65, 0x78, 0x74, 0x12, 0x12, 0x0a, 0x04,
+	0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74,
+	0x12, 0x30, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,
+	0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74,
+	0x2e, 0x76, 0x31, 0x2e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d,
+	0x61, 0x74, 0x22, 0xa6, 0x03, 0x0a, 0x07, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x43,
+	0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x22, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x68, 0x61, 0x72, 0x6d,
+	0x6f, 0x6e, 0x79, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61,
+	0x64, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,
+	0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x09, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f,
+	0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69,
+	0x64, 0x65, 0x73, 0x52, 0x09, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x12, 0x1b,
+	0x0a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28,
+	0x04, 0x52, 0x08, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63,
+	0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52,
+	0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x20, 0x0a, 0x09, 0x65, 0x64,
+	0x69, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x48, 0x01, 0x52,
+	0x08, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64, 0x41, 0x74, 0x88, 0x01, 0x01, 0x12, 0x23, 0x0a, 0x0b,
+	0x69, 0x6e, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x5f, 0x74, 0x6f, 0x18, 0x06, 0x20, 0x01, 0x28,
+	0x04, 0x48, 0x02, 0x52, 0x09, 0x69, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x54, 0x6f, 0x88, 0x01,
+	0x01, 0x12, 0x33, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68,
+	0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x07, 0x63,
+	0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69,
+	0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61,
+	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+	0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x42, 0x0c, 0x0a,
+	0x0a, 0x5f, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x42, 0x0e, 0x0a, 0x0c, 0x5f,
+	0x69, 0x6e, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x5f, 0x74, 0x6f, 0x22, 0x63, 0x0a, 0x0d, 0x4d,
+	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x57, 0x69, 0x74, 0x68, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a,
+	0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04,
+	0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x07, 0x6d,
+	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e,
+	0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
+	0x22, 0xef, 0x02, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d,
+	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19,
+	0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04,
+	0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61,
+	0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x63,
+	0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73,
+	0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x09,
+	0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x58, 0x0a, 0x09,
+	0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32,
+	0x35, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e,
+	0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4d, 0x65, 0x73,
+	0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x44, 0x69, 0x72,
+	0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x01, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74,
+	0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18,
+	0x05, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x02, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x88, 0x01,
+	0x01, 0x22, 0x58, 0x0a, 0x09, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20,
+	0x0a, 0x1c, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x42, 0x45, 0x46, 0x4f,
+	0x52, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00,
+	0x12, 0x14, 0x0a, 0x10, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x52,
+	0x4f, 0x55, 0x4e, 0x44, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54,
+	0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x46, 0x54, 0x45, 0x52, 0x10, 0x02, 0x42, 0x0d, 0x0a, 0x0b, 0x5f,
+	0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x64,
+	0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x63, 0x6f, 0x75,
+	0x6e, 0x74, 0x22, 0xa1, 0x01, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65,
+	0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x61, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x70,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x72, 0x65, 0x61, 0x63, 0x68, 0x65, 0x64, 0x54,
+	0x6f, 0x70, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x61, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x62, 0x6f,
+	0x74, 0x74, 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x72, 0x65, 0x61, 0x63,
+	0x68, 0x65, 0x64, 0x42, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x12, 0x3b, 0x0a, 0x08, 0x6d, 0x65, 0x73,
+	0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4d,
+	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x57, 0x69, 0x74, 0x68, 0x49, 0x64, 0x52, 0x08, 0x6d, 0x65,
+	0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x22, 0x6c, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x73,
+	0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67,
+	0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67,
+	0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65,
+	0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e,
+	0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
+	0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61,
+	0x67, 0x65, 0x49, 0x64, 0x22, 0x49, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61,
+	0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x07, 0x6d, 0x65,
+	0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4d,
+	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22,
+	0x6f, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64,
+	0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64,
+	0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49,
+	0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64,
+	0x22, 0x17, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67,
+	0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xaa, 0x01, 0x0a, 0x14, 0x54, 0x72,
+	0x69, 0x67, 0x67, 0x65, 0x72, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x1d, 0x0a,
+	0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x04, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a,
+	0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04,
+	0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x07, 0x70,
+	0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e,
+	0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x07, 0x70,
+	0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x17, 0x0a, 0x15, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65,
+	0x72, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
+	0x82, 0x03, 0x0a, 0x12, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f,
+	0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49,
+	0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64,
+	0x12, 0x33, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61,
+	0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x07, 0x63, 0x6f,
+	0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x07, 0x65, 0x63, 0x68, 0x6f, 0x5f, 0x69, 0x64,
+	0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x06, 0x65, 0x63, 0x68, 0x6f, 0x49, 0x64,
+	0x88, 0x01, 0x01, 0x12, 0x3e, 0x0a, 0x09, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73,
+	0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f,
+	0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69,
+	0x64, 0x65, 0x73, 0x48, 0x01, 0x52, 0x09, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73,
+	0x88, 0x01, 0x01, 0x12, 0x23, 0x0a, 0x0b, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x5f,
+	0x74, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x48, 0x02, 0x52, 0x09, 0x69, 0x6e, 0x52, 0x65,
+	0x70, 0x6c, 0x79, 0x54, 0x6f, 0x88, 0x01, 0x01, 0x12, 0x43, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61,
+	0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x68, 0x61, 0x72, 0x6d, 0x6f, 0x6e, 0x79, 0x74, 0x79, 0x70,
+	0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x48, 0x03,
+	0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a,
+	0x08, 0x5f, 0x65, 0x63, 0x68, 0x6f, 0x5f, 0x69, 0x64, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6f, 0x76,
+	0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x69, 0x6e, 0x5f, 0x72,
+	0x65, 0x70, 0x6c, 0x79, 0x5f, 0x74, 0x6f, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x65, 0x74, 0x61,
+	0x64, 0x61, 0x74, 0x61, 0x22, 0x34, 0x0a, 0x13, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73,
+	0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d,
+	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52,
+	0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64, 0x22, 0xb5, 0x01, 0x0a, 0x18, 0x55,
+	0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x65, 0x78, 0x74,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64,
+	0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64,
+	0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49,
+	0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64,
+	0x12, 0x40, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18,
+	0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c,
+	0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74,
+	0x65, 0x64, 0x54, 0x65, 0x78, 0x74, 0x52, 0x0a, 0x6e, 0x65, 0x77, 0x43, 0x6f, 0x6e, 0x74, 0x65,
+	0x6e, 0x74, 0x22, 0x1b, 0x0a, 0x19, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x73, 0x73,
+	0x61, 0x67, 0x65, 0x54, 0x65, 0x78, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
+	0x6c, 0x0a, 0x11, 0x50, 0x69, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12,
+	0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x04, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x1d,
+	0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01,
+	0x28, 0x04, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64, 0x22, 0x14, 0x0a,
+	0x12, 0x50, 0x69, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x22, 0x6e, 0x0a, 0x13, 0x55, 0x6e, 0x70, 0x69, 0x6e, 0x4d, 0x65, 0x73, 0x73,
+	0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75,
+	0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75,
+	0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c,
+	0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e,
+	0x65, 0x6c, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f,
+	0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,
+	0x65, 0x49, 0x64, 0x22, 0x16, 0x0a, 0x14, 0x55, 0x6e, 0x70, 0x69, 0x6e, 0x4d, 0x65, 0x73, 0x73,
+	0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x54, 0x0a, 0x18, 0x47,
+	0x65, 0x74, 0x50, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64,
+	0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64,
+	0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49,
+	0x64, 0x22, 0x49, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x50, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x4d, 0x65,
+	0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c,
+	0x0a, 0x12, 0x70, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
+	0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x04, 0x52, 0x10, 0x70, 0x69, 0x6e, 0x6e,
+	0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64, 0x73, 0x22, 0x9d, 0x01, 0x0a,
+	0x12, 0x41, 0x64, 0x64, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x1d,
+	0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x04, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x1d, 0x0a,
+	0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28,
+	0x04, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x05,
+	0x65, 0x6d, 0x6f, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e,
+	0x45, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x05, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x22, 0x15, 0x0a, 0x13,
+	0x41, 0x64, 0x64, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x22, 0xa0, 0x01, 0x0a, 0x15, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65,
+	0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a,
+	0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52,
+	0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e,
+	0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x63, 0x68,
+	0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61,
+	0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6d, 0x65, 0x73,
+	0x73, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x05, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x18,
+	0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c,
+	0x2e, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x52,
+	0x05, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x22, 0x18, 0x0a, 0x16, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65,
+	0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x42, 0xc3, 0x01, 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f,
+	0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x42, 0x0d, 0x4d, 0x65, 0x73, 0x73, 0x61,
+	0x67, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x68,
+	0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x72, 0x6d, 0x6f, 0x6e, 0x79, 0x2d, 0x64,
+	0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x73, 0x68, 0x69, 0x62, 0x73,
+	0x68, 0x69, 0x62, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x63, 0x68, 0x61, 0x74, 0x2f, 0x76, 0x31, 0x3b,
+	0x63, 0x68, 0x61, 0x74, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x50, 0x43, 0x58, 0xaa, 0x02, 0x10, 0x50,
+	0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x74, 0x2e, 0x56, 0x31, 0xca,
+	0x02, 0x10, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5c, 0x43, 0x68, 0x61, 0x74, 0x5c,
+	0x56, 0x31, 0xe2, 0x02, 0x1c, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5c, 0x43, 0x68,
+	0x61, 0x74, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74,
+	0x61, 0xea, 0x02, 0x12, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x3a, 0x3a, 0x43, 0x68,
+	0x61, 0x74, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_chat_v1_messages_proto_rawDescOnce sync.Once
+	file_chat_v1_messages_proto_rawDescData = file_chat_v1_messages_proto_rawDesc
+)
+
+func file_chat_v1_messages_proto_rawDescGZIP() []byte {
+	file_chat_v1_messages_proto_rawDescOnce.Do(func() {
+		file_chat_v1_messages_proto_rawDescData = protoimpl.X.CompressGZIP(file_chat_v1_messages_proto_rawDescData)
+	})
+	return file_chat_v1_messages_proto_rawDescData
+}
+
+var file_chat_v1_messages_proto_enumTypes = make([]protoimpl.EnumInfo, 4)
+var file_chat_v1_messages_proto_msgTypes = make([]protoimpl.MessageInfo, 65)
+var file_chat_v1_messages_proto_goTypes = []interface{}{
+	(Action_Type)(0),                         // 0: protocol.chat.v1.Action.Type
+	(Embed_EmbedField_Presentation)(0),       // 1: protocol.chat.v1.Embed.EmbedField.Presentation
+	(Format_Color_Kind)(0),                   // 2: protocol.chat.v1.Format.Color.Kind
+	(GetChannelMessagesRequest_Direction)(0), // 3: protocol.chat.v1.GetChannelMessagesRequest.Direction
+	(*Overrides)(nil),                        // 4: protocol.chat.v1.Overrides
+	(*ActionPayload)(nil),                    // 5: protocol.chat.v1.ActionPayload
+	(*Action)(nil),                           // 6: protocol.chat.v1.Action
+	(*Embed)(nil),                            // 7: protocol.chat.v1.Embed
+	(*Minithumbnail)(nil),                    // 8: protocol.chat.v1.Minithumbnail
+	(*Photo)(nil),                            // 9: protocol.chat.v1.Photo
+	(*Attachment)(nil),                       // 10: protocol.chat.v1.Attachment
+	(*Content)(nil),                          // 11: protocol.chat.v1.Content
+	(*Reaction)(nil),                         // 12: protocol.chat.v1.Reaction
+	(*Format)(nil),                           // 13: protocol.chat.v1.Format
+	(*FormattedText)(nil),                    // 14: protocol.chat.v1.FormattedText
+	(*Message)(nil),                          // 15: protocol.chat.v1.Message
+	(*MessageWithId)(nil),                    // 16: protocol.chat.v1.MessageWithId
+	(*GetChannelMessagesRequest)(nil),        // 17: protocol.chat.v1.GetChannelMessagesRequest
+	(*GetChannelMessagesResponse)(nil),       // 18: protocol.chat.v1.GetChannelMessagesResponse
+	(*GetMessageRequest)(nil),                // 19: protocol.chat.v1.GetMessageRequest
+	(*GetMessageResponse)(nil),               // 20: protocol.chat.v1.GetMessageResponse
+	(*DeleteMessageRequest)(nil),             // 21: protocol.chat.v1.DeleteMessageRequest
+	(*DeleteMessageResponse)(nil),            // 22: protocol.chat.v1.DeleteMessageResponse
+	(*TriggerActionRequest)(nil),             // 23: protocol.chat.v1.TriggerActionRequest
+	(*TriggerActionResponse)(nil),            // 24: protocol.chat.v1.TriggerActionResponse
+	(*SendMessageRequest)(nil),               // 25: protocol.chat.v1.SendMessageRequest
+	(*SendMessageResponse)(nil),              // 26: protocol.chat.v1.SendMessageResponse
+	(*UpdateMessageTextRequest)(nil),         // 27: protocol.chat.v1.UpdateMessageTextRequest
+	(*UpdateMessageTextResponse)(nil),        // 28: protocol.chat.v1.UpdateMessageTextResponse
+	(*PinMessageRequest)(nil),                // 29: protocol.chat.v1.PinMessageRequest
+	(*PinMessageResponse)(nil),               // 30: protocol.chat.v1.PinMessageResponse
+	(*UnpinMessageRequest)(nil),              // 31: protocol.chat.v1.UnpinMessageRequest
+	(*UnpinMessageResponse)(nil),             // 32: protocol.chat.v1.UnpinMessageResponse
+	(*GetPinnedMessagesRequest)(nil),         // 33: protocol.chat.v1.GetPinnedMessagesRequest
+	(*GetPinnedMessagesResponse)(nil),        // 34: protocol.chat.v1.GetPinnedMessagesResponse
+	(*AddReactionRequest)(nil),               // 35: protocol.chat.v1.AddReactionRequest
+	(*AddReactionResponse)(nil),              // 36: protocol.chat.v1.AddReactionResponse
+	(*RemoveReactionRequest)(nil),            // 37: protocol.chat.v1.RemoveReactionRequest
+	(*RemoveReactionResponse)(nil),           // 38: protocol.chat.v1.RemoveReactionResponse
+	(*ActionPayload_Button)(nil),             // 39: protocol.chat.v1.ActionPayload.Button
+	(*ActionPayload_Dropdown)(nil),           // 40: protocol.chat.v1.ActionPayload.Dropdown
+	(*ActionPayload_Input)(nil),              // 41: protocol.chat.v1.ActionPayload.Input
+	(*Action_Button)(nil),                    // 42: protocol.chat.v1.Action.Button
+	(*Action_Dropdown)(nil),                  // 43: protocol.chat.v1.Action.Dropdown
+	(*Action_Input)(nil),                     // 44: protocol.chat.v1.Action.Input
+	(*Action_Dropdown_Entry)(nil),            // 45: protocol.chat.v1.Action.Dropdown.Entry
+	(*Embed_EmbedHeading)(nil),               // 46: protocol.chat.v1.Embed.EmbedHeading
+	(*Embed_EmbedField)(nil),                 // 47: protocol.chat.v1.Embed.EmbedField
+	(*Content_TextContent)(nil),              // 48: protocol.chat.v1.Content.TextContent
+	(*Content_EmbedContent)(nil),             // 49: protocol.chat.v1.Content.EmbedContent
+	(*Content_AttachmentContent)(nil),        // 50: protocol.chat.v1.Content.AttachmentContent
+	(*Content_PhotoContent)(nil),             // 51: protocol.chat.v1.Content.PhotoContent
+	(*Content_InviteRejected)(nil),           // 52: protocol.chat.v1.Content.InviteRejected
+	(*Content_InviteAccepted)(nil),           // 53: protocol.chat.v1.Content.InviteAccepted
+	(*Content_RoomUpgradedToGuild)(nil),      // 54: protocol.chat.v1.Content.RoomUpgradedToGuild
+	(*Format_Bold)(nil),                      // 55: protocol.chat.v1.Format.Bold
+	(*Format_Italic)(nil),                    // 56: protocol.chat.v1.Format.Italic
+	(*Format_Underline)(nil),                 // 57: protocol.chat.v1.Format.Underline
+	(*Format_Monospace)(nil),                 // 58: protocol.chat.v1.Format.Monospace
+	(*Format_Superscript)(nil),               // 59: protocol.chat.v1.Format.Superscript
+	(*Format_Subscript)(nil),                 // 60: protocol.chat.v1.Format.Subscript
+	(*Format_CodeBlock)(nil),                 // 61: protocol.chat.v1.Format.CodeBlock
+	(*Format_UserMention)(nil),               // 62: protocol.chat.v1.Format.UserMention
+	(*Format_RoleMention)(nil),               // 63: protocol.chat.v1.Format.RoleMention
+	(*Format_ChannelMention)(nil),            // 64: protocol.chat.v1.Format.ChannelMention
+	(*Format_GuildMention)(nil),              // 65: protocol.chat.v1.Format.GuildMention
+	(*Format_Emoji)(nil),                     // 66: protocol.chat.v1.Format.Emoji
+	(*Format_Color)(nil),                     // 67: protocol.chat.v1.Format.Color
+	(*Format_Localization)(nil),              // 68: protocol.chat.v1.Format.Localization
+	(*v1.Empty)(nil),                         // 69: protocol.harmonytypes.v1.Empty
+	(*v11.Emote)(nil),                        // 70: protocol.emote.v1.Emote
+	(*v1.Metadata)(nil),                      // 71: protocol.harmonytypes.v1.Metadata
+}
+var file_chat_v1_messages_proto_depIdxs = []int32{
+	69, // 0: protocol.chat.v1.Overrides.webhook:type_name -> protocol.harmonytypes.v1.Empty
+	69, // 1: protocol.chat.v1.Overrides.system_plurality:type_name -> protocol.harmonytypes.v1.Empty
+	69, // 2: protocol.chat.v1.Overrides.system_message:type_name -> protocol.harmonytypes.v1.Empty
+	69, // 3: protocol.chat.v1.Overrides.bridge:type_name -> protocol.harmonytypes.v1.Empty
+	39, // 4: protocol.chat.v1.ActionPayload.button:type_name -> protocol.chat.v1.ActionPayload.Button
+	40, // 5: protocol.chat.v1.ActionPayload.dropdown:type_name -> protocol.chat.v1.ActionPayload.Dropdown
+	41, // 6: protocol.chat.v1.ActionPayload.input:type_name -> protocol.chat.v1.ActionPayload.Input
+	0,  // 7: protocol.chat.v1.Action.action_type:type_name -> protocol.chat.v1.Action.Type
+	42, // 8: protocol.chat.v1.Action.button:type_name -> protocol.chat.v1.Action.Button
+	43, // 9: protocol.chat.v1.Action.dropdown:type_name -> protocol.chat.v1.Action.Dropdown
+	44, // 10: protocol.chat.v1.Action.input:type_name -> protocol.chat.v1.Action.Input
+	14, // 11: protocol.chat.v1.Embed.body:type_name -> protocol.chat.v1.FormattedText
+	46, // 12: protocol.chat.v1.Embed.header:type_name -> protocol.chat.v1.Embed.EmbedHeading
+	46, // 13: protocol.chat.v1.Embed.footer:type_name -> protocol.chat.v1.Embed.EmbedHeading
+	47, // 14: protocol.chat.v1.Embed.fields:type_name -> protocol.chat.v1.Embed.EmbedField
+	14, // 15: protocol.chat.v1.Photo.caption:type_name -> protocol.chat.v1.FormattedText
+	8,  // 16: protocol.chat.v1.Photo.minithumbnail:type_name -> protocol.chat.v1.Minithumbnail
+	14, // 17: protocol.chat.v1.Attachment.caption:type_name -> protocol.chat.v1.FormattedText
+	48, // 18: protocol.chat.v1.Content.text_message:type_name -> protocol.chat.v1.Content.TextContent
+	49, // 19: protocol.chat.v1.Content.embed_message:type_name -> protocol.chat.v1.Content.EmbedContent
+	50, // 20: protocol.chat.v1.Content.attachment_message:type_name -> protocol.chat.v1.Content.AttachmentContent
+	51, // 21: protocol.chat.v1.Content.photo_message:type_name -> protocol.chat.v1.Content.PhotoContent
+	52, // 22: protocol.chat.v1.Content.invite_rejected:type_name -> protocol.chat.v1.Content.InviteRejected
+	53, // 23: protocol.chat.v1.Content.invite_accepted:type_name -> protocol.chat.v1.Content.InviteAccepted
+	54, // 24: protocol.chat.v1.Content.room_upgraded_to_guild:type_name -> protocol.chat.v1.Content.RoomUpgradedToGuild
+	70, // 25: protocol.chat.v1.Reaction.emote:type_name -> protocol.emote.v1.Emote
+	55, // 26: protocol.chat.v1.Format.bold:type_name -> protocol.chat.v1.Format.Bold
+	56, // 27: protocol.chat.v1.Format.italic:type_name -> protocol.chat.v1.Format.Italic
+	57, // 28: protocol.chat.v1.Format.underline:type_name -> protocol.chat.v1.Format.Underline
+	58, // 29: protocol.chat.v1.Format.monospace:type_name -> protocol.chat.v1.Format.Monospace
+	59, // 30: protocol.chat.v1.Format.superscript:type_name -> protocol.chat.v1.Format.Superscript
+	60, // 31: protocol.chat.v1.Format.subscript:type_name -> protocol.chat.v1.Format.Subscript
+	61, // 32: protocol.chat.v1.Format.code_block:type_name -> protocol.chat.v1.Format.CodeBlock
+	62, // 33: protocol.chat.v1.Format.user_mention:type_name -> protocol.chat.v1.Format.UserMention
+	63, // 34: protocol.chat.v1.Format.role_mention:type_name -> protocol.chat.v1.Format.RoleMention
+	64, // 35: protocol.chat.v1.Format.channel_mention:type_name -> protocol.chat.v1.Format.ChannelMention
+	65, // 36: protocol.chat.v1.Format.guild_mention:type_name -> protocol.chat.v1.Format.GuildMention
+	66, // 37: protocol.chat.v1.Format.emoji:type_name -> protocol.chat.v1.Format.Emoji
+	67, // 38: protocol.chat.v1.Format.color:type_name -> protocol.chat.v1.Format.Color
+	68, // 39: protocol.chat.v1.Format.localization:type_name -> protocol.chat.v1.Format.Localization
+	13, // 40: protocol.chat.v1.FormattedText.format:type_name -> protocol.chat.v1.Format
+	71, // 41: protocol.chat.v1.Message.metadata:type_name -> protocol.harmonytypes.v1.Metadata
+	4,  // 42: protocol.chat.v1.Message.overrides:type_name -> protocol.chat.v1.Overrides
+	11, // 43: protocol.chat.v1.Message.content:type_name -> protocol.chat.v1.Content
+	12, // 44: protocol.chat.v1.Message.reactions:type_name -> protocol.chat.v1.Reaction
+	15, // 45: protocol.chat.v1.MessageWithId.message:type_name -> protocol.chat.v1.Message
+	3,  // 46: protocol.chat.v1.GetChannelMessagesRequest.direction:type_name -> protocol.chat.v1.GetChannelMessagesRequest.Direction
+	16, // 47: protocol.chat.v1.GetChannelMessagesResponse.messages:type_name -> protocol.chat.v1.MessageWithId
+	15, // 48: protocol.chat.v1.GetMessageResponse.message:type_name -> protocol.chat.v1.Message
+	5,  // 49: protocol.chat.v1.TriggerActionRequest.payload:type_name -> protocol.chat.v1.ActionPayload
+	11, // 50: protocol.chat.v1.SendMessageRequest.content:type_name -> protocol.chat.v1.Content
+	4,  // 51: protocol.chat.v1.SendMessageRequest.overrides:type_name -> protocol.chat.v1.Overrides
+	71, // 52: protocol.chat.v1.SendMessageRequest.metadata:type_name -> protocol.harmonytypes.v1.Metadata
+	14, // 53: protocol.chat.v1.UpdateMessageTextRequest.new_content:type_name -> protocol.chat.v1.FormattedText
+	70, // 54: protocol.chat.v1.AddReactionRequest.emote:type_name -> protocol.emote.v1.Emote
+	70, // 55: protocol.chat.v1.RemoveReactionRequest.emote:type_name -> protocol.emote.v1.Emote
+	45, // 56: protocol.chat.v1.Action.Dropdown.entries:type_name -> protocol.chat.v1.Action.Dropdown.Entry
+	14, // 57: protocol.chat.v1.Embed.EmbedField.body:type_name -> protocol.chat.v1.FormattedText
+	1,  // 58: protocol.chat.v1.Embed.EmbedField.presentation:type_name -> protocol.chat.v1.Embed.EmbedField.Presentation
+	6,  // 59: protocol.chat.v1.Embed.EmbedField.actions:type_name -> protocol.chat.v1.Action
+	14, // 60: protocol.chat.v1.Content.TextContent.content:type_name -> protocol.chat.v1.FormattedText
+	7,  // 61: protocol.chat.v1.Content.EmbedContent.embeds:type_name -> protocol.chat.v1.Embed
+	10, // 62: protocol.chat.v1.Content.AttachmentContent.files:type_name -> protocol.chat.v1.Attachment
+	9,  // 63: protocol.chat.v1.Content.PhotoContent.photos:type_name -> protocol.chat.v1.Photo
+	2,  // 64: protocol.chat.v1.Format.Color.kind:type_name -> protocol.chat.v1.Format.Color.Kind
+	65, // [65:65] is the sub-list for method output_type
+	65, // [65:65] is the sub-list for method input_type
+	65, // [65:65] is the sub-list for extension type_name
+	65, // [65:65] is the sub-list for extension extendee
+	0,  // [0:65] is the sub-list for field type_name
+}
+
+func init() { file_chat_v1_messages_proto_init() }
+func file_chat_v1_messages_proto_init() {
+	if File_chat_v1_messages_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_chat_v1_messages_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Overrides); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ActionPayload); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Action); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Embed); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Minithumbnail); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Photo); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Attachment); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Content); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Reaction); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Format); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*FormattedText); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*MessageWithId); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetChannelMessagesRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetChannelMessagesResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetMessageRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetMessageResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DeleteMessageRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DeleteMessageResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*TriggerActionRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*TriggerActionResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SendMessageRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SendMessageResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*UpdateMessageTextRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*UpdateMessageTextResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*PinMessageRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*PinMessageResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*UnpinMessageRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*UnpinMessageResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetPinnedMessagesRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetPinnedMessagesResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*AddReactionRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*AddReactionResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*RemoveReactionRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*RemoveReactionResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ActionPayload_Button); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ActionPayload_Dropdown); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ActionPayload_Input); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Action_Button); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Action_Dropdown); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Action_Input); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Action_Dropdown_Entry); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Embed_EmbedHeading); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Embed_EmbedField); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Content_TextContent); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Content_EmbedContent); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Content_AttachmentContent); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Content_PhotoContent); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Content_InviteRejected); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Content_InviteAccepted); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Content_RoomUpgradedToGuild); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Format_Bold); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Format_Italic); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Format_Underline); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Format_Monospace); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Format_Superscript); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Format_Subscript); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Format_CodeBlock); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Format_UserMention); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Format_RoleMention); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Format_ChannelMention); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Format_GuildMention); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Format_Emoji); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Format_Color); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_messages_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Format_Localization); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	file_chat_v1_messages_proto_msgTypes[0].OneofWrappers = []interface{}{
+		(*Overrides_UserDefined)(nil),
+		(*Overrides_Webhook)(nil),
+		(*Overrides_SystemPlurality)(nil),
+		(*Overrides_SystemMessage)(nil),
+		(*Overrides_Bridge)(nil),
+	}
+	file_chat_v1_messages_proto_msgTypes[1].OneofWrappers = []interface{}{
+		(*ActionPayload_Button_)(nil),
+		(*ActionPayload_Dropdown_)(nil),
+		(*ActionPayload_Input_)(nil),
+	}
+	file_chat_v1_messages_proto_msgTypes[2].OneofWrappers = []interface{}{
+		(*Action_Button_)(nil),
+		(*Action_Dropdown_)(nil),
+		(*Action_Input_)(nil),
+	}
+	file_chat_v1_messages_proto_msgTypes[3].OneofWrappers = []interface{}{}
+	file_chat_v1_messages_proto_msgTypes[6].OneofWrappers = []interface{}{}
+	file_chat_v1_messages_proto_msgTypes[7].OneofWrappers = []interface{}{
+		(*Content_TextMessage)(nil),
+		(*Content_EmbedMessage)(nil),
+		(*Content_AttachmentMessage)(nil),
+		(*Content_PhotoMessage)(nil),
+		(*Content_InviteRejected_)(nil),
+		(*Content_InviteAccepted_)(nil),
+		(*Content_RoomUpgradedToGuild_)(nil),
+	}
+	file_chat_v1_messages_proto_msgTypes[9].OneofWrappers = []interface{}{
+		(*Format_Bold_)(nil),
+		(*Format_Italic_)(nil),
+		(*Format_Underline_)(nil),
+		(*Format_Monospace_)(nil),
+		(*Format_Superscript_)(nil),
+		(*Format_Subscript_)(nil),
+		(*Format_CodeBlock_)(nil),
+		(*Format_UserMention_)(nil),
+		(*Format_RoleMention_)(nil),
+		(*Format_ChannelMention_)(nil),
+		(*Format_GuildMention_)(nil),
+		(*Format_Emoji_)(nil),
+		(*Format_Color_)(nil),
+		(*Format_Localization_)(nil),
+	}
+	file_chat_v1_messages_proto_msgTypes[11].OneofWrappers = []interface{}{}
+	file_chat_v1_messages_proto_msgTypes[13].OneofWrappers = []interface{}{}
+	file_chat_v1_messages_proto_msgTypes[21].OneofWrappers = []interface{}{}
+	file_chat_v1_messages_proto_msgTypes[38].OneofWrappers = []interface{}{}
+	file_chat_v1_messages_proto_msgTypes[42].OneofWrappers = []interface{}{}
+	file_chat_v1_messages_proto_msgTypes[43].OneofWrappers = []interface{}{}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_chat_v1_messages_proto_rawDesc,
+			NumEnums:      4,
+			NumMessages:   65,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_chat_v1_messages_proto_goTypes,
+		DependencyIndexes: file_chat_v1_messages_proto_depIdxs,
+		EnumInfos:         file_chat_v1_messages_proto_enumTypes,
+		MessageInfos:      file_chat_v1_messages_proto_msgTypes,
+	}.Build()
+	File_chat_v1_messages_proto = out.File
+	file_chat_v1_messages_proto_rawDesc = nil
+	file_chat_v1_messages_proto_goTypes = nil
+	file_chat_v1_messages_proto_depIdxs = nil
+}
diff --git a/vendor/github.com/harmony-development/shibshib/gen/chat/v1/permissions.pb.go b/vendor/github.com/harmony-development/shibshib/gen/chat/v1/permissions.pb.go
new file mode 100644
index 00000000..979f3c92
--- /dev/null
+++ b/vendor/github.com/harmony-development/shibshib/gen/chat/v1/permissions.pb.go
@@ -0,0 +1,1886 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.23.0
+// 	protoc        v3.17.3
+// source: chat/v1/permissions.proto
+
+package chatv1
+
+import (
+	proto "github.com/golang/protobuf/proto"
+	v1 "github.com/harmony-development/shibshib/gen/harmonytypes/v1"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
+
+// Object representing a single permission node.
+type Permission struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// the permission matcher. (example: roles.manage)
+	Matches string `protobuf:"bytes,1,opt,name=matches,proto3" json:"matches,omitempty"`
+	// whether the permission is allowed or not.
+	Ok bool `protobuf:"varint,2,opt,name=ok,proto3" json:"ok,omitempty"`
+}
+
+func (x *Permission) Reset() {
+	*x = Permission{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_permissions_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Permission) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Permission) ProtoMessage() {}
+
+func (x *Permission) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_permissions_proto_msgTypes[0]
+	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 Permission.ProtoReflect.Descriptor instead.
+func (*Permission) Descriptor() ([]byte, []int) {
+	return file_chat_v1_permissions_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *Permission) GetMatches() string {
+	if x != nil {
+		return x.Matches
+	}
+	return ""
+}
+
+func (x *Permission) GetOk() bool {
+	if x != nil {
+		return x.Ok
+	}
+	return false
+}
+
+// Object representing a role without the ID.
+type Role struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// the role name.
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	// the role color.
+	Color int32 `protobuf:"varint,2,opt,name=color,proto3" json:"color,omitempty"`
+	// whether the role is hoisted or not.
+	Hoist bool `protobuf:"varint,3,opt,name=hoist,proto3" json:"hoist,omitempty"`
+	// whether the role is mentionable or not.
+	Pingable bool `protobuf:"varint,4,opt,name=pingable,proto3" json:"pingable,omitempty"`
+}
+
+func (x *Role) Reset() {
+	*x = Role{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_permissions_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Role) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Role) ProtoMessage() {}
+
+func (x *Role) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_permissions_proto_msgTypes[1]
+	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 Role.ProtoReflect.Descriptor instead.
+func (*Role) Descriptor() ([]byte, []int) {
+	return file_chat_v1_permissions_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *Role) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *Role) GetColor() int32 {
+	if x != nil {
+		return x.Color
+	}
+	return 0
+}
+
+func (x *Role) GetHoist() bool {
+	if x != nil {
+		return x.Hoist
+	}
+	return false
+}
+
+func (x *Role) GetPingable() bool {
+	if x != nil {
+		return x.Pingable
+	}
+	return false
+}
+
+// Object representing a role with it's ID.
+//
+// The role ID for the default role in a guild should always be 0.
+type RoleWithId struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// ID of the role.
+	RoleId uint64 `protobuf:"varint,1,opt,name=role_id,json=roleId,proto3" json:"role_id,omitempty"`
+	// The role data.
+	Role *Role `protobuf:"bytes,2,opt,name=role,proto3" json:"role,omitempty"`
+}
+
+func (x *RoleWithId) Reset() {
+	*x = RoleWithId{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_permissions_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *RoleWithId) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RoleWithId) ProtoMessage() {}
+
+func (x *RoleWithId) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_permissions_proto_msgTypes[2]
+	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 RoleWithId.ProtoReflect.Descriptor instead.
+func (*RoleWithId) Descriptor() ([]byte, []int) {
+	return file_chat_v1_permissions_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *RoleWithId) GetRoleId() uint64 {
+	if x != nil {
+		return x.RoleId
+	}
+	return 0
+}
+
+func (x *RoleWithId) GetRole() *Role {
+	if x != nil {
+		return x.Role
+	}
+	return nil
+}
+
+// Used in the `QueryHasPermission` endpoint.
+type QueryHasPermissionRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// the guild ID to query permissions for
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// the channel ID to query permissions for. If not set, it will query
+	// permissions for the guild.
+	ChannelId *uint64 `protobuf:"varint,2,opt,name=channel_id,json=channelId,proto3,oneof" json:"channel_id,omitempty"`
+	// the user ID to query permissions for (if not provided, the current user is
+	// assumed).
+	As *uint64 `protobuf:"varint,4,opt,name=as,proto3,oneof" json:"as,omitempty"`
+	// the permission node to check for.
+	CheckFor string `protobuf:"bytes,3,opt,name=check_for,json=checkFor,proto3" json:"check_for,omitempty"`
+}
+
+func (x *QueryHasPermissionRequest) Reset() {
+	*x = QueryHasPermissionRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_permissions_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *QueryHasPermissionRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*QueryHasPermissionRequest) ProtoMessage() {}
+
+func (x *QueryHasPermissionRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_permissions_proto_msgTypes[3]
+	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 QueryHasPermissionRequest.ProtoReflect.Descriptor instead.
+func (*QueryHasPermissionRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_permissions_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *QueryHasPermissionRequest) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *QueryHasPermissionRequest) GetChannelId() uint64 {
+	if x != nil && x.ChannelId != nil {
+		return *x.ChannelId
+	}
+	return 0
+}
+
+func (x *QueryHasPermissionRequest) GetAs() uint64 {
+	if x != nil && x.As != nil {
+		return *x.As
+	}
+	return 0
+}
+
+func (x *QueryHasPermissionRequest) GetCheckFor() string {
+	if x != nil {
+		return x.CheckFor
+	}
+	return ""
+}
+
+// Used in the `QueryHasPermission` endpoint.
+type QueryHasPermissionResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// the permissions for the given node.
+	Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"`
+}
+
+func (x *QueryHasPermissionResponse) Reset() {
+	*x = QueryHasPermissionResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_permissions_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *QueryHasPermissionResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*QueryHasPermissionResponse) ProtoMessage() {}
+
+func (x *QueryHasPermissionResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_permissions_proto_msgTypes[4]
+	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 QueryHasPermissionResponse.ProtoReflect.Descriptor instead.
+func (*QueryHasPermissionResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_permissions_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *QueryHasPermissionResponse) GetOk() bool {
+	if x != nil {
+		return x.Ok
+	}
+	return false
+}
+
+// Used in the `SetPermissions` endpoint.
+type SetPermissionsRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// the guild ID to set permissions for.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// the channel ID to set permissions for. Only set if the role is for a
+	// channel.
+	ChannelId *uint64 `protobuf:"varint,2,opt,name=channel_id,json=channelId,proto3,oneof" json:"channel_id,omitempty"`
+	// the role ID to set permissions for.
+	RoleId uint64 `protobuf:"varint,3,opt,name=role_id,json=roleId,proto3" json:"role_id,omitempty"`
+	// the permission list to give.
+	//
+	// There is no "perms_to_take" because not given permissions are by
+	// default not allowed.
+	PermsToGive []*Permission `protobuf:"bytes,4,rep,name=perms_to_give,json=permsToGive,proto3" json:"perms_to_give,omitempty"`
+}
+
+func (x *SetPermissionsRequest) Reset() {
+	*x = SetPermissionsRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_permissions_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SetPermissionsRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SetPermissionsRequest) ProtoMessage() {}
+
+func (x *SetPermissionsRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_permissions_proto_msgTypes[5]
+	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 SetPermissionsRequest.ProtoReflect.Descriptor instead.
+func (*SetPermissionsRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_permissions_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *SetPermissionsRequest) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *SetPermissionsRequest) GetChannelId() uint64 {
+	if x != nil && x.ChannelId != nil {
+		return *x.ChannelId
+	}
+	return 0
+}
+
+func (x *SetPermissionsRequest) GetRoleId() uint64 {
+	if x != nil {
+		return x.RoleId
+	}
+	return 0
+}
+
+func (x *SetPermissionsRequest) GetPermsToGive() []*Permission {
+	if x != nil {
+		return x.PermsToGive
+	}
+	return nil
+}
+
+// Used in the `SetPermissions` endpoint.
+type SetPermissionsResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *SetPermissionsResponse) Reset() {
+	*x = SetPermissionsResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_permissions_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SetPermissionsResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SetPermissionsResponse) ProtoMessage() {}
+
+func (x *SetPermissionsResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_permissions_proto_msgTypes[6]
+	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 SetPermissionsResponse.ProtoReflect.Descriptor instead.
+func (*SetPermissionsResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_permissions_proto_rawDescGZIP(), []int{6}
+}
+
+// Used in the `GetPermissions` endpoint.
+type GetPermissionsRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// the guild ID to get permissions for.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// the channel ID to get permissions for. Only applicable for roles in a
+	// channel.
+	ChannelId *uint64 `protobuf:"varint,2,opt,name=channel_id,json=channelId,proto3,oneof" json:"channel_id,omitempty"`
+	// the role ID to get permissions for.
+	RoleId uint64 `protobuf:"varint,3,opt,name=role_id,json=roleId,proto3" json:"role_id,omitempty"`
+}
+
+func (x *GetPermissionsRequest) Reset() {
+	*x = GetPermissionsRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_permissions_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetPermissionsRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetPermissionsRequest) ProtoMessage() {}
+
+func (x *GetPermissionsRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_permissions_proto_msgTypes[7]
+	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 GetPermissionsRequest.ProtoReflect.Descriptor instead.
+func (*GetPermissionsRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_permissions_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *GetPermissionsRequest) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *GetPermissionsRequest) GetChannelId() uint64 {
+	if x != nil && x.ChannelId != nil {
+		return *x.ChannelId
+	}
+	return 0
+}
+
+func (x *GetPermissionsRequest) GetRoleId() uint64 {
+	if x != nil {
+		return x.RoleId
+	}
+	return 0
+}
+
+// Used in the `GetPermissions` endpoint.
+type GetPermissionsResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// the permissions list for the given role.
+	Perms []*Permission `protobuf:"bytes,1,rep,name=perms,proto3" json:"perms,omitempty"`
+}
+
+func (x *GetPermissionsResponse) Reset() {
+	*x = GetPermissionsResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_permissions_proto_msgTypes[8]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetPermissionsResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetPermissionsResponse) ProtoMessage() {}
+
+func (x *GetPermissionsResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_permissions_proto_msgTypes[8]
+	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 GetPermissionsResponse.ProtoReflect.Descriptor instead.
+func (*GetPermissionsResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_permissions_proto_rawDescGZIP(), []int{8}
+}
+
+func (x *GetPermissionsResponse) GetPerms() []*Permission {
+	if x != nil {
+		return x.Perms
+	}
+	return nil
+}
+
+// Used in the `MoveRole` endpoint.
+type MoveRoleRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// the guild ID to move the role in.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// the role ID to move.
+	RoleId uint64 `protobuf:"varint,2,opt,name=role_id,json=roleId,proto3" json:"role_id,omitempty"`
+	// the new position of the role.
+	NewPosition *v1.ItemPosition `protobuf:"bytes,3,opt,name=new_position,json=newPosition,proto3" json:"new_position,omitempty"`
+}
+
+func (x *MoveRoleRequest) Reset() {
+	*x = MoveRoleRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_permissions_proto_msgTypes[9]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *MoveRoleRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MoveRoleRequest) ProtoMessage() {}
+
+func (x *MoveRoleRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_permissions_proto_msgTypes[9]
+	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 MoveRoleRequest.ProtoReflect.Descriptor instead.
+func (*MoveRoleRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_permissions_proto_rawDescGZIP(), []int{9}
+}
+
+func (x *MoveRoleRequest) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *MoveRoleRequest) GetRoleId() uint64 {
+	if x != nil {
+		return x.RoleId
+	}
+	return 0
+}
+
+func (x *MoveRoleRequest) GetNewPosition() *v1.ItemPosition {
+	if x != nil {
+		return x.NewPosition
+	}
+	return nil
+}
+
+// Used in the `MoveRole` endpoint.
+type MoveRoleResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *MoveRoleResponse) Reset() {
+	*x = MoveRoleResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_permissions_proto_msgTypes[10]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *MoveRoleResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MoveRoleResponse) ProtoMessage() {}
+
+func (x *MoveRoleResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_permissions_proto_msgTypes[10]
+	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 MoveRoleResponse.ProtoReflect.Descriptor instead.
+func (*MoveRoleResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_permissions_proto_rawDescGZIP(), []int{10}
+}
+
+// Used in the `GetGuildRoles` endpoint.
+type GetGuildRolesRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// the guild ID to get roles for.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+}
+
+func (x *GetGuildRolesRequest) Reset() {
+	*x = GetGuildRolesRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_permissions_proto_msgTypes[11]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetGuildRolesRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetGuildRolesRequest) ProtoMessage() {}
+
+func (x *GetGuildRolesRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_permissions_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 GetGuildRolesRequest.ProtoReflect.Descriptor instead.
+func (*GetGuildRolesRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_permissions_proto_rawDescGZIP(), []int{11}
+}
+
+func (x *GetGuildRolesRequest) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+// Used in the `GetGuildRoles` endpoint.
+type GetGuildRolesResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// the list of roles in the guild.
+	Roles []*RoleWithId `protobuf:"bytes,1,rep,name=roles,proto3" json:"roles,omitempty"`
+}
+
+func (x *GetGuildRolesResponse) Reset() {
+	*x = GetGuildRolesResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_permissions_proto_msgTypes[12]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetGuildRolesResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetGuildRolesResponse) ProtoMessage() {}
+
+func (x *GetGuildRolesResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_permissions_proto_msgTypes[12]
+	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 GetGuildRolesResponse.ProtoReflect.Descriptor instead.
+func (*GetGuildRolesResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_permissions_proto_rawDescGZIP(), []int{12}
+}
+
+func (x *GetGuildRolesResponse) GetRoles() []*RoleWithId {
+	if x != nil {
+		return x.Roles
+	}
+	return nil
+}
+
+// Used in the `AddGuildRole` endpoint.
+type AddGuildRoleRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// the guild ID to add the role to.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// the role name.
+	Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
+	// the role color.
+	Color int32 `protobuf:"varint,3,opt,name=color,proto3" json:"color,omitempty"`
+	// whether the role is hoisted or not.
+	Hoist bool `protobuf:"varint,4,opt,name=hoist,proto3" json:"hoist,omitempty"`
+	// whether the role is mentionable or not.
+	Pingable bool `protobuf:"varint,5,opt,name=pingable,proto3" json:"pingable,omitempty"`
+}
+
+func (x *AddGuildRoleRequest) Reset() {
+	*x = AddGuildRoleRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_permissions_proto_msgTypes[13]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *AddGuildRoleRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*AddGuildRoleRequest) ProtoMessage() {}
+
+func (x *AddGuildRoleRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_permissions_proto_msgTypes[13]
+	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 AddGuildRoleRequest.ProtoReflect.Descriptor instead.
+func (*AddGuildRoleRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_permissions_proto_rawDescGZIP(), []int{13}
+}
+
+func (x *AddGuildRoleRequest) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *AddGuildRoleRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *AddGuildRoleRequest) GetColor() int32 {
+	if x != nil {
+		return x.Color
+	}
+	return 0
+}
+
+func (x *AddGuildRoleRequest) GetHoist() bool {
+	if x != nil {
+		return x.Hoist
+	}
+	return false
+}
+
+func (x *AddGuildRoleRequest) GetPingable() bool {
+	if x != nil {
+		return x.Pingable
+	}
+	return false
+}
+
+// Used in the `AddGuildRole` endpoint.
+type AddGuildRoleResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// the ID of the newly created role.
+	RoleId uint64 `protobuf:"varint,1,opt,name=role_id,json=roleId,proto3" json:"role_id,omitempty"`
+}
+
+func (x *AddGuildRoleResponse) Reset() {
+	*x = AddGuildRoleResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_permissions_proto_msgTypes[14]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *AddGuildRoleResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*AddGuildRoleResponse) ProtoMessage() {}
+
+func (x *AddGuildRoleResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_permissions_proto_msgTypes[14]
+	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 AddGuildRoleResponse.ProtoReflect.Descriptor instead.
+func (*AddGuildRoleResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_permissions_proto_rawDescGZIP(), []int{14}
+}
+
+func (x *AddGuildRoleResponse) GetRoleId() uint64 {
+	if x != nil {
+		return x.RoleId
+	}
+	return 0
+}
+
+// Used in the `DeleteGuildRole` endpoint.
+type DeleteGuildRoleRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// the guild ID to delete the role from.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// the role ID to delete.
+	RoleId uint64 `protobuf:"varint,2,opt,name=role_id,json=roleId,proto3" json:"role_id,omitempty"`
+}
+
+func (x *DeleteGuildRoleRequest) Reset() {
+	*x = DeleteGuildRoleRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_permissions_proto_msgTypes[15]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DeleteGuildRoleRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeleteGuildRoleRequest) ProtoMessage() {}
+
+func (x *DeleteGuildRoleRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_permissions_proto_msgTypes[15]
+	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 DeleteGuildRoleRequest.ProtoReflect.Descriptor instead.
+func (*DeleteGuildRoleRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_permissions_proto_rawDescGZIP(), []int{15}
+}
+
+func (x *DeleteGuildRoleRequest) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *DeleteGuildRoleRequest) GetRoleId() uint64 {
+	if x != nil {
+		return x.RoleId
+	}
+	return 0
+}
+
+// Used in the `DeleteGuildRole` endpoint.
+type DeleteGuildRoleResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *DeleteGuildRoleResponse) Reset() {
+	*x = DeleteGuildRoleResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_permissions_proto_msgTypes[16]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DeleteGuildRoleResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeleteGuildRoleResponse) ProtoMessage() {}
+
+func (x *DeleteGuildRoleResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_permissions_proto_msgTypes[16]
+	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 DeleteGuildRoleResponse.ProtoReflect.Descriptor instead.
+func (*DeleteGuildRoleResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_permissions_proto_rawDescGZIP(), []int{16}
+}
+
+// Used in the `ModifyGuildRole` endpoint.
+type ModifyGuildRoleRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// the ID of the guild where the role is located
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// the ID of the role to modify
+	RoleId uint64 `protobuf:"varint,2,opt,name=role_id,json=roleId,proto3" json:"role_id,omitempty"`
+	// the new name of the role
+	NewName *string `protobuf:"bytes,3,opt,name=new_name,json=newName,proto3,oneof" json:"new_name,omitempty"`
+	// the new color of the role
+	NewColor *int32 `protobuf:"varint,4,opt,name=new_color,json=newColor,proto3,oneof" json:"new_color,omitempty"`
+	// the new hoist status of the role
+	NewHoist *bool `protobuf:"varint,5,opt,name=new_hoist,json=newHoist,proto3,oneof" json:"new_hoist,omitempty"`
+	// the new pingable status of the role
+	NewPingable *bool `protobuf:"varint,6,opt,name=new_pingable,json=newPingable,proto3,oneof" json:"new_pingable,omitempty"`
+}
+
+func (x *ModifyGuildRoleRequest) Reset() {
+	*x = ModifyGuildRoleRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_permissions_proto_msgTypes[17]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ModifyGuildRoleRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ModifyGuildRoleRequest) ProtoMessage() {}
+
+func (x *ModifyGuildRoleRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_permissions_proto_msgTypes[17]
+	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 ModifyGuildRoleRequest.ProtoReflect.Descriptor instead.
+func (*ModifyGuildRoleRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_permissions_proto_rawDescGZIP(), []int{17}
+}
+
+func (x *ModifyGuildRoleRequest) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *ModifyGuildRoleRequest) GetRoleId() uint64 {
+	if x != nil {
+		return x.RoleId
+	}
+	return 0
+}
+
+func (x *ModifyGuildRoleRequest) GetNewName() string {
+	if x != nil && x.NewName != nil {
+		return *x.NewName
+	}
+	return ""
+}
+
+func (x *ModifyGuildRoleRequest) GetNewColor() int32 {
+	if x != nil && x.NewColor != nil {
+		return *x.NewColor
+	}
+	return 0
+}
+
+func (x *ModifyGuildRoleRequest) GetNewHoist() bool {
+	if x != nil && x.NewHoist != nil {
+		return *x.NewHoist
+	}
+	return false
+}
+
+func (x *ModifyGuildRoleRequest) GetNewPingable() bool {
+	if x != nil && x.NewPingable != nil {
+		return *x.NewPingable
+	}
+	return false
+}
+
+// Used in the `ModifyGuildRole` endpoint.
+type ModifyGuildRoleResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *ModifyGuildRoleResponse) Reset() {
+	*x = ModifyGuildRoleResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_permissions_proto_msgTypes[18]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ModifyGuildRoleResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ModifyGuildRoleResponse) ProtoMessage() {}
+
+func (x *ModifyGuildRoleResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_permissions_proto_msgTypes[18]
+	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 ModifyGuildRoleResponse.ProtoReflect.Descriptor instead.
+func (*ModifyGuildRoleResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_permissions_proto_rawDescGZIP(), []int{18}
+}
+
+// Used in the `ManageUserRoles` endpoint.
+type ManageUserRolesRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// the ID of the guild where the user is being managed
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// the ID of the user to modify
+	UserId uint64 `protobuf:"varint,2,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
+	// the IDs of the roles to add
+	GiveRoleIds []uint64 `protobuf:"varint,3,rep,packed,name=give_role_ids,json=giveRoleIds,proto3" json:"give_role_ids,omitempty"`
+	// the IDs of the roles to remove
+	TakeRoleIds []uint64 `protobuf:"varint,4,rep,packed,name=take_role_ids,json=takeRoleIds,proto3" json:"take_role_ids,omitempty"`
+}
+
+func (x *ManageUserRolesRequest) Reset() {
+	*x = ManageUserRolesRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_permissions_proto_msgTypes[19]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ManageUserRolesRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ManageUserRolesRequest) ProtoMessage() {}
+
+func (x *ManageUserRolesRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_permissions_proto_msgTypes[19]
+	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 ManageUserRolesRequest.ProtoReflect.Descriptor instead.
+func (*ManageUserRolesRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_permissions_proto_rawDescGZIP(), []int{19}
+}
+
+func (x *ManageUserRolesRequest) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *ManageUserRolesRequest) GetUserId() uint64 {
+	if x != nil {
+		return x.UserId
+	}
+	return 0
+}
+
+func (x *ManageUserRolesRequest) GetGiveRoleIds() []uint64 {
+	if x != nil {
+		return x.GiveRoleIds
+	}
+	return nil
+}
+
+func (x *ManageUserRolesRequest) GetTakeRoleIds() []uint64 {
+	if x != nil {
+		return x.TakeRoleIds
+	}
+	return nil
+}
+
+// Used in the `ManageUserRoles` endpoint.
+type ManageUserRolesResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *ManageUserRolesResponse) Reset() {
+	*x = ManageUserRolesResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_permissions_proto_msgTypes[20]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ManageUserRolesResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ManageUserRolesResponse) ProtoMessage() {}
+
+func (x *ManageUserRolesResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_permissions_proto_msgTypes[20]
+	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 ManageUserRolesResponse.ProtoReflect.Descriptor instead.
+func (*ManageUserRolesResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_permissions_proto_rawDescGZIP(), []int{20}
+}
+
+// Used in the `GetUserRoles` endpoint.
+type GetUserRolesRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// the ID of the guild where the user is located
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// the ID of the user to get roles for
+	UserId uint64 `protobuf:"varint,2,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
+}
+
+func (x *GetUserRolesRequest) Reset() {
+	*x = GetUserRolesRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_permissions_proto_msgTypes[21]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetUserRolesRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetUserRolesRequest) ProtoMessage() {}
+
+func (x *GetUserRolesRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_permissions_proto_msgTypes[21]
+	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 GetUserRolesRequest.ProtoReflect.Descriptor instead.
+func (*GetUserRolesRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_permissions_proto_rawDescGZIP(), []int{21}
+}
+
+func (x *GetUserRolesRequest) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *GetUserRolesRequest) GetUserId() uint64 {
+	if x != nil {
+		return x.UserId
+	}
+	return 0
+}
+
+// Used in the `GetUserRoles` endpoint.
+type GetUserRolesResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// a list of IDs of the roles the user has
+	Roles []uint64 `protobuf:"varint,1,rep,packed,name=roles,proto3" json:"roles,omitempty"`
+}
+
+func (x *GetUserRolesResponse) Reset() {
+	*x = GetUserRolesResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_permissions_proto_msgTypes[22]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetUserRolesResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetUserRolesResponse) ProtoMessage() {}
+
+func (x *GetUserRolesResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_permissions_proto_msgTypes[22]
+	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 GetUserRolesResponse.ProtoReflect.Descriptor instead.
+func (*GetUserRolesResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_permissions_proto_rawDescGZIP(), []int{22}
+}
+
+func (x *GetUserRolesResponse) GetRoles() []uint64 {
+	if x != nil {
+		return x.Roles
+	}
+	return nil
+}
+
+var File_chat_v1_permissions_proto protoreflect.FileDescriptor
+
+var file_chat_v1_permissions_proto_rawDesc = []byte{
+	0x0a, 0x19, 0x63, 0x68, 0x61, 0x74, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73,
+	0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x10, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x1a, 0x1b, 0x68,
+	0x61, 0x72, 0x6d, 0x6f, 0x6e, 0x79, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x74,
+	0x79, 0x70, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x36, 0x0a, 0x0a, 0x50, 0x65,
+	0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x61, 0x74, 0x63,
+	0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68,
+	0x65, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02,
+	0x6f, 0x6b, 0x22, 0x62, 0x0a, 0x04, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,
+	0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14,
+	0x0a, 0x05, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63,
+	0x6f, 0x6c, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x68, 0x6f, 0x69, 0x73, 0x74, 0x18, 0x03, 0x20,
+	0x01, 0x28, 0x08, 0x52, 0x05, 0x68, 0x6f, 0x69, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x69,
+	0x6e, 0x67, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x70, 0x69,
+	0x6e, 0x67, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x51, 0x0a, 0x0a, 0x52, 0x6f, 0x6c, 0x65, 0x57, 0x69,
+	0x74, 0x68, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x72, 0x6f, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x2a, 0x0a,
+	0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52,
+	0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0xa2, 0x01, 0x0a, 0x19, 0x51, 0x75,
+	0x65, 0x72, 0x79, 0x48, 0x61, 0x73, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64,
+	0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64,
+	0x49, 0x64, 0x12, 0x22, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65,
+	0x6c, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x13, 0x0a, 0x02, 0x61, 0x73, 0x18, 0x04, 0x20, 0x01,
+	0x28, 0x04, 0x48, 0x01, 0x52, 0x02, 0x61, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x09, 0x63,
+	0x68, 0x65, 0x63, 0x6b, 0x5f, 0x66, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,
+	0x63, 0x68, 0x65, 0x63, 0x6b, 0x46, 0x6f, 0x72, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x68, 0x61,
+	0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x61, 0x73, 0x22, 0x2c,
+	0x0a, 0x1a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x48, 0x61, 0x73, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73,
+	0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02,
+	0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x22, 0xc0, 0x01, 0x0a,
+	0x15, 0x53, 0x65, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f,
+	0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49,
+	0x64, 0x12, 0x22, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c,
+	0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x69, 0x64,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x72, 0x6f, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x40,
+	0x0a, 0x0d, 0x70, 0x65, 0x72, 0x6d, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x67, 0x69, 0x76, 0x65, 0x18,
+	0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c,
+	0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73,
+	0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x73, 0x54, 0x6f, 0x47, 0x69, 0x76, 0x65,
+	0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x22,
+	0x18, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e,
+	0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7e, 0x0a, 0x15, 0x47, 0x65, 0x74,
+	0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x22, 0x0a,
+	0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x04, 0x48, 0x00, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x88, 0x01,
+	0x01, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01,
+	0x28, 0x04, 0x52, 0x06, 0x72, 0x6f, 0x6c, 0x65, 0x49, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63,
+	0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x22, 0x4c, 0x0a, 0x16, 0x47, 0x65, 0x74,
+	0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x05, 0x70, 0x65, 0x72, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03,
+	0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68,
+	0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e,
+	0x52, 0x05, 0x70, 0x65, 0x72, 0x6d, 0x73, 0x22, 0x90, 0x01, 0x0a, 0x0f, 0x4d, 0x6f, 0x76, 0x65,
+	0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67,
+	0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67,
+	0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x69,
+	0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x72, 0x6f, 0x6c, 0x65, 0x49, 0x64, 0x12,
+	0x49, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c,
+	0x2e, 0x68, 0x61, 0x72, 0x6d, 0x6f, 0x6e, 0x79, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x76, 0x31,
+	0x2e, 0x49, 0x74, 0x65, 0x6d, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x6e,
+	0x65, 0x77, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x12, 0x0a, 0x10, 0x4d, 0x6f,
+	0x76, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x31,
+	0x0a, 0x14, 0x47, 0x65, 0x74, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f,
+	0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49,
+	0x64, 0x22, 0x4b, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x6f, 0x6c,
+	0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x05, 0x72, 0x6f,
+	0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x6c,
+	0x65, 0x57, 0x69, 0x74, 0x68, 0x49, 0x64, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0x8c,
+	0x01, 0x0a, 0x13, 0x41, 0x64, 0x64, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x6f, 0x6c, 0x65, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f,
+	0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49,
+	0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x18, 0x03,
+	0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x68,
+	0x6f, 0x69, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x68, 0x6f, 0x69, 0x73,
+	0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x69, 0x6e, 0x67, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x05, 0x20,
+	0x01, 0x28, 0x08, 0x52, 0x08, 0x70, 0x69, 0x6e, 0x67, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x2f, 0x0a,
+	0x14, 0x41, 0x64, 0x64, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x69, 0x64,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x72, 0x6f, 0x6c, 0x65, 0x49, 0x64, 0x22, 0x4c,
+	0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x6f, 0x6c,
+	0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c,
+	0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c,
+	0x64, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x72, 0x6f, 0x6c, 0x65, 0x49, 0x64, 0x22, 0x19, 0x0a, 0x17,
+	0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x6f, 0x6c, 0x65, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x92, 0x02, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69,
+	0x66, 0x79, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x17, 0x0a,
+	0x07, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06,
+	0x72, 0x6f, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x5f, 0x6e, 0x61,
+	0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x6e, 0x65, 0x77, 0x4e,
+	0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x63, 0x6f,
+	0x6c, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x08, 0x6e, 0x65, 0x77,
+	0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x5f,
+	0x68, 0x6f, 0x69, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x08, 0x6e,
+	0x65, 0x77, 0x48, 0x6f, 0x69, 0x73, 0x74, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x6e, 0x65,
+	0x77, 0x5f, 0x70, 0x69, 0x6e, 0x67, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08,
+	0x48, 0x03, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x50, 0x69, 0x6e, 0x67, 0x61, 0x62, 0x6c, 0x65, 0x88,
+	0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42,
+	0x0c, 0x0a, 0x0a, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x42, 0x0c, 0x0a,
+	0x0a, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x68, 0x6f, 0x69, 0x73, 0x74, 0x42, 0x0f, 0x0a, 0x0d, 0x5f,
+	0x6e, 0x65, 0x77, 0x5f, 0x70, 0x69, 0x6e, 0x67, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x19, 0x0a, 0x17,
+	0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x6f, 0x6c, 0x65, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x94, 0x01, 0x0a, 0x16, 0x4d, 0x61, 0x6e, 0x61,
+	0x67, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x17, 0x0a,
+	0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06,
+	0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0d, 0x67, 0x69, 0x76, 0x65, 0x5f, 0x72,
+	0x6f, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x04, 0x52, 0x0b, 0x67,
+	0x69, 0x76, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x64, 0x73, 0x12, 0x22, 0x0a, 0x0d, 0x74, 0x61,
+	0x6b, 0x65, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28,
+	0x04, 0x52, 0x0b, 0x74, 0x61, 0x6b, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x64, 0x73, 0x22, 0x19,
+	0x0a, 0x17, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65,
+	0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x49, 0x0a, 0x13, 0x47, 0x65, 0x74,
+	0x55, 0x73, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x75,
+	0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x73,
+	0x65, 0x72, 0x49, 0x64, 0x22, 0x2c, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52,
+	0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05,
+	0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x04, 0x52, 0x05, 0x72, 0x6f, 0x6c,
+	0x65, 0x73, 0x42, 0xc6, 0x01, 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x42, 0x10, 0x50, 0x65, 0x72,
+	0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a,
+	0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x72, 0x6d,
+	0x6f, 0x6e, 0x79, 0x2d, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x2f,
+	0x73, 0x68, 0x69, 0x62, 0x73, 0x68, 0x69, 0x62, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x63, 0x68, 0x61,
+	0x74, 0x2f, 0x76, 0x31, 0x3b, 0x63, 0x68, 0x61, 0x74, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x50, 0x43,
+	0x58, 0xaa, 0x02, 0x10, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61,
+	0x74, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x10, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5c,
+	0x43, 0x68, 0x61, 0x74, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x1c, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63,
+	0x6f, 0x6c, 0x5c, 0x43, 0x68, 0x61, 0x74, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65,
+	0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x12, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f,
+	0x6c, 0x3a, 0x3a, 0x43, 0x68, 0x61, 0x74, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x33,
+}
+
+var (
+	file_chat_v1_permissions_proto_rawDescOnce sync.Once
+	file_chat_v1_permissions_proto_rawDescData = file_chat_v1_permissions_proto_rawDesc
+)
+
+func file_chat_v1_permissions_proto_rawDescGZIP() []byte {
+	file_chat_v1_permissions_proto_rawDescOnce.Do(func() {
+		file_chat_v1_permissions_proto_rawDescData = protoimpl.X.CompressGZIP(file_chat_v1_permissions_proto_rawDescData)
+	})
+	return file_chat_v1_permissions_proto_rawDescData
+}
+
+var file_chat_v1_permissions_proto_msgTypes = make([]protoimpl.MessageInfo, 23)
+var file_chat_v1_permissions_proto_goTypes = []interface{}{
+	(*Permission)(nil),                 // 0: protocol.chat.v1.Permission
+	(*Role)(nil),                       // 1: protocol.chat.v1.Role
+	(*RoleWithId)(nil),                 // 2: protocol.chat.v1.RoleWithId
+	(*QueryHasPermissionRequest)(nil),  // 3: protocol.chat.v1.QueryHasPermissionRequest
+	(*QueryHasPermissionResponse)(nil), // 4: protocol.chat.v1.QueryHasPermissionResponse
+	(*SetPermissionsRequest)(nil),      // 5: protocol.chat.v1.SetPermissionsRequest
+	(*SetPermissionsResponse)(nil),     // 6: protocol.chat.v1.SetPermissionsResponse
+	(*GetPermissionsRequest)(nil),      // 7: protocol.chat.v1.GetPermissionsRequest
+	(*GetPermissionsResponse)(nil),     // 8: protocol.chat.v1.GetPermissionsResponse
+	(*MoveRoleRequest)(nil),            // 9: protocol.chat.v1.MoveRoleRequest
+	(*MoveRoleResponse)(nil),           // 10: protocol.chat.v1.MoveRoleResponse
+	(*GetGuildRolesRequest)(nil),       // 11: protocol.chat.v1.GetGuildRolesRequest
+	(*GetGuildRolesResponse)(nil),      // 12: protocol.chat.v1.GetGuildRolesResponse
+	(*AddGuildRoleRequest)(nil),        // 13: protocol.chat.v1.AddGuildRoleRequest
+	(*AddGuildRoleResponse)(nil),       // 14: protocol.chat.v1.AddGuildRoleResponse
+	(*DeleteGuildRoleRequest)(nil),     // 15: protocol.chat.v1.DeleteGuildRoleRequest
+	(*DeleteGuildRoleResponse)(nil),    // 16: protocol.chat.v1.DeleteGuildRoleResponse
+	(*ModifyGuildRoleRequest)(nil),     // 17: protocol.chat.v1.ModifyGuildRoleRequest
+	(*ModifyGuildRoleResponse)(nil),    // 18: protocol.chat.v1.ModifyGuildRoleResponse
+	(*ManageUserRolesRequest)(nil),     // 19: protocol.chat.v1.ManageUserRolesRequest
+	(*ManageUserRolesResponse)(nil),    // 20: protocol.chat.v1.ManageUserRolesResponse
+	(*GetUserRolesRequest)(nil),        // 21: protocol.chat.v1.GetUserRolesRequest
+	(*GetUserRolesResponse)(nil),       // 22: protocol.chat.v1.GetUserRolesResponse
+	(*v1.ItemPosition)(nil),            // 23: protocol.harmonytypes.v1.ItemPosition
+}
+var file_chat_v1_permissions_proto_depIdxs = []int32{
+	1,  // 0: protocol.chat.v1.RoleWithId.role:type_name -> protocol.chat.v1.Role
+	0,  // 1: protocol.chat.v1.SetPermissionsRequest.perms_to_give:type_name -> protocol.chat.v1.Permission
+	0,  // 2: protocol.chat.v1.GetPermissionsResponse.perms:type_name -> protocol.chat.v1.Permission
+	23, // 3: protocol.chat.v1.MoveRoleRequest.new_position:type_name -> protocol.harmonytypes.v1.ItemPosition
+	2,  // 4: protocol.chat.v1.GetGuildRolesResponse.roles:type_name -> protocol.chat.v1.RoleWithId
+	5,  // [5:5] is the sub-list for method output_type
+	5,  // [5:5] is the sub-list for method input_type
+	5,  // [5:5] is the sub-list for extension type_name
+	5,  // [5:5] is the sub-list for extension extendee
+	0,  // [0:5] is the sub-list for field type_name
+}
+
+func init() { file_chat_v1_permissions_proto_init() }
+func file_chat_v1_permissions_proto_init() {
+	if File_chat_v1_permissions_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_chat_v1_permissions_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Permission); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_permissions_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Role); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_permissions_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*RoleWithId); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_permissions_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*QueryHasPermissionRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_permissions_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*QueryHasPermissionResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_permissions_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SetPermissionsRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_permissions_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SetPermissionsResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_permissions_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetPermissionsRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_permissions_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetPermissionsResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_permissions_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*MoveRoleRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_permissions_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*MoveRoleResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_permissions_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetGuildRolesRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_permissions_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetGuildRolesResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_permissions_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*AddGuildRoleRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_permissions_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*AddGuildRoleResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_permissions_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DeleteGuildRoleRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_permissions_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DeleteGuildRoleResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_permissions_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ModifyGuildRoleRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_permissions_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ModifyGuildRoleResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_permissions_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ManageUserRolesRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_permissions_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ManageUserRolesResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_permissions_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetUserRolesRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_permissions_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetUserRolesResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	file_chat_v1_permissions_proto_msgTypes[3].OneofWrappers = []interface{}{}
+	file_chat_v1_permissions_proto_msgTypes[5].OneofWrappers = []interface{}{}
+	file_chat_v1_permissions_proto_msgTypes[7].OneofWrappers = []interface{}{}
+	file_chat_v1_permissions_proto_msgTypes[17].OneofWrappers = []interface{}{}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_chat_v1_permissions_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   23,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_chat_v1_permissions_proto_goTypes,
+		DependencyIndexes: file_chat_v1_permissions_proto_depIdxs,
+		MessageInfos:      file_chat_v1_permissions_proto_msgTypes,
+	}.Build()
+	File_chat_v1_permissions_proto = out.File
+	file_chat_v1_permissions_proto_rawDesc = nil
+	file_chat_v1_permissions_proto_goTypes = nil
+	file_chat_v1_permissions_proto_depIdxs = nil
+}
diff --git a/vendor/github.com/harmony-development/shibshib/gen/chat/v1/stream.pb.go b/vendor/github.com/harmony-development/shibshib/gen/chat/v1/stream.pb.go
new file mode 100644
index 00000000..8ff28f1a
--- /dev/null
+++ b/vendor/github.com/harmony-development/shibshib/gen/chat/v1/stream.pb.go
@@ -0,0 +1,4081 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.23.0
+// 	protoc        v3.17.3
+// source: chat/v1/stream.proto
+
+package chatv1
+
+import (
+	proto "github.com/golang/protobuf/proto"
+	v1 "github.com/harmony-development/shibshib/gen/emote/v1"
+	v12 "github.com/harmony-development/shibshib/gen/harmonytypes/v1"
+	v11 "github.com/harmony-development/shibshib/gen/profile/v1"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
+
+// Request type for use in the `StreamEvents` endpoint.
+type StreamEventsRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Describes which event source to subscribe to.
+	//
+	// Types that are assignable to Request:
+	//	*StreamEventsRequest_SubscribeToGuild_
+	//	*StreamEventsRequest_SubscribeToActions_
+	//	*StreamEventsRequest_SubscribeToHomeserverEvents_
+	Request isStreamEventsRequest_Request `protobuf_oneof:"request"`
+}
+
+func (x *StreamEventsRequest) Reset() {
+	*x = StreamEventsRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_stream_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamEventsRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamEventsRequest) ProtoMessage() {}
+
+func (x *StreamEventsRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_stream_proto_msgTypes[0]
+	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 StreamEventsRequest.ProtoReflect.Descriptor instead.
+func (*StreamEventsRequest) Descriptor() ([]byte, []int) {
+	return file_chat_v1_stream_proto_rawDescGZIP(), []int{0}
+}
+
+func (m *StreamEventsRequest) GetRequest() isStreamEventsRequest_Request {
+	if m != nil {
+		return m.Request
+	}
+	return nil
+}
+
+func (x *StreamEventsRequest) GetSubscribeToGuild() *StreamEventsRequest_SubscribeToGuild {
+	if x, ok := x.GetRequest().(*StreamEventsRequest_SubscribeToGuild_); ok {
+		return x.SubscribeToGuild
+	}
+	return nil
+}
+
+func (x *StreamEventsRequest) GetSubscribeToActions() *StreamEventsRequest_SubscribeToActions {
+	if x, ok := x.GetRequest().(*StreamEventsRequest_SubscribeToActions_); ok {
+		return x.SubscribeToActions
+	}
+	return nil
+}
+
+func (x *StreamEventsRequest) GetSubscribeToHomeserverEvents() *StreamEventsRequest_SubscribeToHomeserverEvents {
+	if x, ok := x.GetRequest().(*StreamEventsRequest_SubscribeToHomeserverEvents_); ok {
+		return x.SubscribeToHomeserverEvents
+	}
+	return nil
+}
+
+type isStreamEventsRequest_Request interface {
+	isStreamEventsRequest_Request()
+}
+
+type StreamEventsRequest_SubscribeToGuild_ struct {
+	// Subscribe to the guild event source.
+	SubscribeToGuild *StreamEventsRequest_SubscribeToGuild `protobuf:"bytes,1,opt,name=subscribe_to_guild,json=subscribeToGuild,proto3,oneof"`
+}
+
+type StreamEventsRequest_SubscribeToActions_ struct {
+	// Subscribe to the action event source.
+	SubscribeToActions *StreamEventsRequest_SubscribeToActions `protobuf:"bytes,2,opt,name=subscribe_to_actions,json=subscribeToActions,proto3,oneof"`
+}
+
+type StreamEventsRequest_SubscribeToHomeserverEvents_ struct {
+	// Subscribe to the homeserver event source.
+	SubscribeToHomeserverEvents *StreamEventsRequest_SubscribeToHomeserverEvents `protobuf:"bytes,3,opt,name=subscribe_to_homeserver_events,json=subscribeToHomeserverEvents,proto3,oneof"`
+}
+
+func (*StreamEventsRequest_SubscribeToGuild_) isStreamEventsRequest_Request() {}
+
+func (*StreamEventsRequest_SubscribeToActions_) isStreamEventsRequest_Request() {}
+
+func (*StreamEventsRequest_SubscribeToHomeserverEvents_) isStreamEventsRequest_Request() {}
+
+// Used in the `StreamEvents` endpoint.
+type StreamEventsResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Possible events.
+	//
+	// Types that are assignable to Event:
+	//	*StreamEventsResponse_Chat
+	//	*StreamEventsResponse_Emote
+	//	*StreamEventsResponse_Profile
+	Event isStreamEventsResponse_Event `protobuf_oneof:"event"`
+}
+
+func (x *StreamEventsResponse) Reset() {
+	*x = StreamEventsResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_stream_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamEventsResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamEventsResponse) ProtoMessage() {}
+
+func (x *StreamEventsResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_stream_proto_msgTypes[1]
+	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 StreamEventsResponse.ProtoReflect.Descriptor instead.
+func (*StreamEventsResponse) Descriptor() ([]byte, []int) {
+	return file_chat_v1_stream_proto_rawDescGZIP(), []int{1}
+}
+
+func (m *StreamEventsResponse) GetEvent() isStreamEventsResponse_Event {
+	if m != nil {
+		return m.Event
+	}
+	return nil
+}
+
+func (x *StreamEventsResponse) GetChat() *StreamEvent {
+	if x, ok := x.GetEvent().(*StreamEventsResponse_Chat); ok {
+		return x.Chat
+	}
+	return nil
+}
+
+func (x *StreamEventsResponse) GetEmote() *v1.StreamEvent {
+	if x, ok := x.GetEvent().(*StreamEventsResponse_Emote); ok {
+		return x.Emote
+	}
+	return nil
+}
+
+func (x *StreamEventsResponse) GetProfile() *v11.StreamEvent {
+	if x, ok := x.GetEvent().(*StreamEventsResponse_Profile); ok {
+		return x.Profile
+	}
+	return nil
+}
+
+type isStreamEventsResponse_Event interface {
+	isStreamEventsResponse_Event()
+}
+
+type StreamEventsResponse_Chat struct {
+	// A chat event.
+	Chat *StreamEvent `protobuf:"bytes,1,opt,name=chat,proto3,oneof"`
+}
+
+type StreamEventsResponse_Emote struct {
+	// A emote event.
+	Emote *v1.StreamEvent `protobuf:"bytes,2,opt,name=emote,proto3,oneof"`
+}
+
+type StreamEventsResponse_Profile struct {
+	// A profile event.
+	Profile *v11.StreamEvent `protobuf:"bytes,3,opt,name=profile,proto3,oneof"`
+}
+
+func (*StreamEventsResponse_Chat) isStreamEventsResponse_Event() {}
+
+func (*StreamEventsResponse_Emote) isStreamEventsResponse_Event() {}
+
+func (*StreamEventsResponse_Profile) isStreamEventsResponse_Event() {}
+
+// Describes an event.
+type StreamEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Which event to send.
+	//
+	// Types that are assignable to Event:
+	//	*StreamEvent_GuildAddedToList_
+	//	*StreamEvent_GuildRemovedFromList_
+	//	*StreamEvent_ActionPerformed_
+	//	*StreamEvent_SentMessage
+	//	*StreamEvent_EditedMessage
+	//	*StreamEvent_DeletedMessage
+	//	*StreamEvent_CreatedChannel
+	//	*StreamEvent_EditedChannel
+	//	*StreamEvent_DeletedChannel
+	//	*StreamEvent_EditedGuild
+	//	*StreamEvent_DeletedGuild
+	//	*StreamEvent_JoinedMember
+	//	*StreamEvent_LeftMember
+	//	*StreamEvent_Typing_
+	//	*StreamEvent_RoleCreated_
+	//	*StreamEvent_RoleDeleted_
+	//	*StreamEvent_RoleMoved_
+	//	*StreamEvent_RoleUpdated_
+	//	*StreamEvent_RolePermsUpdated
+	//	*StreamEvent_UserRolesUpdated_
+	//	*StreamEvent_PermissionUpdated_
+	//	*StreamEvent_ChannelsReordered_
+	//	*StreamEvent_EditedChannelPosition
+	//	*StreamEvent_MessagePinned_
+	//	*StreamEvent_MessageUnpinned_
+	//	*StreamEvent_ReactionUpdated_
+	//	*StreamEvent_OwnerAdded_
+	//	*StreamEvent_OwnerRemoved_
+	//	*StreamEvent_InviteReceived_
+	//	*StreamEvent_InviteRejected_
+	Event isStreamEvent_Event `protobuf_oneof:"event"`
+}
+
+func (x *StreamEvent) Reset() {
+	*x = StreamEvent{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_stream_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamEvent) ProtoMessage() {}
+
+func (x *StreamEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_stream_proto_msgTypes[2]
+	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 StreamEvent.ProtoReflect.Descriptor instead.
+func (*StreamEvent) Descriptor() ([]byte, []int) {
+	return file_chat_v1_stream_proto_rawDescGZIP(), []int{2}
+}
+
+func (m *StreamEvent) GetEvent() isStreamEvent_Event {
+	if m != nil {
+		return m.Event
+	}
+	return nil
+}
+
+func (x *StreamEvent) GetGuildAddedToList() *StreamEvent_GuildAddedToList {
+	if x, ok := x.GetEvent().(*StreamEvent_GuildAddedToList_); ok {
+		return x.GuildAddedToList
+	}
+	return nil
+}
+
+func (x *StreamEvent) GetGuildRemovedFromList() *StreamEvent_GuildRemovedFromList {
+	if x, ok := x.GetEvent().(*StreamEvent_GuildRemovedFromList_); ok {
+		return x.GuildRemovedFromList
+	}
+	return nil
+}
+
+func (x *StreamEvent) GetActionPerformed() *StreamEvent_ActionPerformed {
+	if x, ok := x.GetEvent().(*StreamEvent_ActionPerformed_); ok {
+		return x.ActionPerformed
+	}
+	return nil
+}
+
+func (x *StreamEvent) GetSentMessage() *StreamEvent_MessageSent {
+	if x, ok := x.GetEvent().(*StreamEvent_SentMessage); ok {
+		return x.SentMessage
+	}
+	return nil
+}
+
+func (x *StreamEvent) GetEditedMessage() *StreamEvent_MessageUpdated {
+	if x, ok := x.GetEvent().(*StreamEvent_EditedMessage); ok {
+		return x.EditedMessage
+	}
+	return nil
+}
+
+func (x *StreamEvent) GetDeletedMessage() *StreamEvent_MessageDeleted {
+	if x, ok := x.GetEvent().(*StreamEvent_DeletedMessage); ok {
+		return x.DeletedMessage
+	}
+	return nil
+}
+
+func (x *StreamEvent) GetCreatedChannel() *StreamEvent_ChannelCreated {
+	if x, ok := x.GetEvent().(*StreamEvent_CreatedChannel); ok {
+		return x.CreatedChannel
+	}
+	return nil
+}
+
+func (x *StreamEvent) GetEditedChannel() *StreamEvent_ChannelUpdated {
+	if x, ok := x.GetEvent().(*StreamEvent_EditedChannel); ok {
+		return x.EditedChannel
+	}
+	return nil
+}
+
+func (x *StreamEvent) GetDeletedChannel() *StreamEvent_ChannelDeleted {
+	if x, ok := x.GetEvent().(*StreamEvent_DeletedChannel); ok {
+		return x.DeletedChannel
+	}
+	return nil
+}
+
+func (x *StreamEvent) GetEditedGuild() *StreamEvent_GuildUpdated {
+	if x, ok := x.GetEvent().(*StreamEvent_EditedGuild); ok {
+		return x.EditedGuild
+	}
+	return nil
+}
+
+func (x *StreamEvent) GetDeletedGuild() *StreamEvent_GuildDeleted {
+	if x, ok := x.GetEvent().(*StreamEvent_DeletedGuild); ok {
+		return x.DeletedGuild
+	}
+	return nil
+}
+
+func (x *StreamEvent) GetJoinedMember() *StreamEvent_MemberJoined {
+	if x, ok := x.GetEvent().(*StreamEvent_JoinedMember); ok {
+		return x.JoinedMember
+	}
+	return nil
+}
+
+func (x *StreamEvent) GetLeftMember() *StreamEvent_MemberLeft {
+	if x, ok := x.GetEvent().(*StreamEvent_LeftMember); ok {
+		return x.LeftMember
+	}
+	return nil
+}
+
+func (x *StreamEvent) GetTyping() *StreamEvent_Typing {
+	if x, ok := x.GetEvent().(*StreamEvent_Typing_); ok {
+		return x.Typing
+	}
+	return nil
+}
+
+func (x *StreamEvent) GetRoleCreated() *StreamEvent_RoleCreated {
+	if x, ok := x.GetEvent().(*StreamEvent_RoleCreated_); ok {
+		return x.RoleCreated
+	}
+	return nil
+}
+
+func (x *StreamEvent) GetRoleDeleted() *StreamEvent_RoleDeleted {
+	if x, ok := x.GetEvent().(*StreamEvent_RoleDeleted_); ok {
+		return x.RoleDeleted
+	}
+	return nil
+}
+
+func (x *StreamEvent) GetRoleMoved() *StreamEvent_RoleMoved {
+	if x, ok := x.GetEvent().(*StreamEvent_RoleMoved_); ok {
+		return x.RoleMoved
+	}
+	return nil
+}
+
+func (x *StreamEvent) GetRoleUpdated() *StreamEvent_RoleUpdated {
+	if x, ok := x.GetEvent().(*StreamEvent_RoleUpdated_); ok {
+		return x.RoleUpdated
+	}
+	return nil
+}
+
+func (x *StreamEvent) GetRolePermsUpdated() *StreamEvent_RolePermissionsUpdated {
+	if x, ok := x.GetEvent().(*StreamEvent_RolePermsUpdated); ok {
+		return x.RolePermsUpdated
+	}
+	return nil
+}
+
+func (x *StreamEvent) GetUserRolesUpdated() *StreamEvent_UserRolesUpdated {
+	if x, ok := x.GetEvent().(*StreamEvent_UserRolesUpdated_); ok {
+		return x.UserRolesUpdated
+	}
+	return nil
+}
+
+func (x *StreamEvent) GetPermissionUpdated() *StreamEvent_PermissionUpdated {
+	if x, ok := x.GetEvent().(*StreamEvent_PermissionUpdated_); ok {
+		return x.PermissionUpdated
+	}
+	return nil
+}
+
+func (x *StreamEvent) GetChannelsReordered() *StreamEvent_ChannelsReordered {
+	if x, ok := x.GetEvent().(*StreamEvent_ChannelsReordered_); ok {
+		return x.ChannelsReordered
+	}
+	return nil
+}
+
+func (x *StreamEvent) GetEditedChannelPosition() *StreamEvent_ChannelPositionUpdated {
+	if x, ok := x.GetEvent().(*StreamEvent_EditedChannelPosition); ok {
+		return x.EditedChannelPosition
+	}
+	return nil
+}
+
+func (x *StreamEvent) GetMessagePinned() *StreamEvent_MessagePinned {
+	if x, ok := x.GetEvent().(*StreamEvent_MessagePinned_); ok {
+		return x.MessagePinned
+	}
+	return nil
+}
+
+func (x *StreamEvent) GetMessageUnpinned() *StreamEvent_MessageUnpinned {
+	if x, ok := x.GetEvent().(*StreamEvent_MessageUnpinned_); ok {
+		return x.MessageUnpinned
+	}
+	return nil
+}
+
+func (x *StreamEvent) GetReactionUpdated() *StreamEvent_ReactionUpdated {
+	if x, ok := x.GetEvent().(*StreamEvent_ReactionUpdated_); ok {
+		return x.ReactionUpdated
+	}
+	return nil
+}
+
+func (x *StreamEvent) GetOwnerAdded() *StreamEvent_OwnerAdded {
+	if x, ok := x.GetEvent().(*StreamEvent_OwnerAdded_); ok {
+		return x.OwnerAdded
+	}
+	return nil
+}
+
+func (x *StreamEvent) GetOwnerRemoved() *StreamEvent_OwnerRemoved {
+	if x, ok := x.GetEvent().(*StreamEvent_OwnerRemoved_); ok {
+		return x.OwnerRemoved
+	}
+	return nil
+}
+
+func (x *StreamEvent) GetInviteReceived() *StreamEvent_InviteReceived {
+	if x, ok := x.GetEvent().(*StreamEvent_InviteReceived_); ok {
+		return x.InviteReceived
+	}
+	return nil
+}
+
+func (x *StreamEvent) GetInviteRejected() *StreamEvent_InviteRejected {
+	if x, ok := x.GetEvent().(*StreamEvent_InviteRejected_); ok {
+		return x.InviteRejected
+	}
+	return nil
+}
+
+type isStreamEvent_Event interface {
+	isStreamEvent_Event()
+}
+
+type StreamEvent_GuildAddedToList_ struct {
+	// Send the guild added to list event.
+	GuildAddedToList *StreamEvent_GuildAddedToList `protobuf:"bytes,1,opt,name=guild_added_to_list,json=guildAddedToList,proto3,oneof"`
+}
+
+type StreamEvent_GuildRemovedFromList_ struct {
+	// Send the guild removed from list event.
+	GuildRemovedFromList *StreamEvent_GuildRemovedFromList `protobuf:"bytes,2,opt,name=guild_removed_from_list,json=guildRemovedFromList,proto3,oneof"`
+}
+
+type StreamEvent_ActionPerformed_ struct {
+	// Send the action performed event.
+	ActionPerformed *StreamEvent_ActionPerformed `protobuf:"bytes,3,opt,name=action_performed,json=actionPerformed,proto3,oneof"`
+}
+
+type StreamEvent_SentMessage struct {
+	// Send the message sent event.
+	SentMessage *StreamEvent_MessageSent `protobuf:"bytes,4,opt,name=sent_message,json=sentMessage,proto3,oneof"`
+}
+
+type StreamEvent_EditedMessage struct {
+	// Send the message updated event.
+	EditedMessage *StreamEvent_MessageUpdated `protobuf:"bytes,5,opt,name=edited_message,json=editedMessage,proto3,oneof"`
+}
+
+type StreamEvent_DeletedMessage struct {
+	// Send the message deleted event.
+	DeletedMessage *StreamEvent_MessageDeleted `protobuf:"bytes,6,opt,name=deleted_message,json=deletedMessage,proto3,oneof"`
+}
+
+type StreamEvent_CreatedChannel struct {
+	// Send the channel created event.
+	CreatedChannel *StreamEvent_ChannelCreated `protobuf:"bytes,7,opt,name=created_channel,json=createdChannel,proto3,oneof"`
+}
+
+type StreamEvent_EditedChannel struct {
+	// Send the channel updated event.
+	EditedChannel *StreamEvent_ChannelUpdated `protobuf:"bytes,8,opt,name=edited_channel,json=editedChannel,proto3,oneof"`
+}
+
+type StreamEvent_DeletedChannel struct {
+	// Send the channel deleted event.
+	DeletedChannel *StreamEvent_ChannelDeleted `protobuf:"bytes,9,opt,name=deleted_channel,json=deletedChannel,proto3,oneof"`
+}
+
+type StreamEvent_EditedGuild struct {
+	// Send the guild updated event.
+	EditedGuild *StreamEvent_GuildUpdated `protobuf:"bytes,10,opt,name=edited_guild,json=editedGuild,proto3,oneof"`
+}
+
+type StreamEvent_DeletedGuild struct {
+	// Send the guild deleted event.
+	DeletedGuild *StreamEvent_GuildDeleted `protobuf:"bytes,11,opt,name=deleted_guild,json=deletedGuild,proto3,oneof"`
+}
+
+type StreamEvent_JoinedMember struct {
+	// Send the member joined event.
+	JoinedMember *StreamEvent_MemberJoined `protobuf:"bytes,12,opt,name=joined_member,json=joinedMember,proto3,oneof"`
+}
+
+type StreamEvent_LeftMember struct {
+	// Send the member left event.
+	LeftMember *StreamEvent_MemberLeft `protobuf:"bytes,13,opt,name=left_member,json=leftMember,proto3,oneof"`
+}
+
+type StreamEvent_Typing_ struct {
+	// Send the typing event.
+	Typing *StreamEvent_Typing `protobuf:"bytes,14,opt,name=typing,proto3,oneof"`
+}
+
+type StreamEvent_RoleCreated_ struct {
+	// Send the role created event.
+	RoleCreated *StreamEvent_RoleCreated `protobuf:"bytes,15,opt,name=role_created,json=roleCreated,proto3,oneof"`
+}
+
+type StreamEvent_RoleDeleted_ struct {
+	// Send the role deleted event.
+	RoleDeleted *StreamEvent_RoleDeleted `protobuf:"bytes,16,opt,name=role_deleted,json=roleDeleted,proto3,oneof"`
+}
+
+type StreamEvent_RoleMoved_ struct {
+	// Send the role moved event.
+	RoleMoved *StreamEvent_RoleMoved `protobuf:"bytes,17,opt,name=role_moved,json=roleMoved,proto3,oneof"`
+}
+
+type StreamEvent_RoleUpdated_ struct {
+	// Send the role updated event.
+	RoleUpdated *StreamEvent_RoleUpdated `protobuf:"bytes,18,opt,name=role_updated,json=roleUpdated,proto3,oneof"`
+}
+
+type StreamEvent_RolePermsUpdated struct {
+	// Send the role perms updated event.
+	RolePermsUpdated *StreamEvent_RolePermissionsUpdated `protobuf:"bytes,19,opt,name=role_perms_updated,json=rolePermsUpdated,proto3,oneof"`
+}
+
+type StreamEvent_UserRolesUpdated_ struct {
+	// Send the user roles updated event.
+	UserRolesUpdated *StreamEvent_UserRolesUpdated `protobuf:"bytes,20,opt,name=user_roles_updated,json=userRolesUpdated,proto3,oneof"`
+}
+
+type StreamEvent_PermissionUpdated_ struct {
+	// Send the permission updated event.
+	PermissionUpdated *StreamEvent_PermissionUpdated `protobuf:"bytes,21,opt,name=permission_updated,json=permissionUpdated,proto3,oneof"`
+}
+
+type StreamEvent_ChannelsReordered_ struct {
+	// The channels have been completely reordered.
+	ChannelsReordered *StreamEvent_ChannelsReordered `protobuf:"bytes,22,opt,name=channels_reordered,json=channelsReordered,proto3,oneof"`
+}
+
+type StreamEvent_EditedChannelPosition struct {
+	// Send the channel position updated event.
+	EditedChannelPosition *StreamEvent_ChannelPositionUpdated `protobuf:"bytes,23,opt,name=edited_channel_position,json=editedChannelPosition,proto3,oneof"`
+}
+
+type StreamEvent_MessagePinned_ struct {
+	// Send the message pinned event.
+	MessagePinned *StreamEvent_MessagePinned `protobuf:"bytes,24,opt,name=message_pinned,json=messagePinned,proto3,oneof"`
+}
+
+type StreamEvent_MessageUnpinned_ struct {
+	// Send the message unpinned event.
+	MessageUnpinned *StreamEvent_MessageUnpinned `protobuf:"bytes,25,opt,name=message_unpinned,json=messageUnpinned,proto3,oneof"`
+}
+
+type StreamEvent_ReactionUpdated_ struct {
+	// Send the reaction updated event.
+	ReactionUpdated *StreamEvent_ReactionUpdated `protobuf:"bytes,26,opt,name=reaction_updated,json=reactionUpdated,proto3,oneof"`
+}
+
+type StreamEvent_OwnerAdded_ struct {
+	// Send the owner added event.
+	OwnerAdded *StreamEvent_OwnerAdded `protobuf:"bytes,27,opt,name=owner_added,json=ownerAdded,proto3,oneof"`
+}
+
+type StreamEvent_OwnerRemoved_ struct {
+	// Send the owner removed event.
+	OwnerRemoved *StreamEvent_OwnerRemoved `protobuf:"bytes,28,opt,name=owner_removed,json=ownerRemoved,proto3,oneof"`
+}
+
+type StreamEvent_InviteReceived_ struct {
+	// Send the guild invite received event.
+	InviteReceived *StreamEvent_InviteReceived `protobuf:"bytes,29,opt,name=invite_received,json=inviteReceived,proto3,oneof"`
+}
+
+type StreamEvent_InviteRejected_ struct {
+	// Send the guild invite rejected event.
+	InviteRejected *StreamEvent_InviteRejected `protobuf:"bytes,30,opt,name=invite_rejected,json=inviteRejected,proto3,oneof"`
+}
+
+func (*StreamEvent_GuildAddedToList_) isStreamEvent_Event() {}
+
+func (*StreamEvent_GuildRemovedFromList_) isStreamEvent_Event() {}
+
+func (*StreamEvent_ActionPerformed_) isStreamEvent_Event() {}
+
+func (*StreamEvent_SentMessage) isStreamEvent_Event() {}
+
+func (*StreamEvent_EditedMessage) isStreamEvent_Event() {}
+
+func (*StreamEvent_DeletedMessage) isStreamEvent_Event() {}
+
+func (*StreamEvent_CreatedChannel) isStreamEvent_Event() {}
+
+func (*StreamEvent_EditedChannel) isStreamEvent_Event() {}
+
+func (*StreamEvent_DeletedChannel) isStreamEvent_Event() {}
+
+func (*StreamEvent_EditedGuild) isStreamEvent_Event() {}
+
+func (*StreamEvent_DeletedGuild) isStreamEvent_Event() {}
+
+func (*StreamEvent_JoinedMember) isStreamEvent_Event() {}
+
+func (*StreamEvent_LeftMember) isStreamEvent_Event() {}
+
+func (*StreamEvent_Typing_) isStreamEvent_Event() {}
+
+func (*StreamEvent_RoleCreated_) isStreamEvent_Event() {}
+
+func (*StreamEvent_RoleDeleted_) isStreamEvent_Event() {}
+
+func (*StreamEvent_RoleMoved_) isStreamEvent_Event() {}
+
+func (*StreamEvent_RoleUpdated_) isStreamEvent_Event() {}
+
+func (*StreamEvent_RolePermsUpdated) isStreamEvent_Event() {}
+
+func (*StreamEvent_UserRolesUpdated_) isStreamEvent_Event() {}
+
+func (*StreamEvent_PermissionUpdated_) isStreamEvent_Event() {}
+
+func (*StreamEvent_ChannelsReordered_) isStreamEvent_Event() {}
+
+func (*StreamEvent_EditedChannelPosition) isStreamEvent_Event() {}
+
+func (*StreamEvent_MessagePinned_) isStreamEvent_Event() {}
+
+func (*StreamEvent_MessageUnpinned_) isStreamEvent_Event() {}
+
+func (*StreamEvent_ReactionUpdated_) isStreamEvent_Event() {}
+
+func (*StreamEvent_OwnerAdded_) isStreamEvent_Event() {}
+
+func (*StreamEvent_OwnerRemoved_) isStreamEvent_Event() {}
+
+func (*StreamEvent_InviteReceived_) isStreamEvent_Event() {}
+
+func (*StreamEvent_InviteRejected_) isStreamEvent_Event() {}
+
+// Event source for guilds' events.
+type StreamEventsRequest_SubscribeToGuild struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// the guild id to subscribe to
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+}
+
+func (x *StreamEventsRequest_SubscribeToGuild) Reset() {
+	*x = StreamEventsRequest_SubscribeToGuild{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_stream_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamEventsRequest_SubscribeToGuild) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamEventsRequest_SubscribeToGuild) ProtoMessage() {}
+
+func (x *StreamEventsRequest_SubscribeToGuild) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_stream_proto_msgTypes[3]
+	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 StreamEventsRequest_SubscribeToGuild.ProtoReflect.Descriptor instead.
+func (*StreamEventsRequest_SubscribeToGuild) Descriptor() ([]byte, []int) {
+	return file_chat_v1_stream_proto_rawDescGZIP(), []int{0, 0}
+}
+
+func (x *StreamEventsRequest_SubscribeToGuild) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+// Event source for actions' events.
+type StreamEventsRequest_SubscribeToActions struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *StreamEventsRequest_SubscribeToActions) Reset() {
+	*x = StreamEventsRequest_SubscribeToActions{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_stream_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamEventsRequest_SubscribeToActions) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamEventsRequest_SubscribeToActions) ProtoMessage() {}
+
+func (x *StreamEventsRequest_SubscribeToActions) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_stream_proto_msgTypes[4]
+	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 StreamEventsRequest_SubscribeToActions.ProtoReflect.Descriptor instead.
+func (*StreamEventsRequest_SubscribeToActions) Descriptor() ([]byte, []int) {
+	return file_chat_v1_stream_proto_rawDescGZIP(), []int{0, 1}
+}
+
+// Event source for homeserver events.
+type StreamEventsRequest_SubscribeToHomeserverEvents struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *StreamEventsRequest_SubscribeToHomeserverEvents) Reset() {
+	*x = StreamEventsRequest_SubscribeToHomeserverEvents{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_stream_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamEventsRequest_SubscribeToHomeserverEvents) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamEventsRequest_SubscribeToHomeserverEvents) ProtoMessage() {}
+
+func (x *StreamEventsRequest_SubscribeToHomeserverEvents) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_stream_proto_msgTypes[5]
+	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 StreamEventsRequest_SubscribeToHomeserverEvents.ProtoReflect.Descriptor instead.
+func (*StreamEventsRequest_SubscribeToHomeserverEvents) Descriptor() ([]byte, []int) {
+	return file_chat_v1_stream_proto_rawDescGZIP(), []int{0, 2}
+}
+
+// Event sent when a new message is sent.
+type StreamEvent_MessageSent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// ID that is sent by your client it can use to confirm that the message is sent.
+	EchoId *uint64 `protobuf:"varint,1,opt,name=echo_id,json=echoId,proto3,oneof" json:"echo_id,omitempty"`
+	// Guild ID of the guild where this event happened.
+	GuildId uint64 `protobuf:"varint,2,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// Channel ID of the channel where this event happened.
+	ChannelId uint64 `protobuf:"varint,3,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
+	// Message ID of the message that was updated.
+	MessageId uint64 `protobuf:"varint,4,opt,name=message_id,json=messageId,proto3" json:"message_id,omitempty"`
+	// The actual message.
+	Message *Message `protobuf:"bytes,5,opt,name=message,proto3" json:"message,omitempty"`
+}
+
+func (x *StreamEvent_MessageSent) Reset() {
+	*x = StreamEvent_MessageSent{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_stream_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamEvent_MessageSent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamEvent_MessageSent) ProtoMessage() {}
+
+func (x *StreamEvent_MessageSent) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_stream_proto_msgTypes[6]
+	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 StreamEvent_MessageSent.ProtoReflect.Descriptor instead.
+func (*StreamEvent_MessageSent) Descriptor() ([]byte, []int) {
+	return file_chat_v1_stream_proto_rawDescGZIP(), []int{2, 0}
+}
+
+func (x *StreamEvent_MessageSent) GetEchoId() uint64 {
+	if x != nil && x.EchoId != nil {
+		return *x.EchoId
+	}
+	return 0
+}
+
+func (x *StreamEvent_MessageSent) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *StreamEvent_MessageSent) GetChannelId() uint64 {
+	if x != nil {
+		return x.ChannelId
+	}
+	return 0
+}
+
+func (x *StreamEvent_MessageSent) GetMessageId() uint64 {
+	if x != nil {
+		return x.MessageId
+	}
+	return 0
+}
+
+func (x *StreamEvent_MessageSent) GetMessage() *Message {
+	if x != nil {
+		return x.Message
+	}
+	return nil
+}
+
+// Event sent when a message's text content is updated.
+type StreamEvent_MessageUpdated struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild where this event happened.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// Channel ID of the channel where this event happened.
+	ChannelId uint64 `protobuf:"varint,2,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
+	// Message ID of the message that was updated.
+	MessageId uint64 `protobuf:"varint,3,opt,name=message_id,json=messageId,proto3" json:"message_id,omitempty"`
+	// When this message was edited, in milliseconds since unix epoch
+	EditedAt uint64 `protobuf:"varint,4,opt,name=edited_at,json=editedAt,proto3" json:"edited_at,omitempty"`
+	// New message content.
+	NewContent *FormattedText `protobuf:"bytes,5,opt,name=new_content,json=newContent,proto3" json:"new_content,omitempty"`
+}
+
+func (x *StreamEvent_MessageUpdated) Reset() {
+	*x = StreamEvent_MessageUpdated{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_stream_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamEvent_MessageUpdated) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamEvent_MessageUpdated) ProtoMessage() {}
+
+func (x *StreamEvent_MessageUpdated) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_stream_proto_msgTypes[7]
+	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 StreamEvent_MessageUpdated.ProtoReflect.Descriptor instead.
+func (*StreamEvent_MessageUpdated) Descriptor() ([]byte, []int) {
+	return file_chat_v1_stream_proto_rawDescGZIP(), []int{2, 1}
+}
+
+func (x *StreamEvent_MessageUpdated) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *StreamEvent_MessageUpdated) GetChannelId() uint64 {
+	if x != nil {
+		return x.ChannelId
+	}
+	return 0
+}
+
+func (x *StreamEvent_MessageUpdated) GetMessageId() uint64 {
+	if x != nil {
+		return x.MessageId
+	}
+	return 0
+}
+
+func (x *StreamEvent_MessageUpdated) GetEditedAt() uint64 {
+	if x != nil {
+		return x.EditedAt
+	}
+	return 0
+}
+
+func (x *StreamEvent_MessageUpdated) GetNewContent() *FormattedText {
+	if x != nil {
+		return x.NewContent
+	}
+	return nil
+}
+
+// Event sent when a message is deleted.
+type StreamEvent_MessageDeleted struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild where this event happened.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// Channel ID of the channel where this event happened.
+	ChannelId uint64 `protobuf:"varint,2,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
+	// Message ID of the message that was deleted.
+	MessageId uint64 `protobuf:"varint,3,opt,name=message_id,json=messageId,proto3" json:"message_id,omitempty"`
+}
+
+func (x *StreamEvent_MessageDeleted) Reset() {
+	*x = StreamEvent_MessageDeleted{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_stream_proto_msgTypes[8]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamEvent_MessageDeleted) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamEvent_MessageDeleted) ProtoMessage() {}
+
+func (x *StreamEvent_MessageDeleted) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_stream_proto_msgTypes[8]
+	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 StreamEvent_MessageDeleted.ProtoReflect.Descriptor instead.
+func (*StreamEvent_MessageDeleted) Descriptor() ([]byte, []int) {
+	return file_chat_v1_stream_proto_rawDescGZIP(), []int{2, 2}
+}
+
+func (x *StreamEvent_MessageDeleted) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *StreamEvent_MessageDeleted) GetChannelId() uint64 {
+	if x != nil {
+		return x.ChannelId
+	}
+	return 0
+}
+
+func (x *StreamEvent_MessageDeleted) GetMessageId() uint64 {
+	if x != nil {
+		return x.MessageId
+	}
+	return 0
+}
+
+// Event sent when a new channel is created.
+type StreamEvent_ChannelCreated struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild where this event happened.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// Channel ID of the channel where this event happened.
+	ChannelId uint64 `protobuf:"varint,2,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
+	// Name of this channel.
+	Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
+	// The position in the channel list.
+	Position *v12.ItemPosition `protobuf:"bytes,4,opt,name=position,proto3" json:"position,omitempty"`
+	// The kind of this channel.
+	Kind ChannelKind `protobuf:"varint,5,opt,name=kind,proto3,enum=protocol.chat.v1.ChannelKind" json:"kind,omitempty"`
+	// Metadata for this channel.
+	Metadata *v12.Metadata `protobuf:"bytes,6,opt,name=metadata,proto3,oneof" json:"metadata,omitempty"`
+}
+
+func (x *StreamEvent_ChannelCreated) Reset() {
+	*x = StreamEvent_ChannelCreated{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_stream_proto_msgTypes[9]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamEvent_ChannelCreated) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamEvent_ChannelCreated) ProtoMessage() {}
+
+func (x *StreamEvent_ChannelCreated) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_stream_proto_msgTypes[9]
+	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 StreamEvent_ChannelCreated.ProtoReflect.Descriptor instead.
+func (*StreamEvent_ChannelCreated) Descriptor() ([]byte, []int) {
+	return file_chat_v1_stream_proto_rawDescGZIP(), []int{2, 3}
+}
+
+func (x *StreamEvent_ChannelCreated) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *StreamEvent_ChannelCreated) GetChannelId() uint64 {
+	if x != nil {
+		return x.ChannelId
+	}
+	return 0
+}
+
+func (x *StreamEvent_ChannelCreated) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *StreamEvent_ChannelCreated) GetPosition() *v12.ItemPosition {
+	if x != nil {
+		return x.Position
+	}
+	return nil
+}
+
+func (x *StreamEvent_ChannelCreated) GetKind() ChannelKind {
+	if x != nil {
+		return x.Kind
+	}
+	return ChannelKind_CHANNEL_KIND_TEXT_UNSPECIFIED
+}
+
+func (x *StreamEvent_ChannelCreated) GetMetadata() *v12.Metadata {
+	if x != nil {
+		return x.Metadata
+	}
+	return nil
+}
+
+// Event sent when a channel's information is changed.
+type StreamEvent_ChannelUpdated struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild where this event happened.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// Channel ID of the channel that was changed.
+	ChannelId uint64 `protobuf:"varint,2,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
+	// The new name of the channel.
+	NewName *string `protobuf:"bytes,3,opt,name=new_name,json=newName,proto3,oneof" json:"new_name,omitempty"`
+	// The new metadata of the channel.
+	NewMetadata *v12.Metadata `protobuf:"bytes,4,opt,name=new_metadata,json=newMetadata,proto3,oneof" json:"new_metadata,omitempty"`
+}
+
+func (x *StreamEvent_ChannelUpdated) Reset() {
+	*x = StreamEvent_ChannelUpdated{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_stream_proto_msgTypes[10]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamEvent_ChannelUpdated) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamEvent_ChannelUpdated) ProtoMessage() {}
+
+func (x *StreamEvent_ChannelUpdated) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_stream_proto_msgTypes[10]
+	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 StreamEvent_ChannelUpdated.ProtoReflect.Descriptor instead.
+func (*StreamEvent_ChannelUpdated) Descriptor() ([]byte, []int) {
+	return file_chat_v1_stream_proto_rawDescGZIP(), []int{2, 4}
+}
+
+func (x *StreamEvent_ChannelUpdated) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *StreamEvent_ChannelUpdated) GetChannelId() uint64 {
+	if x != nil {
+		return x.ChannelId
+	}
+	return 0
+}
+
+func (x *StreamEvent_ChannelUpdated) GetNewName() string {
+	if x != nil && x.NewName != nil {
+		return *x.NewName
+	}
+	return ""
+}
+
+func (x *StreamEvent_ChannelUpdated) GetNewMetadata() *v12.Metadata {
+	if x != nil {
+		return x.NewMetadata
+	}
+	return nil
+}
+
+// Event sent when a channel's position in the channel list is changed.
+type StreamEvent_ChannelPositionUpdated struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild where this event happened.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// Channel ID of the channel that was changed.
+	ChannelId uint64 `protobuf:"varint,2,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
+	// The new position of the channel.
+	NewPosition *v12.ItemPosition `protobuf:"bytes,3,opt,name=new_position,json=newPosition,proto3,oneof" json:"new_position,omitempty"`
+}
+
+func (x *StreamEvent_ChannelPositionUpdated) Reset() {
+	*x = StreamEvent_ChannelPositionUpdated{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_stream_proto_msgTypes[11]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamEvent_ChannelPositionUpdated) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamEvent_ChannelPositionUpdated) ProtoMessage() {}
+
+func (x *StreamEvent_ChannelPositionUpdated) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_stream_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 StreamEvent_ChannelPositionUpdated.ProtoReflect.Descriptor instead.
+func (*StreamEvent_ChannelPositionUpdated) Descriptor() ([]byte, []int) {
+	return file_chat_v1_stream_proto_rawDescGZIP(), []int{2, 5}
+}
+
+func (x *StreamEvent_ChannelPositionUpdated) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *StreamEvent_ChannelPositionUpdated) GetChannelId() uint64 {
+	if x != nil {
+		return x.ChannelId
+	}
+	return 0
+}
+
+func (x *StreamEvent_ChannelPositionUpdated) GetNewPosition() *v12.ItemPosition {
+	if x != nil {
+		return x.NewPosition
+	}
+	return nil
+}
+
+// Event sent when all channels have been reordered
+type StreamEvent_ChannelsReordered struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// guild_id: the guild whose channels are being reordered
+	GuildId uint64 `protobuf:"varint,2,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// channel_ids: the new order of channel IDs
+	ChannelIds []uint64 `protobuf:"varint,1,rep,packed,name=channel_ids,json=channelIds,proto3" json:"channel_ids,omitempty"`
+}
+
+func (x *StreamEvent_ChannelsReordered) Reset() {
+	*x = StreamEvent_ChannelsReordered{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_stream_proto_msgTypes[12]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamEvent_ChannelsReordered) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamEvent_ChannelsReordered) ProtoMessage() {}
+
+func (x *StreamEvent_ChannelsReordered) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_stream_proto_msgTypes[12]
+	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 StreamEvent_ChannelsReordered.ProtoReflect.Descriptor instead.
+func (*StreamEvent_ChannelsReordered) Descriptor() ([]byte, []int) {
+	return file_chat_v1_stream_proto_rawDescGZIP(), []int{2, 6}
+}
+
+func (x *StreamEvent_ChannelsReordered) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *StreamEvent_ChannelsReordered) GetChannelIds() []uint64 {
+	if x != nil {
+		return x.ChannelIds
+	}
+	return nil
+}
+
+// Event sent when a channel is deleted.
+type StreamEvent_ChannelDeleted struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild where this event happened.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// Channel ID of the channel that was deleted.
+	ChannelId uint64 `protobuf:"varint,2,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
+}
+
+func (x *StreamEvent_ChannelDeleted) Reset() {
+	*x = StreamEvent_ChannelDeleted{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_stream_proto_msgTypes[13]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamEvent_ChannelDeleted) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamEvent_ChannelDeleted) ProtoMessage() {}
+
+func (x *StreamEvent_ChannelDeleted) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_stream_proto_msgTypes[13]
+	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 StreamEvent_ChannelDeleted.ProtoReflect.Descriptor instead.
+func (*StreamEvent_ChannelDeleted) Descriptor() ([]byte, []int) {
+	return file_chat_v1_stream_proto_rawDescGZIP(), []int{2, 7}
+}
+
+func (x *StreamEvent_ChannelDeleted) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *StreamEvent_ChannelDeleted) GetChannelId() uint64 {
+	if x != nil {
+		return x.ChannelId
+	}
+	return 0
+}
+
+// Event sent when a guild's information is changed.
+type StreamEvent_GuildUpdated struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild that was changed.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// The new name of the guild.
+	NewName *string `protobuf:"bytes,2,opt,name=new_name,json=newName,proto3,oneof" json:"new_name,omitempty"`
+	// The new picture of the guild.
+	NewPicture *string `protobuf:"bytes,3,opt,name=new_picture,json=newPicture,proto3,oneof" json:"new_picture,omitempty"`
+	// The new metadata of the guild.
+	NewMetadata *v12.Metadata `protobuf:"bytes,4,opt,name=new_metadata,json=newMetadata,proto3,oneof" json:"new_metadata,omitempty"`
+}
+
+func (x *StreamEvent_GuildUpdated) Reset() {
+	*x = StreamEvent_GuildUpdated{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_stream_proto_msgTypes[14]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamEvent_GuildUpdated) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamEvent_GuildUpdated) ProtoMessage() {}
+
+func (x *StreamEvent_GuildUpdated) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_stream_proto_msgTypes[14]
+	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 StreamEvent_GuildUpdated.ProtoReflect.Descriptor instead.
+func (*StreamEvent_GuildUpdated) Descriptor() ([]byte, []int) {
+	return file_chat_v1_stream_proto_rawDescGZIP(), []int{2, 8}
+}
+
+func (x *StreamEvent_GuildUpdated) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *StreamEvent_GuildUpdated) GetNewName() string {
+	if x != nil && x.NewName != nil {
+		return *x.NewName
+	}
+	return ""
+}
+
+func (x *StreamEvent_GuildUpdated) GetNewPicture() string {
+	if x != nil && x.NewPicture != nil {
+		return *x.NewPicture
+	}
+	return ""
+}
+
+func (x *StreamEvent_GuildUpdated) GetNewMetadata() *v12.Metadata {
+	if x != nil {
+		return x.NewMetadata
+	}
+	return nil
+}
+
+// Event sent when a guild is deleted.
+type StreamEvent_GuildDeleted struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild that was deleted.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+}
+
+func (x *StreamEvent_GuildDeleted) Reset() {
+	*x = StreamEvent_GuildDeleted{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_stream_proto_msgTypes[15]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamEvent_GuildDeleted) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamEvent_GuildDeleted) ProtoMessage() {}
+
+func (x *StreamEvent_GuildDeleted) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_stream_proto_msgTypes[15]
+	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 StreamEvent_GuildDeleted.ProtoReflect.Descriptor instead.
+func (*StreamEvent_GuildDeleted) Descriptor() ([]byte, []int) {
+	return file_chat_v1_stream_proto_rawDescGZIP(), []int{2, 9}
+}
+
+func (x *StreamEvent_GuildDeleted) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+// Event sent a user joins to a guild.
+type StreamEvent_MemberJoined struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Member ID of the member that joined the guild.
+	MemberId uint64 `protobuf:"varint,1,opt,name=member_id,json=memberId,proto3" json:"member_id,omitempty"`
+	// Guild ID of the guild where this event happened.
+	GuildId uint64 `protobuf:"varint,2,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+}
+
+func (x *StreamEvent_MemberJoined) Reset() {
+	*x = StreamEvent_MemberJoined{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_stream_proto_msgTypes[16]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamEvent_MemberJoined) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamEvent_MemberJoined) ProtoMessage() {}
+
+func (x *StreamEvent_MemberJoined) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_stream_proto_msgTypes[16]
+	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 StreamEvent_MemberJoined.ProtoReflect.Descriptor instead.
+func (*StreamEvent_MemberJoined) Descriptor() ([]byte, []int) {
+	return file_chat_v1_stream_proto_rawDescGZIP(), []int{2, 10}
+}
+
+func (x *StreamEvent_MemberJoined) GetMemberId() uint64 {
+	if x != nil {
+		return x.MemberId
+	}
+	return 0
+}
+
+func (x *StreamEvent_MemberJoined) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+// Event sent when a member of a guild leaves said guild for whatever reason.
+type StreamEvent_MemberLeft struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// User ID of the member that left the guild.
+	MemberId uint64 `protobuf:"varint,1,opt,name=member_id,json=memberId,proto3" json:"member_id,omitempty"`
+	// Guild ID of the guild where this event happened.
+	GuildId uint64 `protobuf:"varint,2,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// Why this member left the guild.
+	LeaveReason LeaveReason `protobuf:"varint,3,opt,name=leave_reason,json=leaveReason,proto3,enum=protocol.chat.v1.LeaveReason" json:"leave_reason,omitempty"`
+}
+
+func (x *StreamEvent_MemberLeft) Reset() {
+	*x = StreamEvent_MemberLeft{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_stream_proto_msgTypes[17]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamEvent_MemberLeft) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamEvent_MemberLeft) ProtoMessage() {}
+
+func (x *StreamEvent_MemberLeft) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_stream_proto_msgTypes[17]
+	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 StreamEvent_MemberLeft.ProtoReflect.Descriptor instead.
+func (*StreamEvent_MemberLeft) Descriptor() ([]byte, []int) {
+	return file_chat_v1_stream_proto_rawDescGZIP(), []int{2, 11}
+}
+
+func (x *StreamEvent_MemberLeft) GetMemberId() uint64 {
+	if x != nil {
+		return x.MemberId
+	}
+	return 0
+}
+
+func (x *StreamEvent_MemberLeft) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *StreamEvent_MemberLeft) GetLeaveReason() LeaveReason {
+	if x != nil {
+		return x.LeaveReason
+	}
+	return LeaveReason_LEAVE_REASON_WILLINGLY_UNSPECIFIED
+}
+
+// Event sent when you join a new guild.
+type StreamEvent_GuildAddedToList struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild where this event happened.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// The homeserver this guild is on.
+	Homeserver string `protobuf:"bytes,2,opt,name=homeserver,proto3" json:"homeserver,omitempty"`
+}
+
+func (x *StreamEvent_GuildAddedToList) Reset() {
+	*x = StreamEvent_GuildAddedToList{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_stream_proto_msgTypes[18]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamEvent_GuildAddedToList) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamEvent_GuildAddedToList) ProtoMessage() {}
+
+func (x *StreamEvent_GuildAddedToList) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_stream_proto_msgTypes[18]
+	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 StreamEvent_GuildAddedToList.ProtoReflect.Descriptor instead.
+func (*StreamEvent_GuildAddedToList) Descriptor() ([]byte, []int) {
+	return file_chat_v1_stream_proto_rawDescGZIP(), []int{2, 12}
+}
+
+func (x *StreamEvent_GuildAddedToList) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *StreamEvent_GuildAddedToList) GetHomeserver() string {
+	if x != nil {
+		return x.Homeserver
+	}
+	return ""
+}
+
+// Event sent when you leave a guild.
+type StreamEvent_GuildRemovedFromList struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild where this event happened.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// The homeserver this guild is on.
+	Homeserver string `protobuf:"bytes,2,opt,name=homeserver,proto3" json:"homeserver,omitempty"`
+}
+
+func (x *StreamEvent_GuildRemovedFromList) Reset() {
+	*x = StreamEvent_GuildRemovedFromList{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_stream_proto_msgTypes[19]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamEvent_GuildRemovedFromList) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamEvent_GuildRemovedFromList) ProtoMessage() {}
+
+func (x *StreamEvent_GuildRemovedFromList) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_stream_proto_msgTypes[19]
+	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 StreamEvent_GuildRemovedFromList.ProtoReflect.Descriptor instead.
+func (*StreamEvent_GuildRemovedFromList) Descriptor() ([]byte, []int) {
+	return file_chat_v1_stream_proto_rawDescGZIP(), []int{2, 13}
+}
+
+func (x *StreamEvent_GuildRemovedFromList) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *StreamEvent_GuildRemovedFromList) GetHomeserver() string {
+	if x != nil {
+		return x.Homeserver
+	}
+	return ""
+}
+
+// Event sent when an action is performed.
+type StreamEvent_ActionPerformed struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild where this event happened.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// Channel ID of the channel where this event happened.
+	ChannelId uint64 `protobuf:"varint,2,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
+	// Message ID where this event happened.
+	MessageId uint64 `protobuf:"varint,3,opt,name=message_id,json=messageId,proto3" json:"message_id,omitempty"`
+	// User ID of the user that triggered the action
+	UserId uint64 `protobuf:"varint,4,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
+	// The action data payload
+	Payload *ActionPayload `protobuf:"bytes,5,opt,name=payload,proto3" json:"payload,omitempty"`
+}
+
+func (x *StreamEvent_ActionPerformed) Reset() {
+	*x = StreamEvent_ActionPerformed{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_stream_proto_msgTypes[20]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamEvent_ActionPerformed) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamEvent_ActionPerformed) ProtoMessage() {}
+
+func (x *StreamEvent_ActionPerformed) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_stream_proto_msgTypes[20]
+	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 StreamEvent_ActionPerformed.ProtoReflect.Descriptor instead.
+func (*StreamEvent_ActionPerformed) Descriptor() ([]byte, []int) {
+	return file_chat_v1_stream_proto_rawDescGZIP(), []int{2, 14}
+}
+
+func (x *StreamEvent_ActionPerformed) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *StreamEvent_ActionPerformed) GetChannelId() uint64 {
+	if x != nil {
+		return x.ChannelId
+	}
+	return 0
+}
+
+func (x *StreamEvent_ActionPerformed) GetMessageId() uint64 {
+	if x != nil {
+		return x.MessageId
+	}
+	return 0
+}
+
+func (x *StreamEvent_ActionPerformed) GetUserId() uint64 {
+	if x != nil {
+		return x.UserId
+	}
+	return 0
+}
+
+func (x *StreamEvent_ActionPerformed) GetPayload() *ActionPayload {
+	if x != nil {
+		return x.Payload
+	}
+	return nil
+}
+
+// Event sent when a role's position in the role list is changed.
+type StreamEvent_RoleMoved struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild where this event happened.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// Role ID of the role that was moved.
+	RoleId uint64 `protobuf:"varint,2,opt,name=role_id,json=roleId,proto3" json:"role_id,omitempty"`
+	// New position of the role.
+	NewPosition *v12.ItemPosition `protobuf:"bytes,3,opt,name=new_position,json=newPosition,proto3" json:"new_position,omitempty"`
+}
+
+func (x *StreamEvent_RoleMoved) Reset() {
+	*x = StreamEvent_RoleMoved{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_stream_proto_msgTypes[21]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamEvent_RoleMoved) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamEvent_RoleMoved) ProtoMessage() {}
+
+func (x *StreamEvent_RoleMoved) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_stream_proto_msgTypes[21]
+	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 StreamEvent_RoleMoved.ProtoReflect.Descriptor instead.
+func (*StreamEvent_RoleMoved) Descriptor() ([]byte, []int) {
+	return file_chat_v1_stream_proto_rawDescGZIP(), []int{2, 15}
+}
+
+func (x *StreamEvent_RoleMoved) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *StreamEvent_RoleMoved) GetRoleId() uint64 {
+	if x != nil {
+		return x.RoleId
+	}
+	return 0
+}
+
+func (x *StreamEvent_RoleMoved) GetNewPosition() *v12.ItemPosition {
+	if x != nil {
+		return x.NewPosition
+	}
+	return nil
+}
+
+// Event sent when a role is deleted.
+type StreamEvent_RoleDeleted struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild where this event happened.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// Role ID of the role that was deleted.
+	RoleId uint64 `protobuf:"varint,2,opt,name=role_id,json=roleId,proto3" json:"role_id,omitempty"`
+}
+
+func (x *StreamEvent_RoleDeleted) Reset() {
+	*x = StreamEvent_RoleDeleted{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_stream_proto_msgTypes[22]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamEvent_RoleDeleted) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamEvent_RoleDeleted) ProtoMessage() {}
+
+func (x *StreamEvent_RoleDeleted) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_stream_proto_msgTypes[22]
+	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 StreamEvent_RoleDeleted.ProtoReflect.Descriptor instead.
+func (*StreamEvent_RoleDeleted) Descriptor() ([]byte, []int) {
+	return file_chat_v1_stream_proto_rawDescGZIP(), []int{2, 16}
+}
+
+func (x *StreamEvent_RoleDeleted) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *StreamEvent_RoleDeleted) GetRoleId() uint64 {
+	if x != nil {
+		return x.RoleId
+	}
+	return 0
+}
+
+// Event sent when a role is created.
+type StreamEvent_RoleCreated struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild where this event happened.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// Role ID of the role that was created.
+	RoleId uint64 `protobuf:"varint,2,opt,name=role_id,json=roleId,proto3" json:"role_id,omitempty"`
+	// The name of the role.
+	Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
+	// The color of the role.
+	Color int32 `protobuf:"varint,4,opt,name=color,proto3" json:"color,omitempty"`
+	// The hoist status of the role.
+	Hoist bool `protobuf:"varint,5,opt,name=hoist,proto3" json:"hoist,omitempty"`
+	// The pingable status of the role.
+	Pingable bool `protobuf:"varint,6,opt,name=pingable,proto3" json:"pingable,omitempty"`
+}
+
+func (x *StreamEvent_RoleCreated) Reset() {
+	*x = StreamEvent_RoleCreated{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_stream_proto_msgTypes[23]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamEvent_RoleCreated) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamEvent_RoleCreated) ProtoMessage() {}
+
+func (x *StreamEvent_RoleCreated) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_stream_proto_msgTypes[23]
+	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 StreamEvent_RoleCreated.ProtoReflect.Descriptor instead.
+func (*StreamEvent_RoleCreated) Descriptor() ([]byte, []int) {
+	return file_chat_v1_stream_proto_rawDescGZIP(), []int{2, 17}
+}
+
+func (x *StreamEvent_RoleCreated) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *StreamEvent_RoleCreated) GetRoleId() uint64 {
+	if x != nil {
+		return x.RoleId
+	}
+	return 0
+}
+
+func (x *StreamEvent_RoleCreated) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *StreamEvent_RoleCreated) GetColor() int32 {
+	if x != nil {
+		return x.Color
+	}
+	return 0
+}
+
+func (x *StreamEvent_RoleCreated) GetHoist() bool {
+	if x != nil {
+		return x.Hoist
+	}
+	return false
+}
+
+func (x *StreamEvent_RoleCreated) GetPingable() bool {
+	if x != nil {
+		return x.Pingable
+	}
+	return false
+}
+
+// Event sent when a role's information is changed.
+type StreamEvent_RoleUpdated struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild where this event happened.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// Role ID of the role that was changed.
+	RoleId uint64 `protobuf:"varint,2,opt,name=role_id,json=roleId,proto3" json:"role_id,omitempty"`
+	// The new name of the role.
+	NewName *string `protobuf:"bytes,3,opt,name=new_name,json=newName,proto3,oneof" json:"new_name,omitempty"`
+	// The new color of the role.
+	NewColor *int32 `protobuf:"varint,4,opt,name=new_color,json=newColor,proto3,oneof" json:"new_color,omitempty"`
+	// The new hoist status of the role.
+	NewHoist *bool `protobuf:"varint,5,opt,name=new_hoist,json=newHoist,proto3,oneof" json:"new_hoist,omitempty"`
+	// The new pingable status of the role.
+	NewPingable *bool `protobuf:"varint,6,opt,name=new_pingable,json=newPingable,proto3,oneof" json:"new_pingable,omitempty"`
+}
+
+func (x *StreamEvent_RoleUpdated) Reset() {
+	*x = StreamEvent_RoleUpdated{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_stream_proto_msgTypes[24]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamEvent_RoleUpdated) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamEvent_RoleUpdated) ProtoMessage() {}
+
+func (x *StreamEvent_RoleUpdated) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_stream_proto_msgTypes[24]
+	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 StreamEvent_RoleUpdated.ProtoReflect.Descriptor instead.
+func (*StreamEvent_RoleUpdated) Descriptor() ([]byte, []int) {
+	return file_chat_v1_stream_proto_rawDescGZIP(), []int{2, 18}
+}
+
+func (x *StreamEvent_RoleUpdated) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *StreamEvent_RoleUpdated) GetRoleId() uint64 {
+	if x != nil {
+		return x.RoleId
+	}
+	return 0
+}
+
+func (x *StreamEvent_RoleUpdated) GetNewName() string {
+	if x != nil && x.NewName != nil {
+		return *x.NewName
+	}
+	return ""
+}
+
+func (x *StreamEvent_RoleUpdated) GetNewColor() int32 {
+	if x != nil && x.NewColor != nil {
+		return *x.NewColor
+	}
+	return 0
+}
+
+func (x *StreamEvent_RoleUpdated) GetNewHoist() bool {
+	if x != nil && x.NewHoist != nil {
+		return *x.NewHoist
+	}
+	return false
+}
+
+func (x *StreamEvent_RoleUpdated) GetNewPingable() bool {
+	if x != nil && x.NewPingable != nil {
+		return *x.NewPingable
+	}
+	return false
+}
+
+// Event sent when a role's permissions are changed.
+//
+// This event will only be sent to users with the "guild.manage" permission.
+type StreamEvent_RolePermissionsUpdated struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild where this event happened.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// Channel ID of the channel where this event happened.
+	ChannelId *uint64 `protobuf:"varint,2,opt,name=channel_id,json=channelId,proto3,oneof" json:"channel_id,omitempty"`
+	// Role ID of the role that had it's permissions changed.
+	RoleId uint64 `protobuf:"varint,3,opt,name=role_id,json=roleId,proto3" json:"role_id,omitempty"`
+	// The new permissions.
+	NewPerms []*Permission `protobuf:"bytes,4,rep,name=new_perms,json=newPerms,proto3" json:"new_perms,omitempty"`
+}
+
+func (x *StreamEvent_RolePermissionsUpdated) Reset() {
+	*x = StreamEvent_RolePermissionsUpdated{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_stream_proto_msgTypes[25]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamEvent_RolePermissionsUpdated) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamEvent_RolePermissionsUpdated) ProtoMessage() {}
+
+func (x *StreamEvent_RolePermissionsUpdated) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_stream_proto_msgTypes[25]
+	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 StreamEvent_RolePermissionsUpdated.ProtoReflect.Descriptor instead.
+func (*StreamEvent_RolePermissionsUpdated) Descriptor() ([]byte, []int) {
+	return file_chat_v1_stream_proto_rawDescGZIP(), []int{2, 19}
+}
+
+func (x *StreamEvent_RolePermissionsUpdated) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *StreamEvent_RolePermissionsUpdated) GetChannelId() uint64 {
+	if x != nil && x.ChannelId != nil {
+		return *x.ChannelId
+	}
+	return 0
+}
+
+func (x *StreamEvent_RolePermissionsUpdated) GetRoleId() uint64 {
+	if x != nil {
+		return x.RoleId
+	}
+	return 0
+}
+
+func (x *StreamEvent_RolePermissionsUpdated) GetNewPerms() []*Permission {
+	if x != nil {
+		return x.NewPerms
+	}
+	return nil
+}
+
+// Event sent when a user's roles are changed.
+type StreamEvent_UserRolesUpdated struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild where this event happened.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// User ID of the user that had it's roles changed.
+	UserId uint64 `protobuf:"varint,2,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
+	// The new role IDs.
+	NewRoleIds []uint64 `protobuf:"varint,3,rep,packed,name=new_role_ids,json=newRoleIds,proto3" json:"new_role_ids,omitempty"`
+}
+
+func (x *StreamEvent_UserRolesUpdated) Reset() {
+	*x = StreamEvent_UserRolesUpdated{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_stream_proto_msgTypes[26]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamEvent_UserRolesUpdated) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamEvent_UserRolesUpdated) ProtoMessage() {}
+
+func (x *StreamEvent_UserRolesUpdated) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_stream_proto_msgTypes[26]
+	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 StreamEvent_UserRolesUpdated.ProtoReflect.Descriptor instead.
+func (*StreamEvent_UserRolesUpdated) Descriptor() ([]byte, []int) {
+	return file_chat_v1_stream_proto_rawDescGZIP(), []int{2, 20}
+}
+
+func (x *StreamEvent_UserRolesUpdated) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *StreamEvent_UserRolesUpdated) GetUserId() uint64 {
+	if x != nil {
+		return x.UserId
+	}
+	return 0
+}
+
+func (x *StreamEvent_UserRolesUpdated) GetNewRoleIds() []uint64 {
+	if x != nil {
+		return x.NewRoleIds
+	}
+	return nil
+}
+
+// Event sent when a user sends a typing notification in a guild channel.
+type StreamEvent_Typing struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// User ID of the user that sent the typing notification.
+	UserId uint64 `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
+	// Guild ID of the guild where this event happened.
+	GuildId uint64 `protobuf:"varint,2,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// Channel ID of the channel where this event happened.
+	ChannelId uint64 `protobuf:"varint,3,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
+}
+
+func (x *StreamEvent_Typing) Reset() {
+	*x = StreamEvent_Typing{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_stream_proto_msgTypes[27]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamEvent_Typing) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamEvent_Typing) ProtoMessage() {}
+
+func (x *StreamEvent_Typing) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_stream_proto_msgTypes[27]
+	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 StreamEvent_Typing.ProtoReflect.Descriptor instead.
+func (*StreamEvent_Typing) Descriptor() ([]byte, []int) {
+	return file_chat_v1_stream_proto_rawDescGZIP(), []int{2, 21}
+}
+
+func (x *StreamEvent_Typing) GetUserId() uint64 {
+	if x != nil {
+		return x.UserId
+	}
+	return 0
+}
+
+func (x *StreamEvent_Typing) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *StreamEvent_Typing) GetChannelId() uint64 {
+	if x != nil {
+		return x.ChannelId
+	}
+	return 0
+}
+
+// Event sent when a permission is changed that matters to you.
+//
+// Servers should calculate which users to send this event to when a permission is set.
+// It should only be sent if a user is subscribed to the guild the permission pertains to.
+type StreamEvent_PermissionUpdated struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild where this event happened.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// Channel ID of the channel where this event happened.
+	ChannelId *uint64 `protobuf:"varint,2,opt,name=channel_id,json=channelId,proto3,oneof" json:"channel_id,omitempty"`
+	// The permission node that was changed.
+	Query string `protobuf:"bytes,3,opt,name=query,proto3" json:"query,omitempty"`
+	// Whether you have the permission or not.
+	Ok bool `protobuf:"varint,4,opt,name=ok,proto3" json:"ok,omitempty"`
+}
+
+func (x *StreamEvent_PermissionUpdated) Reset() {
+	*x = StreamEvent_PermissionUpdated{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_stream_proto_msgTypes[28]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamEvent_PermissionUpdated) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamEvent_PermissionUpdated) ProtoMessage() {}
+
+func (x *StreamEvent_PermissionUpdated) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_stream_proto_msgTypes[28]
+	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 StreamEvent_PermissionUpdated.ProtoReflect.Descriptor instead.
+func (*StreamEvent_PermissionUpdated) Descriptor() ([]byte, []int) {
+	return file_chat_v1_stream_proto_rawDescGZIP(), []int{2, 22}
+}
+
+func (x *StreamEvent_PermissionUpdated) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *StreamEvent_PermissionUpdated) GetChannelId() uint64 {
+	if x != nil && x.ChannelId != nil {
+		return *x.ChannelId
+	}
+	return 0
+}
+
+func (x *StreamEvent_PermissionUpdated) GetQuery() string {
+	if x != nil {
+		return x.Query
+	}
+	return ""
+}
+
+func (x *StreamEvent_PermissionUpdated) GetOk() bool {
+	if x != nil {
+		return x.Ok
+	}
+	return false
+}
+
+// Sent when a message is pinned in a guild channel.
+//
+// Should only be sent to users who have the "message.view" permission for
+// the guild channel where the message was pinned.
+type StreamEvent_MessagePinned struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild where this event occured.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// Channel ID of the channel where this event occured.
+	ChannelId uint64 `protobuf:"varint,2,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
+	// Message ID of the message that was pinned.
+	MessageId uint64 `protobuf:"varint,3,opt,name=message_id,json=messageId,proto3" json:"message_id,omitempty"`
+}
+
+func (x *StreamEvent_MessagePinned) Reset() {
+	*x = StreamEvent_MessagePinned{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_stream_proto_msgTypes[29]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamEvent_MessagePinned) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamEvent_MessagePinned) ProtoMessage() {}
+
+func (x *StreamEvent_MessagePinned) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_stream_proto_msgTypes[29]
+	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 StreamEvent_MessagePinned.ProtoReflect.Descriptor instead.
+func (*StreamEvent_MessagePinned) Descriptor() ([]byte, []int) {
+	return file_chat_v1_stream_proto_rawDescGZIP(), []int{2, 23}
+}
+
+func (x *StreamEvent_MessagePinned) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *StreamEvent_MessagePinned) GetChannelId() uint64 {
+	if x != nil {
+		return x.ChannelId
+	}
+	return 0
+}
+
+func (x *StreamEvent_MessagePinned) GetMessageId() uint64 {
+	if x != nil {
+		return x.MessageId
+	}
+	return 0
+}
+
+// Sent when a message is unpinned in a guild channel.
+//
+// Should only be sent to users who have the "message.view" permission for
+// the guild channel where the message was unpinned.
+type StreamEvent_MessageUnpinned struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild where this event occured.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// Channel ID of the channel where this event occured.
+	ChannelId uint64 `protobuf:"varint,2,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
+	// Message ID of the message that was unpinned.
+	MessageId uint64 `protobuf:"varint,3,opt,name=message_id,json=messageId,proto3" json:"message_id,omitempty"`
+}
+
+func (x *StreamEvent_MessageUnpinned) Reset() {
+	*x = StreamEvent_MessageUnpinned{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_stream_proto_msgTypes[30]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamEvent_MessageUnpinned) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamEvent_MessageUnpinned) ProtoMessage() {}
+
+func (x *StreamEvent_MessageUnpinned) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_stream_proto_msgTypes[30]
+	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 StreamEvent_MessageUnpinned.ProtoReflect.Descriptor instead.
+func (*StreamEvent_MessageUnpinned) Descriptor() ([]byte, []int) {
+	return file_chat_v1_stream_proto_rawDescGZIP(), []int{2, 24}
+}
+
+func (x *StreamEvent_MessageUnpinned) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *StreamEvent_MessageUnpinned) GetChannelId() uint64 {
+	if x != nil {
+		return x.ChannelId
+	}
+	return 0
+}
+
+func (x *StreamEvent_MessageUnpinned) GetMessageId() uint64 {
+	if x != nil {
+		return x.MessageId
+	}
+	return 0
+}
+
+// Sent when a message's reaction is changed.
+type StreamEvent_ReactionUpdated struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild where this event occured.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// Channel ID of the channel where this event occured.
+	ChannelId uint64 `protobuf:"varint,2,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
+	// Message ID of the message that had a reaction updated.
+	MessageId uint64 `protobuf:"varint,3,opt,name=message_id,json=messageId,proto3" json:"message_id,omitempty"`
+	// The reaction.
+	Reaction *Reaction `protobuf:"bytes,4,opt,name=reaction,proto3" json:"reaction,omitempty"`
+}
+
+func (x *StreamEvent_ReactionUpdated) Reset() {
+	*x = StreamEvent_ReactionUpdated{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_stream_proto_msgTypes[31]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamEvent_ReactionUpdated) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamEvent_ReactionUpdated) ProtoMessage() {}
+
+func (x *StreamEvent_ReactionUpdated) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_stream_proto_msgTypes[31]
+	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 StreamEvent_ReactionUpdated.ProtoReflect.Descriptor instead.
+func (*StreamEvent_ReactionUpdated) Descriptor() ([]byte, []int) {
+	return file_chat_v1_stream_proto_rawDescGZIP(), []int{2, 25}
+}
+
+func (x *StreamEvent_ReactionUpdated) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *StreamEvent_ReactionUpdated) GetChannelId() uint64 {
+	if x != nil {
+		return x.ChannelId
+	}
+	return 0
+}
+
+func (x *StreamEvent_ReactionUpdated) GetMessageId() uint64 {
+	if x != nil {
+		return x.MessageId
+	}
+	return 0
+}
+
+func (x *StreamEvent_ReactionUpdated) GetReaction() *Reaction {
+	if x != nil {
+		return x.Reaction
+	}
+	return nil
+}
+
+// Sent when there's a new owner.
+type StreamEvent_OwnerAdded struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// User ID of the new owner.
+	UserId uint64 `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
+}
+
+func (x *StreamEvent_OwnerAdded) Reset() {
+	*x = StreamEvent_OwnerAdded{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_stream_proto_msgTypes[32]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamEvent_OwnerAdded) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamEvent_OwnerAdded) ProtoMessage() {}
+
+func (x *StreamEvent_OwnerAdded) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_stream_proto_msgTypes[32]
+	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 StreamEvent_OwnerAdded.ProtoReflect.Descriptor instead.
+func (*StreamEvent_OwnerAdded) Descriptor() ([]byte, []int) {
+	return file_chat_v1_stream_proto_rawDescGZIP(), []int{2, 26}
+}
+
+func (x *StreamEvent_OwnerAdded) GetUserId() uint64 {
+	if x != nil {
+		return x.UserId
+	}
+	return 0
+}
+
+// Sent when an owner gives up their ownership.
+type StreamEvent_OwnerRemoved struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// User ID of the user who is no longer owner.
+	UserId uint64 `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
+}
+
+func (x *StreamEvent_OwnerRemoved) Reset() {
+	*x = StreamEvent_OwnerRemoved{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_stream_proto_msgTypes[33]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamEvent_OwnerRemoved) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamEvent_OwnerRemoved) ProtoMessage() {}
+
+func (x *StreamEvent_OwnerRemoved) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_stream_proto_msgTypes[33]
+	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 StreamEvent_OwnerRemoved.ProtoReflect.Descriptor instead.
+func (*StreamEvent_OwnerRemoved) Descriptor() ([]byte, []int) {
+	return file_chat_v1_stream_proto_rawDescGZIP(), []int{2, 27}
+}
+
+func (x *StreamEvent_OwnerRemoved) GetUserId() uint64 {
+	if x != nil {
+		return x.UserId
+	}
+	return 0
+}
+
+// Sent when a guild invite is received.
+type StreamEvent_InviteReceived struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// ID of the invite received.
+	InviteId string `protobuf:"bytes,1,opt,name=invite_id,json=inviteId,proto3" json:"invite_id,omitempty"`
+	// Server ID of the server the inviter is on.
+	ServerId *string `protobuf:"bytes,2,opt,name=server_id,json=serverId,proto3,oneof" json:"server_id,omitempty"`
+	// User ID of the inviter.
+	InviterId uint64 `protobuf:"varint,3,opt,name=inviter_id,json=inviterId,proto3" json:"inviter_id,omitempty"`
+}
+
+func (x *StreamEvent_InviteReceived) Reset() {
+	*x = StreamEvent_InviteReceived{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_stream_proto_msgTypes[34]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamEvent_InviteReceived) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamEvent_InviteReceived) ProtoMessage() {}
+
+func (x *StreamEvent_InviteReceived) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_stream_proto_msgTypes[34]
+	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 StreamEvent_InviteReceived.ProtoReflect.Descriptor instead.
+func (*StreamEvent_InviteReceived) Descriptor() ([]byte, []int) {
+	return file_chat_v1_stream_proto_rawDescGZIP(), []int{2, 28}
+}
+
+func (x *StreamEvent_InviteReceived) GetInviteId() string {
+	if x != nil {
+		return x.InviteId
+	}
+	return ""
+}
+
+func (x *StreamEvent_InviteReceived) GetServerId() string {
+	if x != nil && x.ServerId != nil {
+		return *x.ServerId
+	}
+	return ""
+}
+
+func (x *StreamEvent_InviteReceived) GetInviterId() uint64 {
+	if x != nil {
+		return x.InviterId
+	}
+	return 0
+}
+
+// Sent when a guild invite is rejected by the invitee.
+type StreamEvent_InviteRejected struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Guild ID of the guild that this occured for.
+	GuildId uint64 `protobuf:"varint,1,opt,name=guild_id,json=guildId,proto3" json:"guild_id,omitempty"`
+	// ID of the invite rejected.
+	InviteId string `protobuf:"bytes,2,opt,name=invite_id,json=inviteId,proto3" json:"invite_id,omitempty"`
+	// User ID of the invitee.
+	UserId uint64 `protobuf:"varint,3,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
+}
+
+func (x *StreamEvent_InviteRejected) Reset() {
+	*x = StreamEvent_InviteRejected{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_chat_v1_stream_proto_msgTypes[35]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamEvent_InviteRejected) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamEvent_InviteRejected) ProtoMessage() {}
+
+func (x *StreamEvent_InviteRejected) ProtoReflect() protoreflect.Message {
+	mi := &file_chat_v1_stream_proto_msgTypes[35]
+	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 StreamEvent_InviteRejected.ProtoReflect.Descriptor instead.
+func (*StreamEvent_InviteRejected) Descriptor() ([]byte, []int) {
+	return file_chat_v1_stream_proto_rawDescGZIP(), []int{2, 29}
+}
+
+func (x *StreamEvent_InviteRejected) GetGuildId() uint64 {
+	if x != nil {
+		return x.GuildId
+	}
+	return 0
+}
+
+func (x *StreamEvent_InviteRejected) GetInviteId() string {
+	if x != nil {
+		return x.InviteId
+	}
+	return ""
+}
+
+func (x *StreamEvent_InviteRejected) GetUserId() uint64 {
+	if x != nil {
+		return x.UserId
+	}
+	return 0
+}
+
+var File_chat_v1_stream_proto protoreflect.FileDescriptor
+
+var file_chat_v1_stream_proto_rawDesc = []byte{
+	0x0a, 0x14, 0x63, 0x68, 0x61, 0x74, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c,
+	0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x1a, 0x1b, 0x68, 0x61, 0x72, 0x6d, 0x6f, 0x6e,
+	0x79, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x16, 0x63, 0x68, 0x61, 0x74, 0x2f, 0x76, 0x31, 0x2f, 0x63,
+	0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x14, 0x63,
+	0x68, 0x61, 0x74, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x1a, 0x16, 0x63, 0x68, 0x61, 0x74, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x65, 0x73,
+	0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x63, 0x68, 0x61,
+	0x74, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2f, 0x76, 0x31,
+	0x2f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x70,
+	0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xe5, 0x03, 0x0a, 0x13, 0x53, 0x74, 0x72, 0x65, 0x61,
+	0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x66,
+	0x0a, 0x12, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x67,
+	0x75, 0x69, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74,
+	0x72, 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x6f, 0x47, 0x75, 0x69,
+	0x6c, 0x64, 0x48, 0x00, 0x52, 0x10, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x54,
+	0x6f, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x6c, 0x0a, 0x14, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72,
+	0x69, 0x62, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e,
+	0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76,
+	0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x75, 0x62, 0x73,
+	0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x6f, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x00,
+	0x52, 0x12, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x6f, 0x41, 0x63, 0x74,
+	0x69, 0x6f, 0x6e, 0x73, 0x12, 0x88, 0x01, 0x0a, 0x1e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69,
+	0x62, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x68, 0x6f, 0x6d, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72,
+	0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31,
+	0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x6f,
+	0x48, 0x6f, 0x6d, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73,
+	0x48, 0x00, 0x52, 0x1b, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x6f, 0x48,
+	0x6f, 0x6d, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x1a,
+	0x2d, 0x0a, 0x10, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x6f, 0x47, 0x75,
+	0x69, 0x6c, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x1a, 0x14,
+	0x0a, 0x12, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x6f, 0x41, 0x63, 0x74,
+	0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x1d, 0x0a, 0x1b, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62,
+	0x65, 0x54, 0x6f, 0x48, 0x6f, 0x6d, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x45, 0x76, 0x65,
+	0x6e, 0x74, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xca,
+	0x01, 0x0a, 0x14, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x04, 0x63, 0x68, 0x61, 0x74, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c,
+	0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45,
+	0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x04, 0x63, 0x68, 0x61, 0x74, 0x12, 0x36, 0x0a, 0x05,
+	0x65, 0x6d, 0x6f, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e,
+	0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x05, 0x65,
+	0x6d, 0x6f, 0x74, 0x65, 0x12, 0x3c, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c,
+	0x2e, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65,
+	0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69,
+	0x6c, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0xb2, 0x34, 0x0a, 0x0b,
+	0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x5f, 0x0a, 0x13, 0x67,
+	0x75, 0x69, 0x6c, 0x64, 0x5f, 0x61, 0x64, 0x64, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x5f, 0x6c, 0x69,
+	0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65,
+	0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x41, 0x64, 0x64,
+	0x65, 0x64, 0x54, 0x6f, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x00, 0x52, 0x10, 0x67, 0x75, 0x69, 0x6c,
+	0x64, 0x41, 0x64, 0x64, 0x65, 0x64, 0x54, 0x6f, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x6b, 0x0a, 0x17,
+	0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x66, 0x72,
+	0x6f, 0x6d, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31,
+	0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x75, 0x69,
+	0x6c, 0x64, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4c, 0x69, 0x73,
+	0x74, 0x48, 0x00, 0x52, 0x14, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65,
+	0x64, 0x46, 0x72, 0x6f, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x5a, 0x0a, 0x10, 0x61, 0x63, 0x74,
+	0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x18, 0x03, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63,
+	0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65,
+	0x6e, 0x74, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d,
+	0x65, 0x64, 0x48, 0x00, 0x52, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x66,
+	0x6f, 0x72, 0x6d, 0x65, 0x64, 0x12, 0x4e, 0x0a, 0x0c, 0x73, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65,
+	0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53,
+	0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61,
+	0x67, 0x65, 0x53, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x65, 0x6e, 0x74, 0x4d, 0x65,
+	0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x55, 0x0a, 0x0e, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64, 0x5f,
+	0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31,
+	0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x65, 0x73,
+	0x73, 0x61, 0x67, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x0d, 0x65,
+	0x64, 0x69, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x57, 0x0a, 0x0f,
+	0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18,
+	0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c,
+	0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45,
+	0x76, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x44, 0x65, 0x6c, 0x65,
+	0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x0e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x4d, 0x65,
+	0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x57, 0x0a, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
+	0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76,
+	0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68,
+	0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x0e,
+	0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x55,
+	0x0a, 0x0e, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c,
+	0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f,
+	0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d,
+	0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x55, 0x70, 0x64,
+	0x61, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x0d, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64, 0x43, 0x68,
+	0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x57, 0x0a, 0x0f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64,
+	0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76,
+	0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68,
+	0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x0e,
+	0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x4f,
+	0x0a, 0x0c, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64, 0x5f, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x0a,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e,
+	0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76,
+	0x65, 0x6e, 0x74, 0x2e, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64,
+	0x48, 0x00, 0x52, 0x0b, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x12,
+	0x51, 0x0a, 0x0d, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x67, 0x75, 0x69, 0x6c, 0x64,
+	0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f,
+	0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d,
+	0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x74,
+	0x65, 0x64, 0x48, 0x00, 0x52, 0x0c, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x47, 0x75, 0x69,
+	0x6c, 0x64, 0x12, 0x51, 0x0a, 0x0d, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x6d,
+	0x62, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72,
+	0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x4a,
+	0x6f, 0x69, 0x6e, 0x65, 0x64, 0x48, 0x00, 0x52, 0x0c, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x4d,
+	0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x4b, 0x0a, 0x0b, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x6d, 0x65,
+	0x6d, 0x62, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74,
+	0x72, 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72,
+	0x4c, 0x65, 0x66, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x6c, 0x65, 0x66, 0x74, 0x4d, 0x65, 0x6d, 0x62,
+	0x65, 0x72, 0x12, 0x3e, 0x0a, 0x06, 0x74, 0x79, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x0e, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68,
+	0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e,
+	0x74, 0x2e, 0x54, 0x79, 0x70, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x06, 0x74, 0x79, 0x70, 0x69,
+	0x6e, 0x67, 0x12, 0x4e, 0x0a, 0x0c, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74,
+	0x65, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65,
+	0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x43, 0x72, 0x65, 0x61,
+	0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x0b, 0x72, 0x6f, 0x6c, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74,
+	0x65, 0x64, 0x12, 0x4e, 0x0a, 0x0c, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74,
+	0x65, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65,
+	0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x44, 0x65, 0x6c, 0x65,
+	0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x0b, 0x72, 0x6f, 0x6c, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74,
+	0x65, 0x64, 0x12, 0x48, 0x0a, 0x0a, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x6d, 0x6f, 0x76, 0x65, 0x64,
+	0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f,
+	0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d,
+	0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x6f, 0x76, 0x65, 0x64, 0x48,
+	0x00, 0x52, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x4d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x4e, 0x0a, 0x0c,
+	0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x12, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68,
+	0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e,
+	0x74, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52,
+	0x0b, 0x72, 0x6f, 0x6c, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x64, 0x0a, 0x12,
+	0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x6d, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74,
+	0x65, 0x64, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65,
+	0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x6d,
+	0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x48, 0x00,
+	0x52, 0x10, 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74,
+	0x65, 0x64, 0x12, 0x5e, 0x0a, 0x12, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x73,
+	0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76,
+	0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x73,
+	0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x48, 0x00,
+	0x52, 0x10, 0x75, 0x73, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74,
+	0x65, 0x64, 0x12, 0x60, 0x0a, 0x12, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e,
+	0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76,
+	0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x65,
+	0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x48,
+	0x00, 0x52, 0x11, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64,
+	0x61, 0x74, 0x65, 0x64, 0x12, 0x60, 0x0a, 0x12, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73,
+	0x5f, 0x72, 0x65, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x2f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74,
+	0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e,
+	0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x65,
+	0x64, 0x48, 0x00, 0x52, 0x11, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x6f,
+	0x72, 0x64, 0x65, 0x72, 0x65, 0x64, 0x12, 0x6e, 0x0a, 0x17, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64,
+	0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f,
+	0x6e, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63,
+	0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61,
+	0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x50, 0x6f,
+	0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52,
+	0x15, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x50, 0x6f,
+	0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x54, 0x0a, 0x0e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,
+	0x65, 0x5f, 0x70, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76,
+	0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x65,
+	0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x48, 0x00, 0x52, 0x0d, 0x6d,
+	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x12, 0x5a, 0x0a, 0x10,
+	0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x75, 0x6e, 0x70, 0x69, 0x6e, 0x6e, 0x65, 0x64,
+	0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f,
+	0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d,
+	0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x55, 0x6e, 0x70,
+	0x69, 0x6e, 0x6e, 0x65, 0x64, 0x48, 0x00, 0x52, 0x0f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
+	0x55, 0x6e, 0x70, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x12, 0x5a, 0x0a, 0x10, 0x72, 0x65, 0x61, 0x63,
+	0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x1a, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68,
+	0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e,
+	0x74, 0x2e, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
+	0x64, 0x48, 0x00, 0x52, 0x0f, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64,
+	0x61, 0x74, 0x65, 0x64, 0x12, 0x4b, 0x0a, 0x0b, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x64,
+	0x64, 0x65, 0x64, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72,
+	0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x41, 0x64,
+	0x64, 0x65, 0x64, 0x48, 0x00, 0x52, 0x0a, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x41, 0x64, 0x64, 0x65,
+	0x64, 0x12, 0x51, 0x0a, 0x0d, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76,
+	0x65, 0x64, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65,
+	0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x6d,
+	0x6f, 0x76, 0x65, 0x64, 0x48, 0x00, 0x52, 0x0c, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x6d,
+	0x6f, 0x76, 0x65, 0x64, 0x12, 0x57, 0x0a, 0x0f, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x5f, 0x72,
+	0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31,
+	0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x49, 0x6e, 0x76,
+	0x69, 0x74, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x48, 0x00, 0x52, 0x0e, 0x69,
+	0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x12, 0x57, 0x0a,
+	0x0f, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64,
+	0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f,
+	0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d,
+	0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6a, 0x65,
+	0x63, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x0e, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x65,
+	0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x1a, 0xc5, 0x01, 0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x73, 0x61,
+	0x67, 0x65, 0x53, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x07, 0x65, 0x63, 0x68, 0x6f, 0x5f, 0x69,
+	0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x06, 0x65, 0x63, 0x68, 0x6f, 0x49,
+	0x64, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12,
+	0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20,
+	0x01, 0x28, 0x04, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x1d,
+	0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01,
+	0x28, 0x04, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x33, 0x0a,
+	0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76,
+	0x31, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61,
+	0x67, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x65, 0x63, 0x68, 0x6f, 0x5f, 0x69, 0x64, 0x1a, 0xc8,
+	0x01, 0x0a, 0x0e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
+	0x64, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a,
+	0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04,
+	0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6d,
+	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52,
+	0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x64,
+	0x69, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x65,
+	0x64, 0x69, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x40, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x5f, 0x63,
+	0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e,
+	0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x64, 0x54, 0x65, 0x78, 0x74, 0x52, 0x0a, 0x6e,
+	0x65, 0x77, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x1a, 0x69, 0x0a, 0x0e, 0x4d, 0x65, 0x73,
+	0x73, 0x61, 0x67, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x67,
+	0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67,
+	0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65,
+	0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e,
+	0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
+	0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61,
+	0x67, 0x65, 0x49, 0x64, 0x1a, 0xa7, 0x02, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c,
+	0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64,
+	0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64,
+	0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49,
+	0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x42, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f,
+	0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63,
+	0x6f, 0x6c, 0x2e, 0x68, 0x61, 0x72, 0x6d, 0x6f, 0x6e, 0x79, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e,
+	0x76, 0x31, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52,
+	0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x04, 0x6b, 0x69, 0x6e,
+	0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63,
+	0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e,
+	0x65, 0x6c, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x43, 0x0a, 0x08,
+	0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x68, 0x61, 0x72, 0x6d, 0x6f, 0x6e,
+	0x79, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61,
+	0x74, 0x61, 0x48, 0x00, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x88, 0x01,
+	0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0xd4,
+	0x01, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
+	0x64, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a,
+	0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04,
+	0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x08, 0x6e,
+	0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52,
+	0x07, 0x6e, 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x4a, 0x0a, 0x0c, 0x6e,
+	0x65, 0x77, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x68, 0x61, 0x72,
+	0x6d, 0x6f, 0x6e, 0x79, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74,
+	0x61, 0x64, 0x61, 0x74, 0x61, 0x48, 0x01, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x4d, 0x65, 0x74, 0x61,
+	0x64, 0x61, 0x74, 0x61, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6e, 0x65, 0x77, 0x5f,
+	0x6e, 0x61, 0x6d, 0x65, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x6d, 0x65, 0x74,
+	0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0xb3, 0x01, 0x0a, 0x16, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65,
+	0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64,
+	0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63,
+	0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52,
+	0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x4e, 0x0a, 0x0c, 0x6e, 0x65,
+	0x77, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x68, 0x61, 0x72, 0x6d,
+	0x6f, 0x6e, 0x79, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x74, 0x65, 0x6d,
+	0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x50,
+	0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e,
+	0x65, 0x77, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x4f, 0x0a, 0x11, 0x43,
+	0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x65, 0x64,
+	0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63,
+	0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x04,
+	0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x73, 0x1a, 0x4a, 0x0a, 0x0e,
+	0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x19,
+	0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04,
+	0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61,
+	0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x63,
+	0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x1a, 0xe9, 0x01, 0x0a, 0x0c, 0x47, 0x75, 0x69,
+	0x6c, 0x64, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69,
+	0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69,
+	0x6c, 0x64, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x6e, 0x65, 0x77, 0x4e, 0x61, 0x6d,
+	0x65, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x69, 0x63, 0x74,
+	0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0a, 0x6e, 0x65, 0x77,
+	0x50, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x88, 0x01, 0x01, 0x12, 0x4a, 0x0a, 0x0c, 0x6e, 0x65,
+	0x77, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x22, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x68, 0x61, 0x72, 0x6d,
+	0x6f, 0x6e, 0x79, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61,
+	0x64, 0x61, 0x74, 0x61, 0x48, 0x02, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x4d, 0x65, 0x74, 0x61, 0x64,
+	0x61, 0x74, 0x61, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x6e,
+	0x61, 0x6d, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x69, 0x63, 0x74,
+	0x75, 0x72, 0x65, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x6d, 0x65, 0x74, 0x61,
+	0x64, 0x61, 0x74, 0x61, 0x1a, 0x29, 0x0a, 0x0c, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x44, 0x65, 0x6c,
+	0x65, 0x74, 0x65, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x1a,
+	0x46, 0x0a, 0x0c, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x4a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x12,
+	0x1b, 0x0a, 0x09, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x04, 0x52, 0x08, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08,
+	0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07,
+	0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x1a, 0x86, 0x01, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x62,
+	0x65, 0x72, 0x4c, 0x65, 0x66, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72,
+	0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6d, 0x65, 0x6d, 0x62, 0x65,
+	0x72, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x40,
+	0x0a, 0x0c, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03,
+	0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e,
+	0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x52, 0x65, 0x61,
+	0x73, 0x6f, 0x6e, 0x52, 0x0b, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e,
+	0x1a, 0x4d, 0x0a, 0x10, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x41, 0x64, 0x64, 0x65, 0x64, 0x54, 0x6f,
+	0x4c, 0x69, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12,
+	0x1e, 0x0a, 0x0a, 0x68, 0x6f, 0x6d, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x0a, 0x68, 0x6f, 0x6d, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x1a,
+	0x51, 0x0a, 0x14, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x46,
+	0x72, 0x6f, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64,
+	0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64,
+	0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x68, 0x6f, 0x6d, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x68, 0x6f, 0x6d, 0x65, 0x73, 0x65, 0x72, 0x76,
+	0x65, 0x72, 0x1a, 0xbe, 0x01, 0x0a, 0x0f, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72,
+	0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f,
+	0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49,
+	0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64,
+	0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03,
+	0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12,
+	0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04,
+	0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c,
+	0x6f, 0x61, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74,
+	0x69, 0x6f, 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c,
+	0x6f, 0x61, 0x64, 0x1a, 0x8a, 0x01, 0x0a, 0x09, 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x6f, 0x76, 0x65,
+	0x64, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07,
+	0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x72,
+	0x6f, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x49, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x6f, 0x73,
+	0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x68, 0x61, 0x72, 0x6d, 0x6f, 0x6e, 0x79, 0x74, 0x79,
+	0x70, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x50, 0x6f, 0x73, 0x69, 0x74,
+	0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e,
+	0x1a, 0x41, 0x0a, 0x0b, 0x52, 0x6f, 0x6c, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12,
+	0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x6f,
+	0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x72, 0x6f, 0x6c,
+	0x65, 0x49, 0x64, 0x1a, 0x9d, 0x01, 0x0a, 0x0b, 0x52, 0x6f, 0x6c, 0x65, 0x43, 0x72, 0x65, 0x61,
+	0x74, 0x65, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x17,
+	0x0a, 0x07, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52,
+	0x06, 0x72, 0x6f, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63,
+	0x6f, 0x6c, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x6c, 0x6f,
+	0x72, 0x12, 0x14, 0x0a, 0x05, 0x68, 0x6f, 0x69, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08,
+	0x52, 0x05, 0x68, 0x6f, 0x69, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x69, 0x6e, 0x67, 0x61,
+	0x62, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x70, 0x69, 0x6e, 0x67, 0x61,
+	0x62, 0x6c, 0x65, 0x1a, 0x87, 0x02, 0x0a, 0x0b, 0x52, 0x6f, 0x6c, 0x65, 0x55, 0x70, 0x64, 0x61,
+	0x74, 0x65, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x17,
+	0x0a, 0x07, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52,
+	0x06, 0x72, 0x6f, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x5f, 0x6e,
+	0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x6e, 0x65, 0x77,
+	0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x63,
+	0x6f, 0x6c, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x08, 0x6e, 0x65,
+	0x77, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x6e, 0x65, 0x77,
+	0x5f, 0x68, 0x6f, 0x69, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x08,
+	0x6e, 0x65, 0x77, 0x48, 0x6f, 0x69, 0x73, 0x74, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x6e,
+	0x65, 0x77, 0x5f, 0x70, 0x69, 0x6e, 0x67, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28,
+	0x08, 0x48, 0x03, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x50, 0x69, 0x6e, 0x67, 0x61, 0x62, 0x6c, 0x65,
+	0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65,
+	0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x42, 0x0c,
+	0x0a, 0x0a, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x68, 0x6f, 0x69, 0x73, 0x74, 0x42, 0x0f, 0x0a, 0x0d,
+	0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x69, 0x6e, 0x67, 0x61, 0x62, 0x6c, 0x65, 0x1a, 0xba, 0x01,
+	0x0a, 0x16, 0x52, 0x6f, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e,
+	0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c,
+	0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c,
+	0x64, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69,
+	0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e,
+	0x65, 0x6c, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x6f, 0x6c, 0x65, 0x5f,
+	0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x72, 0x6f, 0x6c, 0x65, 0x49, 0x64,
+	0x12, 0x39, 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x65, 0x72, 0x6d, 0x73, 0x18, 0x04, 0x20,
+	0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63,
+	0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f,
+	0x6e, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x50, 0x65, 0x72, 0x6d, 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f,
+	0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x1a, 0x68, 0x0a, 0x10, 0x55, 0x73,
+	0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x19,
+	0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04,
+	0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65,
+	0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72,
+	0x49, 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x69,
+	0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x04, 0x52, 0x0a, 0x6e, 0x65, 0x77, 0x52, 0x6f, 0x6c,
+	0x65, 0x49, 0x64, 0x73, 0x1a, 0x5b, 0x0a, 0x06, 0x54, 0x79, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x17,
+	0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52,
+	0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64,
+	0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64,
+	0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49,
+	0x64, 0x1a, 0x87, 0x01, 0x0a, 0x11, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e,
+	0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64,
+	0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64,
+	0x49, 0x64, 0x12, 0x22, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65,
+	0x6c, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x02,
+	0x6f, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x42, 0x0d, 0x0a, 0x0b,
+	0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x1a, 0x68, 0x0a, 0x0d, 0x4d,
+	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x12, 0x19, 0x0a, 0x08,
+	0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07,
+	0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e,
+	0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x63, 0x68, 0x61,
+	0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,
+	0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73,
+	0x61, 0x67, 0x65, 0x49, 0x64, 0x1a, 0x6a, 0x0a, 0x0f, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
+	0x55, 0x6e, 0x70, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c,
+	0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c,
+	0x64, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69,
+	0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c,
+	0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49,
+	0x64, 0x1a, 0xa2, 0x01, 0x0a, 0x0f, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70,
+	0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69,
+	0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64,
+	0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12,
+	0x1d, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20,
+	0x01, 0x28, 0x04, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x36,
+	0x0a, 0x08, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74,
+	0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x72, 0x65,
+	0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x25, 0x0a, 0x0a, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x41,
+	0x64, 0x64, 0x65, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x1a, 0x27, 0x0a,
+	0x0c, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x17, 0x0a,
+	0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06,
+	0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x1a, 0x7c, 0x0a, 0x0e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65,
+	0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x69,
+	0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6e, 0x76,
+	0x69, 0x74, 0x65, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x09, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f,
+	0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76,
+	0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x6e, 0x76, 0x69, 0x74,
+	0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x69, 0x6e, 0x76,
+	0x69, 0x74, 0x65, 0x72, 0x49, 0x64, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65,
+	0x72, 0x5f, 0x69, 0x64, 0x1a, 0x61, 0x0a, 0x0e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x65,
+	0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x5f,
+	0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x49,
+	0x64, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x49, 0x64, 0x12, 0x17,
+	0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52,
+	0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74,
+	0x42, 0xc1, 0x01, 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f,
+	0x6c, 0x2e, 0x63, 0x68, 0x61, 0x74, 0x2e, 0x76, 0x31, 0x42, 0x0b, 0x53, 0x74, 0x72, 0x65, 0x61,
+	0x6d, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,
+	0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x72, 0x6d, 0x6f, 0x6e, 0x79, 0x2d, 0x64, 0x65, 0x76,
+	0x65, 0x6c, 0x6f, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x73, 0x68, 0x69, 0x62, 0x73, 0x68, 0x69,
+	0x62, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x63, 0x68, 0x61, 0x74, 0x2f, 0x76, 0x31, 0x3b, 0x63, 0x68,
+	0x61, 0x74, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x50, 0x43, 0x58, 0xaa, 0x02, 0x10, 0x50, 0x72, 0x6f,
+	0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x74, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x10,
+	0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5c, 0x43, 0x68, 0x61, 0x74, 0x5c, 0x56, 0x31,
+	0xe2, 0x02, 0x1c, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5c, 0x43, 0x68, 0x61, 0x74,
+	0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea,
+	0x02, 0x12, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x3a, 0x3a, 0x43, 0x68, 0x61, 0x74,
+	0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_chat_v1_stream_proto_rawDescOnce sync.Once
+	file_chat_v1_stream_proto_rawDescData = file_chat_v1_stream_proto_rawDesc
+)
+
+func file_chat_v1_stream_proto_rawDescGZIP() []byte {
+	file_chat_v1_stream_proto_rawDescOnce.Do(func() {
+		file_chat_v1_stream_proto_rawDescData = protoimpl.X.CompressGZIP(file_chat_v1_stream_proto_rawDescData)
+	})
+	return file_chat_v1_stream_proto_rawDescData
+}
+
+var file_chat_v1_stream_proto_msgTypes = make([]protoimpl.MessageInfo, 36)
+var file_chat_v1_stream_proto_goTypes = []interface{}{
+	(*StreamEventsRequest)(nil),                             // 0: protocol.chat.v1.StreamEventsRequest
+	(*StreamEventsResponse)(nil),                            // 1: protocol.chat.v1.StreamEventsResponse
+	(*StreamEvent)(nil),                                     // 2: protocol.chat.v1.StreamEvent
+	(*StreamEventsRequest_SubscribeToGuild)(nil),            // 3: protocol.chat.v1.StreamEventsRequest.SubscribeToGuild
+	(*StreamEventsRequest_SubscribeToActions)(nil),          // 4: protocol.chat.v1.StreamEventsRequest.SubscribeToActions
+	(*StreamEventsRequest_SubscribeToHomeserverEvents)(nil), // 5: protocol.chat.v1.StreamEventsRequest.SubscribeToHomeserverEvents
+	(*StreamEvent_MessageSent)(nil),                         // 6: protocol.chat.v1.StreamEvent.MessageSent
+	(*StreamEvent_MessageUpdated)(nil),                      // 7: protocol.chat.v1.StreamEvent.MessageUpdated
+	(*StreamEvent_MessageDeleted)(nil),                      // 8: protocol.chat.v1.StreamEvent.MessageDeleted
+	(*StreamEvent_ChannelCreated)(nil),                      // 9: protocol.chat.v1.StreamEvent.ChannelCreated
+	(*StreamEvent_ChannelUpdated)(nil),                      // 10: protocol.chat.v1.StreamEvent.ChannelUpdated
+	(*StreamEvent_ChannelPositionUpdated)(nil),              // 11: protocol.chat.v1.StreamEvent.ChannelPositionUpdated
+	(*StreamEvent_ChannelsReordered)(nil),                   // 12: protocol.chat.v1.StreamEvent.ChannelsReordered
+	(*StreamEvent_ChannelDeleted)(nil),                      // 13: protocol.chat.v1.StreamEvent.ChannelDeleted
+	(*StreamEvent_GuildUpdated)(nil),                        // 14: protocol.chat.v1.StreamEvent.GuildUpdated
+	(*StreamEvent_GuildDeleted)(nil),                        // 15: protocol.chat.v1.StreamEvent.GuildDeleted
+	(*StreamEvent_MemberJoined)(nil),                        // 16: protocol.chat.v1.StreamEvent.MemberJoined
+	(*StreamEvent_MemberLeft)(nil),                          // 17: protocol.chat.v1.StreamEvent.MemberLeft
+	(*StreamEvent_GuildAddedToList)(nil),                    // 18: protocol.chat.v1.StreamEvent.GuildAddedToList
+	(*StreamEvent_GuildRemovedFromList)(nil),                // 19: protocol.chat.v1.StreamEvent.GuildRemovedFromList
+	(*StreamEvent_ActionPerformed)(nil),                     // 20: protocol.chat.v1.StreamEvent.ActionPerformed
+	(*StreamEvent_RoleMoved)(nil),                           // 21: protocol.chat.v1.StreamEvent.RoleMoved
+	(*StreamEvent_RoleDeleted)(nil),                         // 22: protocol.chat.v1.StreamEvent.RoleDeleted
+	(*StreamEvent_RoleCreated)(nil),                         // 23: protocol.chat.v1.StreamEvent.RoleCreated
+	(*StreamEvent_RoleUpdated)(nil),                         // 24: protocol.chat.v1.StreamEvent.RoleUpdated
+	(*StreamEvent_RolePermissionsUpdated)(nil),              // 25: protocol.chat.v1.StreamEvent.RolePermissionsUpdated
+	(*StreamEvent_UserRolesUpdated)(nil),                    // 26: protocol.chat.v1.StreamEvent.UserRolesUpdated
+	(*StreamEvent_Typing)(nil),                              // 27: protocol.chat.v1.StreamEvent.Typing
+	(*StreamEvent_PermissionUpdated)(nil),                   // 28: protocol.chat.v1.StreamEvent.PermissionUpdated
+	(*StreamEvent_MessagePinned)(nil),                       // 29: protocol.chat.v1.StreamEvent.MessagePinned
+	(*StreamEvent_MessageUnpinned)(nil),                     // 30: protocol.chat.v1.StreamEvent.MessageUnpinned
+	(*StreamEvent_ReactionUpdated)(nil),                     // 31: protocol.chat.v1.StreamEvent.ReactionUpdated
+	(*StreamEvent_OwnerAdded)(nil),                          // 32: protocol.chat.v1.StreamEvent.OwnerAdded
+	(*StreamEvent_OwnerRemoved)(nil),                        // 33: protocol.chat.v1.StreamEvent.OwnerRemoved
+	(*StreamEvent_InviteReceived)(nil),                      // 34: protocol.chat.v1.StreamEvent.InviteReceived
+	(*StreamEvent_InviteRejected)(nil),                      // 35: protocol.chat.v1.StreamEvent.InviteRejected
+	(*v1.StreamEvent)(nil),                                  // 36: protocol.emote.v1.StreamEvent
+	(*v11.StreamEvent)(nil),                                 // 37: protocol.profile.v1.StreamEvent
+	(*Message)(nil),                                         // 38: protocol.chat.v1.Message
+	(*FormattedText)(nil),                                   // 39: protocol.chat.v1.FormattedText
+	(*v12.ItemPosition)(nil),                                // 40: protocol.harmonytypes.v1.ItemPosition
+	(ChannelKind)(0),                                        // 41: protocol.chat.v1.ChannelKind
+	(*v12.Metadata)(nil),                                    // 42: protocol.harmonytypes.v1.Metadata
+	(LeaveReason)(0),                                        // 43: protocol.chat.v1.LeaveReason
+	(*ActionPayload)(nil),                                   // 44: protocol.chat.v1.ActionPayload
+	(*Permission)(nil),                                      // 45: protocol.chat.v1.Permission
+	(*Reaction)(nil),                                        // 46: protocol.chat.v1.Reaction
+}
+var file_chat_v1_stream_proto_depIdxs = []int32{
+	3,  // 0: protocol.chat.v1.StreamEventsRequest.subscribe_to_guild:type_name -> protocol.chat.v1.StreamEventsRequest.SubscribeToGuild
+	4,  // 1: protocol.chat.v1.StreamEventsRequest.subscribe_to_actions:type_name -> protocol.chat.v1.StreamEventsRequest.SubscribeToActions
+	5,  // 2: protocol.chat.v1.StreamEventsRequest.subscribe_to_homeserver_events:type_name -> protocol.chat.v1.StreamEventsRequest.SubscribeToHomeserverEvents
+	2,  // 3: protocol.chat.v1.StreamEventsResponse.chat:type_name -> protocol.chat.v1.StreamEvent
+	36, // 4: protocol.chat.v1.StreamEventsResponse.emote:type_name -> protocol.emote.v1.StreamEvent
+	37, // 5: protocol.chat.v1.StreamEventsResponse.profile:type_name -> protocol.profile.v1.StreamEvent
+	18, // 6: protocol.chat.v1.StreamEvent.guild_added_to_list:type_name -> protocol.chat.v1.StreamEvent.GuildAddedToList
+	19, // 7: protocol.chat.v1.StreamEvent.guild_removed_from_list:type_name -> protocol.chat.v1.StreamEvent.GuildRemovedFromList
+	20, // 8: protocol.chat.v1.StreamEvent.action_performed:type_name -> protocol.chat.v1.StreamEvent.ActionPerformed
+	6,  // 9: protocol.chat.v1.StreamEvent.sent_message:type_name -> protocol.chat.v1.StreamEvent.MessageSent
+	7,  // 10: protocol.chat.v1.StreamEvent.edited_message:type_name -> protocol.chat.v1.StreamEvent.MessageUpdated
+	8,  // 11: protocol.chat.v1.StreamEvent.deleted_message:type_name -> protocol.chat.v1.StreamEvent.MessageDeleted
+	9,  // 12: protocol.chat.v1.StreamEvent.created_channel:type_name -> protocol.chat.v1.StreamEvent.ChannelCreated
+	10, // 13: protocol.chat.v1.StreamEvent.edited_channel:type_name -> protocol.chat.v1.StreamEvent.ChannelUpdated
+	13, // 14: protocol.chat.v1.StreamEvent.deleted_channel:type_name -> protocol.chat.v1.StreamEvent.ChannelDeleted
+	14, // 15: protocol.chat.v1.StreamEvent.edited_guild:type_name -> protocol.chat.v1.StreamEvent.GuildUpdated
+	15, // 16: protocol.chat.v1.StreamEvent.deleted_guild:type_name -> protocol.chat.v1.StreamEvent.GuildDeleted
+	16, // 17: protocol.chat.v1.StreamEvent.joined_member:type_name -> protocol.chat.v1.StreamEvent.MemberJoined
+	17, // 18: protocol.chat.v1.StreamEvent.left_member:type_name -> protocol.chat.v1.StreamEvent.MemberLeft
+	27, // 19: protocol.chat.v1.StreamEvent.typing:type_name -> protocol.chat.v1.StreamEvent.Typing
+	23, // 20: protocol.chat.v1.StreamEvent.role_created:type_name -> protocol.chat.v1.StreamEvent.RoleCreated
+	22, // 21: protocol.chat.v1.StreamEvent.role_deleted:type_name -> protocol.chat.v1.StreamEvent.RoleDeleted
+	21, // 22: protocol.chat.v1.StreamEvent.role_moved:type_name -> protocol.chat.v1.StreamEvent.RoleMoved
+	24, // 23: protocol.chat.v1.StreamEvent.role_updated:type_name -> protocol.chat.v1.StreamEvent.RoleUpdated
+	25, // 24: protocol.chat.v1.StreamEvent.role_perms_updated:type_name -> protocol.chat.v1.StreamEvent.RolePermissionsUpdated
+	26, // 25: protocol.chat.v1.StreamEvent.user_roles_updated:type_name -> protocol.chat.v1.StreamEvent.UserRolesUpdated
+	28, // 26: protocol.chat.v1.StreamEvent.permission_updated:type_name -> protocol.chat.v1.StreamEvent.PermissionUpdated
+	12, // 27: protocol.chat.v1.StreamEvent.channels_reordered:type_name -> protocol.chat.v1.StreamEvent.ChannelsReordered
+	11, // 28: protocol.chat.v1.StreamEvent.edited_channel_position:type_name -> protocol.chat.v1.StreamEvent.ChannelPositionUpdated
+	29, // 29: protocol.chat.v1.StreamEvent.message_pinned:type_name -> protocol.chat.v1.StreamEvent.MessagePinned
+	30, // 30: protocol.chat.v1.StreamEvent.message_unpinned:type_name -> protocol.chat.v1.StreamEvent.MessageUnpinned
+	31, // 31: protocol.chat.v1.StreamEvent.reaction_updated:type_name -> protocol.chat.v1.StreamEvent.ReactionUpdated
+	32, // 32: protocol.chat.v1.StreamEvent.owner_added:type_name -> protocol.chat.v1.StreamEvent.OwnerAdded
+	33, // 33: protocol.chat.v1.StreamEvent.owner_removed:type_name -> protocol.chat.v1.StreamEvent.OwnerRemoved
+	34, // 34: protocol.chat.v1.StreamEvent.invite_received:type_name -> protocol.chat.v1.StreamEvent.InviteReceived
+	35, // 35: protocol.chat.v1.StreamEvent.invite_rejected:type_name -> protocol.chat.v1.StreamEvent.InviteRejected
+	38, // 36: protocol.chat.v1.StreamEvent.MessageSent.message:type_name -> protocol.chat.v1.Message
+	39, // 37: protocol.chat.v1.StreamEvent.MessageUpdated.new_content:type_name -> protocol.chat.v1.FormattedText
+	40, // 38: protocol.chat.v1.StreamEvent.ChannelCreated.position:type_name -> protocol.harmonytypes.v1.ItemPosition
+	41, // 39: protocol.chat.v1.StreamEvent.ChannelCreated.kind:type_name -> protocol.chat.v1.ChannelKind
+	42, // 40: protocol.chat.v1.StreamEvent.ChannelCreated.metadata:type_name -> protocol.harmonytypes.v1.Metadata
+	42, // 41: protocol.chat.v1.StreamEvent.ChannelUpdated.new_metadata:type_name -> protocol.harmonytypes.v1.Metadata
+	40, // 42: protocol.chat.v1.StreamEvent.ChannelPositionUpdated.new_position:type_name -> protocol.harmonytypes.v1.ItemPosition
+	42, // 43: protocol.chat.v1.StreamEvent.GuildUpdated.new_metadata:type_name -> protocol.harmonytypes.v1.Metadata
+	43, // 44: protocol.chat.v1.StreamEvent.MemberLeft.leave_reason:type_name -> protocol.chat.v1.LeaveReason
+	44, // 45: protocol.chat.v1.StreamEvent.ActionPerformed.payload:type_name -> protocol.chat.v1.ActionPayload
+	40, // 46: protocol.chat.v1.StreamEvent.RoleMoved.new_position:type_name -> protocol.harmonytypes.v1.ItemPosition
+	45, // 47: protocol.chat.v1.StreamEvent.RolePermissionsUpdated.new_perms:type_name -> protocol.chat.v1.Permission
+	46, // 48: protocol.chat.v1.StreamEvent.ReactionUpdated.reaction:type_name -> protocol.chat.v1.Reaction
+	49, // [49:49] is the sub-list for method output_type
+	49, // [49:49] is the sub-list for method input_type
+	49, // [49:49] is the sub-list for extension type_name
+	49, // [49:49] is the sub-list for extension extendee
+	0,  // [0:49] is the sub-list for field type_name
+}
+
+func init() { file_chat_v1_stream_proto_init() }
+func file_chat_v1_stream_proto_init() {
+	if File_chat_v1_stream_proto != nil {
+		return
+	}
+	file_chat_v1_channels_proto_init()
+	file_chat_v1_guilds_proto_init()
+	file_chat_v1_messages_proto_init()
+	file_chat_v1_permissions_proto_init()
+	if !protoimpl.UnsafeEnabled {
+		file_chat_v1_stream_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamEventsRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_stream_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamEventsResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_stream_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamEvent); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_stream_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamEventsRequest_SubscribeToGuild); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_stream_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamEventsRequest_SubscribeToActions); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_stream_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamEventsRequest_SubscribeToHomeserverEvents); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_stream_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamEvent_MessageSent); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_stream_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamEvent_MessageUpdated); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_stream_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamEvent_MessageDeleted); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_stream_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamEvent_ChannelCreated); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_stream_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamEvent_ChannelUpdated); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_stream_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamEvent_ChannelPositionUpdated); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_stream_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamEvent_ChannelsReordered); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_stream_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamEvent_ChannelDeleted); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_stream_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamEvent_GuildUpdated); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_stream_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamEvent_GuildDeleted); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_stream_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamEvent_MemberJoined); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_stream_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamEvent_MemberLeft); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_stream_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamEvent_GuildAddedToList); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_stream_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamEvent_GuildRemovedFromList); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_stream_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamEvent_ActionPerformed); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_stream_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamEvent_RoleMoved); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_stream_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamEvent_RoleDeleted); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_stream_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamEvent_RoleCreated); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_stream_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamEvent_RoleUpdated); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_stream_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamEvent_RolePermissionsUpdated); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_stream_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamEvent_UserRolesUpdated); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_stream_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamEvent_Typing); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_stream_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamEvent_PermissionUpdated); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_stream_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamEvent_MessagePinned); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_stream_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamEvent_MessageUnpinned); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_stream_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamEvent_ReactionUpdated); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_stream_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamEvent_OwnerAdded); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_stream_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamEvent_OwnerRemoved); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_stream_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamEvent_InviteReceived); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_chat_v1_stream_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamEvent_InviteRejected); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	file_chat_v1_stream_proto_msgTypes[0].OneofWrappers = []interface{}{
+		(*StreamEventsRequest_SubscribeToGuild_)(nil),
+		(*StreamEventsRequest_SubscribeToActions_)(nil),
+		(*StreamEventsRequest_SubscribeToHomeserverEvents_)(nil),
+	}
+	file_chat_v1_stream_proto_msgTypes[1].OneofWrappers = []interface{}{
+		(*StreamEventsResponse_Chat)(nil),
+		(*StreamEventsResponse_Emote)(nil),
+		(*StreamEventsResponse_Profile)(nil),
+	}
+	file_chat_v1_stream_proto_msgTypes[2].OneofWrappers = []interface{}{
+		(*StreamEvent_GuildAddedToList_)(nil),
+		(*StreamEvent_GuildRemovedFromList_)(nil),
+		(*StreamEvent_ActionPerformed_)(nil),
+		(*StreamEvent_SentMessage)(nil),
+		(*StreamEvent_EditedMessage)(nil),
+		(*StreamEvent_DeletedMessage)(nil),
+		(*StreamEvent_CreatedChannel)(nil),
+		(*StreamEvent_EditedChannel)(nil),
+		(*StreamEvent_DeletedChannel)(nil),
+		(*StreamEvent_EditedGuild)(nil),
+		(*StreamEvent_DeletedGuild)(nil),
+		(*StreamEvent_JoinedMember)(nil),
+		(*StreamEvent_LeftMember)(nil),
+		(*StreamEvent_Typing_)(nil),
+		(*StreamEvent_RoleCreated_)(nil),
+		(*StreamEvent_RoleDeleted_)(nil),
+		(*StreamEvent_RoleMoved_)(nil),
+		(*StreamEvent_RoleUpdated_)(nil),
+		(*StreamEvent_RolePermsUpdated)(nil),
+		(*StreamEvent_UserRolesUpdated_)(nil),
+		(*StreamEvent_PermissionUpdated_)(nil),
+		(*StreamEvent_ChannelsReordered_)(nil),
+		(*StreamEvent_EditedChannelPosition)(nil),
+		(*StreamEvent_MessagePinned_)(nil),
+		(*StreamEvent_MessageUnpinned_)(nil),
+		(*StreamEvent_ReactionUpdated_)(nil),
+		(*StreamEvent_OwnerAdded_)(nil),
+		(*StreamEvent_OwnerRemoved_)(nil),
+		(*StreamEvent_InviteReceived_)(nil),
+		(*StreamEvent_InviteRejected_)(nil),
+	}
+	file_chat_v1_stream_proto_msgTypes[6].OneofWrappers = []interface{}{}
+	file_chat_v1_stream_proto_msgTypes[9].OneofWrappers = []interface{}{}
+	file_chat_v1_stream_proto_msgTypes[10].OneofWrappers = []interface{}{}
+	file_chat_v1_stream_proto_msgTypes[11].OneofWrappers = []interface{}{}
+	file_chat_v1_stream_proto_msgTypes[14].OneofWrappers = []interface{}{}
+	file_chat_v1_stream_proto_msgTypes[24].OneofWrappers = []interface{}{}
+	file_chat_v1_stream_proto_msgTypes[25].OneofWrappers = []interface{}{}
+	file_chat_v1_stream_proto_msgTypes[28].OneofWrappers = []interface{}{}
+	file_chat_v1_stream_proto_msgTypes[34].OneofWrappers = []interface{}{}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_chat_v1_stream_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   36,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_chat_v1_stream_proto_goTypes,
+		DependencyIndexes: file_chat_v1_stream_proto_depIdxs,
+		MessageInfos:      file_chat_v1_stream_proto_msgTypes,
+	}.Build()
+	File_chat_v1_stream_proto = out.File
+	file_chat_v1_stream_proto_rawDesc = nil
+	file_chat_v1_stream_proto_goTypes = nil
+	file_chat_v1_stream_proto_depIdxs = nil
+}
diff --git a/vendor/github.com/harmony-development/shibshib/gen/emote/v1/emote.pb.go b/vendor/github.com/harmony-development/shibshib/gen/emote/v1/emote.pb.go
new file mode 100644
index 00000000..8fc9619d
--- /dev/null
+++ b/vendor/github.com/harmony-development/shibshib/gen/emote/v1/emote.pb.go
@@ -0,0 +1,175 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.23.0
+// 	protoc        v3.17.3
+// source: emote/v1/emote.proto
+
+package emotev1
+
+import (
+	proto "github.com/golang/protobuf/proto"
+	_ "github.com/harmony-development/shibshib/gen/harmonytypes/v1"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
+
+var File_emote_v1_emote_proto protoreflect.FileDescriptor
+
+var file_emote_v1_emote_proto_rawDesc = []byte{
+	0x0a, 0x14, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x6d, 0x6f, 0x74, 0x65,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c,
+	0x2e, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x1b, 0x68, 0x61, 0x72, 0x6d, 0x6f,
+	0x6e, 0x79, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x14, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2f, 0x76, 0x31,
+	0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x9f, 0x07, 0x0a,
+	0x0c, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x6f, 0x0a,
+	0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x61, 0x63, 0x6b,
+	0x12, 0x29, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x65, 0x6d, 0x6f, 0x74,
+	0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6d, 0x6f, 0x74, 0x65,
+	0x50, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e,
+	0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x05, 0x9a, 0x44, 0x02, 0x08, 0x01, 0x12, 0x69,
+	0x0a, 0x0d, 0x47, 0x65, 0x74, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x73, 0x12,
+	0x27, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x65, 0x6d, 0x6f, 0x74, 0x65,
+	0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x61, 0x63, 0x6b,
+	0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x63, 0x6f, 0x6c, 0x2e, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74,
+	0x45, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x22, 0x05, 0x9a, 0x44, 0x02, 0x08, 0x01, 0x12, 0x78, 0x0a, 0x12, 0x47, 0x65, 0x74,
+	0x45, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x73, 0x12,
+	0x2c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x65, 0x6d, 0x6f, 0x74, 0x65,
+	0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x61, 0x63, 0x6b,
+	0x45, 0x6d, 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x76,
+	0x31, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x45, 0x6d,
+	0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x05, 0x9a, 0x44,
+	0x02, 0x08, 0x01, 0x12, 0x6c, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x54,
+	0x6f, 0x50, 0x61, 0x63, 0x6b, 0x12, 0x28, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c,
+	0x2e, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x45, 0x6d, 0x6f,
+	0x74, 0x65, 0x54, 0x6f, 0x50, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+	0x29, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x65, 0x6d, 0x6f, 0x74, 0x65,
+	0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x54, 0x6f, 0x50, 0x61,
+	0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x05, 0x9a, 0x44, 0x02, 0x08,
+	0x01, 0x12, 0x6f, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6d, 0x6f, 0x74, 0x65,
+	0x50, 0x61, 0x63, 0x6b, 0x12, 0x29, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e,
+	0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45,
+	0x6d, 0x6f, 0x74, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+	0x2a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x65, 0x6d, 0x6f, 0x74, 0x65,
+	0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x50,
+	0x61, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x05, 0x9a, 0x44, 0x02,
+	0x08, 0x01, 0x12, 0x7b, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6d, 0x6f, 0x74,
+	0x65, 0x46, 0x72, 0x6f, 0x6d, 0x50, 0x61, 0x63, 0x6b, 0x12, 0x2d, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65,
+	0x6c, 0x65, 0x74, 0x65, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x50, 0x61, 0x63,
+	0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x63, 0x6f, 0x6c, 0x2e, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c,
+	0x65, 0x74, 0x65, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x50, 0x61, 0x63, 0x6b,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x05, 0x9a, 0x44, 0x02, 0x08, 0x01, 0x12,
+	0x6f, 0x0a, 0x0f, 0x44, 0x65, 0x71, 0x75, 0x69, 0x70, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x61,
+	0x63, 0x6b, 0x12, 0x29, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x65, 0x6d,
+	0x6f, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x71, 0x75, 0x69, 0x70, 0x45, 0x6d, 0x6f,
+	0x74, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x76,
+	0x31, 0x2e, 0x44, 0x65, 0x71, 0x75, 0x69, 0x70, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x61, 0x63,
+	0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x05, 0x9a, 0x44, 0x02, 0x08, 0x01,
+	0x12, 0x6c, 0x0a, 0x0e, 0x45, 0x71, 0x75, 0x69, 0x70, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x61,
+	0x63, 0x6b, 0x12, 0x28, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x65, 0x6d,
+	0x6f, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x71, 0x75, 0x69, 0x70, 0x45, 0x6d, 0x6f, 0x74,
+	0x65, 0x50, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x76, 0x31,
+	0x2e, 0x45, 0x71, 0x75, 0x69, 0x70, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x05, 0x9a, 0x44, 0x02, 0x08, 0x01, 0x42, 0xc7,
+	0x01, 0x0a, 0x15, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e,
+	0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x0a, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x50,
+	0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63,
+	0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x72, 0x6d, 0x6f, 0x6e, 0x79, 0x2d, 0x64, 0x65, 0x76, 0x65, 0x6c,
+	0x6f, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x73, 0x68, 0x69, 0x62, 0x73, 0x68, 0x69, 0x62, 0x2f,
+	0x67, 0x65, 0x6e, 0x2f, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x65, 0x6d, 0x6f,
+	0x74, 0x65, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x50, 0x45, 0x58, 0xaa, 0x02, 0x11, 0x50, 0x72, 0x6f,
+	0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x56, 0x31, 0xca, 0x02,
+	0x11, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5c, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x5c,
+	0x56, 0x31, 0xe2, 0x02, 0x1d, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5c, 0x45, 0x6d,
+	0x6f, 0x74, 0x65, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61,
+	0x74, 0x61, 0xea, 0x02, 0x13, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x3a, 0x3a, 0x45,
+	0x6d, 0x6f, 0x74, 0x65, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var file_emote_v1_emote_proto_goTypes = []interface{}{
+	(*CreateEmotePackRequest)(nil),      // 0: protocol.emote.v1.CreateEmotePackRequest
+	(*GetEmotePacksRequest)(nil),        // 1: protocol.emote.v1.GetEmotePacksRequest
+	(*GetEmotePackEmotesRequest)(nil),   // 2: protocol.emote.v1.GetEmotePackEmotesRequest
+	(*AddEmoteToPackRequest)(nil),       // 3: protocol.emote.v1.AddEmoteToPackRequest
+	(*DeleteEmotePackRequest)(nil),      // 4: protocol.emote.v1.DeleteEmotePackRequest
+	(*DeleteEmoteFromPackRequest)(nil),  // 5: protocol.emote.v1.DeleteEmoteFromPackRequest
+	(*DequipEmotePackRequest)(nil),      // 6: protocol.emote.v1.DequipEmotePackRequest
+	(*EquipEmotePackRequest)(nil),       // 7: protocol.emote.v1.EquipEmotePackRequest
+	(*CreateEmotePackResponse)(nil),     // 8: protocol.emote.v1.CreateEmotePackResponse
+	(*GetEmotePacksResponse)(nil),       // 9: protocol.emote.v1.GetEmotePacksResponse
+	(*GetEmotePackEmotesResponse)(nil),  // 10: protocol.emote.v1.GetEmotePackEmotesResponse
+	(*AddEmoteToPackResponse)(nil),      // 11: protocol.emote.v1.AddEmoteToPackResponse
+	(*DeleteEmotePackResponse)(nil),     // 12: protocol.emote.v1.DeleteEmotePackResponse
+	(*DeleteEmoteFromPackResponse)(nil), // 13: protocol.emote.v1.DeleteEmoteFromPackResponse
+	(*DequipEmotePackResponse)(nil),     // 14: protocol.emote.v1.DequipEmotePackResponse
+	(*EquipEmotePackResponse)(nil),      // 15: protocol.emote.v1.EquipEmotePackResponse
+}
+var file_emote_v1_emote_proto_depIdxs = []int32{
+	0,  // 0: protocol.emote.v1.EmoteService.CreateEmotePack:input_type -> protocol.emote.v1.CreateEmotePackRequest
+	1,  // 1: protocol.emote.v1.EmoteService.GetEmotePacks:input_type -> protocol.emote.v1.GetEmotePacksRequest
+	2,  // 2: protocol.emote.v1.EmoteService.GetEmotePackEmotes:input_type -> protocol.emote.v1.GetEmotePackEmotesRequest
+	3,  // 3: protocol.emote.v1.EmoteService.AddEmoteToPack:input_type -> protocol.emote.v1.AddEmoteToPackRequest
+	4,  // 4: protocol.emote.v1.EmoteService.DeleteEmotePack:input_type -> protocol.emote.v1.DeleteEmotePackRequest
+	5,  // 5: protocol.emote.v1.EmoteService.DeleteEmoteFromPack:input_type -> protocol.emote.v1.DeleteEmoteFromPackRequest
+	6,  // 6: protocol.emote.v1.EmoteService.DequipEmotePack:input_type -> protocol.emote.v1.DequipEmotePackRequest
+	7,  // 7: protocol.emote.v1.EmoteService.EquipEmotePack:input_type -> protocol.emote.v1.EquipEmotePackRequest
+	8,  // 8: protocol.emote.v1.EmoteService.CreateEmotePack:output_type -> protocol.emote.v1.CreateEmotePackResponse
+	9,  // 9: protocol.emote.v1.EmoteService.GetEmotePacks:output_type -> protocol.emote.v1.GetEmotePacksResponse
+	10, // 10: protocol.emote.v1.EmoteService.GetEmotePackEmotes:output_type -> protocol.emote.v1.GetEmotePackEmotesResponse
+	11, // 11: protocol.emote.v1.EmoteService.AddEmoteToPack:output_type -> protocol.emote.v1.AddEmoteToPackResponse
+	12, // 12: protocol.emote.v1.EmoteService.DeleteEmotePack:output_type -> protocol.emote.v1.DeleteEmotePackResponse
+	13, // 13: protocol.emote.v1.EmoteService.DeleteEmoteFromPack:output_type -> protocol.emote.v1.DeleteEmoteFromPackResponse
+	14, // 14: protocol.emote.v1.EmoteService.DequipEmotePack:output_type -> protocol.emote.v1.DequipEmotePackResponse
+	15, // 15: protocol.emote.v1.EmoteService.EquipEmotePack:output_type -> protocol.emote.v1.EquipEmotePackResponse
+	8,  // [8:16] is the sub-list for method output_type
+	0,  // [0:8] is the sub-list for method input_type
+	0,  // [0:0] is the sub-list for extension type_name
+	0,  // [0:0] is the sub-list for extension extendee
+	0,  // [0:0] is the sub-list for field type_name
+}
+
+func init() { file_emote_v1_emote_proto_init() }
+func file_emote_v1_emote_proto_init() {
+	if File_emote_v1_emote_proto != nil {
+		return
+	}
+	file_emote_v1_types_proto_init()
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_emote_v1_emote_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   0,
+			NumExtensions: 0,
+			NumServices:   1,
+		},
+		GoTypes:           file_emote_v1_emote_proto_goTypes,
+		DependencyIndexes: file_emote_v1_emote_proto_depIdxs,
+	}.Build()
+	File_emote_v1_emote_proto = out.File
+	file_emote_v1_emote_proto_rawDesc = nil
+	file_emote_v1_emote_proto_goTypes = nil
+	file_emote_v1_emote_proto_depIdxs = nil
+}
diff --git a/vendor/github.com/harmony-development/shibshib/gen/emote/v1/emote_hrpc_client.pb.go b/vendor/github.com/harmony-development/shibshib/gen/emote/v1/emote_hrpc_client.pb.go
new file mode 100644
index 00000000..ca1f81b8
--- /dev/null
+++ b/vendor/github.com/harmony-development/shibshib/gen/emote/v1/emote_hrpc_client.pb.go
@@ -0,0 +1,455 @@
+// Code generated by protoc-gen-go-hrpc. DO NOT EDIT.
+
+package emotev1
+
+import (
+	bytes "bytes"
+	context "context"
+	proto "google.golang.org/protobuf/proto"
+	ioutil "io/ioutil"
+	http "net/http"
+	httptest "net/http/httptest"
+)
+
+type EmoteServiceClient interface {
+	// Endpoint to create an emote pack.
+	CreateEmotePack(context.Context, *CreateEmotePackRequest) (*CreateEmotePackResponse, error)
+	// Endpoint to get the emote packs you have equipped.
+	GetEmotePacks(context.Context, *GetEmotePacksRequest) (*GetEmotePacksResponse, error)
+	// Endpoint to get the emotes in an emote pack.
+	GetEmotePackEmotes(context.Context, *GetEmotePackEmotesRequest) (*GetEmotePackEmotesResponse, error)
+	// Endpoint to add an emote to an emote pack that you own.
+	AddEmoteToPack(context.Context, *AddEmoteToPackRequest) (*AddEmoteToPackResponse, error)
+	// Endpoint to delete an emote pack that you own.
+	DeleteEmotePack(context.Context, *DeleteEmotePackRequest) (*DeleteEmotePackResponse, error)
+	// Endpoint to delete an emote from an emote pack.
+	DeleteEmoteFromPack(context.Context, *DeleteEmoteFromPackRequest) (*DeleteEmoteFromPackResponse, error)
+	// Endpoint to dequip an emote pack that you have equipped.
+	DequipEmotePack(context.Context, *DequipEmotePackRequest) (*DequipEmotePackResponse, error)
+	// Endpoint to equip an emote pack.
+	EquipEmotePack(context.Context, *EquipEmotePackRequest) (*EquipEmotePackResponse, error)
+}
+
+type HTTPEmoteServiceClient struct {
+	Client         http.Client
+	BaseURL        string
+	WebsocketProto string
+	WebsocketHost  string
+	Header         http.Header
+}
+
+func (client *HTTPEmoteServiceClient) CreateEmotePack(req *CreateEmotePackRequest) (*CreateEmotePackResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.emote.v1.EmoteService/CreateEmotePack", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &CreateEmotePackResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPEmoteServiceClient) GetEmotePacks(req *GetEmotePacksRequest) (*GetEmotePacksResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.emote.v1.EmoteService/GetEmotePacks", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &GetEmotePacksResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPEmoteServiceClient) GetEmotePackEmotes(req *GetEmotePackEmotesRequest) (*GetEmotePackEmotesResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.emote.v1.EmoteService/GetEmotePackEmotes", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &GetEmotePackEmotesResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPEmoteServiceClient) AddEmoteToPack(req *AddEmoteToPackRequest) (*AddEmoteToPackResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.emote.v1.EmoteService/AddEmoteToPack", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &AddEmoteToPackResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPEmoteServiceClient) DeleteEmotePack(req *DeleteEmotePackRequest) (*DeleteEmotePackResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.emote.v1.EmoteService/DeleteEmotePack", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &DeleteEmotePackResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPEmoteServiceClient) DeleteEmoteFromPack(req *DeleteEmoteFromPackRequest) (*DeleteEmoteFromPackResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.emote.v1.EmoteService/DeleteEmoteFromPack", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &DeleteEmoteFromPackResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPEmoteServiceClient) DequipEmotePack(req *DequipEmotePackRequest) (*DequipEmotePackResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.emote.v1.EmoteService/DequipEmotePack", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &DequipEmotePackResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPEmoteServiceClient) EquipEmotePack(req *EquipEmotePackRequest) (*EquipEmotePackResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.emote.v1.EmoteService/EquipEmotePack", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &EquipEmotePackResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+
+type HTTPTestEmoteServiceClient struct {
+	Client interface {
+		Test(*http.Request, ...int) (*http.Response, error)
+	}
+}
+
+func (client *HTTPTestEmoteServiceClient) CreateEmotePack(req *CreateEmotePackRequest) (*CreateEmotePackResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.emote.v1.EmoteService/CreateEmotePack", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &CreateEmotePackResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestEmoteServiceClient) GetEmotePacks(req *GetEmotePacksRequest) (*GetEmotePacksResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.emote.v1.EmoteService/GetEmotePacks", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &GetEmotePacksResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestEmoteServiceClient) GetEmotePackEmotes(req *GetEmotePackEmotesRequest) (*GetEmotePackEmotesResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.emote.v1.EmoteService/GetEmotePackEmotes", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &GetEmotePackEmotesResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestEmoteServiceClient) AddEmoteToPack(req *AddEmoteToPackRequest) (*AddEmoteToPackResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.emote.v1.EmoteService/AddEmoteToPack", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &AddEmoteToPackResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestEmoteServiceClient) DeleteEmotePack(req *DeleteEmotePackRequest) (*DeleteEmotePackResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.emote.v1.EmoteService/DeleteEmotePack", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &DeleteEmotePackResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestEmoteServiceClient) DeleteEmoteFromPack(req *DeleteEmoteFromPackRequest) (*DeleteEmoteFromPackResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.emote.v1.EmoteService/DeleteEmoteFromPack", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &DeleteEmoteFromPackResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestEmoteServiceClient) DequipEmotePack(req *DequipEmotePackRequest) (*DequipEmotePackResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.emote.v1.EmoteService/DequipEmotePack", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &DequipEmotePackResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestEmoteServiceClient) EquipEmotePack(req *EquipEmotePackRequest) (*EquipEmotePackResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.emote.v1.EmoteService/EquipEmotePack", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &EquipEmotePackResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
diff --git a/vendor/github.com/harmony-development/shibshib/gen/emote/v1/stream.pb.go b/vendor/github.com/harmony-development/shibshib/gen/emote/v1/stream.pb.go
new file mode 100644
index 00000000..8ffda36b
--- /dev/null
+++ b/vendor/github.com/harmony-development/shibshib/gen/emote/v1/stream.pb.go
@@ -0,0 +1,573 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.23.0
+// 	protoc        v3.17.3
+// source: emote/v1/stream.proto
+
+package emotev1
+
+import (
+	proto "github.com/golang/protobuf/proto"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
+
+// Event sent when an emote pack's information is changed.
+//
+// Should only be sent to users who have the pack equipped.
+type EmotePackUpdated struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// ID of the pack that was updated.
+	PackId uint64 `protobuf:"varint,1,opt,name=pack_id,json=packId,proto3" json:"pack_id,omitempty"`
+	// New pack name of the pack.
+	NewPackName *string `protobuf:"bytes,2,opt,name=new_pack_name,json=newPackName,proto3,oneof" json:"new_pack_name,omitempty"`
+}
+
+func (x *EmotePackUpdated) Reset() {
+	*x = EmotePackUpdated{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_emote_v1_stream_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EmotePackUpdated) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EmotePackUpdated) ProtoMessage() {}
+
+func (x *EmotePackUpdated) ProtoReflect() protoreflect.Message {
+	mi := &file_emote_v1_stream_proto_msgTypes[0]
+	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 EmotePackUpdated.ProtoReflect.Descriptor instead.
+func (*EmotePackUpdated) Descriptor() ([]byte, []int) {
+	return file_emote_v1_stream_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *EmotePackUpdated) GetPackId() uint64 {
+	if x != nil {
+		return x.PackId
+	}
+	return 0
+}
+
+func (x *EmotePackUpdated) GetNewPackName() string {
+	if x != nil && x.NewPackName != nil {
+		return *x.NewPackName
+	}
+	return ""
+}
+
+// Event sent when an emote pack is deleted.
+//
+// Should only be sent to users who have the pack equipped.
+// Should also be sent if a user dequips an emote pack, only to the user that dequipped it.
+type EmotePackDeleted struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// ID of the pack that was deleted.
+	PackId uint64 `protobuf:"varint,1,opt,name=pack_id,json=packId,proto3" json:"pack_id,omitempty"`
+}
+
+func (x *EmotePackDeleted) Reset() {
+	*x = EmotePackDeleted{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_emote_v1_stream_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EmotePackDeleted) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EmotePackDeleted) ProtoMessage() {}
+
+func (x *EmotePackDeleted) ProtoReflect() protoreflect.Message {
+	mi := &file_emote_v1_stream_proto_msgTypes[1]
+	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 EmotePackDeleted.ProtoReflect.Descriptor instead.
+func (*EmotePackDeleted) Descriptor() ([]byte, []int) {
+	return file_emote_v1_stream_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *EmotePackDeleted) GetPackId() uint64 {
+	if x != nil {
+		return x.PackId
+	}
+	return 0
+}
+
+// Event sent when an emote pack is added.
+//
+// Should only be sent to the user who equipped the pack.
+type EmotePackAdded struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Emote pack that was equipped by the user.
+	Pack *EmotePack `protobuf:"bytes,1,opt,name=pack,proto3" json:"pack,omitempty"`
+}
+
+func (x *EmotePackAdded) Reset() {
+	*x = EmotePackAdded{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_emote_v1_stream_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EmotePackAdded) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EmotePackAdded) ProtoMessage() {}
+
+func (x *EmotePackAdded) ProtoReflect() protoreflect.Message {
+	mi := &file_emote_v1_stream_proto_msgTypes[2]
+	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 EmotePackAdded.ProtoReflect.Descriptor instead.
+func (*EmotePackAdded) Descriptor() ([]byte, []int) {
+	return file_emote_v1_stream_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *EmotePackAdded) GetPack() *EmotePack {
+	if x != nil {
+		return x.Pack
+	}
+	return nil
+}
+
+// Event sent when an emote pack's emotes were changed.
+//
+// Should only be sent to users who have the pack equipped.
+type EmotePackEmotesUpdated struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// ID of the pack to update the emotes of.
+	PackId uint64 `protobuf:"varint,1,opt,name=pack_id,json=packId,proto3" json:"pack_id,omitempty"`
+	// The added emotes.
+	AddedEmotes []*Emote `protobuf:"bytes,2,rep,name=added_emotes,json=addedEmotes,proto3" json:"added_emotes,omitempty"`
+	// The names of the deleted emotes.
+	DeletedEmotes []string `protobuf:"bytes,3,rep,name=deleted_emotes,json=deletedEmotes,proto3" json:"deleted_emotes,omitempty"`
+}
+
+func (x *EmotePackEmotesUpdated) Reset() {
+	*x = EmotePackEmotesUpdated{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_emote_v1_stream_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EmotePackEmotesUpdated) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EmotePackEmotesUpdated) ProtoMessage() {}
+
+func (x *EmotePackEmotesUpdated) ProtoReflect() protoreflect.Message {
+	mi := &file_emote_v1_stream_proto_msgTypes[3]
+	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 EmotePackEmotesUpdated.ProtoReflect.Descriptor instead.
+func (*EmotePackEmotesUpdated) Descriptor() ([]byte, []int) {
+	return file_emote_v1_stream_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *EmotePackEmotesUpdated) GetPackId() uint64 {
+	if x != nil {
+		return x.PackId
+	}
+	return 0
+}
+
+func (x *EmotePackEmotesUpdated) GetAddedEmotes() []*Emote {
+	if x != nil {
+		return x.AddedEmotes
+	}
+	return nil
+}
+
+func (x *EmotePackEmotesUpdated) GetDeletedEmotes() []string {
+	if x != nil {
+		return x.DeletedEmotes
+	}
+	return nil
+}
+
+// Describes an emote service event.
+type StreamEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The event type.
+	//
+	// Types that are assignable to Event:
+	//	*StreamEvent_EmotePackAdded
+	//	*StreamEvent_EmotePackUpdated
+	//	*StreamEvent_EmotePackDeleted
+	//	*StreamEvent_EmotePackEmotesUpdated
+	Event isStreamEvent_Event `protobuf_oneof:"event"`
+}
+
+func (x *StreamEvent) Reset() {
+	*x = StreamEvent{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_emote_v1_stream_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamEvent) ProtoMessage() {}
+
+func (x *StreamEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_emote_v1_stream_proto_msgTypes[4]
+	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 StreamEvent.ProtoReflect.Descriptor instead.
+func (*StreamEvent) Descriptor() ([]byte, []int) {
+	return file_emote_v1_stream_proto_rawDescGZIP(), []int{4}
+}
+
+func (m *StreamEvent) GetEvent() isStreamEvent_Event {
+	if m != nil {
+		return m.Event
+	}
+	return nil
+}
+
+func (x *StreamEvent) GetEmotePackAdded() *EmotePackAdded {
+	if x, ok := x.GetEvent().(*StreamEvent_EmotePackAdded); ok {
+		return x.EmotePackAdded
+	}
+	return nil
+}
+
+func (x *StreamEvent) GetEmotePackUpdated() *EmotePackUpdated {
+	if x, ok := x.GetEvent().(*StreamEvent_EmotePackUpdated); ok {
+		return x.EmotePackUpdated
+	}
+	return nil
+}
+
+func (x *StreamEvent) GetEmotePackDeleted() *EmotePackDeleted {
+	if x, ok := x.GetEvent().(*StreamEvent_EmotePackDeleted); ok {
+		return x.EmotePackDeleted
+	}
+	return nil
+}
+
+func (x *StreamEvent) GetEmotePackEmotesUpdated() *EmotePackEmotesUpdated {
+	if x, ok := x.GetEvent().(*StreamEvent_EmotePackEmotesUpdated); ok {
+		return x.EmotePackEmotesUpdated
+	}
+	return nil
+}
+
+type isStreamEvent_Event interface {
+	isStreamEvent_Event()
+}
+
+type StreamEvent_EmotePackAdded struct {
+	// Send the emote pack added event.
+	EmotePackAdded *EmotePackAdded `protobuf:"bytes,1,opt,name=emote_pack_added,json=emotePackAdded,proto3,oneof"`
+}
+
+type StreamEvent_EmotePackUpdated struct {
+	// Send the emote pack updated event.
+	EmotePackUpdated *EmotePackUpdated `protobuf:"bytes,2,opt,name=emote_pack_updated,json=emotePackUpdated,proto3,oneof"`
+}
+
+type StreamEvent_EmotePackDeleted struct {
+	// Send the emote pack deleted event.
+	EmotePackDeleted *EmotePackDeleted `protobuf:"bytes,3,opt,name=emote_pack_deleted,json=emotePackDeleted,proto3,oneof"`
+}
+
+type StreamEvent_EmotePackEmotesUpdated struct {
+	// Send the emote pack emotes updated event.
+	EmotePackEmotesUpdated *EmotePackEmotesUpdated `protobuf:"bytes,4,opt,name=emote_pack_emotes_updated,json=emotePackEmotesUpdated,proto3,oneof"`
+}
+
+func (*StreamEvent_EmotePackAdded) isStreamEvent_Event() {}
+
+func (*StreamEvent_EmotePackUpdated) isStreamEvent_Event() {}
+
+func (*StreamEvent_EmotePackDeleted) isStreamEvent_Event() {}
+
+func (*StreamEvent_EmotePackEmotesUpdated) isStreamEvent_Event() {}
+
+var File_emote_v1_stream_proto protoreflect.FileDescriptor
+
+var file_emote_v1_stream_proto_rawDesc = []byte{
+	0x0a, 0x15, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x72, 0x65, 0x61,
+	0x6d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f,
+	0x6c, 0x2e, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x14, 0x65, 0x6d, 0x6f, 0x74,
+	0x65, 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x22, 0x66, 0x0a, 0x10, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x55, 0x70, 0x64,
+	0x61, 0x74, 0x65, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x69, 0x64, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x70, 0x61, 0x63, 0x6b, 0x49, 0x64, 0x12, 0x27, 0x0a,
+	0x0d, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x63, 0x6b, 0x4e,
+	0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x70,
+	0x61, 0x63, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x2b, 0x0a, 0x10, 0x45, 0x6d, 0x6f, 0x74,
+	0x65, 0x50, 0x61, 0x63, 0x6b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x17, 0x0a, 0x07,
+	0x70, 0x61, 0x63, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x70,
+	0x61, 0x63, 0x6b, 0x49, 0x64, 0x22, 0x42, 0x0a, 0x0e, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x61,
+	0x63, 0x6b, 0x41, 0x64, 0x64, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x04, 0x70, 0x61, 0x63, 0x6b, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c,
+	0x2e, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x50,
+	0x61, 0x63, 0x6b, 0x52, 0x04, 0x70, 0x61, 0x63, 0x6b, 0x22, 0x95, 0x01, 0x0a, 0x16, 0x45, 0x6d,
+	0x6f, 0x74, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x73, 0x55, 0x70, 0x64,
+	0x61, 0x74, 0x65, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x69, 0x64, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x70, 0x61, 0x63, 0x6b, 0x49, 0x64, 0x12, 0x3b, 0x0a,
+	0x0c, 0x61, 0x64, 0x64, 0x65, 0x64, 0x5f, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20,
+	0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x65,
+	0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x0b, 0x61,
+	0x64, 0x64, 0x65, 0x64, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x64, 0x65,
+	0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03,
+	0x28, 0x09, 0x52, 0x0d, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45, 0x6d, 0x6f, 0x74, 0x65,
+	0x73, 0x22, 0xf7, 0x02, 0x0a, 0x0b, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e,
+	0x74, 0x12, 0x4d, 0x0a, 0x10, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x5f,
+	0x61, 0x64, 0x64, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e,
+	0x45, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x65, 0x64, 0x48, 0x00,
+	0x52, 0x0e, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x65, 0x64,
+	0x12, 0x53, 0x0a, 0x12, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x75,
+	0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x76, 0x31,
+	0x2e, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
+	0x64, 0x48, 0x00, 0x52, 0x10, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x55, 0x70,
+	0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x53, 0x0a, 0x12, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x70,
+	0x61, 0x63, 0x6b, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x23, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x65, 0x6d, 0x6f,
+	0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x44,
+	0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x10, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x50,
+	0x61, 0x63, 0x6b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x66, 0x0a, 0x19, 0x65, 0x6d,
+	0x6f, 0x74, 0x65, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x73, 0x5f,
+	0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x76,
+	0x31, 0x2e, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x45, 0x6d, 0x6f, 0x74, 0x65,
+	0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x16, 0x65, 0x6d, 0x6f, 0x74,
+	0x65, 0x50, 0x61, 0x63, 0x6b, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74,
+	0x65, 0x64, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x42, 0xc8, 0x01, 0x0a, 0x15,
+	0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x65, 0x6d, 0x6f,
+	0x74, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x0b, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x50, 0x72, 0x6f,
+	0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,
+	0x2f, 0x68, 0x61, 0x72, 0x6d, 0x6f, 0x6e, 0x79, 0x2d, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70,
+	0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x73, 0x68, 0x69, 0x62, 0x73, 0x68, 0x69, 0x62, 0x2f, 0x67, 0x65,
+	0x6e, 0x2f, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x65, 0x6d, 0x6f, 0x74, 0x65,
+	0x76, 0x31, 0xa2, 0x02, 0x03, 0x50, 0x45, 0x58, 0xaa, 0x02, 0x11, 0x50, 0x72, 0x6f, 0x74, 0x6f,
+	0x63, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x11, 0x50,
+	0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5c, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x5c, 0x56, 0x31,
+	0xe2, 0x02, 0x1d, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5c, 0x45, 0x6d, 0x6f, 0x74,
+	0x65, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,
+	0xea, 0x02, 0x13, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x3a, 0x3a, 0x45, 0x6d, 0x6f,
+	0x74, 0x65, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_emote_v1_stream_proto_rawDescOnce sync.Once
+	file_emote_v1_stream_proto_rawDescData = file_emote_v1_stream_proto_rawDesc
+)
+
+func file_emote_v1_stream_proto_rawDescGZIP() []byte {
+	file_emote_v1_stream_proto_rawDescOnce.Do(func() {
+		file_emote_v1_stream_proto_rawDescData = protoimpl.X.CompressGZIP(file_emote_v1_stream_proto_rawDescData)
+	})
+	return file_emote_v1_stream_proto_rawDescData
+}
+
+var file_emote_v1_stream_proto_msgTypes = make([]protoimpl.MessageInfo, 5)
+var file_emote_v1_stream_proto_goTypes = []interface{}{
+	(*EmotePackUpdated)(nil),       // 0: protocol.emote.v1.EmotePackUpdated
+	(*EmotePackDeleted)(nil),       // 1: protocol.emote.v1.EmotePackDeleted
+	(*EmotePackAdded)(nil),         // 2: protocol.emote.v1.EmotePackAdded
+	(*EmotePackEmotesUpdated)(nil), // 3: protocol.emote.v1.EmotePackEmotesUpdated
+	(*StreamEvent)(nil),            // 4: protocol.emote.v1.StreamEvent
+	(*EmotePack)(nil),              // 5: protocol.emote.v1.EmotePack
+	(*Emote)(nil),                  // 6: protocol.emote.v1.Emote
+}
+var file_emote_v1_stream_proto_depIdxs = []int32{
+	5, // 0: protocol.emote.v1.EmotePackAdded.pack:type_name -> protocol.emote.v1.EmotePack
+	6, // 1: protocol.emote.v1.EmotePackEmotesUpdated.added_emotes:type_name -> protocol.emote.v1.Emote
+	2, // 2: protocol.emote.v1.StreamEvent.emote_pack_added:type_name -> protocol.emote.v1.EmotePackAdded
+	0, // 3: protocol.emote.v1.StreamEvent.emote_pack_updated:type_name -> protocol.emote.v1.EmotePackUpdated
+	1, // 4: protocol.emote.v1.StreamEvent.emote_pack_deleted:type_name -> protocol.emote.v1.EmotePackDeleted
+	3, // 5: protocol.emote.v1.StreamEvent.emote_pack_emotes_updated:type_name -> protocol.emote.v1.EmotePackEmotesUpdated
+	6, // [6:6] is the sub-list for method output_type
+	6, // [6:6] is the sub-list for method input_type
+	6, // [6:6] is the sub-list for extension type_name
+	6, // [6:6] is the sub-list for extension extendee
+	0, // [0:6] is the sub-list for field type_name
+}
+
+func init() { file_emote_v1_stream_proto_init() }
+func file_emote_v1_stream_proto_init() {
+	if File_emote_v1_stream_proto != nil {
+		return
+	}
+	file_emote_v1_types_proto_init()
+	if !protoimpl.UnsafeEnabled {
+		file_emote_v1_stream_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EmotePackUpdated); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_emote_v1_stream_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EmotePackDeleted); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_emote_v1_stream_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EmotePackAdded); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_emote_v1_stream_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EmotePackEmotesUpdated); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_emote_v1_stream_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamEvent); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	file_emote_v1_stream_proto_msgTypes[0].OneofWrappers = []interface{}{}
+	file_emote_v1_stream_proto_msgTypes[4].OneofWrappers = []interface{}{
+		(*StreamEvent_EmotePackAdded)(nil),
+		(*StreamEvent_EmotePackUpdated)(nil),
+		(*StreamEvent_EmotePackDeleted)(nil),
+		(*StreamEvent_EmotePackEmotesUpdated)(nil),
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_emote_v1_stream_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   5,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_emote_v1_stream_proto_goTypes,
+		DependencyIndexes: file_emote_v1_stream_proto_depIdxs,
+		MessageInfos:      file_emote_v1_stream_proto_msgTypes,
+	}.Build()
+	File_emote_v1_stream_proto = out.File
+	file_emote_v1_stream_proto_rawDesc = nil
+	file_emote_v1_stream_proto_goTypes = nil
+	file_emote_v1_stream_proto_depIdxs = nil
+}
diff --git a/vendor/github.com/harmony-development/shibshib/gen/emote/v1/types.pb.go b/vendor/github.com/harmony-development/shibshib/gen/emote/v1/types.pb.go
new file mode 100644
index 00000000..c8b37b32
--- /dev/null
+++ b/vendor/github.com/harmony-development/shibshib/gen/emote/v1/types.pb.go
@@ -0,0 +1,1262 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.23.0
+// 	protoc        v3.17.3
+// source: emote/v1/types.proto
+
+package emotev1
+
+import (
+	proto "github.com/golang/protobuf/proto"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
+
+// Data for a single pack of emotes.
+type EmotePack struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The ID of the pack.
+	PackId uint64 `protobuf:"varint,1,opt,name=pack_id,json=packId,proto3" json:"pack_id,omitempty"`
+	// The ID of the user who created the pack.
+	PackOwner uint64 `protobuf:"varint,2,opt,name=pack_owner,json=packOwner,proto3" json:"pack_owner,omitempty"`
+	// The name of the pack.
+	PackName string `protobuf:"bytes,3,opt,name=pack_name,json=packName,proto3" json:"pack_name,omitempty"`
+}
+
+func (x *EmotePack) Reset() {
+	*x = EmotePack{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_emote_v1_types_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EmotePack) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EmotePack) ProtoMessage() {}
+
+func (x *EmotePack) ProtoReflect() protoreflect.Message {
+	mi := &file_emote_v1_types_proto_msgTypes[0]
+	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 EmotePack.ProtoReflect.Descriptor instead.
+func (*EmotePack) Descriptor() ([]byte, []int) {
+	return file_emote_v1_types_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *EmotePack) GetPackId() uint64 {
+	if x != nil {
+		return x.PackId
+	}
+	return 0
+}
+
+func (x *EmotePack) GetPackOwner() uint64 {
+	if x != nil {
+		return x.PackOwner
+	}
+	return 0
+}
+
+func (x *EmotePack) GetPackName() string {
+	if x != nil {
+		return x.PackName
+	}
+	return ""
+}
+
+// Data for a single emote.
+type Emote struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The image ID of the emote. This is the ID of the image in the image store
+	// (same place attachments are stored).
+	ImageId string `protobuf:"bytes,1,opt,name=image_id,json=imageId,proto3" json:"image_id,omitempty"`
+	// The name of the emote.
+	Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
+}
+
+func (x *Emote) Reset() {
+	*x = Emote{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_emote_v1_types_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Emote) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Emote) ProtoMessage() {}
+
+func (x *Emote) ProtoReflect() protoreflect.Message {
+	mi := &file_emote_v1_types_proto_msgTypes[1]
+	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 Emote.ProtoReflect.Descriptor instead.
+func (*Emote) Descriptor() ([]byte, []int) {
+	return file_emote_v1_types_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *Emote) GetImageId() string {
+	if x != nil {
+		return x.ImageId
+	}
+	return ""
+}
+
+func (x *Emote) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+// Used in the `CreateEmotePack` endpoint.
+type CreateEmotePackRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// the name of the pack.
+	PackName string `protobuf:"bytes,1,opt,name=pack_name,json=packName,proto3" json:"pack_name,omitempty"`
+}
+
+func (x *CreateEmotePackRequest) Reset() {
+	*x = CreateEmotePackRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_emote_v1_types_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *CreateEmotePackRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CreateEmotePackRequest) ProtoMessage() {}
+
+func (x *CreateEmotePackRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_emote_v1_types_proto_msgTypes[2]
+	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 CreateEmotePackRequest.ProtoReflect.Descriptor instead.
+func (*CreateEmotePackRequest) Descriptor() ([]byte, []int) {
+	return file_emote_v1_types_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *CreateEmotePackRequest) GetPackName() string {
+	if x != nil {
+		return x.PackName
+	}
+	return ""
+}
+
+// Used in the `CreateEmotePack` endpoint.
+type CreateEmotePackResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The ID of the pack.
+	PackId uint64 `protobuf:"varint,1,opt,name=pack_id,json=packId,proto3" json:"pack_id,omitempty"`
+}
+
+func (x *CreateEmotePackResponse) Reset() {
+	*x = CreateEmotePackResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_emote_v1_types_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *CreateEmotePackResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CreateEmotePackResponse) ProtoMessage() {}
+
+func (x *CreateEmotePackResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_emote_v1_types_proto_msgTypes[3]
+	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 CreateEmotePackResponse.ProtoReflect.Descriptor instead.
+func (*CreateEmotePackResponse) Descriptor() ([]byte, []int) {
+	return file_emote_v1_types_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *CreateEmotePackResponse) GetPackId() uint64 {
+	if x != nil {
+		return x.PackId
+	}
+	return 0
+}
+
+// Used in the `GetEmotePacks` endpoint.
+type GetEmotePacksRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *GetEmotePacksRequest) Reset() {
+	*x = GetEmotePacksRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_emote_v1_types_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetEmotePacksRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetEmotePacksRequest) ProtoMessage() {}
+
+func (x *GetEmotePacksRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_emote_v1_types_proto_msgTypes[4]
+	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 GetEmotePacksRequest.ProtoReflect.Descriptor instead.
+func (*GetEmotePacksRequest) Descriptor() ([]byte, []int) {
+	return file_emote_v1_types_proto_rawDescGZIP(), []int{4}
+}
+
+// Used in the `GetEmotePacks` endpoint.
+type GetEmotePacksResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The list of emote packs.
+	Packs []*EmotePack `protobuf:"bytes,1,rep,name=packs,proto3" json:"packs,omitempty"`
+}
+
+func (x *GetEmotePacksResponse) Reset() {
+	*x = GetEmotePacksResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_emote_v1_types_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetEmotePacksResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetEmotePacksResponse) ProtoMessage() {}
+
+func (x *GetEmotePacksResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_emote_v1_types_proto_msgTypes[5]
+	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 GetEmotePacksResponse.ProtoReflect.Descriptor instead.
+func (*GetEmotePacksResponse) Descriptor() ([]byte, []int) {
+	return file_emote_v1_types_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *GetEmotePacksResponse) GetPacks() []*EmotePack {
+	if x != nil {
+		return x.Packs
+	}
+	return nil
+}
+
+// Used in the `GetEmotes` endpoint.
+type GetEmotePackEmotesRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The ID of the pack.
+	PackId uint64 `protobuf:"varint,1,opt,name=pack_id,json=packId,proto3" json:"pack_id,omitempty"`
+}
+
+func (x *GetEmotePackEmotesRequest) Reset() {
+	*x = GetEmotePackEmotesRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_emote_v1_types_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetEmotePackEmotesRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetEmotePackEmotesRequest) ProtoMessage() {}
+
+func (x *GetEmotePackEmotesRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_emote_v1_types_proto_msgTypes[6]
+	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 GetEmotePackEmotesRequest.ProtoReflect.Descriptor instead.
+func (*GetEmotePackEmotesRequest) Descriptor() ([]byte, []int) {
+	return file_emote_v1_types_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *GetEmotePackEmotesRequest) GetPackId() uint64 {
+	if x != nil {
+		return x.PackId
+	}
+	return 0
+}
+
+// Used in the `GetEmotes` endpoint.
+type GetEmotePackEmotesResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The list of emotes in the pack.
+	Emotes []*Emote `protobuf:"bytes,1,rep,name=emotes,proto3" json:"emotes,omitempty"`
+}
+
+func (x *GetEmotePackEmotesResponse) Reset() {
+	*x = GetEmotePackEmotesResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_emote_v1_types_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetEmotePackEmotesResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetEmotePackEmotesResponse) ProtoMessage() {}
+
+func (x *GetEmotePackEmotesResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_emote_v1_types_proto_msgTypes[7]
+	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 GetEmotePackEmotesResponse.ProtoReflect.Descriptor instead.
+func (*GetEmotePackEmotesResponse) Descriptor() ([]byte, []int) {
+	return file_emote_v1_types_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *GetEmotePackEmotesResponse) GetEmotes() []*Emote {
+	if x != nil {
+		return x.Emotes
+	}
+	return nil
+}
+
+// Used in the `AddEmoteToPack` endpoint.
+type AddEmoteToPackRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The ID of the pack.
+	PackId uint64 `protobuf:"varint,1,opt,name=pack_id,json=packId,proto3" json:"pack_id,omitempty"`
+	// The emote to add.
+	Emote *Emote `protobuf:"bytes,2,opt,name=emote,proto3" json:"emote,omitempty"`
+}
+
+func (x *AddEmoteToPackRequest) Reset() {
+	*x = AddEmoteToPackRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_emote_v1_types_proto_msgTypes[8]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *AddEmoteToPackRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*AddEmoteToPackRequest) ProtoMessage() {}
+
+func (x *AddEmoteToPackRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_emote_v1_types_proto_msgTypes[8]
+	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 AddEmoteToPackRequest.ProtoReflect.Descriptor instead.
+func (*AddEmoteToPackRequest) Descriptor() ([]byte, []int) {
+	return file_emote_v1_types_proto_rawDescGZIP(), []int{8}
+}
+
+func (x *AddEmoteToPackRequest) GetPackId() uint64 {
+	if x != nil {
+		return x.PackId
+	}
+	return 0
+}
+
+func (x *AddEmoteToPackRequest) GetEmote() *Emote {
+	if x != nil {
+		return x.Emote
+	}
+	return nil
+}
+
+// Used in the `AddEmoteToPack` endpoint.
+type AddEmoteToPackResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *AddEmoteToPackResponse) Reset() {
+	*x = AddEmoteToPackResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_emote_v1_types_proto_msgTypes[9]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *AddEmoteToPackResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*AddEmoteToPackResponse) ProtoMessage() {}
+
+func (x *AddEmoteToPackResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_emote_v1_types_proto_msgTypes[9]
+	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 AddEmoteToPackResponse.ProtoReflect.Descriptor instead.
+func (*AddEmoteToPackResponse) Descriptor() ([]byte, []int) {
+	return file_emote_v1_types_proto_rawDescGZIP(), []int{9}
+}
+
+// Used in the `DeleteEmoteFromPack` endpoint.
+type DeleteEmoteFromPackRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The ID of the pack.
+	PackId uint64 `protobuf:"varint,1,opt,name=pack_id,json=packId,proto3" json:"pack_id,omitempty"`
+	// The name of the emote to delete.
+	Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
+}
+
+func (x *DeleteEmoteFromPackRequest) Reset() {
+	*x = DeleteEmoteFromPackRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_emote_v1_types_proto_msgTypes[10]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DeleteEmoteFromPackRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeleteEmoteFromPackRequest) ProtoMessage() {}
+
+func (x *DeleteEmoteFromPackRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_emote_v1_types_proto_msgTypes[10]
+	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 DeleteEmoteFromPackRequest.ProtoReflect.Descriptor instead.
+func (*DeleteEmoteFromPackRequest) Descriptor() ([]byte, []int) {
+	return file_emote_v1_types_proto_rawDescGZIP(), []int{10}
+}
+
+func (x *DeleteEmoteFromPackRequest) GetPackId() uint64 {
+	if x != nil {
+		return x.PackId
+	}
+	return 0
+}
+
+func (x *DeleteEmoteFromPackRequest) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+// Used in the `DeleteEmoteFromPack` endpoint.
+type DeleteEmoteFromPackResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *DeleteEmoteFromPackResponse) Reset() {
+	*x = DeleteEmoteFromPackResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_emote_v1_types_proto_msgTypes[11]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DeleteEmoteFromPackResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeleteEmoteFromPackResponse) ProtoMessage() {}
+
+func (x *DeleteEmoteFromPackResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_emote_v1_types_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 DeleteEmoteFromPackResponse.ProtoReflect.Descriptor instead.
+func (*DeleteEmoteFromPackResponse) Descriptor() ([]byte, []int) {
+	return file_emote_v1_types_proto_rawDescGZIP(), []int{11}
+}
+
+// Used in the `DeleteEmotePack` endpoint.
+type DeleteEmotePackRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The ID of the pack.
+	PackId uint64 `protobuf:"varint,1,opt,name=pack_id,json=packId,proto3" json:"pack_id,omitempty"`
+}
+
+func (x *DeleteEmotePackRequest) Reset() {
+	*x = DeleteEmotePackRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_emote_v1_types_proto_msgTypes[12]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DeleteEmotePackRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeleteEmotePackRequest) ProtoMessage() {}
+
+func (x *DeleteEmotePackRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_emote_v1_types_proto_msgTypes[12]
+	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 DeleteEmotePackRequest.ProtoReflect.Descriptor instead.
+func (*DeleteEmotePackRequest) Descriptor() ([]byte, []int) {
+	return file_emote_v1_types_proto_rawDescGZIP(), []int{12}
+}
+
+func (x *DeleteEmotePackRequest) GetPackId() uint64 {
+	if x != nil {
+		return x.PackId
+	}
+	return 0
+}
+
+// Used in the `DeleteEmotePack` endpoint.
+type DeleteEmotePackResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *DeleteEmotePackResponse) Reset() {
+	*x = DeleteEmotePackResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_emote_v1_types_proto_msgTypes[13]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DeleteEmotePackResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeleteEmotePackResponse) ProtoMessage() {}
+
+func (x *DeleteEmotePackResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_emote_v1_types_proto_msgTypes[13]
+	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 DeleteEmotePackResponse.ProtoReflect.Descriptor instead.
+func (*DeleteEmotePackResponse) Descriptor() ([]byte, []int) {
+	return file_emote_v1_types_proto_rawDescGZIP(), []int{13}
+}
+
+// Used in the `DequipEmotePack` endpoint.
+type DequipEmotePackRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The ID of the pack.
+	PackId uint64 `protobuf:"varint,1,opt,name=pack_id,json=packId,proto3" json:"pack_id,omitempty"`
+}
+
+func (x *DequipEmotePackRequest) Reset() {
+	*x = DequipEmotePackRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_emote_v1_types_proto_msgTypes[14]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DequipEmotePackRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DequipEmotePackRequest) ProtoMessage() {}
+
+func (x *DequipEmotePackRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_emote_v1_types_proto_msgTypes[14]
+	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 DequipEmotePackRequest.ProtoReflect.Descriptor instead.
+func (*DequipEmotePackRequest) Descriptor() ([]byte, []int) {
+	return file_emote_v1_types_proto_rawDescGZIP(), []int{14}
+}
+
+func (x *DequipEmotePackRequest) GetPackId() uint64 {
+	if x != nil {
+		return x.PackId
+	}
+	return 0
+}
+
+// Used in the `DequipEmotePack` endpoint.
+type DequipEmotePackResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *DequipEmotePackResponse) Reset() {
+	*x = DequipEmotePackResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_emote_v1_types_proto_msgTypes[15]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DequipEmotePackResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DequipEmotePackResponse) ProtoMessage() {}
+
+func (x *DequipEmotePackResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_emote_v1_types_proto_msgTypes[15]
+	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 DequipEmotePackResponse.ProtoReflect.Descriptor instead.
+func (*DequipEmotePackResponse) Descriptor() ([]byte, []int) {
+	return file_emote_v1_types_proto_rawDescGZIP(), []int{15}
+}
+
+// Used in the `EquipEmotePack` endpoint.
+type EquipEmotePackRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The ID of the pack.
+	PackId uint64 `protobuf:"varint,1,opt,name=pack_id,json=packId,proto3" json:"pack_id,omitempty"`
+}
+
+func (x *EquipEmotePackRequest) Reset() {
+	*x = EquipEmotePackRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_emote_v1_types_proto_msgTypes[16]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EquipEmotePackRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EquipEmotePackRequest) ProtoMessage() {}
+
+func (x *EquipEmotePackRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_emote_v1_types_proto_msgTypes[16]
+	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 EquipEmotePackRequest.ProtoReflect.Descriptor instead.
+func (*EquipEmotePackRequest) Descriptor() ([]byte, []int) {
+	return file_emote_v1_types_proto_rawDescGZIP(), []int{16}
+}
+
+func (x *EquipEmotePackRequest) GetPackId() uint64 {
+	if x != nil {
+		return x.PackId
+	}
+	return 0
+}
+
+// Used in the `EquipEmotePack` endpoint.
+type EquipEmotePackResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *EquipEmotePackResponse) Reset() {
+	*x = EquipEmotePackResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_emote_v1_types_proto_msgTypes[17]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *EquipEmotePackResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EquipEmotePackResponse) ProtoMessage() {}
+
+func (x *EquipEmotePackResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_emote_v1_types_proto_msgTypes[17]
+	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 EquipEmotePackResponse.ProtoReflect.Descriptor instead.
+func (*EquipEmotePackResponse) Descriptor() ([]byte, []int) {
+	return file_emote_v1_types_proto_rawDescGZIP(), []int{17}
+}
+
+var File_emote_v1_types_proto protoreflect.FileDescriptor
+
+var file_emote_v1_types_proto_rawDesc = []byte{
+	0x0a, 0x14, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c,
+	0x2e, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x22, 0x60, 0x0a, 0x09, 0x45, 0x6d, 0x6f,
+	0x74, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x69,
+	0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x70, 0x61, 0x63, 0x6b, 0x49, 0x64, 0x12,
+	0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x04, 0x52, 0x09, 0x70, 0x61, 0x63, 0x6b, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x1b,
+	0x0a, 0x09, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x08, 0x70, 0x61, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x36, 0x0a, 0x05, 0x45,
+	0x6d, 0x6f, 0x74, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12,
+	0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,
+	0x61, 0x6d, 0x65, 0x22, 0x35, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6d, 0x6f,
+	0x74, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a,
+	0x09, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x08, 0x70, 0x61, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x32, 0x0a, 0x17, 0x43, 0x72,
+	0x65, 0x61, 0x74, 0x65, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x69, 0x64,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x70, 0x61, 0x63, 0x6b, 0x49, 0x64, 0x22, 0x16,
+	0x0a, 0x14, 0x47, 0x65, 0x74, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x73, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x4b, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6d, 0x6f,
+	0x74, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
+	0x32, 0x0a, 0x05, 0x70, 0x61, 0x63, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e,
+	0x76, 0x31, 0x2e, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x52, 0x05, 0x70, 0x61,
+	0x63, 0x6b, 0x73, 0x22, 0x34, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x50,
+	0x61, 0x63, 0x6b, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x12, 0x17, 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x04, 0x52, 0x06, 0x70, 0x61, 0x63, 0x6b, 0x49, 0x64, 0x22, 0x4e, 0x0a, 0x1a, 0x47, 0x65, 0x74,
+	0x45, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x73, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x06, 0x65, 0x6d, 0x6f, 0x74, 0x65,
+	0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63,
+	0x6f, 0x6c, 0x2e, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6d, 0x6f, 0x74,
+	0x65, 0x52, 0x06, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x73, 0x22, 0x60, 0x0a, 0x15, 0x41, 0x64, 0x64,
+	0x45, 0x6d, 0x6f, 0x74, 0x65, 0x54, 0x6f, 0x50, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x04, 0x52, 0x06, 0x70, 0x61, 0x63, 0x6b, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x05, 0x65,
+	0x6d, 0x6f, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45,
+	0x6d, 0x6f, 0x74, 0x65, 0x52, 0x05, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x22, 0x18, 0x0a, 0x16, 0x41,
+	0x64, 0x64, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x54, 0x6f, 0x50, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x49, 0x0a, 0x1a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45,
+	0x6d, 0x6f, 0x74, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x50, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x70, 0x61, 0x63, 0x6b, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04,
+	0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65,
+	0x22, 0x1d, 0x0a, 0x1b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x46,
+	0x72, 0x6f, 0x6d, 0x50, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
+	0x31, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x61,
+	0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x61, 0x63,
+	0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x70, 0x61, 0x63, 0x6b,
+	0x49, 0x64, 0x22, 0x19, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6d, 0x6f, 0x74,
+	0x65, 0x50, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x31, 0x0a,
+	0x16, 0x44, 0x65, 0x71, 0x75, 0x69, 0x70, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x61, 0x63, 0x6b,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x5f,
+	0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x70, 0x61, 0x63, 0x6b, 0x49, 0x64,
+	0x22, 0x19, 0x0a, 0x17, 0x44, 0x65, 0x71, 0x75, 0x69, 0x70, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x50,
+	0x61, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x0a, 0x15, 0x45,
+	0x71, 0x75, 0x69, 0x70, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x69, 0x64, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x70, 0x61, 0x63, 0x6b, 0x49, 0x64, 0x22, 0x18, 0x0a,
+	0x16, 0x45, 0x71, 0x75, 0x69, 0x70, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0xc7, 0x01, 0x0a, 0x15, 0x63, 0x6f, 0x6d, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x76,
+	0x31, 0x42, 0x0a, 0x54, 0x79, 0x70, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a,
+	0x3c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x72, 0x6d,
+	0x6f, 0x6e, 0x79, 0x2d, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x2f,
+	0x73, 0x68, 0x69, 0x62, 0x73, 0x68, 0x69, 0x62, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x65, 0x6d, 0x6f,
+	0x74, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x76, 0x31, 0xa2, 0x02, 0x03,
+	0x50, 0x45, 0x58, 0xaa, 0x02, 0x11, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x45,
+	0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x11, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63,
+	0x6f, 0x6c, 0x5c, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x1d, 0x50, 0x72,
+	0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5c, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x5c, 0x56, 0x31, 0x5c,
+	0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x13, 0x50, 0x72,
+	0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x3a, 0x3a, 0x45, 0x6d, 0x6f, 0x74, 0x65, 0x3a, 0x3a, 0x56,
+	0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_emote_v1_types_proto_rawDescOnce sync.Once
+	file_emote_v1_types_proto_rawDescData = file_emote_v1_types_proto_rawDesc
+)
+
+func file_emote_v1_types_proto_rawDescGZIP() []byte {
+	file_emote_v1_types_proto_rawDescOnce.Do(func() {
+		file_emote_v1_types_proto_rawDescData = protoimpl.X.CompressGZIP(file_emote_v1_types_proto_rawDescData)
+	})
+	return file_emote_v1_types_proto_rawDescData
+}
+
+var file_emote_v1_types_proto_msgTypes = make([]protoimpl.MessageInfo, 18)
+var file_emote_v1_types_proto_goTypes = []interface{}{
+	(*EmotePack)(nil),                   // 0: protocol.emote.v1.EmotePack
+	(*Emote)(nil),                       // 1: protocol.emote.v1.Emote
+	(*CreateEmotePackRequest)(nil),      // 2: protocol.emote.v1.CreateEmotePackRequest
+	(*CreateEmotePackResponse)(nil),     // 3: protocol.emote.v1.CreateEmotePackResponse
+	(*GetEmotePacksRequest)(nil),        // 4: protocol.emote.v1.GetEmotePacksRequest
+	(*GetEmotePacksResponse)(nil),       // 5: protocol.emote.v1.GetEmotePacksResponse
+	(*GetEmotePackEmotesRequest)(nil),   // 6: protocol.emote.v1.GetEmotePackEmotesRequest
+	(*GetEmotePackEmotesResponse)(nil),  // 7: protocol.emote.v1.GetEmotePackEmotesResponse
+	(*AddEmoteToPackRequest)(nil),       // 8: protocol.emote.v1.AddEmoteToPackRequest
+	(*AddEmoteToPackResponse)(nil),      // 9: protocol.emote.v1.AddEmoteToPackResponse
+	(*DeleteEmoteFromPackRequest)(nil),  // 10: protocol.emote.v1.DeleteEmoteFromPackRequest
+	(*DeleteEmoteFromPackResponse)(nil), // 11: protocol.emote.v1.DeleteEmoteFromPackResponse
+	(*DeleteEmotePackRequest)(nil),      // 12: protocol.emote.v1.DeleteEmotePackRequest
+	(*DeleteEmotePackResponse)(nil),     // 13: protocol.emote.v1.DeleteEmotePackResponse
+	(*DequipEmotePackRequest)(nil),      // 14: protocol.emote.v1.DequipEmotePackRequest
+	(*DequipEmotePackResponse)(nil),     // 15: protocol.emote.v1.DequipEmotePackResponse
+	(*EquipEmotePackRequest)(nil),       // 16: protocol.emote.v1.EquipEmotePackRequest
+	(*EquipEmotePackResponse)(nil),      // 17: protocol.emote.v1.EquipEmotePackResponse
+}
+var file_emote_v1_types_proto_depIdxs = []int32{
+	0, // 0: protocol.emote.v1.GetEmotePacksResponse.packs:type_name -> protocol.emote.v1.EmotePack
+	1, // 1: protocol.emote.v1.GetEmotePackEmotesResponse.emotes:type_name -> protocol.emote.v1.Emote
+	1, // 2: protocol.emote.v1.AddEmoteToPackRequest.emote:type_name -> protocol.emote.v1.Emote
+	3, // [3:3] is the sub-list for method output_type
+	3, // [3:3] is the sub-list for method input_type
+	3, // [3:3] is the sub-list for extension type_name
+	3, // [3:3] is the sub-list for extension extendee
+	0, // [0:3] is the sub-list for field type_name
+}
+
+func init() { file_emote_v1_types_proto_init() }
+func file_emote_v1_types_proto_init() {
+	if File_emote_v1_types_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_emote_v1_types_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EmotePack); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_emote_v1_types_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Emote); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_emote_v1_types_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*CreateEmotePackRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_emote_v1_types_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*CreateEmotePackResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_emote_v1_types_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetEmotePacksRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_emote_v1_types_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetEmotePacksResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_emote_v1_types_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetEmotePackEmotesRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_emote_v1_types_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetEmotePackEmotesResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_emote_v1_types_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*AddEmoteToPackRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_emote_v1_types_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*AddEmoteToPackResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_emote_v1_types_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DeleteEmoteFromPackRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_emote_v1_types_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DeleteEmoteFromPackResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_emote_v1_types_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DeleteEmotePackRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_emote_v1_types_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DeleteEmotePackResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_emote_v1_types_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DequipEmotePackRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_emote_v1_types_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DequipEmotePackResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_emote_v1_types_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EquipEmotePackRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_emote_v1_types_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*EquipEmotePackResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_emote_v1_types_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   18,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_emote_v1_types_proto_goTypes,
+		DependencyIndexes: file_emote_v1_types_proto_depIdxs,
+		MessageInfos:      file_emote_v1_types_proto_msgTypes,
+	}.Build()
+	File_emote_v1_types_proto = out.File
+	file_emote_v1_types_proto_rawDesc = nil
+	file_emote_v1_types_proto_goTypes = nil
+	file_emote_v1_types_proto_depIdxs = nil
+}
diff --git a/vendor/github.com/harmony-development/shibshib/gen/harmonytypes/v1/types.pb.go b/vendor/github.com/harmony-development/shibshib/gen/harmonytypes/v1/types.pb.go
new file mode 100644
index 00000000..d4d6b07a
--- /dev/null
+++ b/vendor/github.com/harmony-development/shibshib/gen/harmonytypes/v1/types.pb.go
@@ -0,0 +1,754 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.23.0
+// 	protoc        v3.17.3
+// source: harmonytypes/v1/types.proto
+
+package harmonytypesv1
+
+import (
+	proto "github.com/golang/protobuf/proto"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	descriptorpb "google.golang.org/protobuf/types/descriptorpb"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
+
+// The position
+type ItemPosition_Position int32
+
+const (
+	// The position is before the item
+	ItemPosition_POSITION_BEFORE_UNSPECIFIED ItemPosition_Position = 0
+	// The position is after the item
+	ItemPosition_POSITION_AFTER ItemPosition_Position = 1
+)
+
+// Enum value maps for ItemPosition_Position.
+var (
+	ItemPosition_Position_name = map[int32]string{
+		0: "POSITION_BEFORE_UNSPECIFIED",
+		1: "POSITION_AFTER",
+	}
+	ItemPosition_Position_value = map[string]int32{
+		"POSITION_BEFORE_UNSPECIFIED": 0,
+		"POSITION_AFTER":              1,
+	}
+)
+
+func (x ItemPosition_Position) Enum() *ItemPosition_Position {
+	p := new(ItemPosition_Position)
+	*p = x
+	return p
+}
+
+func (x ItemPosition_Position) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (ItemPosition_Position) Descriptor() protoreflect.EnumDescriptor {
+	return file_harmonytypes_v1_types_proto_enumTypes[0].Descriptor()
+}
+
+func (ItemPosition_Position) Type() protoreflect.EnumType {
+	return &file_harmonytypes_v1_types_proto_enumTypes[0]
+}
+
+func (x ItemPosition_Position) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use ItemPosition_Position.Descriptor instead.
+func (ItemPosition_Position) EnumDescriptor() ([]byte, []int) {
+	return file_harmonytypes_v1_types_proto_rawDescGZIP(), []int{6, 0}
+}
+
+// Metadata for methods. These are set in individual RPC endpoints and are
+// typically used by servers.
+type HarmonyMethodMetadata struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// whether the method requires authentication.
+	RequiresAuthentication bool `protobuf:"varint,1,opt,name=requires_authentication,json=requiresAuthentication,proto3" json:"requires_authentication,omitempty"`
+	// whether the method allows federation or not.
+	RequiresLocal bool `protobuf:"varint,2,opt,name=requires_local,json=requiresLocal,proto3" json:"requires_local,omitempty"`
+	// the permission nodes required to invoke the method.
+	RequiresPermissionNode string `protobuf:"bytes,3,opt,name=requires_permission_node,json=requiresPermissionNode,proto3" json:"requires_permission_node,omitempty"`
+	// whether the method requires owner
+	RequiresOwner bool `protobuf:"varint,4,opt,name=requires_owner,json=requiresOwner,proto3" json:"requires_owner,omitempty"`
+}
+
+func (x *HarmonyMethodMetadata) Reset() {
+	*x = HarmonyMethodMetadata{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_harmonytypes_v1_types_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *HarmonyMethodMetadata) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*HarmonyMethodMetadata) ProtoMessage() {}
+
+func (x *HarmonyMethodMetadata) ProtoReflect() protoreflect.Message {
+	mi := &file_harmonytypes_v1_types_proto_msgTypes[0]
+	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 HarmonyMethodMetadata.ProtoReflect.Descriptor instead.
+func (*HarmonyMethodMetadata) Descriptor() ([]byte, []int) {
+	return file_harmonytypes_v1_types_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *HarmonyMethodMetadata) GetRequiresAuthentication() bool {
+	if x != nil {
+		return x.RequiresAuthentication
+	}
+	return false
+}
+
+func (x *HarmonyMethodMetadata) GetRequiresLocal() bool {
+	if x != nil {
+		return x.RequiresLocal
+	}
+	return false
+}
+
+func (x *HarmonyMethodMetadata) GetRequiresPermissionNode() string {
+	if x != nil {
+		return x.RequiresPermissionNode
+	}
+	return ""
+}
+
+func (x *HarmonyMethodMetadata) GetRequiresOwner() bool {
+	if x != nil {
+		return x.RequiresOwner
+	}
+	return false
+}
+
+// Anything holds anything
+type Anything struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Kind is the kind of the message
+	Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"`
+	// Body is the serialised bytes
+	Body []byte `protobuf:"bytes,2,opt,name=body,proto3" json:"body,omitempty"`
+}
+
+func (x *Anything) Reset() {
+	*x = Anything{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_harmonytypes_v1_types_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Anything) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Anything) ProtoMessage() {}
+
+func (x *Anything) ProtoReflect() protoreflect.Message {
+	mi := &file_harmonytypes_v1_types_proto_msgTypes[1]
+	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 Anything.ProtoReflect.Descriptor instead.
+func (*Anything) Descriptor() ([]byte, []int) {
+	return file_harmonytypes_v1_types_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *Anything) GetKind() string {
+	if x != nil {
+		return x.Kind
+	}
+	return ""
+}
+
+func (x *Anything) GetBody() []byte {
+	if x != nil {
+		return x.Body
+	}
+	return nil
+}
+
+// Metadata type used by many messages.
+type Metadata struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Kind of this metadata.
+	Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"`
+	// A map containing information.
+	Extension map[string]*Anything `protobuf:"bytes,2,rep,name=extension,proto3" json:"extension,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+}
+
+func (x *Metadata) Reset() {
+	*x = Metadata{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_harmonytypes_v1_types_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Metadata) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Metadata) ProtoMessage() {}
+
+func (x *Metadata) ProtoReflect() protoreflect.Message {
+	mi := &file_harmonytypes_v1_types_proto_msgTypes[2]
+	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 Metadata.ProtoReflect.Descriptor instead.
+func (*Metadata) Descriptor() ([]byte, []int) {
+	return file_harmonytypes_v1_types_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *Metadata) GetKind() string {
+	if x != nil {
+		return x.Kind
+	}
+	return ""
+}
+
+func (x *Metadata) GetExtension() map[string]*Anything {
+	if x != nil {
+		return x.Extension
+	}
+	return nil
+}
+
+// Error type that will be returned by servers.
+type Error struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The identifier of this error, can be used as an i18n key.
+	Identifier string `protobuf:"bytes,1,opt,name=identifier,proto3" json:"identifier,omitempty"`
+	// A (usually english) human message for this error.
+	HumanMessage string `protobuf:"bytes,2,opt,name=human_message,json=humanMessage,proto3" json:"human_message,omitempty"`
+	// More details about this message. Is dependent on the endpoint.
+	MoreDetails []byte `protobuf:"bytes,3,opt,name=more_details,json=moreDetails,proto3" json:"more_details,omitempty"`
+}
+
+func (x *Error) Reset() {
+	*x = Error{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_harmonytypes_v1_types_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Error) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Error) ProtoMessage() {}
+
+func (x *Error) ProtoReflect() protoreflect.Message {
+	mi := &file_harmonytypes_v1_types_proto_msgTypes[3]
+	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 Error.ProtoReflect.Descriptor instead.
+func (*Error) Descriptor() ([]byte, []int) {
+	return file_harmonytypes_v1_types_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *Error) GetIdentifier() string {
+	if x != nil {
+		return x.Identifier
+	}
+	return ""
+}
+
+func (x *Error) GetHumanMessage() string {
+	if x != nil {
+		return x.HumanMessage
+	}
+	return ""
+}
+
+func (x *Error) GetMoreDetails() []byte {
+	if x != nil {
+		return x.MoreDetails
+	}
+	return nil
+}
+
+// Token that will be used for authentication.
+type Token struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Ed25519 signature of the following serialized protobuf data, signed
+	// with a private key. Which private key used to sign will be described
+	// in the documentation.
+	//
+	// Has to be 64 bytes long, otherwise it will be rejected.
+	Sig []byte `protobuf:"bytes,1,opt,name=sig,proto3" json:"sig,omitempty"`
+	// Serialized protobuf data.
+	// The protobuf type of this serialized data is dependent on the API endpoint
+	// used.
+	Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"`
+}
+
+func (x *Token) Reset() {
+	*x = Token{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_harmonytypes_v1_types_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Token) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Token) ProtoMessage() {}
+
+func (x *Token) ProtoReflect() protoreflect.Message {
+	mi := &file_harmonytypes_v1_types_proto_msgTypes[4]
+	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 Token.ProtoReflect.Descriptor instead.
+func (*Token) Descriptor() ([]byte, []int) {
+	return file_harmonytypes_v1_types_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *Token) GetSig() []byte {
+	if x != nil {
+		return x.Sig
+	}
+	return nil
+}
+
+func (x *Token) GetData() []byte {
+	if x != nil {
+		return x.Data
+	}
+	return nil
+}
+
+// An empty message
+type Empty struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *Empty) Reset() {
+	*x = Empty{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_harmonytypes_v1_types_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Empty) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Empty) ProtoMessage() {}
+
+func (x *Empty) ProtoReflect() protoreflect.Message {
+	mi := &file_harmonytypes_v1_types_proto_msgTypes[5]
+	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 Empty.ProtoReflect.Descriptor instead.
+func (*Empty) Descriptor() ([]byte, []int) {
+	return file_harmonytypes_v1_types_proto_rawDescGZIP(), []int{5}
+}
+
+// An object representing an item position between two other items.
+type ItemPosition struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The ID of the item the position is relative to
+	ItemId uint64 `protobuf:"varint,1,opt,name=item_id,json=itemId,proto3" json:"item_id,omitempty"`
+	// Whether the position is before or after the given ID
+	Position ItemPosition_Position `protobuf:"varint,2,opt,name=position,proto3,enum=protocol.harmonytypes.v1.ItemPosition_Position" json:"position,omitempty"`
+}
+
+func (x *ItemPosition) Reset() {
+	*x = ItemPosition{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_harmonytypes_v1_types_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ItemPosition) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ItemPosition) ProtoMessage() {}
+
+func (x *ItemPosition) ProtoReflect() protoreflect.Message {
+	mi := &file_harmonytypes_v1_types_proto_msgTypes[6]
+	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 ItemPosition.ProtoReflect.Descriptor instead.
+func (*ItemPosition) Descriptor() ([]byte, []int) {
+	return file_harmonytypes_v1_types_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *ItemPosition) GetItemId() uint64 {
+	if x != nil {
+		return x.ItemId
+	}
+	return 0
+}
+
+func (x *ItemPosition) GetPosition() ItemPosition_Position {
+	if x != nil {
+		return x.Position
+	}
+	return ItemPosition_POSITION_BEFORE_UNSPECIFIED
+}
+
+var file_harmonytypes_v1_types_proto_extTypes = []protoimpl.ExtensionInfo{
+	{
+		ExtendedType:  (*descriptorpb.MethodOptions)(nil),
+		ExtensionType: (*HarmonyMethodMetadata)(nil),
+		Field:         1091,
+		Name:          "protocol.harmonytypes.v1.metadata",
+		Tag:           "bytes,1091,opt,name=metadata",
+		Filename:      "harmonytypes/v1/types.proto",
+	},
+}
+
+// Extension fields to descriptorpb.MethodOptions.
+var (
+	// Harmony method metadata.
+	//
+	// optional protocol.harmonytypes.v1.HarmonyMethodMetadata metadata = 1091;
+	E_Metadata = &file_harmonytypes_v1_types_proto_extTypes[0]
+)
+
+var File_harmonytypes_v1_types_proto protoreflect.FileDescriptor
+
+var file_harmonytypes_v1_types_proto_rawDesc = []byte{
+	0x0a, 0x1b, 0x68, 0x61, 0x72, 0x6d, 0x6f, 0x6e, 0x79, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x76,
+	0x31, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x18, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x68, 0x61, 0x72, 0x6d, 0x6f, 0x6e, 0x79, 0x74,
+	0x79, 0x70, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70,
+	0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd8, 0x01, 0x0a, 0x15, 0x48, 0x61,
+	0x72, 0x6d, 0x6f, 0x6e, 0x79, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64,
+	0x61, 0x74, 0x61, 0x12, 0x37, 0x0a, 0x17, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x5f,
+	0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x41, 0x75,
+	0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e,
+	0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x4c, 0x6f,
+	0x63, 0x61, 0x6c, 0x12, 0x38, 0x0a, 0x18, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x5f,
+	0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x50,
+	0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x25, 0x0a,
+	0x0e, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18,
+	0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x4f,
+	0x77, 0x6e, 0x65, 0x72, 0x22, 0x32, 0x0a, 0x08, 0x41, 0x6e, 0x79, 0x74, 0x68, 0x69, 0x6e, 0x67,
+	0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
+	0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x0c, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x22, 0xd1, 0x01, 0x0a, 0x08, 0x4d, 0x65, 0x74,
+	0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x4f, 0x0a, 0x09, 0x65, 0x78, 0x74,
+	0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x68, 0x61, 0x72, 0x6d, 0x6f, 0x6e, 0x79, 0x74,
+	0x79, 0x70, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,
+	0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52,
+	0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x60, 0x0a, 0x0e, 0x45, 0x78,
+	0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03,
+	0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x38,
+	0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x68, 0x61, 0x72, 0x6d, 0x6f, 0x6e, 0x79,
+	0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x6e, 0x79, 0x74, 0x68, 0x69, 0x6e,
+	0x67, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6f, 0x0a, 0x05,
+	0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66,
+	0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74,
+	0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x68, 0x75, 0x6d, 0x61, 0x6e, 0x5f, 0x6d,
+	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x68, 0x75,
+	0x6d, 0x61, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x6f,
+	0x72, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c,
+	0x52, 0x0b, 0x6d, 0x6f, 0x72, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x2d, 0x0a,
+	0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x69, 0x67, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x0c, 0x52, 0x03, 0x73, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x07, 0x0a, 0x05,
+	0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xb5, 0x01, 0x0a, 0x0c, 0x49, 0x74, 0x65, 0x6d, 0x50, 0x6f,
+	0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x69,
+	0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x69, 0x74, 0x65, 0x6d, 0x49, 0x64, 0x12,
+	0x4b, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x0e, 0x32, 0x2f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x68, 0x61, 0x72,
+	0x6d, 0x6f, 0x6e, 0x79, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x74, 0x65,
+	0x6d, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69,
+	0x6f, 0x6e, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3f, 0x0a, 0x08,
+	0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x1b, 0x50, 0x4f, 0x53, 0x49,
+	0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x42, 0x45, 0x46, 0x4f, 0x52, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50,
+	0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x4f, 0x53,
+	0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x46, 0x54, 0x45, 0x52, 0x10, 0x01, 0x3a, 0x6c, 0x0a,
+	0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68,
+	0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xc3, 0x08, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x2f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x68, 0x61, 0x72, 0x6d,
+	0x6f, 0x6e, 0x79, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x61, 0x72, 0x6d,
+	0x6f, 0x6e, 0x79, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74,
+	0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x42, 0xf8, 0x01, 0x0a, 0x1c,
+	0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x68, 0x61, 0x72,
+	0x6d, 0x6f, 0x6e, 0x79, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x42, 0x0a, 0x54, 0x79,
+	0x70, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4a, 0x67, 0x69, 0x74, 0x68,
+	0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x72, 0x6d, 0x6f, 0x6e, 0x79, 0x2d, 0x64,
+	0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x73, 0x68, 0x69, 0x62, 0x73,
+	0x68, 0x69, 0x62, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x68, 0x61, 0x72, 0x6d, 0x6f, 0x6e, 0x79, 0x74,
+	0x79, 0x70, 0x65, 0x73, 0x2f, 0x76, 0x31, 0x3b, 0x68, 0x61, 0x72, 0x6d, 0x6f, 0x6e, 0x79, 0x74,
+	0x79, 0x70, 0x65, 0x73, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x50, 0x48, 0x58, 0xaa, 0x02, 0x18, 0x50,
+	0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x48, 0x61, 0x72, 0x6d, 0x6f, 0x6e, 0x79, 0x74,
+	0x79, 0x70, 0x65, 0x73, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x18, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63,
+	0x6f, 0x6c, 0x5c, 0x48, 0x61, 0x72, 0x6d, 0x6f, 0x6e, 0x79, 0x74, 0x79, 0x70, 0x65, 0x73, 0x5c,
+	0x56, 0x31, 0xe2, 0x02, 0x24, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5c, 0x48, 0x61,
+	0x72, 0x6d, 0x6f, 0x6e, 0x79, 0x74, 0x79, 0x70, 0x65, 0x73, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50,
+	0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x1a, 0x50, 0x72, 0x6f, 0x74,
+	0x6f, 0x63, 0x6f, 0x6c, 0x3a, 0x3a, 0x48, 0x61, 0x72, 0x6d, 0x6f, 0x6e, 0x79, 0x74, 0x79, 0x70,
+	0x65, 0x73, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_harmonytypes_v1_types_proto_rawDescOnce sync.Once
+	file_harmonytypes_v1_types_proto_rawDescData = file_harmonytypes_v1_types_proto_rawDesc
+)
+
+func file_harmonytypes_v1_types_proto_rawDescGZIP() []byte {
+	file_harmonytypes_v1_types_proto_rawDescOnce.Do(func() {
+		file_harmonytypes_v1_types_proto_rawDescData = protoimpl.X.CompressGZIP(file_harmonytypes_v1_types_proto_rawDescData)
+	})
+	return file_harmonytypes_v1_types_proto_rawDescData
+}
+
+var file_harmonytypes_v1_types_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
+var file_harmonytypes_v1_types_proto_msgTypes = make([]protoimpl.MessageInfo, 8)
+var file_harmonytypes_v1_types_proto_goTypes = []interface{}{
+	(ItemPosition_Position)(0),         // 0: protocol.harmonytypes.v1.ItemPosition.Position
+	(*HarmonyMethodMetadata)(nil),      // 1: protocol.harmonytypes.v1.HarmonyMethodMetadata
+	(*Anything)(nil),                   // 2: protocol.harmonytypes.v1.Anything
+	(*Metadata)(nil),                   // 3: protocol.harmonytypes.v1.Metadata
+	(*Error)(nil),                      // 4: protocol.harmonytypes.v1.Error
+	(*Token)(nil),                      // 5: protocol.harmonytypes.v1.Token
+	(*Empty)(nil),                      // 6: protocol.harmonytypes.v1.Empty
+	(*ItemPosition)(nil),               // 7: protocol.harmonytypes.v1.ItemPosition
+	nil,                                // 8: protocol.harmonytypes.v1.Metadata.ExtensionEntry
+	(*descriptorpb.MethodOptions)(nil), // 9: google.protobuf.MethodOptions
+}
+var file_harmonytypes_v1_types_proto_depIdxs = []int32{
+	8, // 0: protocol.harmonytypes.v1.Metadata.extension:type_name -> protocol.harmonytypes.v1.Metadata.ExtensionEntry
+	0, // 1: protocol.harmonytypes.v1.ItemPosition.position:type_name -> protocol.harmonytypes.v1.ItemPosition.Position
+	2, // 2: protocol.harmonytypes.v1.Metadata.ExtensionEntry.value:type_name -> protocol.harmonytypes.v1.Anything
+	9, // 3: protocol.harmonytypes.v1.metadata:extendee -> google.protobuf.MethodOptions
+	1, // 4: protocol.harmonytypes.v1.metadata:type_name -> protocol.harmonytypes.v1.HarmonyMethodMetadata
+	5, // [5:5] is the sub-list for method output_type
+	5, // [5:5] is the sub-list for method input_type
+	4, // [4:5] is the sub-list for extension type_name
+	3, // [3:4] is the sub-list for extension extendee
+	0, // [0:3] is the sub-list for field type_name
+}
+
+func init() { file_harmonytypes_v1_types_proto_init() }
+func file_harmonytypes_v1_types_proto_init() {
+	if File_harmonytypes_v1_types_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_harmonytypes_v1_types_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*HarmonyMethodMetadata); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_harmonytypes_v1_types_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Anything); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_harmonytypes_v1_types_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Metadata); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_harmonytypes_v1_types_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Error); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_harmonytypes_v1_types_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Token); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_harmonytypes_v1_types_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Empty); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_harmonytypes_v1_types_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ItemPosition); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_harmonytypes_v1_types_proto_rawDesc,
+			NumEnums:      1,
+			NumMessages:   8,
+			NumExtensions: 1,
+			NumServices:   0,
+		},
+		GoTypes:           file_harmonytypes_v1_types_proto_goTypes,
+		DependencyIndexes: file_harmonytypes_v1_types_proto_depIdxs,
+		EnumInfos:         file_harmonytypes_v1_types_proto_enumTypes,
+		MessageInfos:      file_harmonytypes_v1_types_proto_msgTypes,
+		ExtensionInfos:    file_harmonytypes_v1_types_proto_extTypes,
+	}.Build()
+	File_harmonytypes_v1_types_proto = out.File
+	file_harmonytypes_v1_types_proto_rawDesc = nil
+	file_harmonytypes_v1_types_proto_goTypes = nil
+	file_harmonytypes_v1_types_proto_depIdxs = nil
+}
diff --git a/vendor/github.com/harmony-development/shibshib/gen/profile/v1/profile.pb.go b/vendor/github.com/harmony-development/shibshib/gen/profile/v1/profile.pb.go
new file mode 100644
index 00000000..1f13eeb2
--- /dev/null
+++ b/vendor/github.com/harmony-development/shibshib/gen/profile/v1/profile.pb.go
@@ -0,0 +1,130 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.23.0
+// 	protoc        v3.17.3
+// source: profile/v1/profile.proto
+
+package profilev1
+
+import (
+	proto "github.com/golang/protobuf/proto"
+	_ "github.com/harmony-development/shibshib/gen/harmonytypes/v1"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
+
+var File_profile_v1_profile_proto protoreflect.FileDescriptor
+
+var file_profile_v1_profile_proto_rawDesc = []byte{
+	0x0a, 0x18, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f,
+	0x66, 0x69, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x13, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x1a,
+	0x1b, 0x68, 0x61, 0x72, 0x6d, 0x6f, 0x6e, 0x79, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x76, 0x31,
+	0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x16, 0x70, 0x72,
+	0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x32, 0xb1, 0x03, 0x0a, 0x0e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65,
+	0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x64, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x50, 0x72,
+	0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c,
+	0x2e, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50,
+	0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65,
+	0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x05, 0x9a, 0x44, 0x02, 0x08, 0x01, 0x12, 0x6d, 0x0a,
+	0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x29,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c,
+	0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69,
+	0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e,
+	0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x05, 0x9a, 0x44, 0x02, 0x08, 0x01, 0x12, 0x64, 0x0a, 0x0a,
+	0x47, 0x65, 0x74, 0x41, 0x70, 0x70, 0x44, 0x61, 0x74, 0x61, 0x12, 0x26, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x76, 0x31,
+	0x2e, 0x47, 0x65, 0x74, 0x41, 0x70, 0x70, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x1a, 0x27, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x70, 0x72,
+	0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x70, 0x70, 0x44,
+	0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x05, 0x9a, 0x44, 0x02,
+	0x08, 0x01, 0x12, 0x64, 0x0a, 0x0a, 0x53, 0x65, 0x74, 0x41, 0x70, 0x70, 0x44, 0x61, 0x74, 0x61,
+	0x12, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x66,
+	0x69, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x70, 0x70, 0x44, 0x61, 0x74,
+	0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x63, 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53,
+	0x65, 0x74, 0x41, 0x70, 0x70, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x22, 0x05, 0x9a, 0x44, 0x02, 0x08, 0x01, 0x42, 0xd7, 0x01, 0x0a, 0x17, 0x63, 0x6f, 0x6d,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c,
+	0x65, 0x2e, 0x76, 0x31, 0x42, 0x0c, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x72, 0x6f,
+	0x74, 0x6f, 0x50, 0x01, 0x5a, 0x40, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,
+	0x2f, 0x68, 0x61, 0x72, 0x6d, 0x6f, 0x6e, 0x79, 0x2d, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70,
+	0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x73, 0x68, 0x69, 0x62, 0x73, 0x68, 0x69, 0x62, 0x2f, 0x67, 0x65,
+	0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x70, 0x72, 0x6f,
+	0x66, 0x69, 0x6c, 0x65, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x50, 0x50, 0x58, 0xaa, 0x02, 0x13, 0x50,
+	0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2e,
+	0x56, 0x31, 0xca, 0x02, 0x13, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5c, 0x50, 0x72,
+	0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x1f, 0x50, 0x72, 0x6f, 0x74, 0x6f,
+	0x63, 0x6f, 0x6c, 0x5c, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5c, 0x56, 0x31, 0x5c, 0x47,
+	0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x15, 0x50, 0x72, 0x6f,
+	0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x3a, 0x3a, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x3a, 0x3a,
+	0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var file_profile_v1_profile_proto_goTypes = []interface{}{
+	(*GetProfileRequest)(nil),     // 0: protocol.profile.v1.GetProfileRequest
+	(*UpdateProfileRequest)(nil),  // 1: protocol.profile.v1.UpdateProfileRequest
+	(*GetAppDataRequest)(nil),     // 2: protocol.profile.v1.GetAppDataRequest
+	(*SetAppDataRequest)(nil),     // 3: protocol.profile.v1.SetAppDataRequest
+	(*GetProfileResponse)(nil),    // 4: protocol.profile.v1.GetProfileResponse
+	(*UpdateProfileResponse)(nil), // 5: protocol.profile.v1.UpdateProfileResponse
+	(*GetAppDataResponse)(nil),    // 6: protocol.profile.v1.GetAppDataResponse
+	(*SetAppDataResponse)(nil),    // 7: protocol.profile.v1.SetAppDataResponse
+}
+var file_profile_v1_profile_proto_depIdxs = []int32{
+	0, // 0: protocol.profile.v1.ProfileService.GetProfile:input_type -> protocol.profile.v1.GetProfileRequest
+	1, // 1: protocol.profile.v1.ProfileService.UpdateProfile:input_type -> protocol.profile.v1.UpdateProfileRequest
+	2, // 2: protocol.profile.v1.ProfileService.GetAppData:input_type -> protocol.profile.v1.GetAppDataRequest
+	3, // 3: protocol.profile.v1.ProfileService.SetAppData:input_type -> protocol.profile.v1.SetAppDataRequest
+	4, // 4: protocol.profile.v1.ProfileService.GetProfile:output_type -> protocol.profile.v1.GetProfileResponse
+	5, // 5: protocol.profile.v1.ProfileService.UpdateProfile:output_type -> protocol.profile.v1.UpdateProfileResponse
+	6, // 6: protocol.profile.v1.ProfileService.GetAppData:output_type -> protocol.profile.v1.GetAppDataResponse
+	7, // 7: protocol.profile.v1.ProfileService.SetAppData:output_type -> protocol.profile.v1.SetAppDataResponse
+	4, // [4:8] is the sub-list for method output_type
+	0, // [0:4] is the sub-list for method input_type
+	0, // [0:0] is the sub-list for extension type_name
+	0, // [0:0] is the sub-list for extension extendee
+	0, // [0:0] is the sub-list for field type_name
+}
+
+func init() { file_profile_v1_profile_proto_init() }
+func file_profile_v1_profile_proto_init() {
+	if File_profile_v1_profile_proto != nil {
+		return
+	}
+	file_profile_v1_types_proto_init()
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_profile_v1_profile_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   0,
+			NumExtensions: 0,
+			NumServices:   1,
+		},
+		GoTypes:           file_profile_v1_profile_proto_goTypes,
+		DependencyIndexes: file_profile_v1_profile_proto_depIdxs,
+	}.Build()
+	File_profile_v1_profile_proto = out.File
+	file_profile_v1_profile_proto_rawDesc = nil
+	file_profile_v1_profile_proto_goTypes = nil
+	file_profile_v1_profile_proto_depIdxs = nil
+}
diff --git a/vendor/github.com/harmony-development/shibshib/gen/profile/v1/profile_hrpc_client.pb.go b/vendor/github.com/harmony-development/shibshib/gen/profile/v1/profile_hrpc_client.pb.go
new file mode 100644
index 00000000..e6ac6b3a
--- /dev/null
+++ b/vendor/github.com/harmony-development/shibshib/gen/profile/v1/profile_hrpc_client.pb.go
@@ -0,0 +1,244 @@
+// Code generated by protoc-gen-go-hrpc. DO NOT EDIT.
+
+package profilev1
+
+import (
+	bytes "bytes"
+	context "context"
+	proto "google.golang.org/protobuf/proto"
+	ioutil "io/ioutil"
+	http "net/http"
+	httptest "net/http/httptest"
+)
+
+type ProfileServiceClient interface {
+	// Gets a user's profile.
+	GetProfile(context.Context, *GetProfileRequest) (*GetProfileResponse, error)
+	// Updates the user's profile.
+	UpdateProfile(context.Context, *UpdateProfileRequest) (*UpdateProfileResponse, error)
+	// Gets app data for a user (this can be used to store user preferences which
+	// is synchronized across devices).
+	GetAppData(context.Context, *GetAppDataRequest) (*GetAppDataResponse, error)
+	// Sets the app data for a user.
+	SetAppData(context.Context, *SetAppDataRequest) (*SetAppDataResponse, error)
+}
+
+type HTTPProfileServiceClient struct {
+	Client         http.Client
+	BaseURL        string
+	WebsocketProto string
+	WebsocketHost  string
+	Header         http.Header
+}
+
+func (client *HTTPProfileServiceClient) GetProfile(req *GetProfileRequest) (*GetProfileResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.profile.v1.ProfileService/GetProfile", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &GetProfileResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPProfileServiceClient) UpdateProfile(req *UpdateProfileRequest) (*UpdateProfileResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.profile.v1.ProfileService/UpdateProfile", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &UpdateProfileResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPProfileServiceClient) GetAppData(req *GetAppDataRequest) (*GetAppDataResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.profile.v1.ProfileService/GetAppData", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &GetAppDataResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPProfileServiceClient) SetAppData(req *SetAppDataRequest) (*SetAppDataResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	hreq, err := http.NewRequest("POST", client.BaseURL+"/protocol.profile.v1.ProfileService/SetAppData", reader)
+	if err != nil {
+		return nil, err
+	}
+	for k, v := range client.Header {
+		hreq.Header[k] = v
+	}
+	hreq.Header.Add("content-type", "application/hrpc")
+	resp, err := client.Client.Do(hreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &SetAppDataResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+
+type HTTPTestProfileServiceClient struct {
+	Client interface {
+		Test(*http.Request, ...int) (*http.Response, error)
+	}
+}
+
+func (client *HTTPTestProfileServiceClient) GetProfile(req *GetProfileRequest) (*GetProfileResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.profile.v1.ProfileService/GetProfile", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &GetProfileResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestProfileServiceClient) UpdateProfile(req *UpdateProfileRequest) (*UpdateProfileResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.profile.v1.ProfileService/UpdateProfile", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &UpdateProfileResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestProfileServiceClient) GetAppData(req *GetAppDataRequest) (*GetAppDataResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.profile.v1.ProfileService/GetAppData", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &GetAppDataResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
+func (client *HTTPTestProfileServiceClient) SetAppData(req *SetAppDataRequest) (*SetAppDataResponse, error) {
+	data, marshalErr := proto.Marshal(req)
+	if marshalErr != nil {
+		return nil, marshalErr
+	}
+	reader := bytes.NewReader(data)
+	testreq := httptest.NewRequest("POST", "/protocol.profile.v1.ProfileService/SetAppData", reader)
+	resp, err := client.Client.Test(testreq)
+	if err != nil {
+		return nil, err
+	}
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	ret := &SetAppDataResponse{}
+	unmarshalErr := proto.Unmarshal(body, ret)
+	if unmarshalErr != nil {
+		return nil, unmarshalErr
+	}
+	return ret, nil
+}
diff --git a/vendor/github.com/harmony-development/shibshib/gen/profile/v1/stream.pb.go b/vendor/github.com/harmony-development/shibshib/gen/profile/v1/stream.pb.go
new file mode 100644
index 00000000..bcd327ee
--- /dev/null
+++ b/vendor/github.com/harmony-development/shibshib/gen/profile/v1/stream.pb.go
@@ -0,0 +1,316 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.23.0
+// 	protoc        v3.17.3
+// source: profile/v1/stream.proto
+
+package profilev1
+
+import (
+	proto "github.com/golang/protobuf/proto"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
+
+// Event sent when a user's profile is updated.
+//
+// Servers should sent this event only to users that can "see" (eg. they are
+// in the same guild) the user this event was triggered by.
+type ProfileUpdated struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// User ID of the user that had it's profile updated.
+	UserId uint64 `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
+	// New username for this user.
+	NewUsername *string `protobuf:"bytes,2,opt,name=new_username,json=newUsername,proto3,oneof" json:"new_username,omitempty"`
+	// New avatar for this user.
+	NewAvatar *string `protobuf:"bytes,3,opt,name=new_avatar,json=newAvatar,proto3,oneof" json:"new_avatar,omitempty"`
+	// New status for this user.
+	NewStatus *UserStatus `protobuf:"varint,4,opt,name=new_status,json=newStatus,proto3,enum=protocol.profile.v1.UserStatus,oneof" json:"new_status,omitempty"`
+	// New is bot or not for this user.
+	NewIsBot *bool `protobuf:"varint,5,opt,name=new_is_bot,json=newIsBot,proto3,oneof" json:"new_is_bot,omitempty"`
+}
+
+func (x *ProfileUpdated) Reset() {
+	*x = ProfileUpdated{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_profile_v1_stream_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ProfileUpdated) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ProfileUpdated) ProtoMessage() {}
+
+func (x *ProfileUpdated) ProtoReflect() protoreflect.Message {
+	mi := &file_profile_v1_stream_proto_msgTypes[0]
+	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 ProfileUpdated.ProtoReflect.Descriptor instead.
+func (*ProfileUpdated) Descriptor() ([]byte, []int) {
+	return file_profile_v1_stream_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *ProfileUpdated) GetUserId() uint64 {
+	if x != nil {
+		return x.UserId
+	}
+	return 0
+}
+
+func (x *ProfileUpdated) GetNewUsername() string {
+	if x != nil && x.NewUsername != nil {
+		return *x.NewUsername
+	}
+	return ""
+}
+
+func (x *ProfileUpdated) GetNewAvatar() string {
+	if x != nil && x.NewAvatar != nil {
+		return *x.NewAvatar
+	}
+	return ""
+}
+
+func (x *ProfileUpdated) GetNewStatus() UserStatus {
+	if x != nil && x.NewStatus != nil {
+		return *x.NewStatus
+	}
+	return UserStatus_USER_STATUS_OFFLINE_UNSPECIFIED
+}
+
+func (x *ProfileUpdated) GetNewIsBot() bool {
+	if x != nil && x.NewIsBot != nil {
+		return *x.NewIsBot
+	}
+	return false
+}
+
+// Describes an emote service event.
+type StreamEvent struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The event type.
+	//
+	// Types that are assignable to Event:
+	//	*StreamEvent_ProfileUpdated
+	Event isStreamEvent_Event `protobuf_oneof:"event"`
+}
+
+func (x *StreamEvent) Reset() {
+	*x = StreamEvent{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_profile_v1_stream_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StreamEvent) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StreamEvent) ProtoMessage() {}
+
+func (x *StreamEvent) ProtoReflect() protoreflect.Message {
+	mi := &file_profile_v1_stream_proto_msgTypes[1]
+	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 StreamEvent.ProtoReflect.Descriptor instead.
+func (*StreamEvent) Descriptor() ([]byte, []int) {
+	return file_profile_v1_stream_proto_rawDescGZIP(), []int{1}
+}
+
+func (m *StreamEvent) GetEvent() isStreamEvent_Event {
+	if m != nil {
+		return m.Event
+	}
+	return nil
+}
+
+func (x *StreamEvent) GetProfileUpdated() *ProfileUpdated {
+	if x, ok := x.GetEvent().(*StreamEvent_ProfileUpdated); ok {
+		return x.ProfileUpdated
+	}
+	return nil
+}
+
+type isStreamEvent_Event interface {
+	isStreamEvent_Event()
+}
+
+type StreamEvent_ProfileUpdated struct {
+	// Send the profile updated event.
+	ProfileUpdated *ProfileUpdated `protobuf:"bytes,14,opt,name=profile_updated,json=profileUpdated,proto3,oneof"`
+}
+
+func (*StreamEvent_ProfileUpdated) isStreamEvent_Event() {}
+
+var File_profile_v1_stream_proto protoreflect.FileDescriptor
+
+var file_profile_v1_stream_proto_rawDesc = []byte{
+	0x0a, 0x17, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x72,
+	0x65, 0x61, 0x6d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x13, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x63, 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x16,
+	0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x9b, 0x02, 0x0a, 0x0e, 0x50, 0x72, 0x6f, 0x66, 0x69,
+	0x6c, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65,
+	0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72,
+	0x49, 0x64, 0x12, 0x26, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61,
+	0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x55,
+	0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x22, 0x0a, 0x0a, 0x6e, 0x65,
+	0x77, 0x5f, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01,
+	0x52, 0x09, 0x6e, 0x65, 0x77, 0x41, 0x76, 0x61, 0x74, 0x61, 0x72, 0x88, 0x01, 0x01, 0x12, 0x43,
+	0x0a, 0x0a, 0x6e, 0x65, 0x77, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01,
+	0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x70, 0x72,
+	0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x74, 0x61,
+	0x74, 0x75, 0x73, 0x48, 0x02, 0x52, 0x09, 0x6e, 0x65, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
+	0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x0a, 0x6e, 0x65, 0x77, 0x5f, 0x69, 0x73, 0x5f, 0x62, 0x6f,
+	0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x49, 0x73,
+	0x42, 0x6f, 0x74, 0x88, 0x01, 0x01, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x75,
+	0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x6e, 0x65, 0x77, 0x5f,
+	0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x73,
+	0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x69, 0x73,
+	0x5f, 0x62, 0x6f, 0x74, 0x22, 0x66, 0x0a, 0x0b, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76,
+	0x65, 0x6e, 0x74, 0x12, 0x4e, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x75,
+	0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2e,
+	0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
+	0x64, 0x48, 0x00, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x55, 0x70, 0x64, 0x61,
+	0x74, 0x65, 0x64, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x42, 0xd6, 0x01, 0x0a,
+	0x17, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x70, 0x72,
+	0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x0b, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d,
+	0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x40, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e,
+	0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x72, 0x6d, 0x6f, 0x6e, 0x79, 0x2d, 0x64, 0x65, 0x76, 0x65,
+	0x6c, 0x6f, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x73, 0x68, 0x69, 0x62, 0x73, 0x68, 0x69, 0x62,
+	0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x3b,
+	0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x50, 0x50, 0x58, 0xaa,
+	0x02, 0x13, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69,
+	0x6c, 0x65, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x13, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c,
+	0x5c, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x1f, 0x50, 0x72,
+	0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5c, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5c, 0x56,
+	0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x15,
+	0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x3a, 0x3a, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c,
+	0x65, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_profile_v1_stream_proto_rawDescOnce sync.Once
+	file_profile_v1_stream_proto_rawDescData = file_profile_v1_stream_proto_rawDesc
+)
+
+func file_profile_v1_stream_proto_rawDescGZIP() []byte {
+	file_profile_v1_stream_proto_rawDescOnce.Do(func() {
+		file_profile_v1_stream_proto_rawDescData = protoimpl.X.CompressGZIP(file_profile_v1_stream_proto_rawDescData)
+	})
+	return file_profile_v1_stream_proto_rawDescData
+}
+
+var file_profile_v1_stream_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
+var file_profile_v1_stream_proto_goTypes = []interface{}{
+	(*ProfileUpdated)(nil), // 0: protocol.profile.v1.ProfileUpdated
+	(*StreamEvent)(nil),    // 1: protocol.profile.v1.StreamEvent
+	(UserStatus)(0),        // 2: protocol.profile.v1.UserStatus
+}
+var file_profile_v1_stream_proto_depIdxs = []int32{
+	2, // 0: protocol.profile.v1.ProfileUpdated.new_status:type_name -> protocol.profile.v1.UserStatus
+	0, // 1: protocol.profile.v1.StreamEvent.profile_updated:type_name -> protocol.profile.v1.ProfileUpdated
+	2, // [2:2] is the sub-list for method output_type
+	2, // [2:2] is the sub-list for method input_type
+	2, // [2:2] is the sub-list for extension type_name
+	2, // [2:2] is the sub-list for extension extendee
+	0, // [0:2] is the sub-list for field type_name
+}
+
+func init() { file_profile_v1_stream_proto_init() }
+func file_profile_v1_stream_proto_init() {
+	if File_profile_v1_stream_proto != nil {
+		return
+	}
+	file_profile_v1_types_proto_init()
+	if !protoimpl.UnsafeEnabled {
+		file_profile_v1_stream_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ProfileUpdated); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_profile_v1_stream_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StreamEvent); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	file_profile_v1_stream_proto_msgTypes[0].OneofWrappers = []interface{}{}
+	file_profile_v1_stream_proto_msgTypes[1].OneofWrappers = []interface{}{
+		(*StreamEvent_ProfileUpdated)(nil),
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_profile_v1_stream_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   2,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_profile_v1_stream_proto_goTypes,
+		DependencyIndexes: file_profile_v1_stream_proto_depIdxs,
+		MessageInfos:      file_profile_v1_stream_proto_msgTypes,
+	}.Build()
+	File_profile_v1_stream_proto = out.File
+	file_profile_v1_stream_proto_rawDesc = nil
+	file_profile_v1_stream_proto_goTypes = nil
+	file_profile_v1_stream_proto_depIdxs = nil
+}
diff --git a/vendor/github.com/harmony-development/shibshib/gen/profile/v1/types.pb.go b/vendor/github.com/harmony-development/shibshib/gen/profile/v1/types.pb.go
new file mode 100644
index 00000000..60954c67
--- /dev/null
+++ b/vendor/github.com/harmony-development/shibshib/gen/profile/v1/types.pb.go
@@ -0,0 +1,835 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.23.0
+// 	protoc        v3.17.3
+// source: profile/v1/types.proto
+
+package profilev1
+
+import (
+	proto "github.com/golang/protobuf/proto"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
+
+// The possible statuses a user can have.
+type UserStatus int32
+
+const (
+	// User is offline (not connected to the server).
+	UserStatus_USER_STATUS_OFFLINE_UNSPECIFIED UserStatus = 0
+	// User is online (this is the default value if ommitted).
+	UserStatus_USER_STATUS_ONLINE UserStatus = 1
+	// User is away.
+	UserStatus_USER_STATUS_IDLE UserStatus = 2
+	// User does not want to be disturbed.
+	UserStatus_USER_STATUS_DO_NOT_DISTURB UserStatus = 3
+	// User is on mobile.
+	UserStatus_USER_STATUS_MOBILE UserStatus = 4
+	// User is streaming
+	UserStatus_USER_STATUS_STREAMING UserStatus = 5
+)
+
+// Enum value maps for UserStatus.
+var (
+	UserStatus_name = map[int32]string{
+		0: "USER_STATUS_OFFLINE_UNSPECIFIED",
+		1: "USER_STATUS_ONLINE",
+		2: "USER_STATUS_IDLE",
+		3: "USER_STATUS_DO_NOT_DISTURB",
+		4: "USER_STATUS_MOBILE",
+		5: "USER_STATUS_STREAMING",
+	}
+	UserStatus_value = map[string]int32{
+		"USER_STATUS_OFFLINE_UNSPECIFIED": 0,
+		"USER_STATUS_ONLINE":              1,
+		"USER_STATUS_IDLE":                2,
+		"USER_STATUS_DO_NOT_DISTURB":      3,
+		"USER_STATUS_MOBILE":              4,
+		"USER_STATUS_STREAMING":           5,
+	}
+)
+
+func (x UserStatus) Enum() *UserStatus {
+	p := new(UserStatus)
+	*p = x
+	return p
+}
+
+func (x UserStatus) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (UserStatus) Descriptor() protoreflect.EnumDescriptor {
+	return file_profile_v1_types_proto_enumTypes[0].Descriptor()
+}
+
+func (UserStatus) Type() protoreflect.EnumType {
+	return &file_profile_v1_types_proto_enumTypes[0]
+}
+
+func (x UserStatus) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use UserStatus.Descriptor instead.
+func (UserStatus) EnumDescriptor() ([]byte, []int) {
+	return file_profile_v1_types_proto_rawDescGZIP(), []int{0}
+}
+
+// Data for a single profile, without the user's ID.
+type Profile struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// the name of the user.
+	UserName string `protobuf:"bytes,1,opt,name=user_name,json=userName,proto3" json:"user_name,omitempty"`
+	// the user's avatar.
+	UserAvatar *string `protobuf:"bytes,2,opt,name=user_avatar,json=userAvatar,proto3,oneof" json:"user_avatar,omitempty"`
+	// the status of the user.
+	UserStatus UserStatus `protobuf:"varint,3,opt,name=user_status,json=userStatus,proto3,enum=protocol.profile.v1.UserStatus" json:"user_status,omitempty"`
+	// whether the user is a bot or not.
+	IsBot bool `protobuf:"varint,4,opt,name=is_bot,json=isBot,proto3" json:"is_bot,omitempty"`
+}
+
+func (x *Profile) Reset() {
+	*x = Profile{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_profile_v1_types_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Profile) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Profile) ProtoMessage() {}
+
+func (x *Profile) ProtoReflect() protoreflect.Message {
+	mi := &file_profile_v1_types_proto_msgTypes[0]
+	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 Profile.ProtoReflect.Descriptor instead.
+func (*Profile) Descriptor() ([]byte, []int) {
+	return file_profile_v1_types_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *Profile) GetUserName() string {
+	if x != nil {
+		return x.UserName
+	}
+	return ""
+}
+
+func (x *Profile) GetUserAvatar() string {
+	if x != nil && x.UserAvatar != nil {
+		return *x.UserAvatar
+	}
+	return ""
+}
+
+func (x *Profile) GetUserStatus() UserStatus {
+	if x != nil {
+		return x.UserStatus
+	}
+	return UserStatus_USER_STATUS_OFFLINE_UNSPECIFIED
+}
+
+func (x *Profile) GetIsBot() bool {
+	if x != nil {
+		return x.IsBot
+	}
+	return false
+}
+
+// Used in `GetProfile` endpoint.
+type GetProfileRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The id of the user to get.
+	UserId uint64 `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
+}
+
+func (x *GetProfileRequest) Reset() {
+	*x = GetProfileRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_profile_v1_types_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetProfileRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetProfileRequest) ProtoMessage() {}
+
+func (x *GetProfileRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_profile_v1_types_proto_msgTypes[1]
+	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 GetProfileRequest.ProtoReflect.Descriptor instead.
+func (*GetProfileRequest) Descriptor() ([]byte, []int) {
+	return file_profile_v1_types_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *GetProfileRequest) GetUserId() uint64 {
+	if x != nil {
+		return x.UserId
+	}
+	return 0
+}
+
+// Used in `GetProfile` endpoint.
+type GetProfileResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// The user's profile
+	Profile *Profile `protobuf:"bytes,1,opt,name=profile,proto3" json:"profile,omitempty"`
+}
+
+func (x *GetProfileResponse) Reset() {
+	*x = GetProfileResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_profile_v1_types_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetProfileResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetProfileResponse) ProtoMessage() {}
+
+func (x *GetProfileResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_profile_v1_types_proto_msgTypes[2]
+	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 GetProfileResponse.ProtoReflect.Descriptor instead.
+func (*GetProfileResponse) Descriptor() ([]byte, []int) {
+	return file_profile_v1_types_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *GetProfileResponse) GetProfile() *Profile {
+	if x != nil {
+		return x.Profile
+	}
+	return nil
+}
+
+// Used in `UpdateProfile` endpoint.
+type UpdateProfileRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// new name of the user.
+	NewUserName *string `protobuf:"bytes,1,opt,name=new_user_name,json=newUserName,proto3,oneof" json:"new_user_name,omitempty"`
+	// new user avatar. The avatar will be removed if the string is empty.
+	NewUserAvatar *string `protobuf:"bytes,2,opt,name=new_user_avatar,json=newUserAvatar,proto3,oneof" json:"new_user_avatar,omitempty"`
+	// new status of the user.
+	NewUserStatus *UserStatus `protobuf:"varint,3,opt,name=new_user_status,json=newUserStatus,proto3,enum=protocol.profile.v1.UserStatus,oneof" json:"new_user_status,omitempty"`
+	// new whether the user is a bot or not.
+	NewIsBot *bool `protobuf:"varint,4,opt,name=new_is_bot,json=newIsBot,proto3,oneof" json:"new_is_bot,omitempty"`
+}
+
+func (x *UpdateProfileRequest) Reset() {
+	*x = UpdateProfileRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_profile_v1_types_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *UpdateProfileRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UpdateProfileRequest) ProtoMessage() {}
+
+func (x *UpdateProfileRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_profile_v1_types_proto_msgTypes[3]
+	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 UpdateProfileRequest.ProtoReflect.Descriptor instead.
+func (*UpdateProfileRequest) Descriptor() ([]byte, []int) {
+	return file_profile_v1_types_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *UpdateProfileRequest) GetNewUserName() string {
+	if x != nil && x.NewUserName != nil {
+		return *x.NewUserName
+	}
+	return ""
+}
+
+func (x *UpdateProfileRequest) GetNewUserAvatar() string {
+	if x != nil && x.NewUserAvatar != nil {
+		return *x.NewUserAvatar
+	}
+	return ""
+}
+
+func (x *UpdateProfileRequest) GetNewUserStatus() UserStatus {
+	if x != nil && x.NewUserStatus != nil {
+		return *x.NewUserStatus
+	}
+	return UserStatus_USER_STATUS_OFFLINE_UNSPECIFIED
+}
+
+func (x *UpdateProfileRequest) GetNewIsBot() bool {
+	if x != nil && x.NewIsBot != nil {
+		return *x.NewIsBot
+	}
+	return false
+}
+
+// Used in `UpdateProfile` endpoint.
+type UpdateProfileResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *UpdateProfileResponse) Reset() {
+	*x = UpdateProfileResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_profile_v1_types_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *UpdateProfileResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UpdateProfileResponse) ProtoMessage() {}
+
+func (x *UpdateProfileResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_profile_v1_types_proto_msgTypes[4]
+	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 UpdateProfileResponse.ProtoReflect.Descriptor instead.
+func (*UpdateProfileResponse) Descriptor() ([]byte, []int) {
+	return file_profile_v1_types_proto_rawDescGZIP(), []int{4}
+}
+
+// Used in `GetAppData` endpoint.
+type GetAppDataRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// the app id.
+	AppId string `protobuf:"bytes,1,opt,name=app_id,json=appId,proto3" json:"app_id,omitempty"`
+}
+
+func (x *GetAppDataRequest) Reset() {
+	*x = GetAppDataRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_profile_v1_types_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetAppDataRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetAppDataRequest) ProtoMessage() {}
+
+func (x *GetAppDataRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_profile_v1_types_proto_msgTypes[5]
+	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 GetAppDataRequest.ProtoReflect.Descriptor instead.
+func (*GetAppDataRequest) Descriptor() ([]byte, []int) {
+	return file_profile_v1_types_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *GetAppDataRequest) GetAppId() string {
+	if x != nil {
+		return x.AppId
+	}
+	return ""
+}
+
+// Used in `GetAppData` endpoint.
+type GetAppDataResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// the app data.
+	AppData []byte `protobuf:"bytes,1,opt,name=app_data,json=appData,proto3" json:"app_data,omitempty"`
+}
+
+func (x *GetAppDataResponse) Reset() {
+	*x = GetAppDataResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_profile_v1_types_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetAppDataResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetAppDataResponse) ProtoMessage() {}
+
+func (x *GetAppDataResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_profile_v1_types_proto_msgTypes[6]
+	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 GetAppDataResponse.ProtoReflect.Descriptor instead.
+func (*GetAppDataResponse) Descriptor() ([]byte, []int) {
+	return file_profile_v1_types_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *GetAppDataResponse) GetAppData() []byte {
+	if x != nil {
+		return x.AppData
+	}
+	return nil
+}
+
+// Used in `SetAppData` endpoint.
+type SetAppDataRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// the app id.
+	AppId string `protobuf:"bytes,1,opt,name=app_id,json=appId,proto3" json:"app_id,omitempty"`
+	// the app data.
+	AppData []byte `protobuf:"bytes,2,opt,name=app_data,json=appData,proto3" json:"app_data,omitempty"`
+}
+
+func (x *SetAppDataRequest) Reset() {
+	*x = SetAppDataRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_profile_v1_types_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SetAppDataRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SetAppDataRequest) ProtoMessage() {}
+
+func (x *SetAppDataRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_profile_v1_types_proto_msgTypes[7]
+	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 SetAppDataRequest.ProtoReflect.Descriptor instead.
+func (*SetAppDataRequest) Descriptor() ([]byte, []int) {
+	return file_profile_v1_types_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *SetAppDataRequest) GetAppId() string {
+	if x != nil {
+		return x.AppId
+	}
+	return ""
+}
+
+func (x *SetAppDataRequest) GetAppData() []byte {
+	if x != nil {
+		return x.AppData
+	}
+	return nil
+}
+
+// Used in `SetAppData` endpoint.
+type SetAppDataResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *SetAppDataResponse) Reset() {
+	*x = SetAppDataResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_profile_v1_types_proto_msgTypes[8]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SetAppDataResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SetAppDataResponse) ProtoMessage() {}
+
+func (x *SetAppDataResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_profile_v1_types_proto_msgTypes[8]
+	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 SetAppDataResponse.ProtoReflect.Descriptor instead.
+func (*SetAppDataResponse) Descriptor() ([]byte, []int) {
+	return file_profile_v1_types_proto_rawDescGZIP(), []int{8}
+}
+
+var File_profile_v1_types_proto protoreflect.FileDescriptor
+
+var file_profile_v1_types_proto_rawDesc = []byte{
+	0x0a, 0x16, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x79, 0x70,
+	0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x13, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63,
+	0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x22, 0xb5, 0x01,
+	0x0a, 0x07, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65,
+	0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73,
+	0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x61,
+	0x76, 0x61, 0x74, 0x61, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x75,
+	0x73, 0x65, 0x72, 0x41, 0x76, 0x61, 0x74, 0x61, 0x72, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x0b,
+	0x75, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28,
+	0x0e, 0x32, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f,
+	0x66, 0x69, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74,
+	0x75, 0x73, 0x52, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x15,
+	0x0a, 0x06, 0x69, 0x73, 0x5f, 0x62, 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05,
+	0x69, 0x73, 0x42, 0x6f, 0x74, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x61,
+	0x76, 0x61, 0x74, 0x61, 0x72, 0x22, 0x2c, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x66,
+	0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73,
+	0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x73, 0x65,
+	0x72, 0x49, 0x64, 0x22, 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c,
+	0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x07, 0x70, 0x72, 0x6f,
+	0x66, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x76, 0x31,
+	0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c,
+	0x65, 0x22, 0xa6, 0x02, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x66,
+	0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0d, 0x6e, 0x65,
+	0x77, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x48, 0x00, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65,
+	0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x0f, 0x6e, 0x65, 0x77, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f,
+	0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0d,
+	0x6e, 0x65, 0x77, 0x55, 0x73, 0x65, 0x72, 0x41, 0x76, 0x61, 0x74, 0x61, 0x72, 0x88, 0x01, 0x01,
+	0x12, 0x4c, 0x0a, 0x0f, 0x6e, 0x65, 0x77, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61,
+	0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x2e,
+	0x55, 0x73, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x02, 0x52, 0x0d, 0x6e, 0x65,
+	0x77, 0x55, 0x73, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x88, 0x01, 0x01, 0x12, 0x21,
+	0x0a, 0x0a, 0x6e, 0x65, 0x77, 0x5f, 0x69, 0x73, 0x5f, 0x62, 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01,
+	0x28, 0x08, 0x48, 0x03, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x49, 0x73, 0x42, 0x6f, 0x74, 0x88, 0x01,
+	0x01, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e,
+	0x61, 0x6d, 0x65, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x75, 0x73, 0x65, 0x72,
+	0x5f, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x6e, 0x65, 0x77, 0x5f,
+	0x75, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f,
+	0x6e, 0x65, 0x77, 0x5f, 0x69, 0x73, 0x5f, 0x62, 0x6f, 0x74, 0x22, 0x17, 0x0a, 0x15, 0x55, 0x70,
+	0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x22, 0x2a, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x41, 0x70, 0x70, 0x44, 0x61, 0x74,
+	0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f,
+	0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x22,
+	0x2f, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x70, 0x70, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x64, 0x61, 0x74,
+	0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x70, 0x70, 0x44, 0x61, 0x74, 0x61,
+	0x22, 0x45, 0x0a, 0x11, 0x53, 0x65, 0x74, 0x41, 0x70, 0x70, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08,
+	0x61, 0x70, 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07,
+	0x61, 0x70, 0x70, 0x44, 0x61, 0x74, 0x61, 0x22, 0x14, 0x0a, 0x12, 0x53, 0x65, 0x74, 0x41, 0x70,
+	0x70, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0xb2, 0x01,
+	0x0a, 0x0a, 0x55, 0x73, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x23, 0x0a, 0x1f,
+	0x55, 0x53, 0x45, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4f, 0x46, 0x46, 0x4c,
+	0x49, 0x4e, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10,
+	0x00, 0x12, 0x16, 0x0a, 0x12, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53,
+	0x5f, 0x4f, 0x4e, 0x4c, 0x49, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x55, 0x53, 0x45,
+	0x52, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x49, 0x44, 0x4c, 0x45, 0x10, 0x02, 0x12,
+	0x1e, 0x0a, 0x1a, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x44,
+	0x4f, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x44, 0x49, 0x53, 0x54, 0x55, 0x52, 0x42, 0x10, 0x03, 0x12,
+	0x16, 0x0a, 0x12, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4d,
+	0x4f, 0x42, 0x49, 0x4c, 0x45, 0x10, 0x04, 0x12, 0x19, 0x0a, 0x15, 0x55, 0x53, 0x45, 0x52, 0x5f,
+	0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x49, 0x4e, 0x47,
+	0x10, 0x05, 0x42, 0xd5, 0x01, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x63, 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x0a,
+	0x54, 0x79, 0x70, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x40, 0x67, 0x69,
+	0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x72, 0x6d, 0x6f, 0x6e, 0x79,
+	0x2d, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x73, 0x68, 0x69,
+	0x62, 0x73, 0x68, 0x69, 0x62, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c,
+	0x65, 0x2f, 0x76, 0x31, 0x3b, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x76, 0x31, 0xa2, 0x02,
+	0x03, 0x50, 0x50, 0x58, 0xaa, 0x02, 0x13, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e,
+	0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x13, 0x50, 0x72, 0x6f,
+	0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5c, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5c, 0x56, 0x31,
+	0xe2, 0x02, 0x1f, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5c, 0x50, 0x72, 0x6f, 0x66,
+	0x69, 0x6c, 0x65, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61,
+	0x74, 0x61, 0xea, 0x02, 0x15, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x3a, 0x3a, 0x50,
+	0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x33,
+}
+
+var (
+	file_profile_v1_types_proto_rawDescOnce sync.Once
+	file_profile_v1_types_proto_rawDescData = file_profile_v1_types_proto_rawDesc
+)
+
+func file_profile_v1_types_proto_rawDescGZIP() []byte {
+	file_profile_v1_types_proto_rawDescOnce.Do(func() {
+		file_profile_v1_types_proto_rawDescData = protoimpl.X.CompressGZIP(file_profile_v1_types_proto_rawDescData)
+	})
+	return file_profile_v1_types_proto_rawDescData
+}
+
+var file_profile_v1_types_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
+var file_profile_v1_types_proto_msgTypes = make([]protoimpl.MessageInfo, 9)
+var file_profile_v1_types_proto_goTypes = []interface{}{
+	(UserStatus)(0),               // 0: protocol.profile.v1.UserStatus
+	(*Profile)(nil),               // 1: protocol.profile.v1.Profile
+	(*GetProfileRequest)(nil),     // 2: protocol.profile.v1.GetProfileRequest
+	(*GetProfileResponse)(nil),    // 3: protocol.profile.v1.GetProfileResponse
+	(*UpdateProfileRequest)(nil),  // 4: protocol.profile.v1.UpdateProfileRequest
+	(*UpdateProfileResponse)(nil), // 5: protocol.profile.v1.UpdateProfileResponse
+	(*GetAppDataRequest)(nil),     // 6: protocol.profile.v1.GetAppDataRequest
+	(*GetAppDataResponse)(nil),    // 7: protocol.profile.v1.GetAppDataResponse
+	(*SetAppDataRequest)(nil),     // 8: protocol.profile.v1.SetAppDataRequest
+	(*SetAppDataResponse)(nil),    // 9: protocol.profile.v1.SetAppDataResponse
+}
+var file_profile_v1_types_proto_depIdxs = []int32{
+	0, // 0: protocol.profile.v1.Profile.user_status:type_name -> protocol.profile.v1.UserStatus
+	1, // 1: protocol.profile.v1.GetProfileResponse.profile:type_name -> protocol.profile.v1.Profile
+	0, // 2: protocol.profile.v1.UpdateProfileRequest.new_user_status:type_name -> protocol.profile.v1.UserStatus
+	3, // [3:3] is the sub-list for method output_type
+	3, // [3:3] is the sub-list for method input_type
+	3, // [3:3] is the sub-list for extension type_name
+	3, // [3:3] is the sub-list for extension extendee
+	0, // [0:3] is the sub-list for field type_name
+}
+
+func init() { file_profile_v1_types_proto_init() }
+func file_profile_v1_types_proto_init() {
+	if File_profile_v1_types_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_profile_v1_types_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Profile); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_profile_v1_types_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetProfileRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_profile_v1_types_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetProfileResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_profile_v1_types_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*UpdateProfileRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_profile_v1_types_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*UpdateProfileResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_profile_v1_types_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetAppDataRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_profile_v1_types_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetAppDataResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_profile_v1_types_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SetAppDataRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_profile_v1_types_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SetAppDataResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	file_profile_v1_types_proto_msgTypes[0].OneofWrappers = []interface{}{}
+	file_profile_v1_types_proto_msgTypes[3].OneofWrappers = []interface{}{}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_profile_v1_types_proto_rawDesc,
+			NumEnums:      1,
+			NumMessages:   9,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_profile_v1_types_proto_goTypes,
+		DependencyIndexes: file_profile_v1_types_proto_depIdxs,
+		EnumInfos:         file_profile_v1_types_proto_enumTypes,
+		MessageInfos:      file_profile_v1_types_proto_msgTypes,
+	}.Build()
+	File_profile_v1_types_proto = out.File
+	file_profile_v1_types_proto_rawDesc = nil
+	file_profile_v1_types_proto_goTypes = nil
+	file_profile_v1_types_proto_depIdxs = nil
+}
diff --git a/vendor/github.com/harmony-development/shibshib/located.go b/vendor/github.com/harmony-development/shibshib/located.go
new file mode 100644
index 00000000..d98fadba
--- /dev/null
+++ b/vendor/github.com/harmony-development/shibshib/located.go
@@ -0,0 +1,10 @@
+package shibshib
+
+import chatv1 "github.com/harmony-development/shibshib/gen/chat/v1"
+
+type LocatedMessage struct {
+	chatv1.MessageWithId
+
+	GuildID   uint64
+	ChannelID uint64
+}
diff --git a/vendor/golang.org/x/sys/windows/memory_windows.go b/vendor/golang.org/x/sys/windows/memory_windows.go
index 1adb6073..6dc0920a 100644
--- a/vendor/golang.org/x/sys/windows/memory_windows.go
+++ b/vendor/golang.org/x/sys/windows/memory_windows.go
@@ -35,3 +35,14 @@ const (
 	QUOTA_LIMITS_HARDWS_MAX_DISABLE = 0x00000008
 	QUOTA_LIMITS_HARDWS_MAX_ENABLE  = 0x00000004
 )
+
+type MemoryBasicInformation struct {
+	BaseAddress       uintptr
+	AllocationBase    uintptr
+	AllocationProtect uint32
+	PartitionId       uint16
+	RegionSize        uintptr
+	State             uint32
+	Protect           uint32
+	Type              uint32
+}
diff --git a/vendor/golang.org/x/sys/windows/syscall_windows.go b/vendor/golang.org/x/sys/windows/syscall_windows.go
index ff2d45d4..d3b59ae6 100644
--- a/vendor/golang.org/x/sys/windows/syscall_windows.go
+++ b/vendor/golang.org/x/sys/windows/syscall_windows.go
@@ -274,6 +274,11 @@ func NewCallbackCDecl(fn interface{}) uintptr {
 //sys	VirtualAlloc(address uintptr, size uintptr, alloctype uint32, protect uint32) (value uintptr, err error) = kernel32.VirtualAlloc
 //sys	VirtualFree(address uintptr, size uintptr, freetype uint32) (err error) = kernel32.VirtualFree
 //sys	VirtualProtect(address uintptr, size uintptr, newprotect uint32, oldprotect *uint32) (err error) = kernel32.VirtualProtect
+//sys	VirtualProtectEx(process Handle, address uintptr, size uintptr, newProtect uint32, oldProtect *uint32) (err error) = kernel32.VirtualProtectEx
+//sys	VirtualQuery(address uintptr, buffer *MemoryBasicInformation, length uintptr) (err error) = kernel32.VirtualQuery
+//sys	VirtualQueryEx(process Handle, address uintptr, buffer *MemoryBasicInformation, length uintptr) (err error) = kernel32.VirtualQueryEx
+//sys	ReadProcessMemory(process Handle, baseAddress uintptr, buffer *byte, size uintptr, numberOfBytesRead *uintptr) (err error) = kernel32.ReadProcessMemory
+//sys	WriteProcessMemory(process Handle, baseAddress uintptr, buffer *byte, size uintptr, numberOfBytesWritten *uintptr) (err error) = kernel32.WriteProcessMemory
 //sys	TransmitFile(s Handle, handle Handle, bytesToWrite uint32, bytsPerSend uint32, overlapped *Overlapped, transmitFileBuf *TransmitFileBuffers, flags uint32) (err error) = mswsock.TransmitFile
 //sys	ReadDirectoryChanges(handle Handle, buf *byte, buflen uint32, watchSubTree bool, mask uint32, retlen *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) = kernel32.ReadDirectoryChangesW
 //sys	FindFirstChangeNotification(path string, watchSubtree bool, notifyFilter uint32) (handle Handle, err error) [failretval==InvalidHandle] = kernel32.FindFirstChangeNotificationW
diff --git a/vendor/golang.org/x/sys/windows/zsyscall_windows.go b/vendor/golang.org/x/sys/windows/zsyscall_windows.go
index e282e246..4ea788e4 100644
--- a/vendor/golang.org/x/sys/windows/zsyscall_windows.go
+++ b/vendor/golang.org/x/sys/windows/zsyscall_windows.go
@@ -303,6 +303,7 @@ var (
 	procReadConsoleW                                         = modkernel32.NewProc("ReadConsoleW")
 	procReadDirectoryChangesW                                = modkernel32.NewProc("ReadDirectoryChangesW")
 	procReadFile                                             = modkernel32.NewProc("ReadFile")
+	procReadProcessMemory                                    = modkernel32.NewProc("ReadProcessMemory")
 	procReleaseMutex                                         = modkernel32.NewProc("ReleaseMutex")
 	procRemoveDirectoryW                                     = modkernel32.NewProc("RemoveDirectoryW")
 	procResetEvent                                           = modkernel32.NewProc("ResetEvent")
@@ -345,12 +346,16 @@ var (
 	procVirtualFree                                          = modkernel32.NewProc("VirtualFree")
 	procVirtualLock                                          = modkernel32.NewProc("VirtualLock")
 	procVirtualProtect                                       = modkernel32.NewProc("VirtualProtect")
+	procVirtualProtectEx                                     = modkernel32.NewProc("VirtualProtectEx")
+	procVirtualQuery                                         = modkernel32.NewProc("VirtualQuery")
+	procVirtualQueryEx                                       = modkernel32.NewProc("VirtualQueryEx")
 	procVirtualUnlock                                        = modkernel32.NewProc("VirtualUnlock")
 	procWTSGetActiveConsoleSessionId                         = modkernel32.NewProc("WTSGetActiveConsoleSessionId")
 	procWaitForMultipleObjects                               = modkernel32.NewProc("WaitForMultipleObjects")
 	procWaitForSingleObject                                  = modkernel32.NewProc("WaitForSingleObject")
 	procWriteConsoleW                                        = modkernel32.NewProc("WriteConsoleW")
 	procWriteFile                                            = modkernel32.NewProc("WriteFile")
+	procWriteProcessMemory                                   = modkernel32.NewProc("WriteProcessMemory")
 	procAcceptEx                                             = modmswsock.NewProc("AcceptEx")
 	procGetAcceptExSockaddrs                                 = modmswsock.NewProc("GetAcceptExSockaddrs")
 	procTransmitFile                                         = modmswsock.NewProc("TransmitFile")
@@ -2636,6 +2641,14 @@ func ReadFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (
 	return
 }
 
+func ReadProcessMemory(process Handle, baseAddress uintptr, buffer *byte, size uintptr, numberOfBytesRead *uintptr) (err error) {
+	r1, _, e1 := syscall.Syscall6(procReadProcessMemory.Addr(), 5, uintptr(process), uintptr(baseAddress), uintptr(unsafe.Pointer(buffer)), uintptr(size), uintptr(unsafe.Pointer(numberOfBytesRead)), 0)
+	if r1 == 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
 func ReleaseMutex(mutex Handle) (err error) {
 	r1, _, e1 := syscall.Syscall(procReleaseMutex.Addr(), 1, uintptr(mutex), 0, 0)
 	if r1 == 0 {
@@ -2990,6 +3003,30 @@ func VirtualProtect(address uintptr, size uintptr, newprotect uint32, oldprotect
 	return
 }
 
+func VirtualProtectEx(process Handle, address uintptr, size uintptr, newProtect uint32, oldProtect *uint32) (err error) {
+	r1, _, e1 := syscall.Syscall6(procVirtualProtectEx.Addr(), 5, uintptr(process), uintptr(address), uintptr(size), uintptr(newProtect), uintptr(unsafe.Pointer(oldProtect)), 0)
+	if r1 == 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+func VirtualQuery(address uintptr, buffer *MemoryBasicInformation, length uintptr) (err error) {
+	r1, _, e1 := syscall.Syscall(procVirtualQuery.Addr(), 3, uintptr(address), uintptr(unsafe.Pointer(buffer)), uintptr(length))
+	if r1 == 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+func VirtualQueryEx(process Handle, address uintptr, buffer *MemoryBasicInformation, length uintptr) (err error) {
+	r1, _, e1 := syscall.Syscall6(procVirtualQueryEx.Addr(), 4, uintptr(process), uintptr(address), uintptr(unsafe.Pointer(buffer)), uintptr(length), 0, 0)
+	if r1 == 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
 func VirtualUnlock(addr uintptr, length uintptr) (err error) {
 	r1, _, e1 := syscall.Syscall(procVirtualUnlock.Addr(), 2, uintptr(addr), uintptr(length), 0)
 	if r1 == 0 {
@@ -3046,6 +3083,14 @@ func WriteFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped)
 	return
 }
 
+func WriteProcessMemory(process Handle, baseAddress uintptr, buffer *byte, size uintptr, numberOfBytesWritten *uintptr) (err error) {
+	r1, _, e1 := syscall.Syscall6(procWriteProcessMemory.Addr(), 5, uintptr(process), uintptr(baseAddress), uintptr(unsafe.Pointer(buffer)), uintptr(size), uintptr(unsafe.Pointer(numberOfBytesWritten)), 0)
+	if r1 == 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
 func AcceptEx(ls Handle, as Handle, buf *byte, rxdatalen uint32, laddrlen uint32, raddrlen uint32, recvd *uint32, overlapped *Overlapped) (err error) {
 	r1, _, e1 := syscall.Syscall9(procAcceptEx.Addr(), 8, uintptr(ls), uintptr(as), uintptr(unsafe.Pointer(buf)), uintptr(rxdatalen), uintptr(laddrlen), uintptr(raddrlen), uintptr(unsafe.Pointer(recvd)), uintptr(unsafe.Pointer(overlapped)), 0)
 	if r1 == 0 {
diff --git a/vendor/modules.txt b/vendor/modules.txt
index e83e308e..ee3f36dd 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -109,6 +109,14 @@ github.com/gorilla/schema
 # github.com/gorilla/websocket v1.4.2
 ## explicit; go 1.12
 github.com/gorilla/websocket
+# github.com/harmony-development/shibshib v0.0.0-20211127182844-512296f7c548
+## explicit; go 1.15
+github.com/harmony-development/shibshib
+github.com/harmony-development/shibshib/gen/auth/v1
+github.com/harmony-development/shibshib/gen/chat/v1
+github.com/harmony-development/shibshib/gen/emote/v1
+github.com/harmony-development/shibshib/gen/harmonytypes/v1
+github.com/harmony-development/shibshib/gen/profile/v1
 # github.com/hashicorp/errwrap v1.1.0
 ## explicit
 github.com/hashicorp/errwrap