From c6a37a39beb8d2eafe1dd5532db681b60708bc9f Mon Sep 17 00:00:00 2001 From: mvoolt <77506726+mvoolt@users.noreply.github.com> Date: Fri, 17 Mar 2023 23:04:07 +0200 Subject: [PATCH] Introduce ClientType Also regenerate mumble.pb.go and replace certain mentions of Version with VersionV1 due to library still relying on legacy features. --- gumble/MumbleProto/Mumble.pb.go | 604 ++++++++++++++++++++++---------- gumble/client.go | 3 +- gumble/config.go | 4 + gumble/handlers.go | 8 +- 4 files changed, 421 insertions(+), 198 deletions(-) diff --git a/gumble/MumbleProto/Mumble.pb.go b/gumble/MumbleProto/Mumble.pb.go index 2538012..c58baff 100644 --- a/gumble/MumbleProto/Mumble.pb.go +++ b/gumble/MumbleProto/Mumble.pb.go @@ -115,10 +115,14 @@ const ( PermissionDenied_UserName PermissionDenied_DenyType = 8 // Channel is full. PermissionDenied_ChannelFull PermissionDenied_DenyType = 9 - // Channels are nested too deply. + // Channels are nested too deeply. PermissionDenied_NestingLimit PermissionDenied_DenyType = 10 // Maximum channel count reached. PermissionDenied_ChannelCountLimit PermissionDenied_DenyType = 11 + // Amount of listener objects for this channel has been reached + PermissionDenied_ChannelListenerLimit PermissionDenied_DenyType = 12 + // Amount of listener proxies for the user has been reached + PermissionDenied_UserListenerLimit PermissionDenied_DenyType = 13 ) var PermissionDenied_DenyType_name = map[int32]string{ @@ -134,21 +138,25 @@ var PermissionDenied_DenyType_name = map[int32]string{ 9: "ChannelFull", 10: "NestingLimit", 11: "ChannelCountLimit", + 12: "ChannelListenerLimit", + 13: "UserListenerLimit", } var PermissionDenied_DenyType_value = map[string]int32{ - "Text": 0, - "Permission": 1, - "SuperUser": 2, - "ChannelName": 3, - "TextTooLong": 4, - "H9K": 5, - "TemporaryChannel": 6, - "MissingCertificate": 7, - "UserName": 8, - "ChannelFull": 9, - "NestingLimit": 10, - "ChannelCountLimit": 11, + "Text": 0, + "Permission": 1, + "SuperUser": 2, + "ChannelName": 3, + "TextTooLong": 4, + "H9K": 5, + "TemporaryChannel": 6, + "MissingCertificate": 7, + "UserName": 8, + "ChannelFull": 9, + "NestingLimit": 10, + "ChannelCountLimit": 11, + "ChannelListenerLimit": 12, + "UserListenerLimit": 13, } func (x PermissionDenied_DenyType) Enum() *PermissionDenied_DenyType { @@ -261,8 +269,11 @@ func (ContextActionModify_Operation) EnumDescriptor() ([]byte, []int) { } type Version struct { - // 2-byte Major, 1-byte Minor and 1-byte Patch version number. - Version *uint32 `protobuf:"varint,1,opt,name=version" json:"version,omitempty"` + // Legacy version number format. + VersionV1 *uint32 `protobuf:"varint,1,opt,name=version_v1,json=versionV1" json:"version_v1,omitempty"` + // New version number format. + // Necessary since patch level may exceed 255. (See https://github.com/mumble-voip/mumble/issues/5827) + VersionV2 *uint64 `protobuf:"varint,5,opt,name=version_v2,json=versionV2" json:"version_v2,omitempty"` // Client release name. Release *string `protobuf:"bytes,2,opt,name=release" json:"release,omitempty"` // Client OS name. @@ -299,9 +310,16 @@ func (m *Version) XXX_DiscardUnknown() { var xxx_messageInfo_Version proto.InternalMessageInfo -func (m *Version) GetVersion() uint32 { - if m != nil && m.Version != nil { - return *m.Version +func (m *Version) GetVersionV1() uint32 { + if m != nil && m.VersionV1 != nil { + return *m.VersionV1 + } + return 0 +} + +func (m *Version) GetVersionV2() uint64 { + if m != nil && m.VersionV2 != nil { + return *m.VersionV2 } return 0 } @@ -377,8 +395,10 @@ type Authenticate struct { // Additional access tokens for server ACL groups. Tokens []string `protobuf:"bytes,3,rep,name=tokens" json:"tokens,omitempty"` // A list of CELT bitstream version constants supported by the client. - CeltVersions []int32 `protobuf:"varint,4,rep,name=celt_versions,json=celtVersions" json:"celt_versions,omitempty"` - Opus *bool `protobuf:"varint,5,opt,name=opus,def=0" json:"opus,omitempty"` + CeltVersions []int32 `protobuf:"varint,4,rep,name=celt_versions,json=celtVersions" json:"celt_versions,omitempty"` + Opus *bool `protobuf:"varint,5,opt,name=opus,def=0" json:"opus,omitempty"` + // 0 = REGULAR, 1 = BOT + ClientType *int32 `protobuf:"varint,6,opt,name=client_type,json=clientType,def=0" json:"client_type,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -410,6 +430,7 @@ func (m *Authenticate) XXX_DiscardUnknown() { var xxx_messageInfo_Authenticate proto.InternalMessageInfo const Default_Authenticate_Opus bool = false +const Default_Authenticate_ClientType int32 = 0 func (m *Authenticate) GetUsername() string { if m != nil && m.Username != nil { @@ -446,6 +467,13 @@ func (m *Authenticate) GetOpus() bool { return Default_Authenticate_Opus } +func (m *Authenticate) GetClientType() int32 { + if m != nil && m.ClientType != nil { + return *m.ClientType + } + return Default_Authenticate_ClientType +} + // Sent by the client to notify the server that the client is still alive. // Server must reply to the packet with the same timestamp and its own // good/late/lost/resync numbers. None of the fields is strictly required. @@ -639,6 +667,9 @@ type ServerSync struct { // Server welcome text. WelcomeText *string `protobuf:"bytes,3,opt,name=welcome_text,json=welcomeText" json:"welcome_text,omitempty"` // Current user permissions in the root channel. + // Note: The permissions data type usually is uin32 (e.g. in PermissionQuery and PermissionDenied messages). Here + // it is uint64 because of an oversight in the past. Nonetheless it should never exceed the uin32 range. + // See also: https://github.com/mumble-voip/mumble/issues/5139 Permissions *uint64 `protobuf:"varint,4,opt,name=permissions" json:"permissions,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -1001,7 +1032,7 @@ type UserState struct { // Positional audio information is only sent to users who share // identical plugin contexts. // - // This value is not trasmitted to clients. + // This value is not transmitted to clients. PluginContext []byte `protobuf:"bytes,12,opt,name=plugin_context,json=pluginContext" json:"plugin_context,omitempty"` // The user's plugin-specific identity. // This value is not transmitted to clients. @@ -1018,11 +1049,17 @@ type UserState struct { PrioritySpeaker *bool `protobuf:"varint,18,opt,name=priority_speaker,json=prioritySpeaker" json:"priority_speaker,omitempty"` // True if the user is currently recording. Recording *bool `protobuf:"varint,19,opt,name=recording" json:"recording,omitempty"` - // A list of temporary acces tokens to be respected when processing this request. + // A list of temporary access tokens to be respected when processing this request. TemporaryAccessTokens []string `protobuf:"bytes,20,rep,name=temporary_access_tokens,json=temporaryAccessTokens" json:"temporary_access_tokens,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + // A list of channels the user wants to start listening to. + ListeningChannelAdd []uint32 `protobuf:"varint,21,rep,name=listening_channel_add,json=listeningChannelAdd" json:"listening_channel_add,omitempty"` + // a list of channels the user does no longer want to listen to. + ListeningChannelRemove []uint32 `protobuf:"varint,22,rep,name=listening_channel_remove,json=listeningChannelRemove" json:"listening_channel_remove,omitempty"` + // A list of volume adjustments the user has applied to listeners + ListeningVolumeAdjustment []*UserState_VolumeAdjustment `protobuf:"bytes,23,rep,name=listening_volume_adjustment,json=listeningVolumeAdjustment" json:"listening_volume_adjustment,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *UserState) Reset() { *m = UserState{} } @@ -1190,6 +1227,74 @@ func (m *UserState) GetTemporaryAccessTokens() []string { return nil } +func (m *UserState) GetListeningChannelAdd() []uint32 { + if m != nil { + return m.ListeningChannelAdd + } + return nil +} + +func (m *UserState) GetListeningChannelRemove() []uint32 { + if m != nil { + return m.ListeningChannelRemove + } + return nil +} + +func (m *UserState) GetListeningVolumeAdjustment() []*UserState_VolumeAdjustment { + if m != nil { + return m.ListeningVolumeAdjustment + } + return nil +} + +type UserState_VolumeAdjustment struct { + ListeningChannel *uint32 `protobuf:"varint,1,opt,name=listening_channel,json=listeningChannel" json:"listening_channel,omitempty"` + VolumeAdjustment *float32 `protobuf:"fixed32,2,opt,name=volume_adjustment,json=volumeAdjustment" json:"volume_adjustment,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *UserState_VolumeAdjustment) Reset() { *m = UserState_VolumeAdjustment{} } +func (m *UserState_VolumeAdjustment) String() string { return proto.CompactTextString(m) } +func (*UserState_VolumeAdjustment) ProtoMessage() {} +func (*UserState_VolumeAdjustment) Descriptor() ([]byte, []int) { + return fileDescriptor_56c09c2dce0fb003, []int{9, 0} +} + +func (m *UserState_VolumeAdjustment) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_UserState_VolumeAdjustment.Unmarshal(m, b) +} +func (m *UserState_VolumeAdjustment) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_UserState_VolumeAdjustment.Marshal(b, m, deterministic) +} +func (m *UserState_VolumeAdjustment) XXX_Merge(src proto.Message) { + xxx_messageInfo_UserState_VolumeAdjustment.Merge(m, src) +} +func (m *UserState_VolumeAdjustment) XXX_Size() int { + return xxx_messageInfo_UserState_VolumeAdjustment.Size(m) +} +func (m *UserState_VolumeAdjustment) XXX_DiscardUnknown() { + xxx_messageInfo_UserState_VolumeAdjustment.DiscardUnknown(m) +} + +var xxx_messageInfo_UserState_VolumeAdjustment proto.InternalMessageInfo + +func (m *UserState_VolumeAdjustment) GetListeningChannel() uint32 { + if m != nil && m.ListeningChannel != nil { + return *m.ListeningChannel + } + return 0 +} + +func (m *UserState_VolumeAdjustment) GetVolumeAdjustment() float32 { + if m != nil && m.VolumeAdjustment != nil { + return *m.VolumeAdjustment + } + return 0 +} + // Relays information on the bans. The client may send the BanList message to // either modify the list of bans or query them from the server. The server // sends this list only after a client queries for it. @@ -1894,13 +1999,20 @@ func (m *CryptSetup) GetServerNonce() []byte { return nil } +// Used to add or remove custom context menu item on client-side. type ContextActionModify struct { - // The action name. + // The action identifier. Used later to initiate an action. Action *string `protobuf:"bytes,1,req,name=action" json:"action,omitempty"` // The display name of the action. Text *string `protobuf:"bytes,2,opt,name=text" json:"text,omitempty"` // Context bit flags defining where the action should be displayed. - Context *uint32 `protobuf:"varint,3,opt,name=context" json:"context,omitempty"` + // Flags can be OR-ed to combine different types. + Context *uint32 `protobuf:"varint,3,opt,name=context" json:"context,omitempty"` + // Choose either to add or to remove the context action. + // Note: This field only exists after Mumble 1.2.4-beta1 release. + // + // The message will be recognized as Add regardless of this field + // before said release. Operation *ContextActionModify_Operation `protobuf:"varint,4,opt,name=operation,enum=MumbleProto.ContextActionModify_Operation" json:"operation,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -2424,7 +2536,7 @@ type UserStats struct { CeltVersions []int32 `protobuf:"varint,13,rep,name=celt_versions,json=celtVersions" json:"celt_versions,omitempty"` // Client IP address. Address []byte `protobuf:"bytes,14,opt,name=address" json:"address,omitempty"` - // Bandwith used by this client. + // Bandwidth used by this client. Bandwidth *uint32 `protobuf:"varint,15,opt,name=bandwidth" json:"bandwidth,omitempty"` // Connection duration. Onlinesecs *uint32 `protobuf:"varint,16,opt,name=onlinesecs" json:"onlinesecs,omitempty"` @@ -2747,7 +2859,9 @@ type ServerConfig struct { // Maximum image message length. ImageMessageLength *uint32 `protobuf:"varint,5,opt,name=image_message_length,json=imageMessageLength" json:"image_message_length,omitempty"` // The maximum number of users allowed on the server. - MaxUsers *uint32 `protobuf:"varint,6,opt,name=max_users,json=maxUsers" json:"max_users,omitempty"` + MaxUsers *uint32 `protobuf:"varint,6,opt,name=max_users,json=maxUsers" json:"max_users,omitempty"` + // Whether using Mumble's recording feature is allowed on the server + RecordingAllowed *bool `protobuf:"varint,7,opt,name=recording_allowed,json=recordingAllowed" json:"recording_allowed,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -2820,11 +2934,21 @@ func (m *ServerConfig) GetMaxUsers() uint32 { return 0 } +func (m *ServerConfig) GetRecordingAllowed() bool { + if m != nil && m.RecordingAllowed != nil { + return *m.RecordingAllowed + } + return false +} + // Sent by the server to inform the clients of suggested client configuration // specified by the server administrator. type SuggestConfig struct { - // Suggested client version. - Version *uint32 `protobuf:"varint,1,opt,name=version" json:"version,omitempty"` + // Suggested client version in the legacy format. + VersionV1 *uint32 `protobuf:"varint,1,opt,name=version_v1,json=versionV1" json:"version_v1,omitempty"` + // Suggested client version in the new format. + // Necessary since patch level may exceed 255. (See https://github.com/mumble-voip/mumble/issues/5827) + VersionV2 *uint64 `protobuf:"varint,4,opt,name=version_v2,json=versionV2" json:"version_v2,omitempty"` // True if the administrator suggests positional audio to be used on this // server. Positional *bool `protobuf:"varint,2,opt,name=positional" json:"positional,omitempty"` @@ -2860,9 +2984,16 @@ func (m *SuggestConfig) XXX_DiscardUnknown() { var xxx_messageInfo_SuggestConfig proto.InternalMessageInfo -func (m *SuggestConfig) GetVersion() uint32 { - if m != nil && m.Version != nil { - return *m.Version +func (m *SuggestConfig) GetVersionV1() uint32 { + if m != nil && m.VersionV1 != nil { + return *m.VersionV1 + } + return 0 +} + +func (m *SuggestConfig) GetVersionV2() uint64 { + if m != nil && m.VersionV2 != nil { + return *m.VersionV2 } return 0 } @@ -2881,6 +3012,75 @@ func (m *SuggestConfig) GetPushToTalk() bool { return false } +// Used to send plugin messages between clients +type PluginDataTransmission struct { + // The session ID of the client this message was sent from + SenderSession *uint32 `protobuf:"varint,1,opt,name=senderSession" json:"senderSession,omitempty"` + // The session IDs of the clients that should receive this message + ReceiverSessions []uint32 `protobuf:"varint,2,rep,packed,name=receiverSessions" json:"receiverSessions,omitempty"` + // The data that is sent + Data []byte `protobuf:"bytes,3,opt,name=data" json:"data,omitempty"` + // The ID of the sent data. This will be used by plugins to check whether they will + // process it or not + DataID *string `protobuf:"bytes,4,opt,name=dataID" json:"dataID,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *PluginDataTransmission) Reset() { *m = PluginDataTransmission{} } +func (m *PluginDataTransmission) String() string { return proto.CompactTextString(m) } +func (*PluginDataTransmission) ProtoMessage() {} +func (*PluginDataTransmission) Descriptor() ([]byte, []int) { + return fileDescriptor_56c09c2dce0fb003, []int{26} +} + +func (m *PluginDataTransmission) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_PluginDataTransmission.Unmarshal(m, b) +} +func (m *PluginDataTransmission) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_PluginDataTransmission.Marshal(b, m, deterministic) +} +func (m *PluginDataTransmission) XXX_Merge(src proto.Message) { + xxx_messageInfo_PluginDataTransmission.Merge(m, src) +} +func (m *PluginDataTransmission) XXX_Size() int { + return xxx_messageInfo_PluginDataTransmission.Size(m) +} +func (m *PluginDataTransmission) XXX_DiscardUnknown() { + xxx_messageInfo_PluginDataTransmission.DiscardUnknown(m) +} + +var xxx_messageInfo_PluginDataTransmission proto.InternalMessageInfo + +func (m *PluginDataTransmission) GetSenderSession() uint32 { + if m != nil && m.SenderSession != nil { + return *m.SenderSession + } + return 0 +} + +func (m *PluginDataTransmission) GetReceiverSessions() []uint32 { + if m != nil { + return m.ReceiverSessions + } + return nil +} + +func (m *PluginDataTransmission) GetData() []byte { + if m != nil { + return m.Data + } + return nil +} + +func (m *PluginDataTransmission) GetDataID() string { + if m != nil && m.DataID != nil { + return *m.DataID + } + return "" +} + func init() { proto.RegisterEnum("MumbleProto.Reject_RejectType", Reject_RejectType_name, Reject_RejectType_value) proto.RegisterEnum("MumbleProto.PermissionDenied_DenyType", PermissionDenied_DenyType_name, PermissionDenied_DenyType_value) @@ -2896,6 +3096,7 @@ func init() { proto.RegisterType((*ChannelState)(nil), "MumbleProto.ChannelState") proto.RegisterType((*UserRemove)(nil), "MumbleProto.UserRemove") proto.RegisterType((*UserState)(nil), "MumbleProto.UserState") + proto.RegisterType((*UserState_VolumeAdjustment)(nil), "MumbleProto.UserState.VolumeAdjustment") proto.RegisterType((*BanList)(nil), "MumbleProto.BanList") proto.RegisterType((*BanList_BanEntry)(nil), "MumbleProto.BanList.BanEntry") proto.RegisterType((*TextMessage)(nil), "MumbleProto.TextMessage") @@ -2918,168 +3119,185 @@ func init() { proto.RegisterType((*RequestBlob)(nil), "MumbleProto.RequestBlob") proto.RegisterType((*ServerConfig)(nil), "MumbleProto.ServerConfig") proto.RegisterType((*SuggestConfig)(nil), "MumbleProto.SuggestConfig") + proto.RegisterType((*PluginDataTransmission)(nil), "MumbleProto.PluginDataTransmission") } func init() { proto.RegisterFile("Mumble.proto", fileDescriptor_56c09c2dce0fb003) } var fileDescriptor_56c09c2dce0fb003 = []byte{ - // 2523 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x58, 0x4f, 0x6f, 0x24, 0x47, - 0x15, 0x4f, 0xcf, 0xff, 0x79, 0x33, 0x63, 0xb7, 0x6b, 0x9d, 0x64, 0x70, 0xb2, 0x89, 0xd3, 0x0b, - 0x89, 0x03, 0x91, 0x09, 0x56, 0x84, 0x94, 0x48, 0x1c, 0xbc, 0xde, 0x04, 0xaf, 0xb0, 0x37, 0x4b, - 0xdb, 0xd9, 0x1c, 0x38, 0x34, 0xe5, 0xee, 0xf2, 0x4c, 0xe3, 0x9e, 0xee, 0x4e, 0x55, 0xb5, 0x77, - 0x47, 0xe2, 0x08, 0x5c, 0xc9, 0x8d, 0x1b, 0x1f, 0x20, 0x87, 0x48, 0x7c, 0x05, 0x3e, 0x01, 0x07, - 0x3e, 0x01, 0xe2, 0xc6, 0x0d, 0x89, 0x3b, 0x7a, 0xaf, 0xaa, 0xff, 0x79, 0x9d, 0x6c, 0xb8, 0x72, - 0x99, 0xa9, 0xf7, 0x7b, 0xbf, 0xfa, 0xd3, 0x55, 0xef, 0x5f, 0x15, 0x4c, 0x4f, 0x8b, 0xd5, 0x45, - 0x22, 0xf6, 0x73, 0x99, 0xe9, 0x8c, 0x4d, 0x8c, 0xf4, 0x18, 0x05, 0x2f, 0x81, 0xe1, 0x13, 0x21, - 0x55, 0x9c, 0xa5, 0x6c, 0x0e, 0xc3, 0x6b, 0xd3, 0x9c, 0x3b, 0xbb, 0xce, 0xde, 0xcc, 0x2f, 0x45, - 0xd4, 0x48, 0x91, 0x08, 0xae, 0xc4, 0xbc, 0xb3, 0xeb, 0xec, 0x8d, 0xfd, 0x52, 0x64, 0x1b, 0xd0, - 0xc9, 0xd4, 0xbc, 0x4b, 0x60, 0x27, 0x53, 0xec, 0x2e, 0x40, 0xa6, 0x82, 0x72, 0x98, 0x1e, 0xe1, - 0xe3, 0x4c, 0xd9, 0x29, 0xbc, 0x7b, 0x30, 0xfe, 0xec, 0xc1, 0xe3, 0xf3, 0x22, 0x4d, 0x45, 0xc2, - 0x5e, 0x81, 0x41, 0xce, 0xc3, 0x2b, 0xa1, 0xe7, 0xce, 0x6e, 0x67, 0x6f, 0xea, 0x5b, 0xc9, 0xfb, - 0xb3, 0x03, 0xd3, 0xc3, 0x42, 0x2f, 0x45, 0xaa, 0xe3, 0x90, 0x6b, 0xc1, 0x76, 0x60, 0x54, 0x28, - 0x21, 0x53, 0xbe, 0x12, 0xb4, 0xb2, 0xb1, 0x5f, 0xc9, 0xa8, 0xcb, 0xb9, 0x52, 0x4f, 0x33, 0x19, - 0xd9, 0xb5, 0x55, 0x32, 0x4e, 0xa0, 0xb3, 0x2b, 0x91, 0xe2, 0x02, 0xbb, 0x7b, 0x63, 0xdf, 0x4a, - 0xec, 0x1e, 0xcc, 0x42, 0x91, 0xe8, 0x72, 0x99, 0x6a, 0xde, 0xdb, 0xed, 0xee, 0xf5, 0xfd, 0x29, - 0x82, 0x76, 0xa5, 0x8a, 0x7d, 0x0f, 0x7a, 0x59, 0x5e, 0xa8, 0x79, 0x7f, 0xd7, 0xd9, 0x1b, 0x7d, - 0xd4, 0xbf, 0xe4, 0x89, 0x12, 0x3e, 0x41, 0xde, 0x5f, 0x3b, 0xd0, 0x7b, 0x1c, 0xa7, 0x0b, 0xf6, - 0x3a, 0x8c, 0x75, 0xbc, 0x12, 0x4a, 0xf3, 0x55, 0x4e, 0x2b, 0xeb, 0xf9, 0x35, 0xc0, 0x18, 0xf4, - 0x16, 0x59, 0x66, 0x96, 0x35, 0xf3, 0xa9, 0x8d, 0x58, 0xc2, 0xb5, 0xa0, 0x1d, 0x9b, 0xf9, 0xd4, - 0x26, 0x2c, 0x53, 0x9a, 0x76, 0x0b, 0xb1, 0x4c, 0x69, 0x5c, 0xba, 0x14, 0x6a, 0x9d, 0x86, 0x34, - 0xff, 0xcc, 0xb7, 0x12, 0x7b, 0x13, 0x26, 0x45, 0x94, 0x07, 0x66, 0xa7, 0xd4, 0x7c, 0x40, 0x4a, - 0x28, 0xa2, 0xfc, 0xb1, 0x41, 0x90, 0xa0, 0xc3, 0x9a, 0x30, 0x34, 0x04, 0x1d, 0x56, 0x84, 0x5d, - 0x98, 0xd2, 0x08, 0x71, 0xba, 0x08, 0xf8, 0xf5, 0x62, 0x3e, 0xda, 0x75, 0xf6, 0x3a, 0x66, 0x88, - 0x38, 0x5d, 0x1c, 0x5e, 0x2f, 0x5a, 0x8c, 0x6b, 0x2e, 0xe7, 0xe3, 0x16, 0xe3, 0x09, 0x97, 0xc8, - 0xa0, 0x49, 0xca, 0x31, 0xc0, 0x30, 0x70, 0x96, 0x7a, 0x8c, 0x8a, 0x81, 0x63, 0x4c, 0x5a, 0x8c, - 0x27, 0x5c, 0x7a, 0xbf, 0xef, 0xc0, 0xc0, 0x17, 0xbf, 0x11, 0xa1, 0x66, 0x07, 0xd0, 0xd3, 0xeb, - 0xdc, 0x9c, 0xed, 0xc6, 0xc1, 0x1b, 0xfb, 0x0d, 0xfb, 0xdc, 0x37, 0x14, 0xfb, 0x77, 0xbe, 0xce, - 0x85, 0x4f, 0x5c, 0xb3, 0x41, 0x5c, 0x65, 0xa9, 0x3d, 0x75, 0x2b, 0x79, 0x5f, 0x3b, 0x00, 0x35, - 0x99, 0x8d, 0xa0, 0xf7, 0x28, 0x4b, 0x85, 0xfb, 0x12, 0x73, 0x61, 0xfa, 0xb9, 0xcc, 0xd2, 0x85, - 0x3d, 0x60, 0xd7, 0x61, 0x77, 0x60, 0xf3, 0x61, 0x7a, 0xcd, 0x93, 0x38, 0xfa, 0xcc, 0x5a, 0x93, - 0xdb, 0x61, 0x9b, 0x30, 0x21, 0x1a, 0x42, 0x8f, 0x3f, 0x77, 0xbb, 0x6c, 0x0b, 0x66, 0x04, 0x9c, - 0x09, 0x79, 0x4d, 0x50, 0x0f, 0xa1, 0xb2, 0xc7, 0xc3, 0xf4, 0x33, 0x25, 0xdc, 0x3e, 0xdb, 0x00, - 0x30, 0x84, 0x4f, 0x8a, 0x24, 0x71, 0x07, 0x48, 0x79, 0x94, 0x1d, 0x09, 0xa9, 0xe3, 0x4b, 0xb2, - 0x61, 0x77, 0xc8, 0x5e, 0x86, 0xad, 0x86, 0x55, 0x67, 0xf2, 0x13, 0x1e, 0x27, 0xee, 0xc8, 0xfb, - 0xd2, 0x29, 0xbb, 0x9e, 0xe1, 0x01, 0xcf, 0x61, 0xa8, 0x84, 0x6a, 0x3a, 0xa1, 0x15, 0xd1, 0x6a, - 0x57, 0xfc, 0x59, 0x70, 0xc1, 0xd3, 0xe8, 0x69, 0x1c, 0xe9, 0xa5, 0xb5, 0xab, 0xe9, 0x8a, 0x3f, - 0xbb, 0x5f, 0x62, 0xec, 0x2d, 0x98, 0x3e, 0x15, 0x49, 0x98, 0xad, 0x44, 0xa0, 0xc5, 0x33, 0x6d, - 0x3d, 0x73, 0x62, 0xb1, 0x73, 0xf1, 0x4c, 0xb3, 0x5d, 0x98, 0xe4, 0x42, 0xae, 0x62, 0x55, 0xda, - 0x3e, 0x9a, 0x6d, 0x13, 0xf2, 0xf6, 0x61, 0x76, 0xb4, 0xe4, 0xe8, 0xa3, 0xbe, 0x58, 0x65, 0xd7, - 0x02, 0xbd, 0x3a, 0x34, 0x40, 0x10, 0x47, 0xe4, 0xad, 0x33, 0x7f, 0x6c, 0x91, 0x87, 0x91, 0xf7, - 0x55, 0x17, 0xa6, 0xb6, 0xc3, 0x99, 0x46, 0x8b, 0xbe, 0xc9, 0x77, 0x5a, 0x7c, 0xe3, 0xf8, 0x52, - 0xa4, 0xda, 0x7e, 0x82, 0x95, 0xd0, 0x11, 0xc8, 0xc7, 0xcd, 0xa2, 0xa9, 0xcd, 0xb6, 0xa1, 0x9f, - 0xc4, 0xe9, 0x95, 0xf1, 0xd1, 0x99, 0x6f, 0x04, 0xfc, 0x86, 0x48, 0xa8, 0x50, 0xc6, 0xb9, 0xc6, - 0x9d, 0xea, 0x9b, 0xaf, 0x6c, 0x40, 0xec, 0x35, 0x18, 0x13, 0x35, 0xe0, 0x51, 0x34, 0x1f, 0x50, - 0xdf, 0x11, 0x01, 0x87, 0x51, 0x84, 0xbb, 0x64, 0x94, 0x92, 0xbe, 0x6f, 0x3e, 0x24, 0xfd, 0x84, - 0x30, 0xfb, 0xc9, 0xf7, 0x60, 0xac, 0xc5, 0x2a, 0xcf, 0x24, 0x97, 0x6b, 0xf2, 0x91, 0x2a, 0x06, - 0xd4, 0x38, 0xbb, 0x0b, 0xa3, 0x3c, 0x53, 0x31, 0xad, 0x01, 0xbd, 0xa4, 0xff, 0x91, 0xf3, 0xbe, - 0x5f, 0x41, 0xec, 0x5d, 0x70, 0x1b, 0x4b, 0x0a, 0x96, 0x5c, 0x2d, 0xc9, 0x55, 0xa6, 0xfe, 0x66, - 0x03, 0x3f, 0xe6, 0x6a, 0x89, 0xcb, 0xc5, 0xc3, 0xc5, 0xb0, 0xa6, 0xc8, 0x59, 0x66, 0xfe, 0x68, - 0xc5, 0x9f, 0xa1, 0x99, 0x29, 0xb6, 0x0f, 0x77, 0x62, 0x15, 0x88, 0x54, 0x0b, 0x19, 0x48, 0xa1, - 0xb4, 0x8c, 0x43, 0x2d, 0xa2, 0xf9, 0x14, 0x57, 0xe5, 0x6f, 0xc5, 0xea, 0x63, 0xd4, 0xf8, 0x95, - 0x02, 0x07, 0x0b, 0x79, 0x6a, 0x3a, 0xcc, 0x67, 0xc4, 0x1a, 0x85, 0x3c, 0x25, 0x9a, 0x77, 0x09, - 0x80, 0xa3, 0xda, 0xcf, 0x6c, 0x99, 0x5b, 0xa7, 0x69, 0x6e, 0xdb, 0xd0, 0xe7, 0xa1, 0xce, 0xa4, - 0x3d, 0x23, 0x23, 0x34, 0xdc, 0xae, 0xdb, 0x74, 0x3b, 0xe6, 0x42, 0xf7, 0x82, 0x9b, 0x80, 0x3f, - 0xf2, 0xb1, 0xe9, 0xfd, 0xb3, 0x07, 0x63, 0x9c, 0xc8, 0x58, 0xc4, 0x37, 0x9b, 0xf5, 0xed, 0xf3, - 0xdc, 0x66, 0x0a, 0xaf, 0xc2, 0x10, 0xf7, 0x07, 0x4d, 0xca, 0x84, 0xca, 0x01, 0x8a, 0x0f, 0xa3, - 0x1b, 0xe6, 0xd6, 0xbf, 0x69, 0x6e, 0x0c, 0x7a, 0xab, 0x42, 0x0b, 0x0a, 0x96, 0x23, 0x9f, 0xda, - 0x88, 0x45, 0x82, 0x5f, 0x52, 0x7c, 0x1c, 0xf9, 0xd4, 0xc6, 0x54, 0xa2, 0x8a, 0x3c, 0x97, 0x42, - 0x29, 0x73, 0xe2, 0x7e, 0x25, 0xe3, 0x96, 0x2a, 0x91, 0x5c, 0x06, 0x34, 0xd0, 0xd8, 0x2a, 0x45, - 0x72, 0x79, 0x8a, 0x83, 0x95, 0x4a, 0x1a, 0x11, 0x6a, 0xe5, 0x03, 0x1c, 0x75, 0x0e, 0x43, 0xf4, - 0xc4, 0x42, 0x0a, 0x3a, 0xd7, 0xa9, 0x5f, 0x8a, 0xec, 0x07, 0xb0, 0x91, 0x27, 0xc5, 0x22, 0x4e, - 0x83, 0x30, 0x4b, 0xc9, 0x5b, 0xa7, 0x44, 0x98, 0x19, 0xf4, 0xc8, 0x80, 0xec, 0x1d, 0xd8, 0xb4, - 0xb4, 0x38, 0xc2, 0xe0, 0xa1, 0xd7, 0x74, 0xa6, 0x63, 0xdf, 0xf6, 0x7e, 0x68, 0x51, 0x9c, 0x29, - 0xcc, 0x56, 0x2b, 0xf4, 0xab, 0x0d, 0x93, 0xa5, 0xad, 0x88, 0x5f, 0x4b, 0xc6, 0xb7, 0x69, 0x76, - 0x13, 0xdb, 0xe8, 0x03, 0x56, 0x6d, 0x0c, 0xd3, 0xa5, 0xb9, 0x27, 0x16, 0x3b, 0xb6, 0x14, 0xbb, - 0x56, 0x43, 0xd9, 0x32, 0x14, 0x8b, 0x11, 0xe5, 0x5d, 0x70, 0x73, 0x19, 0x67, 0x32, 0xd6, 0xeb, - 0x40, 0xe5, 0x82, 0x5f, 0x09, 0x39, 0x67, 0xb4, 0x03, 0x9b, 0x25, 0x7e, 0x66, 0x60, 0x4c, 0x96, - 0x52, 0x84, 0x99, 0x8c, 0xe2, 0x74, 0x31, 0xbf, 0x43, 0x9c, 0x1a, 0x60, 0x3f, 0x85, 0x57, 0x2b, - 0xbf, 0x0a, 0x78, 0x18, 0x0a, 0xa5, 0x02, 0x9b, 0xbc, 0xb7, 0x29, 0x79, 0xbf, 0x5c, 0xa9, 0x0f, - 0x49, 0x7b, 0x4e, 0x4a, 0xef, 0x0f, 0x1d, 0x18, 0xde, 0xe7, 0xe9, 0x49, 0xac, 0x34, 0xfb, 0x09, - 0xf4, 0x2e, 0x78, 0xaa, 0xe6, 0xce, 0x6e, 0x77, 0x6f, 0x72, 0x70, 0xb7, 0x95, 0x47, 0x2c, 0x07, - 0xff, 0x3f, 0x4e, 0xb5, 0x5c, 0xfb, 0x44, 0x65, 0xaf, 0x41, 0xff, 0x8b, 0x42, 0xc8, 0x35, 0x59, - 0x5f, 0xe5, 0xe2, 0x06, 0xdb, 0xf9, 0xca, 0x81, 0x51, 0xc9, 0xc7, 0xdd, 0xe5, 0x51, 0x44, 0xc6, - 0x61, 0xca, 0x95, 0x52, 0x24, 0xfb, 0xe2, 0xea, 0x6a, 0xde, 0x21, 0x07, 0xa2, 0xf6, 0xad, 0xf6, - 0x5b, 0x9e, 0x42, 0xaf, 0x71, 0x0a, 0xb5, 0x3f, 0xf5, 0x5b, 0xfe, 0xb4, 0x0d, 0x7d, 0xa5, 0xb9, - 0xd4, 0x64, 0xb4, 0x63, 0xdf, 0x08, 0x68, 0xa1, 0x51, 0x21, 0x39, 0xc5, 0x1b, 0x93, 0xd9, 0x2b, - 0xd9, 0xfb, 0xa3, 0x03, 0x13, 0x8c, 0xef, 0xa7, 0x42, 0x29, 0xbe, 0x10, 0xb5, 0x5f, 0x39, 0x4d, - 0xbf, 0x6a, 0xf8, 0x61, 0x87, 0x82, 0x5e, 0xe5, 0x87, 0x6d, 0x27, 0xea, 0x92, 0xb2, 0xe1, 0x44, - 0xaf, 0xc2, 0x50, 0x4b, 0x21, 0x8c, 0xf3, 0xa1, 0x6e, 0x80, 0xe2, 0xc3, 0x08, 0x47, 0x5c, 0x99, - 0x29, 0xe7, 0xfd, 0xdd, 0x0e, 0x5a, 0x9d, 0x15, 0x31, 0x2d, 0xb8, 0x8f, 0xab, 0xb4, 0xf2, 0x40, - 0xa4, 0xb1, 0x88, 0xd8, 0x1b, 0x00, 0x75, 0xaa, 0xb1, 0x6b, 0x6b, 0x20, 0x37, 0x96, 0xd1, 0xb9, - 0xe9, 0xcb, 0x8d, 0xf5, 0x77, 0xdb, 0x71, 0xa4, 0xde, 0xc9, 0x5e, 0x6b, 0x27, 0x3f, 0xb2, 0xc5, - 0x45, 0x9f, 0x8a, 0x8b, 0xb7, 0x5b, 0x46, 0x71, 0x73, 0x75, 0xfb, 0x0f, 0x44, 0xba, 0x6e, 0x14, - 0x19, 0xe5, 0x29, 0x0e, 0xea, 0x53, 0xf4, 0xfe, 0xee, 0xc0, 0xa8, 0xa4, 0x61, 0x79, 0x81, 0x7b, - 0xee, 0xbe, 0x84, 0x05, 0x40, 0x3d, 0x9a, 0xeb, 0xb0, 0x19, 0x8c, 0xcf, 0x8a, 0x5c, 0x48, 0x0c, - 0x81, 0xa6, 0xac, 0xb0, 0x19, 0xf2, 0x11, 0xd6, 0x19, 0x5d, 0x04, 0xb0, 0xe7, 0x79, 0x96, 0x9d, - 0x64, 0xe9, 0xc2, 0xed, 0xb1, 0x21, 0x74, 0x8f, 0x3f, 0xfc, 0x85, 0xdb, 0x67, 0xdb, 0xe0, 0x9e, - 0x97, 0xa6, 0x6e, 0xfb, 0xb8, 0x03, 0xf6, 0x0a, 0xb0, 0x53, 0x1c, 0x3c, 0x5d, 0xb4, 0xab, 0x8a, - 0x29, 0x8c, 0x70, 0x0a, 0x1a, 0x75, 0xd4, 0x98, 0x86, 0xea, 0x90, 0x31, 0x56, 0x3d, 0x8f, 0x84, - 0xd2, 0x71, 0xba, 0x38, 0x89, 0x57, 0xb1, 0x76, 0x01, 0xcb, 0x10, 0x4b, 0x39, 0xca, 0x8a, 0x54, - 0x1b, 0x78, 0xe2, 0xfd, 0xae, 0x0f, 0xdd, 0xc3, 0xa3, 0x93, 0x17, 0xa4, 0x7a, 0xf6, 0x0e, 0x4c, - 0xe3, 0x74, 0x29, 0x64, 0xac, 0x03, 0x1e, 0x26, 0xca, 0xba, 0x4d, 0x4f, 0xcb, 0x42, 0xf8, 0x13, - 0xab, 0x39, 0x0c, 0x13, 0xc5, 0x0e, 0x60, 0xb0, 0x90, 0x59, 0x91, 0x9b, 0xda, 0x7b, 0x72, 0xb0, - 0xd3, 0xda, 0xf8, 0xc3, 0xa3, 0x93, 0x7d, 0x5c, 0xc5, 0xcf, 0x91, 0xe2, 0x5b, 0x26, 0x7b, 0x0f, - 0x7a, 0x34, 0x68, 0x8f, 0x7a, 0xcc, 0x6f, 0xed, 0x71, 0x78, 0x74, 0xe2, 0x13, 0xab, 0x76, 0xdd, - 0xfe, 0x2d, 0xae, 0xfb, 0x0f, 0x07, 0xc6, 0xd5, 0x04, 0xd5, 0x39, 0x3a, 0x64, 0xa0, 0xc6, 0x1b, - 0x3d, 0x18, 0xdb, 0xf5, 0x8a, 0xa8, 0xf5, 0x19, 0x35, 0xcc, 0xde, 0x80, 0xa1, 0x15, 0xc8, 0xda, - 0x4a, 0x46, 0x09, 0xb2, 0xb7, 0xa1, 0xfc, 0x66, 0x7e, 0x91, 0x08, 0x93, 0xfd, 0x6e, 0x6c, 0x06, - 0x2a, 0x30, 0x3b, 0x62, 0x19, 0xd2, 0x27, 0xc7, 0xc1, 0xa6, 0xb1, 0x56, 0xaa, 0x3d, 0x4c, 0x6d, - 0x62, 0x25, 0xf6, 0x23, 0xd8, 0xaa, 0xa6, 0x0f, 0x56, 0x62, 0x75, 0x81, 0xf5, 0x80, 0x29, 0x4f, - 0xdc, 0x4a, 0x71, 0x6a, 0xf0, 0x9d, 0xbf, 0x39, 0x30, 0xb4, 0x7b, 0xc2, 0xee, 0x01, 0xf0, 0x3c, - 0x4f, 0xd6, 0xc1, 0x52, 0x48, 0x53, 0x49, 0x57, 0xdf, 0x43, 0xf8, 0xb1, 0x90, 0xa2, 0x26, 0xa9, - 0xe2, 0xa2, 0x7d, 0x76, 0x86, 0x74, 0x56, 0x5c, 0xa8, 0xf6, 0xc6, 0x74, 0x6f, 0xdf, 0x98, 0x6f, - 0x4c, 0xc5, 0xdb, 0xd0, 0xa7, 0xc3, 0xb4, 0xe1, 0xcc, 0x08, 0x06, 0xe5, 0xa9, 0xb6, 0xf7, 0x15, - 0x23, 0x98, 0x1c, 0x9c, 0xae, 0x6d, 0x24, 0xa3, 0xb6, 0xf7, 0x01, 0xc0, 0x2f, 0xf1, 0x00, 0x4d, - 0xe1, 0xe3, 0x42, 0x37, 0x8e, 0x4c, 0x3c, 0x9f, 0xf9, 0xd8, 0xc4, 0x91, 0xf0, 0xf4, 0x14, 0x45, - 0xaf, 0xb1, 0x6f, 0x04, 0x2f, 0x02, 0x38, 0x92, 0xeb, 0x5c, 0x9f, 0x09, 0x5d, 0xe4, 0xd8, 0xeb, - 0x4a, 0xac, 0x69, 0x0f, 0xa6, 0x3e, 0x36, 0x29, 0xd7, 0x25, 0x31, 0xa6, 0xba, 0x34, 0x4b, 0x43, - 0x73, 0x89, 0xc5, 0x5c, 0x47, 0xd8, 0x23, 0x84, 0x90, 0xa2, 0xa8, 0x0a, 0xb7, 0x94, 0xae, 0xa1, - 0x18, 0x8c, 0x28, 0xde, 0x7f, 0x1c, 0xb8, 0x63, 0x93, 0xf2, 0x61, 0x88, 0x31, 0xf7, 0x34, 0x8b, - 0xe2, 0xcb, 0x35, 0x9e, 0x25, 0x27, 0xd9, 0xda, 0x97, 0x95, 0xf0, 0xfb, 0x28, 0xab, 0x9b, 0x0b, - 0x0a, 0xb5, 0x4d, 0x8e, 0x4e, 0xab, 0xd2, 0x7c, 0xe6, 0x97, 0x22, 0x3b, 0x86, 0x71, 0x96, 0x0b, - 0x1b, 0xdc, 0x7b, 0x14, 0xac, 0x7e, 0xd8, 0xf2, 0x80, 0x5b, 0xa6, 0xde, 0xff, 0xb4, 0xec, 0xe1, - 0xd7, 0x9d, 0xbd, 0xf7, 0x60, 0x58, 0xd6, 0x0e, 0x00, 0x03, 0x73, 0xb7, 0x70, 0x1d, 0x36, 0x31, - 0xc6, 0x82, 0xe1, 0xa4, 0x83, 0x81, 0x8b, 0x22, 0x53, 0xcf, 0xdb, 0x85, 0x71, 0x35, 0x0a, 0x06, - 0xa1, 0xc3, 0x28, 0x72, 0x5f, 0xc2, 0x8e, 0xa6, 0x42, 0x74, 0x1d, 0xef, 0xd7, 0x30, 0x6b, 0xcd, - 0xfd, 0x2d, 0xc5, 0xdc, 0x0b, 0xa2, 0x77, 0xbd, 0x53, 0xdd, 0xe6, 0x4e, 0x79, 0x7f, 0x71, 0x4c, - 0x14, 0xa3, 0x2c, 0xfe, 0x3e, 0xf4, 0x4d, 0x19, 0xec, 0xdc, 0x12, 0x38, 0x4a, 0x16, 0x35, 0x7c, - 0x43, 0xdc, 0x51, 0xe6, 0x63, 0x9a, 0x56, 0x69, 0x02, 0x57, 0x69, 0x95, 0xa5, 0xff, 0x77, 0x1a, - 0xd9, 0x18, 0x2f, 0x08, 0x5c, 0xe9, 0x40, 0x09, 0x51, 0x16, 0xb3, 0x23, 0x04, 0xce, 0x84, 0x48, - 0xe9, 0x82, 0x80, 0x4a, 0xbb, 0x74, 0x6b, 0xe4, 0x13, 0xc4, 0xec, 0x1e, 0x7a, 0xff, 0x76, 0x60, - 0xf2, 0x24, 0x8b, 0x43, 0x71, 0xce, 0xe5, 0x42, 0x68, 0xb6, 0x01, 0x9d, 0xea, 0xae, 0xd3, 0x89, - 0x23, 0xf6, 0x21, 0x0c, 0x35, 0x69, 0x8c, 0xad, 0x4e, 0x0e, 0xde, 0x6c, 0x7d, 0x48, 0xa3, 0xeb, - 0xbe, 0xf9, 0xf3, 0x4b, 0xfe, 0xce, 0x9f, 0x1c, 0x18, 0xd8, 0x51, 0x5b, 0x5b, 0xdd, 0xfd, 0x1f, - 0xb6, 0xba, 0x72, 0xc4, 0x6e, 0xd3, 0x11, 0x5f, 0xab, 0x6f, 0x53, 0xcd, 0x98, 0x69, 0x2e, 0x55, - 0x6f, 0xc1, 0x28, 0x5c, 0xc6, 0x49, 0x24, 0x45, 0xda, 0x8e, 0xa9, 0x15, 0xec, 0x65, 0xb0, 0x59, - 0x67, 0x39, 0x72, 0xd4, 0x17, 0xdd, 0xf5, 0x6e, 0xdc, 0x36, 0xcd, 0x3a, 0x9b, 0x10, 0xae, 0xe9, - 0x32, 0x29, 0xd4, 0xd2, 0xc6, 0x9a, 0x72, 0x4d, 0x84, 0x79, 0xbf, 0x85, 0xe9, 0x51, 0x16, 0x89, - 0xb0, 0x7c, 0xa3, 0xc2, 0xaa, 0x26, 0xc9, 0x97, 0x9c, 0x0e, 0xb8, 0xef, 0x1b, 0x01, 0xcf, 0xf7, - 0x42, 0x68, 0x4e, 0x15, 0x58, 0xdf, 0xa7, 0x36, 0x66, 0xaa, 0x5c, 0x8a, 0x4b, 0x21, 0x03, 0xd3, - 0x01, 0x2d, 0xae, 0x0a, 0xce, 0x46, 0x73, 0x48, 0x9d, 0xcb, 0x87, 0x9e, 0xde, 0xf3, 0x0f, 0x3d, - 0x5f, 0x0f, 0xea, 0x3b, 0x8c, 0xfa, 0x16, 0xb3, 0xff, 0x3e, 0x80, 0x42, 0x4a, 0x90, 0xa5, 0xc9, - 0x8d, 0x52, 0x72, 0x4c, 0x8a, 0x4f, 0xd3, 0x64, 0xcd, 0x3c, 0x98, 0x86, 0x75, 0xee, 0x36, 0x89, - 0x71, 0xea, 0xb7, 0x30, 0xf6, 0x33, 0x98, 0x5c, 0xca, 0x6c, 0x15, 0x98, 0xd0, 0x44, 0x6b, 0x9a, - 0x1c, 0xbc, 0xfe, 0x9c, 0x0b, 0xd0, 0x82, 0xf6, 0xe9, 0xd7, 0x07, 0xec, 0x70, 0x44, 0xfc, 0xaa, - 0xbb, 0x09, 0x5b, 0x74, 0x8a, 0xdf, 0xa9, 0xbb, 0x09, 0x12, 0xff, 0x3f, 0xaf, 0x4b, 0x6c, 0xbf, - 0x7e, 0xcb, 0x9c, 0xd2, 0x26, 0x6c, 0xb7, 0xbd, 0xcf, 0xe8, 0xea, 0x17, 0xce, 0xe7, 0x9e, 0x04, - 0x67, 0xb7, 0x3c, 0x09, 0x36, 0xae, 0x00, 0x1b, 0xe6, 0x2a, 0x57, 0x5e, 0x01, 0x5e, 0x87, 0x71, - 0xfd, 0x2e, 0xb3, 0x69, 0x7c, 0xa0, 0x02, 0xb0, 0xe6, 0xcd, 0xd2, 0x24, 0x4e, 0x85, 0x12, 0xa1, - 0xa2, 0x8b, 0xd6, 0xcc, 0x6f, 0x20, 0x58, 0xd6, 0xc7, 0x51, 0x62, 0xb4, 0x5b, 0xa6, 0xac, 0x2f, - 0x65, 0xf6, 0x01, 0x30, 0xa5, 0x65, 0x96, 0x2e, 0x82, 0x86, 0x9d, 0x98, 0x2b, 0x56, 0x69, 0x62, - 0x5b, 0x86, 0xd0, 0xa8, 0x0b, 0x2b, 0x9b, 0xbe, 0xf3, 0x9c, 0x4d, 0xef, 0xfc, 0x0a, 0xfa, 0xc6, - 0x9c, 0xcb, 0xe7, 0x49, 0xe7, 0x96, 0xe7, 0xc9, 0xce, 0x2d, 0xcf, 0x93, 0xdd, 0x5b, 0x9f, 0x27, - 0x7b, 0xcd, 0xe7, 0x49, 0xef, 0x4b, 0x07, 0x26, 0xbe, 0xf8, 0xa2, 0x10, 0x4a, 0xdf, 0x4f, 0xb2, - 0x0b, 0xbc, 0xbb, 0x5a, 0x1f, 0x09, 0xca, 0x4b, 0xb0, 0x09, 0x63, 0x1b, 0x16, 0x3e, 0xb7, 0x77, - 0xe1, 0x06, 0xb1, 0xbc, 0xc3, 0x76, 0x5a, 0xc4, 0x23, 0x7b, 0x95, 0xfd, 0x31, 0xdc, 0x29, 0xc3, - 0x4d, 0xf3, 0x05, 0xc8, 0xdc, 0x57, 0x98, 0x55, 0x3d, 0xa8, 0x35, 0xde, 0xbf, 0x1c, 0x98, 0x1a, - 0xf3, 0x3e, 0xca, 0xd2, 0xcb, 0x78, 0xf1, 0xfc, 0x3b, 0x9a, 0xf3, 0x1d, 0xde, 0xd1, 0x3a, 0xcf, - 0xbf, 0xa3, 0xdd, 0x05, 0xe0, 0x49, 0x92, 0x3d, 0x0d, 0x96, 0x7a, 0x95, 0x98, 0xe0, 0xe5, 0x8f, - 0x09, 0x39, 0xd6, 0xab, 0x04, 0x6f, 0xf7, 0xf6, 0x22, 0x14, 0x24, 0x22, 0x5d, 0xe8, 0xa5, 0xdd, - 0xaa, 0x99, 0x45, 0x4f, 0x08, 0x64, 0xef, 0xc3, 0x76, 0xbc, 0x42, 0xd2, 0x0d, 0xb2, 0x79, 0xc5, - 0x60, 0xa4, 0x3b, 0x6d, 0xf5, 0x68, 0x3d, 0x15, 0x0d, 0xda, 0x4f, 0x45, 0xde, 0x15, 0xcc, 0xce, - 0x8a, 0xc5, 0x42, 0x28, 0x6d, 0xbf, 0xf6, 0x9b, 0x1f, 0xf5, 0xf1, 0x26, 0x66, 0x5f, 0xaa, 0x78, - 0x62, 0x82, 0x96, 0xdf, 0x40, 0xd0, 0xc9, 0xf2, 0x42, 0x2d, 0x03, 0x9d, 0x05, 0x9a, 0x27, 0x57, - 0xf6, 0x0b, 0x01, 0xb1, 0xf3, 0xec, 0x9c, 0x27, 0x57, 0xf7, 0x3b, 0xc7, 0xce, 0x7f, 0x03, 0x00, - 0x00, 0xff, 0xff, 0x86, 0xf1, 0xdf, 0x29, 0x5b, 0x18, 0x00, 0x00, + // 2772 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x59, 0xcd, 0x72, 0xdc, 0xc6, + 0xf1, 0x37, 0xf6, 0x7b, 0x7b, 0x77, 0x49, 0x70, 0x44, 0x49, 0x6b, 0xca, 0xb2, 0x69, 0xc8, 0xb6, + 0xe8, 0xbf, 0x5d, 0xfc, 0xdb, 0x2c, 0x57, 0x2a, 0x76, 0x55, 0x0e, 0x14, 0x65, 0x47, 0xac, 0x90, + 0x32, 0x03, 0xd2, 0xf2, 0x21, 0x07, 0x64, 0x08, 0x0c, 0x77, 0x61, 0x62, 0x01, 0x18, 0x33, 0xa0, + 0xb4, 0x55, 0x39, 0x26, 0xb9, 0xc6, 0xb7, 0xa4, 0xf2, 0x06, 0xf1, 0xc1, 0x55, 0x79, 0x05, 0x3f, + 0x41, 0xee, 0xb9, 0xe5, 0x11, 0x52, 0x95, 0x7b, 0xaa, 0x7b, 0x06, 0x5f, 0x4b, 0xfa, 0xeb, 0x9a, + 0x0b, 0x77, 0xfa, 0xd7, 0x3d, 0x83, 0x9e, 0x9e, 0xee, 0x9e, 0xee, 0x21, 0x8c, 0x8f, 0xf3, 0xc5, + 0x79, 0x24, 0x76, 0xd3, 0x2c, 0x51, 0x09, 0x1b, 0x69, 0xea, 0x04, 0x09, 0xe7, 0x2b, 0x0b, 0xfa, + 0xcf, 0x44, 0x26, 0xc3, 0x24, 0x66, 0xf7, 0x01, 0xae, 0xf4, 0xd0, 0xbb, 0x7a, 0x7f, 0x6a, 0x6d, + 0x5b, 0x3b, 0x13, 0x77, 0x68, 0x90, 0x67, 0xef, 0x37, 0xd8, 0x7b, 0xd3, 0xee, 0xb6, 0xb5, 0xd3, + 0xa9, 0xd8, 0x7b, 0x6c, 0x0a, 0xfd, 0x4c, 0x44, 0x82, 0x4b, 0x31, 0x6d, 0x6d, 0x5b, 0x3b, 0x43, + 0xb7, 0x20, 0xd9, 0x1a, 0xb4, 0x12, 0x39, 0x6d, 0x13, 0xd8, 0x4a, 0x24, 0x2e, 0x94, 0x48, 0xcf, + 0xcc, 0x9c, 0x76, 0x08, 0x1f, 0x26, 0xd2, 0xa8, 0xe1, 0x3c, 0x80, 0xe1, 0x67, 0x8f, 0x4f, 0xce, + 0xf2, 0x38, 0x16, 0x11, 0xbb, 0x03, 0xbd, 0x94, 0xfb, 0x97, 0x42, 0x4d, 0xad, 0xed, 0xd6, 0xce, + 0xd8, 0x35, 0x94, 0xf3, 0xad, 0x05, 0xe3, 0xfd, 0x5c, 0xcd, 0x45, 0xac, 0x42, 0x9f, 0x2b, 0xc1, + 0xb6, 0x60, 0x90, 0x4b, 0x91, 0xc5, 0x7c, 0x21, 0x48, 0xf5, 0xa1, 0x5b, 0xd2, 0xc8, 0x4b, 0xb9, + 0x94, 0xcf, 0x93, 0x2c, 0x30, 0xba, 0x95, 0x34, 0x7e, 0x40, 0x25, 0x97, 0x22, 0x46, 0x05, 0xdb, + 0x3b, 0x43, 0xd7, 0x50, 0xec, 0x01, 0x4c, 0x7c, 0x11, 0xa9, 0x42, 0x4d, 0x39, 0xed, 0x6c, 0xb7, + 0x77, 0xba, 0xee, 0x18, 0x41, 0xa3, 0xa9, 0x64, 0x2f, 0x43, 0x27, 0x49, 0x73, 0x49, 0xc6, 0x18, + 0x7c, 0xd4, 0xbd, 0xe0, 0x91, 0x14, 0x2e, 0x41, 0xcc, 0x81, 0x91, 0x1f, 0x85, 0x22, 0x56, 0x9e, + 0x5a, 0xa6, 0x62, 0xda, 0xdb, 0xb6, 0x76, 0xba, 0x1f, 0x59, 0xef, 0xb9, 0xa0, 0xd1, 0xb3, 0x65, + 0x2a, 0x9c, 0x6f, 0x5b, 0xd0, 0x39, 0x09, 0xe3, 0x19, 0x7b, 0x05, 0x86, 0x2a, 0x5c, 0x08, 0xa9, + 0xf8, 0x22, 0x25, 0xed, 0x3b, 0x6e, 0x05, 0x30, 0x06, 0x9d, 0x59, 0x92, 0x68, 0xd5, 0x27, 0x2e, + 0x8d, 0x11, 0x8b, 0xb8, 0x12, 0x64, 0xd5, 0x89, 0x4b, 0x63, 0xc2, 0x12, 0xa9, 0xc8, 0xa2, 0x88, + 0x25, 0x52, 0xe1, 0xf6, 0x32, 0x21, 0x97, 0xb1, 0x4f, 0x3a, 0x4e, 0x5c, 0x43, 0xb1, 0xd7, 0x60, + 0x94, 0x07, 0xa9, 0xa7, 0xad, 0x29, 0x49, 0xbd, 0x89, 0x0b, 0x79, 0x90, 0x9e, 0x68, 0x04, 0x05, + 0x94, 0x5f, 0x09, 0xf4, 0xb5, 0x80, 0xf2, 0x4b, 0x81, 0x6d, 0x18, 0xd3, 0x0a, 0x61, 0x3c, 0xf3, + 0xf8, 0xd5, 0x6c, 0x3a, 0xd8, 0xb6, 0x76, 0x5a, 0x7a, 0x89, 0x30, 0x9e, 0xed, 0x5f, 0xcd, 0x1a, + 0x12, 0x57, 0x3c, 0x9b, 0x0e, 0x1b, 0x12, 0xcf, 0x78, 0x86, 0x12, 0xf4, 0x91, 0x62, 0x0d, 0xd0, + 0x12, 0xf8, 0x95, 0x6a, 0x8d, 0x52, 0x02, 0xd7, 0x18, 0x35, 0x24, 0x9e, 0xf1, 0xcc, 0xf9, 0x43, + 0x0b, 0x7a, 0xae, 0xf8, 0x42, 0xf8, 0x8a, 0xed, 0x41, 0x87, 0x8c, 0x8d, 0x16, 0x5c, 0xdb, 0x7b, + 0x75, 0xb7, 0xe6, 0xe8, 0xbb, 0x5a, 0xc4, 0xfc, 0xa0, 0xf5, 0x5d, 0x92, 0xd5, 0x06, 0xe2, 0x32, + 0x89, 0x8d, 0x67, 0x18, 0xca, 0xf9, 0xc6, 0x02, 0xa8, 0x84, 0xd9, 0x00, 0x3a, 0x4f, 0x93, 0x58, + 0xd8, 0x2f, 0x31, 0x1b, 0xc6, 0x9f, 0x67, 0x49, 0x3c, 0x33, 0x4e, 0x60, 0x5b, 0xec, 0x16, 0xac, + 0x1f, 0xc6, 0x57, 0x3c, 0x0a, 0x83, 0xcf, 0x8c, 0xc7, 0xd9, 0x2d, 0xb6, 0x0e, 0x23, 0x12, 0x43, + 0xe8, 0xe4, 0x73, 0xbb, 0xcd, 0x36, 0x60, 0x42, 0xc0, 0xa9, 0xc8, 0xae, 0x08, 0xea, 0x20, 0x54, + 0xcc, 0x38, 0x8c, 0x3f, 0x93, 0xc2, 0xee, 0xb2, 0x35, 0x00, 0x2d, 0xf0, 0x49, 0x1e, 0x45, 0x76, + 0x0f, 0x45, 0x9e, 0x26, 0x07, 0x22, 0x53, 0xe1, 0x05, 0xf9, 0xb9, 0xdd, 0x67, 0xb7, 0x61, 0xa3, + 0xe6, 0xf9, 0x49, 0xf6, 0x09, 0x0f, 0x23, 0x7b, 0x80, 0x91, 0x6c, 0xa6, 0x9e, 0xe2, 0x01, 0x4f, + 0xa1, 0x2f, 0x85, 0xa4, 0x08, 0xd3, 0x91, 0x5c, 0x90, 0xe8, 0xd9, 0x0b, 0xfe, 0xc2, 0x3b, 0xe7, + 0x71, 0xf0, 0x3c, 0x0c, 0xd4, 0xdc, 0xf8, 0xd5, 0x78, 0xc1, 0x5f, 0x3c, 0x2a, 0x30, 0xf6, 0x3a, + 0x8c, 0x9f, 0x8b, 0xc8, 0x4f, 0x16, 0xc2, 0x53, 0xe2, 0x85, 0x32, 0xd1, 0x3b, 0x32, 0xd8, 0x99, + 0x78, 0xa1, 0xd8, 0x36, 0x8c, 0x52, 0x91, 0x2d, 0x42, 0x59, 0xc4, 0x07, 0xba, 0x6d, 0x1d, 0x72, + 0x76, 0x61, 0x72, 0x30, 0xe7, 0x18, 0xc7, 0xae, 0x58, 0x24, 0x57, 0x02, 0x23, 0xdf, 0xd7, 0x80, + 0x17, 0x06, 0x14, 0xd1, 0x13, 0x77, 0x68, 0x90, 0xc3, 0xc0, 0xf9, 0xba, 0x0d, 0x63, 0x33, 0xe1, + 0x54, 0xa1, 0x47, 0xaf, 0xca, 0x5b, 0x0d, 0x79, 0x9d, 0x1c, 0x32, 0x11, 0x2b, 0xb3, 0x05, 0x43, + 0x61, 0x20, 0x50, 0x1e, 0xd0, 0x4a, 0xd3, 0x98, 0x6d, 0x42, 0x37, 0x0a, 0xe3, 0x4b, 0x1d, 0xc7, + 0x13, 0x57, 0x13, 0xb8, 0x87, 0x40, 0x48, 0x3f, 0x0b, 0x53, 0x85, 0x96, 0xea, 0xea, 0x5d, 0xd6, + 0x20, 0x76, 0x0f, 0x86, 0x24, 0xea, 0xf1, 0x20, 0x98, 0xf6, 0x68, 0xee, 0x80, 0x80, 0xfd, 0x20, + 0x40, 0x2b, 0x69, 0x66, 0x46, 0xfb, 0x9b, 0xf6, 0x89, 0x3f, 0x22, 0xcc, 0x6c, 0xf9, 0x01, 0x0c, + 0x95, 0x58, 0xa4, 0x49, 0xc6, 0xb3, 0x25, 0xc5, 0x48, 0x99, 0x27, 0x2a, 0x9c, 0xdd, 0x87, 0x41, + 0x9a, 0xc8, 0x90, 0x74, 0x18, 0x16, 0x99, 0xa2, 0x84, 0xd8, 0xdb, 0x60, 0xd7, 0x54, 0xf2, 0xe6, + 0x5c, 0xce, 0x29, 0x54, 0xc6, 0xee, 0x7a, 0x0d, 0x7f, 0xc2, 0xe5, 0x1c, 0xd5, 0xc5, 0xc3, 0xc5, + 0xd4, 0x27, 0x29, 0x58, 0x26, 0xee, 0x60, 0xc1, 0x5f, 0xa0, 0x9b, 0x49, 0xb6, 0x0b, 0xb7, 0x42, + 0xe9, 0x89, 0x58, 0x89, 0xcc, 0xcb, 0x84, 0x54, 0x59, 0xe8, 0x2b, 0x11, 0x4c, 0xc7, 0xa8, 0x95, + 0xbb, 0x11, 0xca, 0x8f, 0x91, 0xe3, 0x96, 0x0c, 0x5c, 0xcc, 0xe7, 0xb1, 0x9e, 0x30, 0x9d, 0x90, + 0xd4, 0xc0, 0xe7, 0x31, 0x89, 0x39, 0x17, 0x00, 0xb8, 0xaa, 0xd9, 0x66, 0xc3, 0xdd, 0x5a, 0x75, + 0x77, 0xdb, 0x84, 0x2e, 0xf7, 0x55, 0x92, 0x99, 0x33, 0xd2, 0x44, 0x2d, 0xec, 0xda, 0xf5, 0xb0, + 0x63, 0x36, 0xb4, 0xcf, 0xb9, 0xbe, 0x14, 0x06, 0x2e, 0x0e, 0x9d, 0xbf, 0xf5, 0x61, 0x88, 0x1f, + 0xd2, 0x1e, 0xf1, 0xdd, 0x6e, 0x7d, 0xf3, 0x77, 0x6e, 0x72, 0x85, 0xbb, 0xd0, 0x47, 0xfb, 0xa0, + 0x4b, 0xe9, 0x54, 0xd9, 0x43, 0xf2, 0x30, 0x58, 0x71, 0xb7, 0xee, 0xaa, 0xbb, 0x31, 0xe8, 0x2c, + 0x72, 0xa5, 0x73, 0xf9, 0xc0, 0xa5, 0x31, 0x62, 0x81, 0xe0, 0x17, 0x94, 0x1f, 0x07, 0x2e, 0x8d, + 0xf1, 0xba, 0x91, 0x79, 0x9a, 0x66, 0x42, 0x4a, 0x7d, 0xe2, 0x6e, 0x49, 0xa3, 0x49, 0xa5, 0x88, + 0x2e, 0x3c, 0x5a, 0x68, 0x68, 0x98, 0x22, 0xba, 0x38, 0xc6, 0xc5, 0x0a, 0x26, 0xad, 0x08, 0x15, + 0xf3, 0x31, 0xae, 0x3a, 0x85, 0x3e, 0x46, 0x62, 0x9e, 0x09, 0x3a, 0xd7, 0xb1, 0x5b, 0x90, 0xec, + 0x4d, 0x58, 0x4b, 0xa3, 0x7c, 0x16, 0xc6, 0x9e, 0x9f, 0xc4, 0x14, 0xad, 0x63, 0x12, 0x98, 0x68, + 0xf4, 0x40, 0x83, 0xec, 0x21, 0xac, 0x1b, 0xb1, 0x30, 0xc0, 0xe4, 0xa1, 0x96, 0x74, 0xa6, 0x43, + 0xd7, 0xcc, 0x3e, 0x34, 0x28, 0x7e, 0xc9, 0x4f, 0x16, 0x0b, 0x8c, 0xab, 0x35, 0x7d, 0x93, 0x1b, + 0x12, 0x77, 0x4b, 0xce, 0xb7, 0xae, 0xad, 0x89, 0x63, 0x8c, 0x01, 0xc3, 0xd6, 0x8e, 0x69, 0xd3, + 0xb7, 0x47, 0x06, 0x7b, 0x62, 0x44, 0x8c, 0xae, 0x5a, 0x64, 0x43, 0x8b, 0x18, 0x8c, 0x44, 0xde, + 0x06, 0x3b, 0xcd, 0xc2, 0x24, 0x0b, 0xd5, 0xd2, 0x93, 0xa9, 0xe0, 0x97, 0x22, 0x9b, 0x32, 0xb2, + 0xc0, 0x7a, 0x81, 0x9f, 0x6a, 0x18, 0x2f, 0xcb, 0x4c, 0xf8, 0x49, 0x16, 0x84, 0xf1, 0x6c, 0x7a, + 0x8b, 0x64, 0x2a, 0x80, 0xfd, 0x0c, 0xee, 0x96, 0x71, 0xe5, 0x71, 0xdf, 0x17, 0x52, 0x7a, 0xe6, + 0x82, 0xdf, 0xa4, 0x0b, 0xfe, 0x76, 0xc9, 0xde, 0x27, 0xee, 0x99, 0xbe, 0xef, 0xf7, 0xe0, 0x76, + 0x14, 0x4a, 0x25, 0x62, 0xbc, 0x69, 0x0a, 0x2f, 0xc0, 0x98, 0xbf, 0x4d, 0x31, 0x7d, 0xab, 0x64, + 0x9a, 0x04, 0x85, 0xe1, 0xff, 0x73, 0x98, 0x5e, 0x9f, 0x63, 0x52, 0xc1, 0x1d, 0x9a, 0x76, 0x67, + 0x75, 0x9a, 0x09, 0x97, 0x19, 0xdc, 0xab, 0x66, 0x5e, 0x25, 0x51, 0xbe, 0x10, 0x1e, 0x0f, 0xbe, + 0xc8, 0xa5, 0x22, 0xb3, 0xdf, 0xdd, 0x6e, 0xef, 0x8c, 0xf6, 0x1e, 0x36, 0x2e, 0xb0, 0x32, 0x06, + 0x76, 0x9f, 0x91, 0xfc, 0x7e, 0x29, 0xee, 0xbe, 0x5c, 0xae, 0xb5, 0xca, 0xda, 0x8a, 0xc0, 0x5e, + 0xc5, 0xd8, 0x3b, 0xb0, 0x71, 0x4d, 0x6d, 0x13, 0x4d, 0xf6, 0xaa, 0xbe, 0x28, 0x7c, 0x5d, 0xbf, + 0x16, 0xdd, 0xc2, 0xf6, 0xd5, 0xca, 0xca, 0xce, 0x1f, 0x5b, 0xd0, 0x7f, 0xc4, 0xe3, 0xa3, 0x50, + 0x2a, 0xf6, 0x3e, 0x74, 0xce, 0x79, 0x2c, 0xa7, 0x16, 0xed, 0xe5, 0x7e, 0x63, 0x2f, 0x46, 0x06, + 0x7f, 0x3f, 0x8e, 0x55, 0xb6, 0x74, 0x49, 0x94, 0xdd, 0x83, 0xee, 0x97, 0xb9, 0xc8, 0x96, 0xb4, + 0x7e, 0x99, 0x27, 0x35, 0xb6, 0xf5, 0xb5, 0x05, 0x83, 0x42, 0x1e, 0x5d, 0x94, 0x07, 0x01, 0x45, + 0x98, 0xae, 0x0b, 0x0b, 0x92, 0x82, 0x94, 0xcb, 0xcb, 0x69, 0x8b, 0xb2, 0x10, 0x8d, 0x6f, 0x4c, + 0x02, 0x85, 0x2b, 0x77, 0x6a, 0xae, 0x5c, 0x25, 0xa5, 0x6e, 0x23, 0x29, 0x6d, 0x42, 0x57, 0x2a, + 0x9e, 0x29, 0x8a, 0xfc, 0xa1, 0xab, 0x09, 0x0c, 0xf3, 0x20, 0xcf, 0x38, 0x25, 0x6d, 0x5d, 0x1e, + 0x95, 0xb4, 0xf3, 0x27, 0x0b, 0x46, 0x78, 0x49, 0x1e, 0x0b, 0x29, 0xf9, 0x4c, 0x54, 0xc9, 0xc9, + 0xaa, 0x27, 0xa7, 0x5a, 0x32, 0x6b, 0x91, 0xbb, 0x94, 0xc9, 0xac, 0x99, 0x89, 0xda, 0xc4, 0xac, + 0x65, 0xa2, 0xbb, 0xd0, 0x57, 0x99, 0x10, 0x3a, 0x83, 0x21, 0xaf, 0x87, 0xe4, 0x61, 0x80, 0x2b, + 0x2e, 0xf4, 0x27, 0xa7, 0xdd, 0xed, 0x16, 0x86, 0xae, 0x21, 0x9d, 0x7f, 0xb6, 0xc1, 0x3e, 0x29, + 0xef, 0xe6, 0xc7, 0x22, 0x0e, 0x45, 0xc0, 0x5e, 0x05, 0xa8, 0xee, 0x6b, 0xa3, 0x5b, 0x0d, 0x59, + 0x51, 0xa3, 0xb5, 0x9a, 0x10, 0x6b, 0xfa, 0xb7, 0x9b, 0xc9, 0xb8, 0xb2, 0x64, 0xa7, 0x61, 0xc9, + 0x8f, 0x4c, 0x85, 0xd6, 0xa5, 0x0a, 0xed, 0xad, 0x86, 0x53, 0xac, 0x6a, 0xb7, 0xfb, 0x58, 0xc4, + 0xcb, 0x5a, 0xa5, 0x56, 0x9c, 0x62, 0xaf, 0x3a, 0x45, 0x2c, 0xfe, 0x06, 0x85, 0x18, 0xd6, 0x68, + 0x68, 0x73, 0xfb, 0x25, 0xac, 0xa2, 0xaa, 0xd5, 0x6c, 0x8b, 0x4d, 0x60, 0x78, 0x9a, 0xa7, 0x22, + 0xc3, 0x18, 0xd2, 0xb5, 0x99, 0x71, 0xef, 0xa7, 0x58, 0xac, 0xb5, 0x11, 0xc0, 0x99, 0x67, 0x49, + 0x72, 0x94, 0xc4, 0x33, 0xbb, 0xc3, 0xfa, 0xd0, 0x7e, 0xf2, 0xe1, 0xaf, 0xec, 0x2e, 0xdb, 0x04, + 0xfb, 0xac, 0xc8, 0x17, 0x66, 0x8e, 0xdd, 0x63, 0x77, 0x80, 0x1d, 0xe3, 0xe2, 0xf1, 0xac, 0x59, + 0x9a, 0x8d, 0x61, 0x80, 0x9f, 0xa0, 0x55, 0x07, 0xb5, 0xcf, 0x50, 0x31, 0x37, 0xc4, 0xd2, 0xf1, + 0xa9, 0x90, 0x2a, 0x8c, 0x67, 0x47, 0xe1, 0x22, 0x54, 0x36, 0x60, 0x2d, 0x67, 0x44, 0x0e, 0x92, + 0x3c, 0x56, 0x1a, 0x1e, 0xb1, 0x29, 0x6c, 0x1a, 0xf8, 0x88, 0xe2, 0x51, 0x64, 0x9a, 0x33, 0xc6, + 0x09, 0xf8, 0x85, 0x26, 0x3c, 0x71, 0x7e, 0xdf, 0x85, 0xf6, 0xfe, 0xc1, 0xd1, 0x0f, 0x14, 0x58, + 0xec, 0x21, 0x8c, 0xc3, 0x78, 0x2e, 0xb2, 0x50, 0x79, 0xdc, 0x8f, 0xa4, 0x89, 0xb3, 0x8e, 0xca, + 0x72, 0xe1, 0x8e, 0x0c, 0x67, 0xdf, 0x8f, 0x30, 0x1b, 0xf6, 0x66, 0x59, 0x92, 0xa7, 0xba, 0x2b, + 0x1a, 0xed, 0x6d, 0x35, 0x4e, 0x6a, 0xff, 0xe0, 0x68, 0x17, 0xf5, 0xfb, 0x25, 0x8a, 0xb8, 0x46, + 0x92, 0xbd, 0x0b, 0x1d, 0x5a, 0xb4, 0x43, 0x33, 0xa6, 0x37, 0xce, 0xd8, 0x3f, 0x38, 0x72, 0x49, + 0xaa, 0x8a, 0xf5, 0xee, 0x0d, 0xb1, 0xfe, 0x2f, 0x0b, 0x86, 0xe5, 0x07, 0xca, 0x83, 0xb7, 0xc8, + 0xa3, 0x75, 0xf8, 0x3a, 0x30, 0x34, 0xfa, 0x8a, 0xa0, 0xb1, 0x8d, 0x0a, 0x66, 0xaf, 0x42, 0xdf, + 0x10, 0xe4, 0x9e, 0x85, 0x44, 0x01, 0xb2, 0xb7, 0xa0, 0xd8, 0x33, 0x3f, 0x8f, 0x84, 0xae, 0x39, + 0x56, 0x8c, 0x81, 0x0c, 0xac, 0x49, 0xf0, 0x22, 0xe8, 0x52, 0xa4, 0xe1, 0x50, 0xbb, 0x37, 0xa5, + 0x79, 0x5d, 0x11, 0x1a, 0x0a, 0x93, 0x65, 0xf9, 0x79, 0x6f, 0x21, 0x16, 0xe7, 0x58, 0x85, 0xe9, + 0xa2, 0xd0, 0x2e, 0x19, 0xc7, 0x1a, 0xdf, 0xfa, 0x87, 0x05, 0x7d, 0x63, 0x13, 0xf6, 0x00, 0x80, + 0xa7, 0x69, 0xb4, 0xf4, 0xe6, 0x22, 0xd3, 0xfd, 0x4b, 0xb9, 0x1f, 0xc2, 0x9f, 0x88, 0x4c, 0x54, + 0x42, 0x32, 0x3f, 0x6f, 0x9e, 0x9d, 0x16, 0x3a, 0xcd, 0xcf, 0x65, 0xd3, 0x30, 0xed, 0x9b, 0x0d, + 0xf3, 0x9d, 0x05, 0xd0, 0x26, 0x74, 0xe9, 0x30, 0x4d, 0xfe, 0xd3, 0x84, 0x46, 0x79, 0xac, 0x4c, + 0x97, 0xa8, 0x09, 0x5d, 0xf9, 0xc4, 0x4b, 0x93, 0xfa, 0x68, 0xec, 0x7c, 0x00, 0xf0, 0x6b, 0x3c, + 0x40, 0x5d, 0x6e, 0xda, 0xd0, 0x0e, 0x03, 0x7d, 0x01, 0x4c, 0x5c, 0x1c, 0xe2, 0x4a, 0x78, 0x7a, + 0x92, 0xd2, 0xdd, 0xd0, 0xd5, 0x84, 0x13, 0x00, 0x1c, 0x64, 0xcb, 0x54, 0x9d, 0x0a, 0x95, 0xa7, + 0x38, 0xeb, 0x52, 0x2c, 0xc9, 0x06, 0x63, 0x17, 0x87, 0x54, 0x61, 0xe8, 0x56, 0x3a, 0x4e, 0x62, + 0x5f, 0x3f, 0x2f, 0x60, 0x85, 0x41, 0xd8, 0x53, 0x84, 0x50, 0x44, 0x52, 0xef, 0x63, 0x44, 0xda, + 0x5a, 0x44, 0x63, 0x24, 0xe2, 0xfc, 0xc7, 0x82, 0x5b, 0xa6, 0x14, 0xda, 0xf7, 0x31, 0x49, 0x1f, + 0x27, 0x41, 0x78, 0xb1, 0xc4, 0xb3, 0xe4, 0x44, 0x1b, 0xff, 0x32, 0x14, 0xee, 0x8f, 0x6a, 0x29, + 0xdd, 0x16, 0xd2, 0x58, 0x57, 0x46, 0x71, 0xd9, 0x10, 0x4d, 0xdc, 0x82, 0x64, 0x4f, 0x60, 0x98, + 0xa4, 0xc2, 0xdc, 0x06, 0x1d, 0xca, 0x6e, 0xff, 0xd7, 0x88, 0x80, 0x1b, 0x3e, 0xbd, 0xfb, 0x69, + 0x31, 0xc3, 0xad, 0x26, 0x3b, 0xef, 0x42, 0xbf, 0xa8, 0xd8, 0x00, 0x7a, 0xba, 0xa3, 0xb3, 0x2d, + 0x36, 0xd2, 0xce, 0x82, 0xf9, 0xa7, 0x85, 0x99, 0x8e, 0x52, 0x59, 0xc7, 0xd9, 0x86, 0x61, 0xb9, + 0x0a, 0x66, 0xad, 0xfd, 0x20, 0xb0, 0x5f, 0xc2, 0x89, 0xba, 0xd0, 0xb0, 0x2d, 0xe7, 0xb7, 0x30, + 0x69, 0x7c, 0xfb, 0x7b, 0x4a, 0xe8, 0x1f, 0x48, 0xf7, 0x95, 0xa5, 0xda, 0x75, 0x4b, 0x39, 0x7f, + 0xb7, 0x74, 0xda, 0xa3, 0x6b, 0xff, 0x3d, 0xe8, 0xea, 0xe6, 0xc3, 0xba, 0x21, 0x71, 0x14, 0x52, + 0x34, 0x70, 0xb5, 0xe0, 0x96, 0xd4, 0x9b, 0xa9, 0x7b, 0xa5, 0x4e, 0x5c, 0x85, 0x57, 0x16, 0xf1, + 0xdf, 0xaa, 0x5d, 0xdf, 0xd8, 0x96, 0x71, 0xa9, 0x3c, 0x29, 0x44, 0xd1, 0x42, 0x0c, 0x10, 0x38, + 0x15, 0x22, 0xa6, 0xb6, 0x0c, 0x99, 0x45, 0x6d, 0xa3, 0x9d, 0x7c, 0x84, 0x98, 0xb1, 0xa1, 0xf3, + 0x6f, 0x0b, 0x46, 0xcf, 0x92, 0xd0, 0x17, 0x67, 0x3c, 0x9b, 0x09, 0xc5, 0xd6, 0xa0, 0x55, 0x76, + 0x98, 0xad, 0x30, 0x60, 0x1f, 0x42, 0x5f, 0x11, 0x47, 0xfb, 0xea, 0x68, 0xef, 0xb5, 0xc6, 0x46, + 0x6a, 0x53, 0x77, 0xf5, 0x8f, 0x5b, 0xc8, 0x6f, 0xfd, 0xd9, 0x82, 0x9e, 0x59, 0xb5, 0x61, 0xea, + 0xf6, 0x4f, 0x30, 0x75, 0x19, 0x88, 0xed, 0x7a, 0x20, 0xde, 0xab, 0x7a, 0xd8, 0x7a, 0xce, 0xd4, + 0xad, 0xec, 0xeb, 0x30, 0xf0, 0xe7, 0x61, 0x14, 0x64, 0x22, 0x6e, 0xe6, 0xd4, 0x12, 0x76, 0x12, + 0x58, 0xaf, 0xae, 0x45, 0x0a, 0xd4, 0x1f, 0xea, 0xb0, 0x57, 0x7a, 0x7c, 0xad, 0x67, 0x1d, 0x42, + 0x9d, 0x2e, 0xa2, 0x5c, 0xce, 0x4d, 0xae, 0x29, 0x74, 0x22, 0xcc, 0xf9, 0x1d, 0x8c, 0x0f, 0x92, + 0x40, 0xf8, 0xc5, 0x0b, 0x23, 0x96, 0x41, 0x51, 0x3a, 0xe7, 0x74, 0xc0, 0x5d, 0x57, 0x13, 0x78, + 0xbe, 0xe7, 0x42, 0x71, 0x2a, 0xd9, 0xba, 0x2e, 0x8d, 0xf1, 0xa6, 0x4a, 0x33, 0x71, 0x21, 0x32, + 0x4f, 0x4f, 0x40, 0x8f, 0x2b, 0x93, 0xb3, 0xe6, 0xec, 0xd3, 0xe4, 0xe2, 0x09, 0xae, 0x73, 0xed, + 0x09, 0xce, 0xf9, 0xa6, 0x57, 0x75, 0x8e, 0xf2, 0x7b, 0xdc, 0xfe, 0x0d, 0x00, 0x89, 0x22, 0x5e, + 0x12, 0x47, 0x2b, 0xb5, 0xe7, 0x90, 0x18, 0x9f, 0xc6, 0xd1, 0x92, 0x39, 0x30, 0xf6, 0xab, 0xcb, + 0x5e, 0x5f, 0x8c, 0x63, 0xb7, 0x81, 0xb1, 0x5f, 0xc0, 0xe8, 0x22, 0x4b, 0x16, 0x9e, 0x4e, 0x4d, + 0xa4, 0xd3, 0x68, 0xef, 0x95, 0x1b, 0xcb, 0x78, 0xb9, 0x4b, 0x7f, 0x5d, 0xc0, 0x09, 0x07, 0x24, + 0x5f, 0x4e, 0xd7, 0x69, 0x8b, 0x4e, 0xf1, 0x47, 0x4d, 0xd7, 0x49, 0xe2, 0x7f, 0xe7, 0x4d, 0x8f, + 0xed, 0x42, 0xbf, 0x78, 0x1e, 0x1e, 0x93, 0x11, 0x36, 0x9b, 0xd1, 0xa7, 0x79, 0x6e, 0x21, 0x74, + 0xfd, 0xb1, 0x76, 0x72, 0xc3, 0x63, 0x6d, 0xad, 0x67, 0x58, 0xd3, 0x0d, 0x74, 0xd1, 0x33, 0xbc, + 0x02, 0xc3, 0xea, 0x35, 0x6c, 0x5d, 0xc7, 0x40, 0x09, 0x60, 0x91, 0x9c, 0xc4, 0x51, 0x18, 0x0b, + 0x29, 0x7c, 0x49, 0xed, 0xed, 0xc4, 0xad, 0x21, 0xd8, 0x07, 0x84, 0x41, 0xa4, 0xb9, 0x1b, 0xba, + 0x0f, 0x28, 0x68, 0xf6, 0x01, 0x30, 0xa9, 0xb2, 0x04, 0xfb, 0xac, 0xca, 0x4f, 0x74, 0x63, 0x5b, + 0xb8, 0xd8, 0x86, 0x16, 0xa8, 0x15, 0x92, 0xa5, 0x4f, 0xdf, 0xba, 0xe6, 0xd3, 0x5b, 0xbf, 0x81, + 0xae, 0x76, 0xe7, 0xe2, 0x51, 0xd8, 0xba, 0xe1, 0x51, 0xb8, 0x75, 0xc3, 0xa3, 0x70, 0xfb, 0xc6, + 0x47, 0xe1, 0x4e, 0xfd, 0x51, 0xd8, 0xf9, 0xca, 0x82, 0x91, 0x2b, 0xbe, 0xcc, 0x85, 0x54, 0x8f, + 0xa2, 0xe4, 0x9c, 0x3d, 0x84, 0x75, 0x13, 0x23, 0x5e, 0xf1, 0xf4, 0xa0, 0xd3, 0xd8, 0x9a, 0x81, + 0xcf, 0xcc, 0x0b, 0x44, 0x4d, 0xb0, 0x78, 0x39, 0x68, 0x35, 0x04, 0x0f, 0xcc, 0x03, 0xc2, 0xff, + 0xc3, 0xad, 0x22, 0xdd, 0xd4, 0xdf, 0xdd, 0x74, 0x83, 0xc3, 0x0c, 0xeb, 0x71, 0xc5, 0x71, 0xfe, + 0xd2, 0x82, 0xb1, 0x76, 0xef, 0x83, 0x24, 0xbe, 0x08, 0x67, 0xd7, 0x5f, 0x2f, 0xad, 0x1f, 0xf1, + 0x7a, 0xd9, 0xba, 0xfe, 0x7a, 0x79, 0x1f, 0x80, 0x47, 0x51, 0xf2, 0xdc, 0x9b, 0xab, 0x45, 0xa4, + 0x93, 0x97, 0x3b, 0x24, 0xe4, 0x89, 0x5a, 0x44, 0xec, 0x4d, 0x58, 0x33, 0x9d, 0x93, 0x17, 0x89, + 0x78, 0xa6, 0xe6, 0xc6, 0x54, 0x13, 0x83, 0x1e, 0x11, 0xc8, 0xde, 0x83, 0xcd, 0x70, 0x81, 0x42, + 0x2b, 0xc2, 0xfa, 0xed, 0x88, 0x11, 0xef, 0xb8, 0x31, 0xa3, 0xf1, 0x40, 0xd7, 0x5b, 0x79, 0xa0, + 0x7b, 0x07, 0x36, 0xca, 0x97, 0x0c, 0x8f, 0x94, 0x11, 0x81, 0x79, 0x5a, 0xb2, 0x4b, 0xc6, 0xbe, + 0xc6, 0xb1, 0xc7, 0x9c, 0x9c, 0xe6, 0xb3, 0x99, 0x90, 0xca, 0xd8, 0xe6, 0x27, 0xfd, 0x03, 0xa7, + 0xb3, 0xfa, 0x0f, 0x1c, 0x6c, 0x06, 0xcd, 0x8b, 0x23, 0x8f, 0x74, 0x1a, 0x74, 0x6b, 0x08, 0x86, + 0x6d, 0x9a, 0xcb, 0xb9, 0xa7, 0x12, 0x4f, 0xf1, 0xe8, 0xd2, 0xd8, 0x0c, 0x10, 0x3b, 0x4b, 0xce, + 0x78, 0x74, 0xe9, 0xfc, 0xd5, 0x82, 0x3b, 0x27, 0xf4, 0x96, 0xf4, 0x98, 0x2b, 0x7e, 0x96, 0xf1, + 0x58, 0x16, 0x9d, 0xe4, 0x1b, 0x30, 0x91, 0x22, 0x0e, 0x44, 0x76, 0xda, 0xc8, 0xc1, 0x4d, 0x90, + 0xed, 0x02, 0x6e, 0x53, 0x84, 0x57, 0x25, 0xa4, 0xaf, 0xdf, 0xc9, 0xa3, 0x96, 0x6d, 0xb9, 0xd7, + 0x78, 0x54, 0x83, 0x72, 0xc5, 0x4d, 0xb9, 0x47, 0x63, 0x74, 0x6e, 0xfc, 0x3d, 0x7c, 0x5c, 0xb4, + 0x9e, 0x9a, 0x7a, 0xd4, 0x7a, 0x62, 0xfd, 0x37, 0x00, 0x00, 0xff, 0xff, 0xa8, 0xa7, 0x70, 0xd9, + 0x09, 0x1b, 0x00, 0x00, } diff --git a/gumble/client.go b/gumble/client.go index 2256f5f..f8ecfe2 100644 --- a/gumble/client.go +++ b/gumble/client.go @@ -117,7 +117,7 @@ func DialWithDialer(dialer *net.Dialer, addr string, config *Config, tlsConfig * // Initial packets versionPacket := MumbleProto.Version{ - Version: proto.Uint32(ClientVersion), + VersionV1: proto.Uint32(ClientVersion), Release: proto.String("gumble"), Os: proto.String(runtime.GOOS), OsVersion: proto.String(runtime.GOARCH), @@ -127,6 +127,7 @@ func DialWithDialer(dialer *net.Dialer, addr string, config *Config, tlsConfig * Password: &client.Config.Password, Opus: proto.Bool(getAudioCodec(audioCodecIDOpus) != nil), Tokens: client.Config.Tokens, + ClientType: proto.Int(client.Config.ClientType | 0), } client.Conn.WriteProto(&versionPacket) client.Conn.WriteProto(&authenticationPacket) diff --git a/gumble/config.go b/gumble/config.go index 4960388..ffd7338 100644 --- a/gumble/config.go +++ b/gumble/config.go @@ -16,6 +16,10 @@ type Config struct { // resent to the server using: // client.Send(config.Tokens) Tokens AccessTokens + // Used to specify when a connecting client is a bot or not. + // If set to 0, server will determine the client as a regular client. + // If set to 1, server will determine the client as a bot and will be not counted on the user count. + ClientType int // AudioInterval is the interval at which audio packets are sent. Valid // values are: 10ms, 20ms, 40ms, and 60ms. diff --git a/gumble/handlers.go b/gumble/handlers.go index a5b012d..1611fb1 100644 --- a/gumble/handlers.go +++ b/gumble/handlers.go @@ -53,8 +53,8 @@ var handlers = [...]func(*Client, []byte) error{ func parseVersion(packet *MumbleProto.Version) Version { var version Version - if packet.Version != nil { - version.Version = *packet.Version + if packet.VersionV1 != nil { + version.Version = *packet.VersionV1 } if packet.Release != nil { version.Release = *packet.Release @@ -1245,9 +1245,9 @@ func (c *Client) handleSuggestConfig(buffer []byte) error { event := ServerConfigEvent{ Client: c, } - if packet.Version != nil { + if packet.VersionV1 != nil { event.SuggestVersion = &Version{ - Version: packet.GetVersion(), + Version: packet.GetVersionV1(), } } if packet.Positional != nil {