From ad29c655e1ca3307555c0be7e55656e6bb6d24b5 Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 17 Sep 2025 11:55:27 -0700 Subject: [PATCH 1/7] Initial protocol change --- livekit/livekit_sip.pb.go | 31 +- livekit/livekit_sip.twirp.go | 564 ++++++++++++++++++----------------- livekit/sip.go | 10 + protobufs/livekit_sip.proto | 10 +- protobufs/rpc/sip.proto | 10 +- rpc/sip.go | 4 + rpc/sip.pb.go | 29 +- rpc/sip.psrpc.go | 132 ++++---- 8 files changed, 429 insertions(+), 361 deletions(-) diff --git a/livekit/livekit_sip.pb.go b/livekit/livekit_sip.pb.go index 08f83a03d..fdd2f3c3b 100644 --- a/livekit/livekit_sip.pb.go +++ b/livekit/livekit_sip.pb.go @@ -15,7 +15,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.36.9 -// protoc v4.23.4 +// protoc v3.21.12 // source: livekit_sip.proto package livekit @@ -3378,9 +3378,16 @@ type CreateSIPParticipantRequest struct { KrispEnabled bool `protobuf:"varint,14,opt,name=krisp_enabled,json=krispEnabled,proto3" json:"krisp_enabled,omitempty"` MediaEncryption SIPMediaEncryption `protobuf:"varint,18,opt,name=media_encryption,json=mediaEncryption,proto3,enum=livekit.SIPMediaEncryption" json:"media_encryption,omitempty"` // Wait for the answer for the call before returning. - WaitUntilAnswered bool `protobuf:"varint,19,opt,name=wait_until_answered,json=waitUntilAnswered,proto3" json:"wait_until_answered,omitempty"` // NEXT ID: 21 - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + WaitUntilAnswered bool `protobuf:"varint,19,opt,name=wait_until_answered,json=waitUntilAnswered,proto3" json:"wait_until_answered,omitempty"` + // Optional display name for the 'From' SIP header. + // + // Cases: + // 1) Unspecified: Use legacy behavior - display name will be set to be the caller's number. + // 2) Empty string: Do not send a display name, which will result in a CNAM lookup downstream. + // 3) Non-empty: Use the specified value as the display name. + DisplayName *string `protobuf:"bytes,21,opt,name=display_name,json=displayName,proto3,oneof" json:"display_name,omitempty"` // NEXT ID: 22 + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *CreateSIPParticipantRequest) Reset() { @@ -3554,6 +3561,13 @@ func (x *CreateSIPParticipantRequest) GetWaitUntilAnswered() bool { return false } +func (x *CreateSIPParticipantRequest) GetDisplayName() string { + if x != nil && x.DisplayName != nil { + return *x.DisplayName + } + return "" +} + type SIPParticipantInfo struct { state protoimpl.MessageState `protogen:"open.v1"` ParticipantId string `protobuf:"bytes,1,opt,name=participant_id,json=participantId,proto3" json:"participant_id,omitempty"` @@ -4408,7 +4422,7 @@ const file_livekit_sip_proto_rawDesc = "" + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1aF\n" + "\x18AttributesToHeadersEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xa3\t\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xdc\t\n" + "\x1bCreateSIPParticipantRequest\x12 \n" + "\fsip_trunk_id\x18\x01 \x01(\tR\n" + "sipTrunkId\x120\n" + @@ -4432,13 +4446,15 @@ const file_livekit_sip_proto_rawDesc = "" + "\x11max_call_duration\x18\f \x01(\v2\x19.google.protobuf.DurationR\x0fmaxCallDuration\x12#\n" + "\rkrisp_enabled\x18\x0e \x01(\bR\fkrispEnabled\x12F\n" + "\x10media_encryption\x18\x12 \x01(\x0e2\x1b.livekit.SIPMediaEncryptionR\x0fmediaEncryption\x12.\n" + - "\x13wait_until_answered\x18\x13 \x01(\bR\x11waitUntilAnswered\x1aH\n" + + "\x13wait_until_answered\x18\x13 \x01(\bR\x11waitUntilAnswered\x12&\n" + + "\fdisplay_name\x18\x15 \x01(\tH\x00R\vdisplayName\x88\x01\x01\x1aH\n" + "\x1aParticipantAttributesEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1a:\n" + "\fHeadersEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xab\x01\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01B\x0f\n" + + "\r_display_name\"\xab\x01\n" + "\x12SIPParticipantInfo\x12%\n" + "\x0eparticipant_id\x18\x01 \x01(\tR\rparticipantId\x121\n" + "\x14participant_identity\x18\x02 \x01(\tR\x13participantIdentity\x12\x1b\n" + @@ -4841,6 +4857,7 @@ func file_livekit_sip_proto_init() { (*UpdateSIPDispatchRuleRequest_Update)(nil), } file_livekit_sip_proto_msgTypes[29].OneofWrappers = []any{} + file_livekit_sip_proto_msgTypes[34].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ diff --git a/livekit/livekit_sip.twirp.go b/livekit/livekit_sip.twirp.go index ca6986b60..8eab63430 100644 --- a/livekit/livekit_sip.twirp.go +++ b/livekit/livekit_sip.twirp.go @@ -4704,288 +4704,290 @@ func (s *sIPServer) PathPrefix() string { } var twirpFileDescriptor4 = []byte{ - // 4526 bytes of a gzipped FileDescriptorProto + // 4552 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x7c, 0x59, 0x8c, 0x1b, 0xd9, 0x5a, 0x7f, 0xec, 0x72, 0xbb, 0xed, 0xcf, 0xbd, 0x54, 0x9f, 0x5e, 0xe2, 0x38, 0xe9, 0x24, 0xe3, - 0x4c, 0x26, 0x49, 0xcf, 0xfd, 0x77, 0xe6, 0x26, 0x7f, 0xee, 0xcc, 0x84, 0xbb, 0x55, 0xdb, 0xd5, - 0xdd, 0x45, 0xdc, 0x55, 0x9e, 0xaa, 0x72, 0x92, 0xbe, 0xba, 0x50, 0x54, 0x5c, 0xd5, 0x9d, 0xba, - 0xb1, 0x5d, 0xc6, 0x2e, 0x67, 0x41, 0xf0, 0x80, 0xc4, 0xc3, 0xf0, 0x82, 0xd8, 0x37, 0x89, 0x4d, - 0x6c, 0x12, 0x08, 0x24, 0x10, 0xdb, 0x13, 0xd2, 0x20, 0x1e, 0x00, 0x89, 0x67, 0x90, 0x58, 0xc4, - 0x0e, 0xe2, 0x01, 0x78, 0x60, 0x7d, 0x02, 0x9d, 0xa5, 0x56, 0x97, 0x97, 0x4e, 0x72, 0x25, 0x04, - 0x6f, 0x55, 0xdf, 0xf9, 0xce, 0x77, 0xbe, 0x73, 0xce, 0xef, 0x5b, 0xce, 0x57, 0xc7, 0x86, 0xb5, - 0x8e, 0xf3, 0xcc, 0x7e, 0xea, 0x78, 0xc6, 0xd0, 0xe9, 0xef, 0xf6, 0x07, 0xae, 0xe7, 0xa2, 0x45, - 0x46, 0xaa, 0x5c, 0x38, 0x75, 0xdd, 0xd3, 0x8e, 0x7d, 0x9b, 0x90, 0x1f, 0x8f, 0x4e, 0x6e, 0x9b, - 0xbd, 0x97, 0x94, 0xa7, 0x72, 0x39, 0xd9, 0x64, 0x8d, 0x06, 0xa6, 0xe7, 0xb8, 0x3d, 0xd6, 0x7e, - 0x31, 0xd9, 0x6e, 0x77, 0xfb, 0x9e, 0xdf, 0x79, 0xc3, 0x1f, 0xb3, 0xeb, 0x5a, 0x76, 0x67, 0xc8, - 0xa8, 0xc8, 0xa7, 0x0e, 0x5c, 0xb7, 0x4b, 0x69, 0x55, 0x05, 0x8a, 0x9a, 0xd4, 0xd4, 0x3c, 0xd3, - 0x1b, 0x0d, 0xd1, 0x0e, 0xe4, 0xda, 0xae, 0x65, 0x97, 0x33, 0x57, 0x33, 0x37, 0x57, 0xee, 0x6c, - 0xed, 0x32, 0xfe, 0xdd, 0x80, 0xa3, 0xe6, 0x5a, 0xb6, 0x4a, 0x78, 0xd0, 0x16, 0xe4, 0x87, 0x84, - 0x56, 0xce, 0x5e, 0xcd, 0xdc, 0x2c, 0xaa, 0xec, 0xad, 0xfa, 0xa7, 0x1c, 0x6c, 0xd6, 0x06, 0xb6, - 0xe9, 0xd9, 0x9a, 0xd4, 0xd4, 0x07, 0xa3, 0xde, 0x53, 0xd5, 0xfe, 0xa6, 0x91, 0x3d, 0xf4, 0xd0, - 0xbb, 0xb0, 0xe6, 0xf4, 0x1e, 0xbb, 0xa3, 0x9e, 0x65, 0x98, 0x96, 0x35, 0xb0, 0x87, 0x43, 0x7b, - 0x58, 0xce, 0x5c, 0xe5, 0x6e, 0x16, 0x55, 0x9e, 0x35, 0x08, 0x3e, 0x1d, 0xdd, 0x02, 0xde, 0x1d, - 0x79, 0x31, 0x6e, 0x36, 0xd0, 0xaa, 0x4f, 0x67, 0xcc, 0xe8, 0x06, 0x04, 0x24, 0xa3, 0x37, 0xea, - 0x3e, 0xb6, 0x07, 0x65, 0x8e, 0x70, 0xae, 0xf8, 0x64, 0x99, 0x50, 0xd1, 0x67, 0x60, 0xd3, 0x57, - 0x80, 0xf2, 0x0d, 0x8d, 0x81, 0x7d, 0x6a, 0xbf, 0x28, 0xe7, 0xb0, 0x12, 0x7b, 0xd9, 0x72, 0x46, - 0x5d, 0x67, 0x0c, 0xb4, 0xc7, 0x50, 0xc5, 0xcd, 0x78, 0x80, 0x44, 0xbf, 0x72, 0x91, 0xa8, 0xbd, - 0x12, 0xe7, 0xc6, 0x4a, 0xfb, 0x8c, 0xa3, 0xa1, 0x3d, 0xe8, 0x99, 0x5d, 0xbb, 0xbc, 0x40, 0x95, - 0x66, 0xf4, 0x16, 0x23, 0x47, 0x59, 0xfb, 0xe6, 0x70, 0xf8, 0xdc, 0x1d, 0x58, 0xe5, 0x7c, 0x8c, - 0xb5, 0xc9, 0xc8, 0x78, 0xdd, 0x82, 0xf9, 0x05, 0x62, 0x17, 0x09, 0x6f, 0xb0, 0x46, 0x81, 0xdc, - 0x28, 0x73, 0x20, 0xb8, 0x10, 0x67, 0x0e, 0x24, 0x23, 0xc8, 0x11, 0x61, 0x40, 0xda, 0xc9, 0x33, - 0xaa, 0x40, 0xa1, 0x6b, 0x7b, 0xa6, 0x65, 0x7a, 0x66, 0xb9, 0x44, 0xe8, 0xc1, 0xfb, 0xbd, 0x6c, - 0x39, 0x53, 0xfd, 0xd9, 0x05, 0x58, 0xf2, 0x77, 0x56, 0xea, 0x9d, 0xb8, 0xe8, 0x2a, 0x2c, 0x0d, - 0x9d, 0xbe, 0xe1, 0x61, 0x82, 0xe1, 0x58, 0x04, 0x3c, 0x45, 0x15, 0x86, 0x4e, 0x9f, 0xf2, 0x58, - 0xe8, 0x2e, 0xe4, 0x9e, 0x3a, 0x3d, 0xab, 0xbc, 0x42, 0x60, 0x75, 0x25, 0x0a, 0xab, 0x40, 0xcc, - 0x2e, 0x79, 0xba, 0xef, 0xf4, 0x2c, 0x95, 0x30, 0xa7, 0xa3, 0x25, 0x7b, 0x06, 0xb4, 0x70, 0x73, - 0xa3, 0x25, 0x97, 0x8a, 0x96, 0xbb, 0x50, 0xf4, 0x06, 0x66, 0x6f, 0xd8, 0x77, 0x07, 0x5e, 0x79, - 0x99, 0xa8, 0xbe, 0x19, 0x57, 0x9d, 0x35, 0xaa, 0x21, 0xdf, 0x64, 0x88, 0x2d, 0x9c, 0x19, 0x62, - 0x30, 0x37, 0xc4, 0xf2, 0xf3, 0x43, 0x6c, 0xf1, 0x0c, 0x10, 0x2b, 0x9c, 0x05, 0x62, 0xc5, 0x19, - 0x10, 0x2b, 0x4d, 0x80, 0xd8, 0x52, 0x1c, 0x62, 0xd5, 0x3a, 0x14, 0x03, 0x24, 0x20, 0x1e, 0x96, - 0x74, 0xb5, 0x25, 0xdf, 0x37, 0x1a, 0xe2, 0x81, 0x50, 0x3b, 0xe6, 0xcf, 0xa1, 0x35, 0x58, 0xa6, - 0x14, 0x49, 0xde, 0x53, 0x5a, 0x72, 0x9d, 0xcf, 0x20, 0x04, 0x2b, 0x94, 0xa4, 0xb4, 0x74, 0x4a, - 0xcb, 0x12, 0xa0, 0xaa, 0x70, 0x29, 0xf0, 0x43, 0x12, 0x9d, 0x6f, 0xcc, 0x1d, 0xdd, 0x81, 0x05, - 0x82, 0x59, 0x02, 0xd8, 0xd2, 0x9d, 0x4b, 0xd1, 0xbd, 0x8d, 0xf2, 0x63, 0x74, 0xaa, 0x94, 0xb5, - 0xfa, 0x5b, 0x19, 0xb8, 0xd4, 0xea, 0x5b, 0x93, 0x85, 0xce, 0x36, 0x86, 0x0f, 0x60, 0x71, 0x60, - 0xf7, 0x3b, 0x66, 0xdb, 0x26, 0xfe, 0x6c, 0xc6, 0xc0, 0x87, 0xe7, 0x54, 0x9f, 0x1d, 0x7d, 0x00, - 0xf9, 0x11, 0x19, 0x9b, 0x40, 0xbb, 0x74, 0xe7, 0xf2, 0xa4, 0x8e, 0x54, 0xc3, 0xc3, 0x73, 0x2a, - 0xe3, 0xdf, 0x2b, 0x40, 0xde, 0x6c, 0xe3, 0xd8, 0x51, 0xfd, 0x9d, 0x02, 0xac, 0xa7, 0x0c, 0x33, - 0x87, 0xde, 0xfe, 0x46, 0x66, 0x27, 0x6c, 0x24, 0x17, 0xdf, 0x48, 0x54, 0x86, 0x45, 0x1f, 0xc9, - 0xc4, 0xbd, 0xaa, 0xfe, 0x2b, 0xc6, 0x8f, 0xd9, 0xe9, 0xb8, 0xcf, 0xed, 0xa8, 0x65, 0x2f, 0x50, - 0xcb, 0x66, 0x0d, 0xa1, 0x65, 0xdf, 0x80, 0x55, 0x9f, 0xd9, 0x17, 0x97, 0xa7, 0x86, 0xc1, 0xc8, - 0xbe, 0x61, 0x5c, 0x83, 0x65, 0x73, 0xe4, 0x3d, 0x49, 0x7a, 0xc8, 0x25, 0x4c, 0x0c, 0xa0, 0xeb, - 0x33, 0x25, 0x3c, 0x23, 0x61, 0x0a, 0x20, 0x5b, 0x83, 0xc5, 0x27, 0xb6, 0x69, 0xf9, 0x6e, 0xbe, - 0x74, 0xe7, 0xd6, 0xb4, 0x1d, 0xda, 0x3d, 0xa4, 0xbc, 0x62, 0xcf, 0x1b, 0xbc, 0x54, 0xfd, 0x9e, - 0xc8, 0x81, 0x4d, 0xf6, 0x68, 0x78, 0xae, 0x61, 0x7a, 0xde, 0xc0, 0x79, 0x3c, 0xf2, 0x6c, 0x6a, - 0xd6, 0xa5, 0x3b, 0x5f, 0x33, 0x8f, 0x48, 0xdd, 0x15, 0x82, 0x7e, 0x54, 0xfc, 0xfa, 0x93, 0xf1, - 0x16, 0x3c, 0x54, 0x28, 0x1f, 0x8f, 0xe6, 0x6b, 0xbf, 0x32, 0xc7, 0x50, 0xa1, 0x1c, 0xdd, 0x8d, - 0xcd, 0x64, 0xdd, 0x1c, 0x6f, 0x41, 0x7b, 0xd8, 0x4d, 0xb5, 0x3b, 0x23, 0xcb, 0x0e, 0x06, 0x59, - 0x25, 0x9e, 0xf1, 0x42, 0x74, 0x10, 0xca, 0xad, 0xf4, 0x31, 0xe2, 0x86, 0xd8, 0x83, 0x91, 0x1e, - 0x11, 0x19, 0x03, 0xa7, 0x77, 0xea, 0xf4, 0x4e, 0x0d, 0xcf, 0xe9, 0xda, 0xee, 0xc8, 0x23, 0xce, - 0xa1, 0x74, 0xe7, 0xc2, 0x2e, 0x4d, 0x69, 0x76, 0xfd, 0x94, 0x66, 0xb7, 0xce, 0x52, 0x1e, 0x75, - 0x85, 0xf5, 0xd0, 0x69, 0x07, 0x24, 0xc2, 0x5a, 0xd7, 0x7c, 0x61, 0xb4, 0xcd, 0x4e, 0xc7, 0xf0, - 0xf3, 0x22, 0xe2, 0x4a, 0xa6, 0x4a, 0x59, 0xed, 0x9a, 0x2f, 0x6a, 0x66, 0xa7, 0xe3, 0x13, 0x30, - 0x1c, 0x9e, 0x0e, 0x9c, 0x61, 0xdf, 0xb0, 0x7b, 0xe6, 0xe3, 0x8e, 0x6d, 0x11, 0x37, 0x5f, 0x50, - 0x97, 0x08, 0x51, 0xa4, 0x34, 0xb4, 0x0f, 0x7c, 0xd7, 0xb6, 0x1c, 0xd3, 0xb0, 0x7b, 0xed, 0xc1, - 0x4b, 0x32, 0xa9, 0x32, 0x4f, 0x26, 0x7d, 0x31, 0x3a, 0xe9, 0x23, 0xcc, 0x23, 0x06, 0x2c, 0xea, - 0x6a, 0x37, 0x4e, 0xa8, 0xdc, 0x83, 0xa5, 0xe8, 0x02, 0x23, 0x1e, 0xb8, 0xa7, 0xf6, 0x4b, 0x66, - 0x69, 0xf8, 0x11, 0x6d, 0xc0, 0xc2, 0x33, 0xb3, 0x33, 0xf2, 0x6d, 0x8c, 0xbe, 0xdc, 0xcb, 0x7e, - 0x90, 0xa9, 0xec, 0x43, 0x79, 0x12, 0x26, 0xce, 0x2a, 0x67, 0xd2, 0x86, 0x9f, 0x45, 0x4e, 0xf5, - 0x9f, 0x39, 0xd8, 0x4c, 0x75, 0x3a, 0xe8, 0xff, 0x85, 0x66, 0x4f, 0xfd, 0xea, 0x7a, 0xb0, 0x48, - 0x0d, 0x67, 0xe8, 0x51, 0xae, 0xd0, 0x17, 0x7c, 0x31, 0xcd, 0x17, 0x64, 0x27, 0x77, 0x1c, 0x77, - 0x10, 0x9f, 0x1d, 0x77, 0x10, 0xdc, 0xe4, 0xfe, 0x49, 0xaf, 0x71, 0x33, 0xe9, 0x35, 0x48, 0x2e, - 0x70, 0x78, 0x2e, 0xee, 0x37, 0x3e, 0xce, 0x64, 0x02, 0xce, 0xc0, 0x75, 0x90, 0xc4, 0xee, 0x30, - 0x13, 0x77, 0x1e, 0x98, 0xf3, 0x3c, 0xf3, 0x94, 0x24, 0x2c, 0x1f, 0x66, 0xa9, 0xaf, 0xc4, 0x0d, - 0x57, 0x22, 0xee, 0x92, 0x78, 0xa7, 0x43, 0x2e, 0x74, 0x98, 0x98, 0xe1, 0x7e, 0x0a, 0xd4, 0x0a, - 0x33, 0xa1, 0x76, 0x98, 0x1b, 0x03, 0xdb, 0xc7, 0x99, 0xcc, 0x1e, 0x0f, 0x2b, 0x46, 0x6c, 0x6e, - 0x21, 0xc5, 0x9f, 0xc3, 0xde, 0x22, 0x2c, 0x18, 0xa4, 0xa9, 0x04, 0x45, 0xc3, 0xd7, 0x64, 0x6f, - 0x1d, 0xd6, 0x8c, 0xa4, 0x1e, 0x55, 0x1d, 0xb6, 0x83, 0x70, 0xaa, 0xb0, 0x28, 0x1f, 0x0b, 0x7d, - 0x77, 0xe3, 0xf1, 0x74, 0x3b, 0xaa, 0x71, 0xac, 0x43, 0x34, 0xa0, 0x7e, 0x92, 0x81, 0xed, 0x20, - 0xa0, 0xa6, 0x8a, 0x9d, 0x1d, 0x99, 0x3e, 0x4c, 0x46, 0xd4, 0xe9, 0x43, 0x47, 0x43, 0xea, 0x87, - 0x89, 0x90, 0x7a, 0x65, 0x62, 0xcf, 0x29, 0x31, 0xf5, 0xb7, 0x17, 0x61, 0x23, 0x6d, 0xa0, 0xaf, - 0x4e, 0x50, 0xf5, 0xd3, 0x5b, 0x9a, 0xb4, 0xfa, 0xaf, 0xe8, 0x36, 0xac, 0x5b, 0xf6, 0xd0, 0x73, - 0x7a, 0xc4, 0xb3, 0x19, 0x6d, 0x77, 0x84, 0x8d, 0x9a, 0xa4, 0xdc, 0x45, 0x15, 0x45, 0x9a, 0x6a, - 0xb4, 0x25, 0x9e, 0xde, 0x2e, 0xcc, 0x99, 0xde, 0x46, 0x82, 0x7a, 0x3e, 0x1e, 0xd4, 0xdf, 0x5c, - 0xf8, 0xad, 0x27, 0xc3, 0xef, 0xce, 0xd4, 0xed, 0x9c, 0x10, 0x7f, 0xbf, 0x32, 0x3d, 0xfe, 0x7e, - 0x66, 0x2e, 0x99, 0x73, 0x06, 0xe0, 0xaf, 0x4c, 0x0a, 0xc0, 0xa5, 0x79, 0xc6, 0x7a, 0xed, 0x08, - 0xbc, 0x74, 0xd6, 0x08, 0x9c, 0x16, 0xd1, 0x96, 0xff, 0x8f, 0x47, 0xb4, 0x5f, 0xc9, 0xc1, 0x56, - 0xba, 0xcd, 0xa3, 0xed, 0xd0, 0xe8, 0x32, 0x2c, 0x3a, 0xf8, 0x04, 0xec, 0xb4, 0x3f, 0x88, 0x1a, - 0x52, 0x76, 0x8a, 0x21, 0x1d, 0x66, 0x22, 0xa6, 0x84, 0x7b, 0xfe, 0xff, 0x74, 0x9b, 0x2d, 0xb2, - 0xb8, 0x91, 0x62, 0xb5, 0xb8, 0x57, 0x24, 0xc2, 0x72, 0x73, 0x44, 0xd8, 0x09, 0x11, 0x8e, 0x9b, - 0x3b, 0xc2, 0xe5, 0x66, 0x45, 0xb8, 0x85, 0x69, 0x11, 0x2e, 0xff, 0x46, 0x22, 0xdc, 0x62, 0x6a, - 0x84, 0x03, 0x28, 0xf8, 0x59, 0xc3, 0xde, 0x12, 0x80, 0x11, 0x2c, 0xee, 0xde, 0x16, 0x6c, 0x18, - 0x29, 0x4b, 0xfb, 0xa6, 0x63, 0xe2, 0xe7, 0xe0, 0xc2, 0x81, 0xed, 0xbd, 0xea, 0x51, 0xb0, 0xda, - 0x84, 0x4a, 0x5a, 0xf7, 0x61, 0xdf, 0xed, 0x0d, 0xed, 0x57, 0x3a, 0x9f, 0x7e, 0xde, 0x97, 0xf8, - 0x6a, 0xa1, 0xb4, 0xaa, 0xc2, 0xc5, 0xd4, 0xfe, 0x4c, 0xa5, 0x57, 0x0a, 0xf1, 0x7b, 0xb0, 0x8e, - 0x71, 0x99, 0xac, 0x06, 0xde, 0x80, 0x5c, 0xdf, 0x3c, 0xb5, 0xc7, 0xb2, 0xc4, 0xa6, 0x79, 0xca, - 0x76, 0x4d, 0x25, 0x0c, 0xe4, 0x2c, 0x7f, 0x00, 0x1b, 0x71, 0x19, 0x4c, 0xa1, 0x77, 0x61, 0xc1, - 0xf1, 0xec, 0x2e, 0x2d, 0x23, 0x96, 0x92, 0x76, 0x17, 0x28, 0x42, 0x78, 0x88, 0xa0, 0x6f, 0x81, - 0x0a, 0x13, 0x94, 0xb6, 0x65, 0xbe, 0x4e, 0xdc, 0x0c, 0x9d, 0xd0, 0x45, 0x6c, 0xf3, 0x74, 0x15, - 0xfd, 0x12, 0x66, 0xc1, 0xa3, 0x6b, 0x38, 0x8c, 0x06, 0xc9, 0x6c, 0x2c, 0x48, 0x56, 0x3f, 0x82, - 0x8b, 0xa9, 0xa3, 0x87, 0x3b, 0x1e, 0x9d, 0xcd, 0x8c, 0x1d, 0x27, 0xac, 0xd5, 0x6f, 0x0d, 0x44, - 0xa6, 0x6e, 0xf9, 0x57, 0x7b, 0x46, 0x1a, 0x5c, 0x4a, 0x1f, 0x3e, 0x44, 0x4c, 0x74, 0x4a, 0xb3, - 0x10, 0x43, 0xe7, 0xf4, 0x21, 0x6c, 0xd6, 0xed, 0x8e, 0x3d, 0x5e, 0x41, 0x9e, 0x0d, 0xe0, 0x7d, - 0x72, 0x2e, 0xa9, 0x3b, 0xc3, 0xbe, 0xe9, 0xb5, 0x9f, 0xa8, 0xa3, 0x8e, 0x5d, 0x77, 0x06, 0x76, - 0xdb, 0xc3, 0xf3, 0x1b, 0xb8, 0x6e, 0x97, 0x58, 0x36, 0xeb, 0x57, 0xc0, 0x04, 0x19, 0xe7, 0x25, - 0x3c, 0x70, 0x7d, 0xa7, 0xc7, 0x82, 0x02, 0x7e, 0xac, 0xca, 0x70, 0x21, 0x21, 0x47, 0xea, 0x59, - 0xce, 0x33, 0xc7, 0x1a, 0x99, 0x1d, 0x74, 0x05, 0x4a, 0x44, 0x56, 0x7f, 0x60, 0x9f, 0x38, 0x2f, - 0x7c, 0x2d, 0x30, 0xa9, 0x49, 0x28, 0x29, 0xf2, 0x9e, 0x8c, 0xe9, 0x85, 0x0f, 0xa2, 0xb6, 0xfd, - 0x0a, 0xb2, 0xd0, 0x25, 0x28, 0x0e, 0xcc, 0x9e, 0xe5, 0x76, 0x9d, 0x6f, 0xa6, 0x1b, 0x5b, 0x50, - 0x43, 0x42, 0xf5, 0x27, 0xb3, 0xb0, 0x9a, 0x18, 0x0a, 0xa9, 0xb0, 0x61, 0xb1, 0x77, 0x63, 0x30, - 0xea, 0xd8, 0x86, 0x45, 0x16, 0x85, 0xd9, 0x5e, 0xac, 0x8e, 0x34, 0xbe, 0x74, 0x87, 0xe7, 0x54, - 0x64, 0x8d, 0x2f, 0xe8, 0x37, 0x40, 0x39, 0x2e, 0xd3, 0x09, 0x16, 0x88, 0xa5, 0xe1, 0xd5, 0x49, - 0x72, 0xc3, 0xa5, 0x3c, 0x3c, 0xa7, 0x6e, 0x59, 0xe9, 0x8b, 0x3c, 0xa6, 0x73, 0x9b, 0x2c, 0x58, - 0x5a, 0xed, 0x6b, 0x7c, 0x59, 0x93, 0x3a, 0x53, 0xea, 0x5e, 0x1e, 0x72, 0x58, 0x54, 0xf5, 0xf7, - 0x72, 0x91, 0xda, 0x60, 0xb4, 0xb7, 0x0f, 0x34, 0x01, 0x96, 0x63, 0x83, 0x93, 0x0a, 0x79, 0xc2, - 0x22, 0xe3, 0x33, 0x3a, 0x71, 0xd5, 0xa5, 0xe8, 0x88, 0xe8, 0x3d, 0x3a, 0x16, 0x5b, 0xe3, 0xf2, - 0xa4, 0x9e, 0xa4, 0x24, 0x4c, 0x38, 0xd1, 0x95, 0xa8, 0x09, 0x66, 0x83, 0x7a, 0x71, 0x68, 0x86, - 0xbb, 0xb0, 0xf6, 0xc4, 0xb1, 0x6c, 0xa3, 0xff, 0xc4, 0xed, 0xd9, 0xd1, 0x4f, 0x1d, 0x05, 0xc2, - 0xb8, 0x8a, 0x1b, 0x9b, 0xb8, 0x8d, 0x55, 0xb0, 0xdf, 0x1d, 0x2f, 0x2a, 0xe7, 0x03, 0xb1, 0xc9, - 0xc2, 0xf2, 0x16, 0x8b, 0xe9, 0x24, 0x3d, 0xa0, 0x5a, 0x91, 0x9c, 0xfd, 0x72, 0x24, 0xa4, 0x2f, - 0x04, 0x6d, 0xe1, 0x91, 0xe4, 0x18, 0x20, 0x92, 0x5d, 0x2f, 0x26, 0x4a, 0x4e, 0xd3, 0x56, 0x79, - 0x37, 0x91, 0xf7, 0x11, 0xc1, 0x11, 0x61, 0xe8, 0x5a, 0x68, 0x1b, 0x43, 0xdb, 0xa3, 0x87, 0x05, - 0xca, 0xc4, 0xec, 0x63, 0x68, 0x7b, 0xe8, 0x0b, 0x8c, 0xa9, 0xed, 0xf6, 0x4e, 0x9c, 0x53, 0x92, - 0x3c, 0x95, 0xee, 0x54, 0x02, 0x05, 0x54, 0xd7, 0xed, 0xd6, 0x48, 0x13, 0x2b, 0xfa, 0x84, 0x02, - 0x28, 0xb9, 0xf2, 0x39, 0x58, 0x7d, 0x8d, 0x04, 0xb4, 0xfa, 0x07, 0xd1, 0x92, 0x70, 0x1a, 0x96, - 0x6e, 0xc3, 0x06, 0x76, 0x5a, 0x09, 0x63, 0xf1, 0x9d, 0xd7, 0xda, 0xd0, 0xe9, 0xc7, 0x90, 0x34, - 0xab, 0x42, 0x9c, 0x84, 0xdd, 0xdc, 0x15, 0xe2, 0x68, 0xc7, 0x29, 0xa7, 0xd9, 0x7f, 0xcc, 0x91, - 0x0a, 0x71, 0x72, 0x98, 0xb3, 0x4f, 0xe3, 0x53, 0xcc, 0x00, 0xb2, 0xd3, 0x0d, 0x80, 0x81, 0x3f, - 0x16, 0x7f, 0xb8, 0x44, 0xfc, 0xd9, 0x49, 0x03, 0x7e, 0x8e, 0x78, 0xbe, 0x31, 0xd0, 0xa7, 0x7c, - 0x49, 0x59, 0x4c, 0xfd, 0x92, 0xe2, 0x9f, 0xbd, 0x17, 0x26, 0x9c, 0xbd, 0xf3, 0x89, 0xb3, 0x77, - 0x23, 0x06, 0xf4, 0x02, 0x01, 0xfa, 0xa7, 0xa6, 0xed, 0x4c, 0x12, 0xdf, 0x31, 0x6c, 0x5f, 0x89, - 0x63, 0xbb, 0x18, 0xf3, 0xfb, 0x18, 0xd7, 0x5f, 0x1b, 0xc7, 0x35, 0xcc, 0xc2, 0x75, 0x14, 0xd3, - 0xe3, 0x85, 0xcd, 0xd2, 0x9c, 0x85, 0xcd, 0xa5, 0x57, 0x38, 0x06, 0xbe, 0xa6, 0x01, 0xfd, 0x26, - 0x37, 0x16, 0x1b, 0xd9, 0xc1, 0xeb, 0xbd, 0x78, 0x4e, 0x32, 0xf1, 0xac, 0x13, 0x02, 0xe5, 0x6c, + 0xcc, 0x92, 0xe9, 0xb9, 0xff, 0xce, 0xdc, 0xcc, 0x9f, 0x3b, 0x33, 0xe1, 0x6e, 0x65, 0xbb, 0xba, + 0xbb, 0x88, 0xbb, 0xca, 0x53, 0x55, 0x4e, 0xd2, 0x57, 0x17, 0x8a, 0x8a, 0xab, 0xba, 0x53, 0x37, + 0xb6, 0xcb, 0xd8, 0xe5, 0x2c, 0x08, 0x1e, 0x90, 0x78, 0x18, 0x5e, 0x10, 0xfb, 0x26, 0xb1, 0x49, + 0x2c, 0x12, 0x08, 0x24, 0x10, 0xdb, 0x13, 0xd2, 0x20, 0x1e, 0x00, 0x89, 0x67, 0x90, 0xb8, 0x20, + 0x76, 0x10, 0x0f, 0xc0, 0x03, 0xeb, 0x13, 0xe8, 0x2c, 0xb5, 0xba, 0xbc, 0x74, 0x92, 0x2b, 0x21, + 0x78, 0xab, 0xfa, 0xce, 0x77, 0xbe, 0xf3, 0x9d, 0x73, 0x7e, 0xdf, 0x72, 0xbe, 0x3a, 0x36, 0x6c, + 0x74, 0x9d, 0x27, 0xf6, 0x63, 0xc7, 0x33, 0x46, 0xce, 0x60, 0x7f, 0x30, 0x74, 0x3d, 0x17, 0x2d, + 0x33, 0x52, 0xe5, 0xd2, 0x99, 0xeb, 0x9e, 0x75, 0xed, 0x5b, 0x84, 0xfc, 0x70, 0x7c, 0x7a, 0xcb, + 0xec, 0x3f, 0xa7, 0x3c, 0x95, 0xab, 0xc9, 0x26, 0x6b, 0x3c, 0x34, 0x3d, 0xc7, 0xed, 0xb3, 0xf6, + 0xcb, 0xc9, 0x76, 0xbb, 0x37, 0xf0, 0xfc, 0xce, 0x5b, 0xfe, 0x98, 0x3d, 0xd7, 0xb2, 0xbb, 0x23, + 0x46, 0x45, 0x3e, 0x75, 0xe8, 0xba, 0x3d, 0x4a, 0xab, 0x2a, 0x50, 0xd4, 0xa4, 0x96, 0xe6, 0x99, + 0xde, 0x78, 0x84, 0xf6, 0x20, 0xd7, 0x71, 0x2d, 0xbb, 0x9c, 0xb9, 0x9e, 0xb9, 0xb9, 0x76, 0x7b, + 0x67, 0x9f, 0xf1, 0xef, 0x07, 0x1c, 0x75, 0xd7, 0xb2, 0x55, 0xc2, 0x83, 0x76, 0x20, 0x3f, 0x22, + 0xb4, 0x72, 0xf6, 0x7a, 0xe6, 0x66, 0x51, 0x65, 0x6f, 0xd5, 0x3f, 0xe5, 0x60, 0xbb, 0x3e, 0xb4, + 0x4d, 0xcf, 0xd6, 0xa4, 0x96, 0x3e, 0x1c, 0xf7, 0x1f, 0xab, 0xf6, 0xb7, 0x8c, 0xed, 0x91, 0x87, + 0xde, 0x81, 0x0d, 0xa7, 0xff, 0xd0, 0x1d, 0xf7, 0x2d, 0xc3, 0xb4, 0xac, 0xa1, 0x3d, 0x1a, 0xd9, + 0xa3, 0x72, 0xe6, 0x3a, 0x77, 0xb3, 0xa8, 0xf2, 0xac, 0x41, 0xf0, 0xe9, 0xe8, 0x6d, 0xe0, 0xdd, + 0xb1, 0x17, 0xe3, 0x66, 0x03, 0xad, 0xfb, 0x74, 0xc6, 0x8c, 0xde, 0x82, 0x80, 0x64, 0xf4, 0xc7, + 0xbd, 0x87, 0xf6, 0xb0, 0xcc, 0x11, 0xce, 0x35, 0x9f, 0x2c, 0x13, 0x2a, 0xfa, 0x0c, 0x6c, 0xfb, + 0x0a, 0x50, 0xbe, 0x91, 0x31, 0xb4, 0xcf, 0xec, 0x67, 0xe5, 0x1c, 0x56, 0xa2, 0x96, 0x2d, 0x67, + 0xd4, 0x4d, 0xc6, 0x40, 0x7b, 0x8c, 0x54, 0xdc, 0x8c, 0x07, 0x48, 0xf4, 0x2b, 0x17, 0x89, 0xda, + 0x6b, 0x71, 0x6e, 0xac, 0xb4, 0xcf, 0x38, 0x1e, 0xd9, 0xc3, 0xbe, 0xd9, 0xb3, 0xcb, 0x4b, 0x54, + 0x69, 0x46, 0x6f, 0x33, 0x72, 0x94, 0x75, 0x60, 0x8e, 0x46, 0x4f, 0xdd, 0xa1, 0x55, 0xce, 0xc7, + 0x58, 0x5b, 0x8c, 0x8c, 0xd7, 0x2d, 0x98, 0x5f, 0x20, 0x76, 0x99, 0xf0, 0x06, 0x6b, 0x14, 0xc8, + 0x8d, 0x32, 0x07, 0x82, 0x0b, 0x71, 0xe6, 0x40, 0x32, 0x82, 0x1c, 0x11, 0x06, 0xa4, 0x9d, 0x3c, + 0xa3, 0x0a, 0x14, 0x7a, 0xb6, 0x67, 0x5a, 0xa6, 0x67, 0x96, 0x4b, 0x84, 0x1e, 0xbc, 0xdf, 0xc9, + 0x96, 0x33, 0xd5, 0x9f, 0x5b, 0x82, 0x15, 0x7f, 0x67, 0xa5, 0xfe, 0xa9, 0x8b, 0xae, 0xc3, 0xca, + 0xc8, 0x19, 0x18, 0x1e, 0x26, 0x18, 0x8e, 0x45, 0xc0, 0x53, 0x54, 0x61, 0xe4, 0x0c, 0x28, 0x8f, + 0x85, 0xde, 0x83, 0xdc, 0x63, 0xa7, 0x6f, 0x95, 0xd7, 0x08, 0xac, 0xae, 0x45, 0x61, 0x15, 0x88, + 0xd9, 0x27, 0x4f, 0x77, 0x9d, 0xbe, 0xa5, 0x12, 0xe6, 0x74, 0xb4, 0x64, 0xcf, 0x81, 0x16, 0x6e, + 0x61, 0xb4, 0xe4, 0x52, 0xd1, 0xf2, 0x1e, 0x14, 0xbd, 0xa1, 0xd9, 0x1f, 0x0d, 0xdc, 0xa1, 0x57, + 0x5e, 0x25, 0xaa, 0x6f, 0xc7, 0x55, 0x67, 0x8d, 0x6a, 0xc8, 0x37, 0x1d, 0x62, 0x4b, 0xe7, 0x86, + 0x18, 0x2c, 0x0c, 0xb1, 0xfc, 0xe2, 0x10, 0x5b, 0x3e, 0x07, 0xc4, 0x0a, 0xe7, 0x81, 0x58, 0x71, + 0x0e, 0xc4, 0x4a, 0x53, 0x20, 0xb6, 0x12, 0x87, 0x58, 0xb5, 0x01, 0xc5, 0x00, 0x09, 0x88, 0x87, + 0x15, 0x5d, 0x6d, 0xcb, 0x77, 0x8d, 0xa6, 0x78, 0x28, 0xd4, 0x4f, 0xf8, 0x0b, 0x68, 0x03, 0x56, + 0x29, 0x45, 0x92, 0x6b, 0x4a, 0x5b, 0x6e, 0xf0, 0x19, 0x84, 0x60, 0x8d, 0x92, 0x94, 0xb6, 0x4e, + 0x69, 0x59, 0x02, 0x54, 0x15, 0xae, 0x04, 0x7e, 0x48, 0xa2, 0xf3, 0x8d, 0xb9, 0xa3, 0xdb, 0xb0, + 0x44, 0x30, 0x4b, 0x00, 0x5b, 0xba, 0x7d, 0x25, 0xba, 0xb7, 0x51, 0x7e, 0x8c, 0x4e, 0x95, 0xb2, + 0x56, 0x7f, 0x3b, 0x03, 0x57, 0xda, 0x03, 0x6b, 0xba, 0xd0, 0xf9, 0xc6, 0xf0, 0x01, 0x2c, 0x0f, + 0xed, 0x41, 0xd7, 0xec, 0xd8, 0xc4, 0x9f, 0xcd, 0x19, 0xf8, 0xe8, 0x82, 0xea, 0xb3, 0xa3, 0x0f, + 0x20, 0x3f, 0x26, 0x63, 0x13, 0x68, 0x97, 0x6e, 0x5f, 0x9d, 0xd6, 0x91, 0x6a, 0x78, 0x74, 0x41, + 0x65, 0xfc, 0xb5, 0x02, 0xe4, 0xcd, 0x0e, 0x8e, 0x1d, 0xd5, 0xdf, 0x2d, 0xc0, 0x66, 0xca, 0x30, + 0x0b, 0xe8, 0xed, 0x6f, 0x64, 0x76, 0xca, 0x46, 0x72, 0xf1, 0x8d, 0x44, 0x65, 0x58, 0xf6, 0x91, + 0x4c, 0xdc, 0xab, 0xea, 0xbf, 0x62, 0xfc, 0x98, 0xdd, 0xae, 0xfb, 0xd4, 0x8e, 0x5a, 0xf6, 0x12, + 0xb5, 0x6c, 0xd6, 0x10, 0x5a, 0xf6, 0x5b, 0xb0, 0xee, 0x33, 0xfb, 0xe2, 0xf2, 0xd4, 0x30, 0x18, + 0xd9, 0x37, 0x8c, 0x1b, 0xb0, 0x6a, 0x8e, 0xbd, 0x47, 0x49, 0x0f, 0xb9, 0x82, 0x89, 0x01, 0x74, + 0x7d, 0xa6, 0x84, 0x67, 0x24, 0x4c, 0x01, 0x64, 0xeb, 0xb0, 0xfc, 0xc8, 0x36, 0x2d, 0xdf, 0xcd, + 0x97, 0x6e, 0xbf, 0x3d, 0x6b, 0x87, 0xf6, 0x8f, 0x28, 0xaf, 0xd8, 0xf7, 0x86, 0xcf, 0x55, 0xbf, + 0x27, 0x72, 0x60, 0x9b, 0x3d, 0x1a, 0x9e, 0x6b, 0x98, 0x9e, 0x37, 0x74, 0x1e, 0x8e, 0x3d, 0x9b, + 0x9a, 0x75, 0xe9, 0xf6, 0xd7, 0x2d, 0x22, 0x52, 0x77, 0x85, 0xa0, 0x1f, 0x15, 0xbf, 0xf9, 0x68, + 0xb2, 0x05, 0x0f, 0x15, 0xca, 0xc7, 0xa3, 0xf9, 0xda, 0xaf, 0x2d, 0x30, 0x54, 0x28, 0x47, 0x77, + 0x63, 0x33, 0xd9, 0x34, 0x27, 0x5b, 0x50, 0x0d, 0xbb, 0xa9, 0x4e, 0x77, 0x6c, 0xd9, 0xc1, 0x20, + 0xeb, 0xc4, 0x33, 0x5e, 0x8a, 0x0e, 0x42, 0xb9, 0x95, 0x01, 0x46, 0xdc, 0x08, 0x7b, 0x30, 0xd2, + 0x23, 0x22, 0x63, 0xe8, 0xf4, 0xcf, 0x9c, 0xfe, 0x99, 0xe1, 0x39, 0x3d, 0xdb, 0x1d, 0x7b, 0xc4, + 0x39, 0x94, 0x6e, 0x5f, 0xda, 0xa7, 0x29, 0xcd, 0xbe, 0x9f, 0xd2, 0xec, 0x37, 0x58, 0xca, 0xa3, + 0xae, 0xb1, 0x1e, 0x3a, 0xed, 0x80, 0x44, 0xd8, 0xe8, 0x99, 0xcf, 0x8c, 0x8e, 0xd9, 0xed, 0x1a, + 0x7e, 0x5e, 0x44, 0x5c, 0xc9, 0x4c, 0x29, 0xeb, 0x3d, 0xf3, 0x59, 0xdd, 0xec, 0x76, 0x7d, 0x02, + 0x86, 0xc3, 0xe3, 0xa1, 0x33, 0x1a, 0x18, 0x76, 0xdf, 0x7c, 0xd8, 0xb5, 0x2d, 0xe2, 0xe6, 0x0b, + 0xea, 0x0a, 0x21, 0x8a, 0x94, 0x86, 0x0e, 0x80, 0xef, 0xd9, 0x96, 0x63, 0x1a, 0x76, 0xbf, 0x33, + 0x7c, 0x4e, 0x26, 0x55, 0xe6, 0xc9, 0xa4, 0x2f, 0x47, 0x27, 0x7d, 0x8c, 0x79, 0xc4, 0x80, 0x45, + 0x5d, 0xef, 0xc5, 0x09, 0x95, 0x3b, 0xb0, 0x12, 0x5d, 0x60, 0xc4, 0x03, 0xf7, 0xd8, 0x7e, 0xce, + 0x2c, 0x0d, 0x3f, 0xa2, 0x2d, 0x58, 0x7a, 0x62, 0x76, 0xc7, 0xbe, 0x8d, 0xd1, 0x97, 0x3b, 0xd9, + 0x0f, 0x32, 0x95, 0x03, 0x28, 0x4f, 0xc3, 0xc4, 0x79, 0xe5, 0x4c, 0xdb, 0xf0, 0xf3, 0xc8, 0xa9, + 0xfe, 0x33, 0x07, 0xdb, 0xa9, 0x4e, 0x07, 0xfd, 0xbf, 0xd0, 0xec, 0xa9, 0x5f, 0xdd, 0x0c, 0x16, + 0xa9, 0xe9, 0x8c, 0x3c, 0xca, 0x15, 0xfa, 0x82, 0x2f, 0xa6, 0xf9, 0x82, 0xec, 0xf4, 0x8e, 0x93, + 0x0e, 0xe2, 0xb3, 0x93, 0x0e, 0x82, 0x9b, 0xde, 0x3f, 0xe9, 0x35, 0x6e, 0x26, 0xbd, 0x06, 0xc9, + 0x05, 0x8e, 0x2e, 0xc4, 0xfd, 0xc6, 0xc7, 0x99, 0x4c, 0xc0, 0x19, 0xb8, 0x0e, 0x92, 0xd8, 0x1d, + 0x65, 0xe2, 0xce, 0x03, 0x73, 0x5e, 0x64, 0x9e, 0x92, 0x84, 0xe5, 0xa3, 0x2c, 0xf5, 0x95, 0xb8, + 0xe1, 0x5a, 0xc4, 0x5d, 0x12, 0xef, 0x74, 0xc4, 0x85, 0x0e, 0x13, 0x33, 0xdc, 0x4d, 0x81, 0x5a, + 0x61, 0x2e, 0xd4, 0x8e, 0x72, 0x13, 0x60, 0xfb, 0x38, 0x93, 0xa9, 0xf1, 0xb0, 0x66, 0xc4, 0xe6, + 0x16, 0x52, 0xfc, 0x39, 0xd4, 0x96, 0x61, 0xc9, 0x20, 0x4d, 0x25, 0x28, 0x1a, 0xbe, 0x26, 0xb5, + 0x4d, 0xd8, 0x30, 0x92, 0x7a, 0x54, 0x75, 0xd8, 0x0d, 0xc2, 0xa9, 0xc2, 0xa2, 0x7c, 0x2c, 0xf4, + 0xbd, 0x17, 0x8f, 0xa7, 0xbb, 0x51, 0x8d, 0x63, 0x1d, 0xa2, 0x01, 0xf5, 0x93, 0x0c, 0xec, 0x06, + 0x01, 0x35, 0x55, 0xec, 0xfc, 0xc8, 0xf4, 0x61, 0x32, 0xa2, 0xce, 0x1e, 0x3a, 0x1a, 0x52, 0x3f, + 0x4c, 0x84, 0xd4, 0x6b, 0x53, 0x7b, 0xce, 0x88, 0xa9, 0xbf, 0xb3, 0x0c, 0x5b, 0x69, 0x03, 0x7d, + 0x6d, 0x82, 0xaa, 0x9f, 0xde, 0xd2, 0xa4, 0xd5, 0x7f, 0x45, 0xb7, 0x60, 0xd3, 0xb2, 0x47, 0x9e, + 0xd3, 0x27, 0x9e, 0xcd, 0xe8, 0xb8, 0x63, 0x6c, 0xd4, 0x24, 0xe5, 0x2e, 0xaa, 0x28, 0xd2, 0x54, + 0xa7, 0x2d, 0xf1, 0xf4, 0x76, 0x69, 0xc1, 0xf4, 0x36, 0x12, 0xd4, 0xf3, 0xf1, 0xa0, 0xfe, 0xea, + 0xc2, 0x6f, 0x23, 0x19, 0x7e, 0xf7, 0x66, 0x6e, 0xe7, 0x94, 0xf8, 0xfb, 0x95, 0xd9, 0xf1, 0xf7, + 0x33, 0x0b, 0xc9, 0x5c, 0x30, 0x00, 0x7f, 0x65, 0x5a, 0x00, 0x2e, 0x2d, 0x32, 0xd6, 0x4b, 0x47, + 0xe0, 0x95, 0xf3, 0x46, 0xe0, 0xb4, 0x88, 0xb6, 0xfa, 0x7f, 0x3c, 0xa2, 0xfd, 0x6a, 0x0e, 0x76, + 0xd2, 0x6d, 0x1e, 0xed, 0x86, 0x46, 0x97, 0x61, 0xd1, 0xc1, 0x27, 0x60, 0xa7, 0xfd, 0x41, 0xd4, + 0x90, 0xb2, 0x33, 0x0c, 0xe9, 0x28, 0x13, 0x31, 0x25, 0xdc, 0xf3, 0xff, 0xa7, 0xdb, 0x6c, 0x91, + 0xc5, 0x8d, 0x14, 0xab, 0xc5, 0xbd, 0x22, 0x11, 0x96, 0x5b, 0x20, 0xc2, 0x4e, 0x89, 0x70, 0xdc, + 0xc2, 0x11, 0x2e, 0x37, 0x2f, 0xc2, 0x2d, 0xcd, 0x8a, 0x70, 0xf9, 0x57, 0x12, 0xe1, 0x96, 0x53, + 0x23, 0x1c, 0x40, 0xc1, 0xcf, 0x1a, 0x6a, 0x2b, 0x00, 0x46, 0xb0, 0xb8, 0xb5, 0x1d, 0xd8, 0x32, + 0x52, 0x96, 0xf6, 0x55, 0xc7, 0xc4, 0xcf, 0xc1, 0xa5, 0x43, 0xdb, 0x7b, 0xd1, 0xa3, 0x60, 0xb5, + 0x05, 0x95, 0xb4, 0xee, 0xa3, 0x81, 0xdb, 0x1f, 0xd9, 0x2f, 0x74, 0x3e, 0xfd, 0xbc, 0x2f, 0xf1, + 0xc5, 0x42, 0x69, 0x55, 0x85, 0xcb, 0xa9, 0xfd, 0x99, 0x4a, 0x2f, 0x14, 0xe2, 0x6b, 0xb0, 0x89, + 0x71, 0x99, 0xac, 0x06, 0xbe, 0x05, 0xb9, 0x81, 0x79, 0x66, 0x4f, 0x64, 0x89, 0x2d, 0xf3, 0x8c, + 0xed, 0x9a, 0x4a, 0x18, 0xc8, 0x59, 0xfe, 0x10, 0xb6, 0xe2, 0x32, 0x98, 0x42, 0xef, 0xc0, 0x92, + 0xe3, 0xd9, 0x3d, 0x5a, 0x46, 0x2c, 0x25, 0xed, 0x2e, 0x50, 0x84, 0xf0, 0x10, 0x41, 0xdf, 0x06, + 0x15, 0x26, 0x28, 0x6d, 0xcb, 0x7c, 0x9d, 0xb8, 0x39, 0x3a, 0xa1, 0xcb, 0xd8, 0xe6, 0xe9, 0x2a, + 0xfa, 0x25, 0xcc, 0x82, 0x47, 0xd7, 0x70, 0x14, 0x0d, 0x92, 0xd9, 0x58, 0x90, 0xac, 0x7e, 0x04, + 0x97, 0x53, 0x47, 0x0f, 0x77, 0x3c, 0x3a, 0x9b, 0x39, 0x3b, 0x4e, 0x58, 0xab, 0xdf, 0x1e, 0x88, + 0x4c, 0xdd, 0xf2, 0xaf, 0xf5, 0x8c, 0x34, 0xb8, 0x92, 0x3e, 0x7c, 0x88, 0x98, 0xe8, 0x94, 0xe6, + 0x21, 0x86, 0xce, 0xe9, 0x43, 0xd8, 0x6e, 0xd8, 0x5d, 0x7b, 0xb2, 0x82, 0x3c, 0x1f, 0xc0, 0x07, + 0xe4, 0x5c, 0xd2, 0x70, 0x46, 0x03, 0xd3, 0xeb, 0x3c, 0x52, 0xc7, 0x5d, 0xbb, 0xe1, 0x0c, 0xed, + 0x8e, 0x87, 0xe7, 0x37, 0x74, 0xdd, 0x1e, 0xb1, 0x6c, 0xd6, 0xaf, 0x80, 0x09, 0x32, 0xce, 0x4b, + 0x78, 0xe0, 0x06, 0x4e, 0x9f, 0x05, 0x05, 0xfc, 0x58, 0x95, 0xe1, 0x52, 0x42, 0x8e, 0xd4, 0xb7, + 0x9c, 0x27, 0x8e, 0x35, 0x36, 0xbb, 0xe8, 0x1a, 0x94, 0x88, 0xac, 0xc1, 0xd0, 0x3e, 0x75, 0x9e, + 0xf9, 0x5a, 0x60, 0x52, 0x8b, 0x50, 0x52, 0xe4, 0x3d, 0x9a, 0xd0, 0x0b, 0x1f, 0x44, 0x6d, 0xfb, + 0x05, 0x64, 0xa1, 0x2b, 0x50, 0x1c, 0x9a, 0x7d, 0xcb, 0xed, 0x39, 0xdf, 0x4a, 0x37, 0xb6, 0xa0, + 0x86, 0x84, 0xea, 0x4f, 0x67, 0x61, 0x3d, 0x31, 0x14, 0x52, 0x61, 0xcb, 0x62, 0xef, 0xc6, 0x70, + 0xdc, 0xb5, 0x0d, 0x8b, 0x2c, 0x0a, 0xb3, 0xbd, 0x58, 0x1d, 0x69, 0x72, 0xe9, 0x8e, 0x2e, 0xa8, + 0xc8, 0x9a, 0x5c, 0xd0, 0x6f, 0x82, 0x72, 0x5c, 0xa6, 0x13, 0x2c, 0x10, 0x4b, 0xc3, 0xab, 0xd3, + 0xe4, 0x86, 0x4b, 0x79, 0x74, 0x41, 0xdd, 0xb1, 0xd2, 0x17, 0x79, 0x42, 0xe7, 0x0e, 0x59, 0xb0, + 0xb4, 0xda, 0xd7, 0xe4, 0xb2, 0x26, 0x75, 0xa6, 0xd4, 0x5a, 0x1e, 0x72, 0x58, 0x54, 0xf5, 0xf7, + 0x73, 0x91, 0xda, 0x60, 0xb4, 0xb7, 0x0f, 0x34, 0x01, 0x56, 0x63, 0x83, 0x93, 0x0a, 0x79, 0xc2, + 0x22, 0xe3, 0x33, 0x3a, 0x75, 0xd5, 0x95, 0xe8, 0x88, 0xe8, 0x5d, 0x3a, 0x16, 0x5b, 0xe3, 0xf2, + 0xb4, 0x9e, 0xa4, 0x24, 0x4c, 0x38, 0xd1, 0xb5, 0xa8, 0x09, 0x66, 0x83, 0x7a, 0x71, 0x68, 0x86, + 0xfb, 0xb0, 0xf1, 0xc8, 0xb1, 0x6c, 0x63, 0xf0, 0xc8, 0xed, 0xdb, 0xd1, 0x4f, 0x1d, 0x05, 0xc2, + 0xb8, 0x8e, 0x1b, 0x5b, 0xb8, 0x8d, 0x55, 0xb0, 0xdf, 0x99, 0x2c, 0x2a, 0xe7, 0x03, 0xb1, 0xc9, + 0xc2, 0xf2, 0x0e, 0x8b, 0xe9, 0x24, 0x3d, 0xa0, 0x5a, 0x91, 0x9c, 0xfd, 0x6a, 0x24, 0xa4, 0x2f, + 0x05, 0x6d, 0xe1, 0x91, 0xe4, 0x04, 0x20, 0x92, 0x5d, 0x2f, 0x27, 0x4a, 0x4e, 0xb3, 0x56, 0x79, + 0x3f, 0x91, 0xf7, 0x11, 0xc1, 0x11, 0x61, 0xe8, 0x46, 0x68, 0x1b, 0x23, 0xdb, 0xa3, 0x87, 0x05, + 0xca, 0xc4, 0xec, 0x63, 0x64, 0x7b, 0xe8, 0x0b, 0x8c, 0xa9, 0xe3, 0xf6, 0x4f, 0x9d, 0x33, 0x92, + 0x3c, 0x95, 0x6e, 0x57, 0x02, 0x05, 0x54, 0xd7, 0xed, 0xd5, 0x49, 0x13, 0x2b, 0xfa, 0x84, 0x02, + 0x28, 0xb9, 0xf2, 0x39, 0x58, 0x7f, 0x89, 0x04, 0xb4, 0xfa, 0x87, 0xd1, 0x92, 0x70, 0x1a, 0x96, + 0x6e, 0xc1, 0x16, 0x76, 0x5a, 0x09, 0x63, 0xf1, 0x9d, 0xd7, 0xc6, 0xc8, 0x19, 0xc4, 0x90, 0x34, + 0xaf, 0x42, 0x9c, 0x84, 0xdd, 0xc2, 0x15, 0xe2, 0x68, 0xc7, 0x19, 0xa7, 0xd9, 0x7f, 0xcc, 0x91, + 0x0a, 0x71, 0x72, 0x98, 0xf3, 0x4f, 0xe3, 0x53, 0xcc, 0x00, 0xb2, 0xb3, 0x0d, 0x80, 0x81, 0x3f, + 0x16, 0x7f, 0xb8, 0x44, 0xfc, 0xd9, 0x4b, 0x03, 0x7e, 0x8e, 0x78, 0xbe, 0x09, 0xd0, 0xa7, 0x7c, + 0x49, 0x59, 0x4e, 0xfd, 0x92, 0xe2, 0x9f, 0xbd, 0x97, 0xa6, 0x9c, 0xbd, 0xf3, 0x89, 0xb3, 0x77, + 0x33, 0x06, 0xf4, 0x02, 0x01, 0xfa, 0xa7, 0x66, 0xed, 0x4c, 0x12, 0xdf, 0x31, 0x6c, 0x5f, 0x8b, + 0x63, 0xbb, 0x18, 0xf3, 0xfb, 0x18, 0xd7, 0x5f, 0x1f, 0xc7, 0x35, 0xcc, 0xc3, 0x75, 0x14, 0xd3, + 0x93, 0x85, 0xcd, 0xd2, 0x82, 0x85, 0xcd, 0x95, 0x17, 0x38, 0x06, 0xbe, 0xa4, 0x01, 0xfd, 0x16, + 0x37, 0x11, 0x1b, 0xd9, 0xc1, 0xeb, 0xdd, 0x78, 0x4e, 0x32, 0xf5, 0xac, 0x13, 0x02, 0xe5, 0x7c, 0x98, 0xf3, 0x8f, 0x31, 0x1c, 0x3b, 0xd5, 0xa5, 0x1e, 0x63, 0x72, 0xac, 0xcc, 0x17, 0x3b, 0xc6, - 0xc8, 0x31, 0x2c, 0x2c, 0x10, 0x2c, 0xec, 0x4e, 0x37, 0xb6, 0xa9, 0x68, 0x48, 0x3b, 0x16, 0xe5, - 0x67, 0x1f, 0x8b, 0xb2, 0x69, 0xc7, 0xa2, 0xd7, 0xdc, 0x8f, 0xb3, 0x9c, 0x7f, 0xbe, 0x33, 0x13, - 0xa4, 0xd3, 0x69, 0x9e, 0x6f, 0xee, 0xe4, 0x73, 0x07, 0xd6, 0x92, 0x7e, 0xc5, 0x4f, 0x42, 0x57, - 0x63, 0xe9, 0x81, 0x35, 0x8c, 0x3b, 0x8a, 0x6c, 0xdc, 0x51, 0x44, 0x12, 0xec, 0xb8, 0x3e, 0x73, - 0x24, 0xd8, 0x63, 0xe1, 0x9c, 0x25, 0xa3, 0x0a, 0x5c, 0x0a, 0x92, 0xd1, 0x37, 0xe1, 0xde, 0xab, - 0x9f, 0xe4, 0x60, 0x2d, 0x92, 0xfd, 0x32, 0x8b, 0xad, 0x40, 0xe1, 0x89, 0x3b, 0xf4, 0xa2, 0xe9, - 0xa9, 0xff, 0x3e, 0xa9, 0xb6, 0xb7, 0x38, 0x5f, 0x6d, 0x2f, 0x3b, 0x67, 0x6d, 0x6f, 0xac, 0x82, - 0xc7, 0xcd, 0x53, 0xc1, 0xcb, 0xa5, 0x54, 0xf0, 0x4e, 0x27, 0xd5, 0xde, 0xa8, 0xa1, 0xdc, 0x4d, - 0x3b, 0x04, 0xd0, 0x65, 0x38, 0x63, 0xe1, 0xed, 0x74, 0x52, 0xe1, 0x2d, 0x3f, 0x73, 0xa0, 0x33, - 0x55, 0xdd, 0xfe, 0xc7, 0x55, 0xab, 0x7e, 0xaa, 0x08, 0x17, 0x83, 0xd4, 0xaa, 0x69, 0x0e, 0x3c, - 0xa7, 0xed, 0xf4, 0xcd, 0x9e, 0x37, 0x7f, 0xd1, 0xfc, 0x3d, 0xff, 0x28, 0xbf, 0x91, 0x08, 0x2c, - 0x63, 0x4b, 0xc5, 0xce, 0xf1, 0xe8, 0x32, 0x94, 0xb0, 0x4c, 0xf2, 0xcd, 0xcd, 0x73, 0x99, 0x4e, - 0xc5, 0xa1, 0xd3, 0xc7, 0xc9, 0xb5, 0xee, 0xa2, 0x6d, 0xc0, 0xf2, 0xfd, 0xe8, 0xbc, 0x1a, 0x34, - 0xb3, 0xb8, 0x1c, 0x3b, 0x80, 0x71, 0x89, 0x03, 0xd8, 0xa7, 0x61, 0xa3, 0x1f, 0xce, 0xc2, 0x70, - 0x2c, 0xbb, 0xe7, 0x39, 0xde, 0x4b, 0x86, 0xae, 0xf5, 0x48, 0x9b, 0xc4, 0x9a, 0xd0, 0x2d, 0xe0, - 0xa3, 0x5d, 0x22, 0x35, 0xe7, 0xd5, 0x08, 0x3d, 0x4d, 0x7a, 0xe0, 0xda, 0x0b, 0x63, 0xd2, 0x8f, - 0xfc, 0x60, 0xff, 0x0c, 0xb6, 0xa2, 0x5d, 0x22, 0x18, 0xa6, 0x35, 0xe9, 0x2f, 0x8c, 0x67, 0xb8, - 0xe3, 0xdb, 0xb0, 0x1b, 0x21, 0x25, 0xf1, 0xbc, 0xd9, 0x4f, 0x6b, 0xc3, 0x49, 0x89, 0xe5, 0x75, - 0x4f, 0xfc, 0xa4, 0x04, 0x3f, 0xa3, 0x1b, 0xb0, 0xdc, 0xef, 0x98, 0x2f, 0x8d, 0x81, 0xd3, 0x3b, - 0xf5, 0xdc, 0x1e, 0x2d, 0xbb, 0xd1, 0x94, 0x7f, 0x09, 0x37, 0xa8, 0x8c, 0x8e, 0x8d, 0x93, 0x30, - 0x5a, 0x8e, 0xd9, 0x21, 0x8c, 0xec, 0x73, 0x26, 0x26, 0xd6, 0x19, 0x2d, 0x3d, 0x97, 0x82, 0xf4, - 0x5c, 0xea, 0x7e, 0x58, 0x8a, 0xe7, 0xc9, 0xb4, 0x3f, 0x3d, 0xd7, 0xb4, 0xd3, 0x2b, 0xf2, 0x29, - 0x95, 0xeb, 0xb5, 0xff, 0x4d, 0xdf, 0x8e, 0x57, 0xe6, 0x4c, 0xb1, 0xd0, 0xd9, 0x53, 0x2c, 0xb4, - 0x0b, 0xeb, 0xcf, 0x4d, 0xc7, 0x33, 0x46, 0x3d, 0xcf, 0xe9, 0x18, 0x66, 0x6f, 0xf8, 0xdc, 0x1e, - 0xd8, 0x56, 0x79, 0x9d, 0x0c, 0xb9, 0x86, 0x9b, 0x5a, 0xb8, 0x45, 0x60, 0x0d, 0x95, 0x43, 0xa8, - 0x4c, 0xc6, 0xde, 0x99, 0x3c, 0xd6, 0x6b, 0xd4, 0xf8, 0xab, 0xbf, 0x90, 0x01, 0x14, 0x47, 0x08, - 0x39, 0x49, 0x5c, 0x87, 0x95, 0xb8, 0xb1, 0x33, 0x69, 0xcb, 0x31, 0x33, 0x9f, 0xe8, 0x13, 0xb2, - 0x93, 0x7d, 0xc2, 0x54, 0x1f, 0x13, 0xf5, 0x5f, 0x8e, 0x1f, 0xb8, 0x7c, 0xff, 0x25, 0x59, 0xd5, - 0x6f, 0xe7, 0x60, 0x9b, 0x04, 0xc6, 0x13, 0x7b, 0x90, 0xee, 0x55, 0x27, 0x69, 0x94, 0x99, 0x53, - 0xa3, 0x6c, 0x42, 0xa3, 0x2b, 0x50, 0xf2, 0xd8, 0x80, 0xd8, 0xa3, 0x52, 0x85, 0xc1, 0x27, 0xe9, - 0xee, 0xb8, 0x41, 0xe7, 0x52, 0x0c, 0xfa, 0x28, 0x34, 0xd2, 0x64, 0x7c, 0x9d, 0x3a, 0x9d, 0xc9, - 0x66, 0x9a, 0x34, 0xb1, 0xfc, 0x19, 0x4d, 0xec, 0xb5, 0x40, 0xf3, 0x49, 0x11, 0x4a, 0x9a, 0xd4, - 0x24, 0x9b, 0x82, 0xd1, 0x72, 0x1e, 0x16, 0xfd, 0x2d, 0xa3, 0xfd, 0xf3, 0x6d, 0xb2, 0x5f, 0xe8, - 0x02, 0x14, 0x82, 0xf8, 0x46, 0xa5, 0x2c, 0xb2, 0x3c, 0x10, 0xdd, 0x04, 0x7e, 0x2c, 0x1f, 0xe3, - 0xe9, 0x25, 0xbf, 0x78, 0x3a, 0x89, 0xb6, 0x20, 0x3f, 0xb0, 0x4f, 0xb1, 0x59, 0xae, 0x51, 0xe1, - 0xf4, 0x6d, 0x3a, 0x92, 0xce, 0xc3, 0x22, 0x69, 0x0c, 0x50, 0x94, 0xc7, 0xaf, 0x53, 0x20, 0xbb, - 0x30, 0x19, 0x20, 0x27, 0x13, 0x03, 0x0d, 0x22, 0x9b, 0x79, 0x3b, 0xea, 0x27, 0xfc, 0x45, 0x79, - 0x85, 0xc0, 0xb2, 0x03, 0x85, 0x93, 0x81, 0xdb, 0x35, 0x46, 0x03, 0x87, 0xed, 0xe7, 0x6a, 0x54, - 0x72, 0x6b, 0xe0, 0xa8, 0x8b, 0x98, 0xa1, 0x35, 0x70, 0xd0, 0x3b, 0x90, 0xf7, 0x5c, 0xc2, 0xb9, - 0x98, 0xce, 0xb9, 0xe0, 0xb9, 0x98, 0xef, 0x2d, 0x80, 0x36, 0x09, 0x03, 0x96, 0x61, 0xd2, 0x23, - 0x2c, 0x47, 0xa2, 0x52, 0x91, 0x51, 0x05, 0x0f, 0xb3, 0x0c, 0x3d, 0x73, 0xc0, 0x58, 0x20, 0x64, - 0x61, 0x54, 0xc1, 0x43, 0xdb, 0x50, 0xb0, 0x7b, 0x16, 0x65, 0x28, 0x05, 0x0c, 0x8b, 0x84, 0x26, - 0x78, 0xe8, 0xf3, 0xc0, 0x33, 0x0f, 0x6b, 0x9c, 0xd8, 0xa6, 0x37, 0x1a, 0xd8, 0xf4, 0x62, 0xd3, - 0x4a, 0xe4, 0x40, 0xa1, 0x49, 0xcd, 0x7d, 0xda, 0xa6, 0xae, 0x32, 0x66, 0xf6, 0x3e, 0x44, 0x5f, - 0x84, 0x15, 0xea, 0xea, 0x49, 0xd9, 0x12, 0xef, 0x74, 0xca, 0x8d, 0x25, 0xe2, 0xd9, 0x7d, 0x06, - 0x75, 0xb9, 0x1d, 0x7d, 0x45, 0xef, 0x43, 0x89, 0x48, 0x60, 0xd7, 0x9d, 0x0b, 0xe3, 0x97, 0xa3, - 0x71, 0x77, 0x7a, 0x41, 0x5a, 0x85, 0x76, 0xf0, 0x8c, 0xaa, 0xb0, 0x1c, 0xae, 0x8f, 0xd1, 0x1b, - 0x96, 0xb7, 0xf0, 0xf4, 0xd4, 0x52, 0xb0, 0x3c, 0x32, 0xe1, 0x09, 0x17, 0x08, 0xf3, 0x9c, 0xa7, - 0x3c, 0xc1, 0xfa, 0xc8, 0x43, 0xec, 0xb9, 0xfc, 0x15, 0xc2, 0x1c, 0x65, 0xc2, 0x51, 0x64, 0x0b, - 0x24, 0x0f, 0xd1, 0x3e, 0x39, 0x3e, 0xb5, 0xdd, 0x5e, 0xcf, 0x6e, 0x7b, 0xc6, 0xc0, 0x36, 0x87, - 0xc1, 0x49, 0x3e, 0x9c, 0x65, 0x3d, 0xe0, 0x50, 0x09, 0x83, 0xca, 0x5b, 0x09, 0x0a, 0x36, 0x4a, - 0x7b, 0x30, 0x70, 0x07, 0x24, 0x6f, 0x28, 0xaa, 0xf4, 0x05, 0x7d, 0x16, 0xf8, 0xc8, 0xf4, 0x0d, - 0x72, 0x41, 0x7c, 0x9d, 0xe0, 0x02, 0x8d, 0x5f, 0x10, 0x57, 0x57, 0xc2, 0xf9, 0xd7, 0x5c, 0x8b, - 0xf8, 0x38, 0x73, 0x64, 0x39, 0x2e, 0xe9, 0xd7, 0x26, 0xd9, 0x66, 0x51, 0x05, 0x42, 0xc2, 0xed, - 0x6d, 0x9c, 0xc7, 0x8d, 0x85, 0xc8, 0x4d, 0x9a, 0xc7, 0x25, 0xa3, 0xe0, 0xdb, 0xb0, 0xd2, 0x6f, - 0x9b, 0x7d, 0xe3, 0xc4, 0xe9, 0xd8, 0x46, 0xc7, 0xe9, 0x3d, 0x2d, 0x5f, 0xa0, 0xa7, 0x0f, 0x4c, - 0xdd, 0x77, 0x3a, 0x76, 0xc3, 0xe9, 0x3d, 0x45, 0xef, 0xc3, 0x12, 0xd1, 0xb7, 0xed, 0xf6, 0x3c, - 0xfb, 0x85, 0x57, 0xae, 0x10, 0x3b, 0xda, 0x18, 0xf3, 0x5e, 0x42, 0xef, 0xa5, 0x4a, 0x36, 0xb6, - 0x46, 0x19, 0xdf, 0x5c, 0xd0, 0xac, 0xfe, 0x17, 0xad, 0xc1, 0xfb, 0xee, 0x97, 0xf8, 0xb1, 0xa8, - 0xb3, 0x0f, 0x33, 0x72, 0x9f, 0x24, 0x59, 0x51, 0x47, 0x97, 0x8d, 0x39, 0xba, 0x99, 0x61, 0xe2, - 0x7d, 0x28, 0x87, 0xa2, 0x7b, 0x8e, 0xe7, 0x44, 0x20, 0x97, 0x23, 0x60, 0xd9, 0x0c, 0xc6, 0xf1, - 0x9b, 0x09, 0x70, 0xa2, 0x1d, 0xdb, 0x6e, 0xb7, 0x8f, 0x8f, 0xb9, 0x7e, 0xc7, 0x85, 0x78, 0xc7, - 0x9a, 0xdf, 0x4c, 0x3a, 0xd6, 0x60, 0x35, 0xe8, 0xc8, 0xcc, 0x82, 0x96, 0x2b, 0x2a, 0x63, 0xc7, - 0x4c, 0x1c, 0x7e, 0x18, 0x34, 0xbc, 0xd8, 0x7b, 0x08, 0xb7, 0xc5, 0x28, 0xdc, 0xea, 0xb0, 0x91, - 0x10, 0x4d, 0x21, 0x57, 0x98, 0x08, 0x39, 0x14, 0x97, 0x8b, 0x61, 0x55, 0xfd, 0x8e, 0x0c, 0xe4, - 0xa9, 0xb3, 0xc2, 0x29, 0x35, 0x3e, 0xd2, 0xb2, 0x15, 0x27, 0xcf, 0x98, 0x86, 0x4f, 0xd7, 0xfe, - 0xbd, 0x1b, 0xfc, 0x8c, 0x56, 0x20, 0xeb, 0xf4, 0xd9, 0xea, 0x66, 0x9d, 0x3e, 0xe6, 0x21, 0xe7, - 0x67, 0xbc, 0x82, 0xcb, 0x2a, 0x79, 0x7e, 0xa5, 0x4b, 0x33, 0x3b, 0xff, 0xb4, 0x04, 0xcb, 0xb1, - 0x5f, 0x50, 0xa0, 0x2d, 0x92, 0x17, 0x19, 0x9a, 0x2e, 0xe8, 0x2d, 0xcd, 0x68, 0xc9, 0xf7, 0x65, - 0xe5, 0xa1, 0xcc, 0x9f, 0x43, 0x9b, 0xa4, 0x32, 0xe0, 0xd3, 0x75, 0xf5, 0x58, 0x92, 0x0f, 0x78, - 0x8c, 0x8c, 0x28, 0xbb, 0x2a, 0xc9, 0x07, 0x98, 0xfe, 0xab, 0x19, 0xf4, 0x16, 0x5c, 0x8a, 0x34, - 0xd4, 0x84, 0x46, 0xc3, 0x90, 0x34, 0x63, 0x5f, 0x51, 0x1f, 0x0a, 0x6a, 0x5d, 0xac, 0xf3, 0xbf, - 0x96, 0x41, 0x5b, 0x31, 0x91, 0x1f, 0xb5, 0xc4, 0x96, 0x58, 0xe7, 0x7f, 0x3d, 0x83, 0xae, 0xc2, - 0xc5, 0x08, 0x5d, 0x13, 0x35, 0x4d, 0x52, 0x64, 0xa3, 0xa9, 0x2a, 0x07, 0xaa, 0xa8, 0x69, 0xfc, - 0x6f, 0x64, 0x10, 0x22, 0x5a, 0xfb, 0x1c, 0xca, 0x7d, 0xfe, 0x77, 0x33, 0xa8, 0x4c, 0x6a, 0xc3, - 0x3e, 0x4d, 0xa8, 0xd5, 0xc4, 0xa6, 0x2e, 0xd6, 0xf9, 0xdf, 0x4f, 0xaa, 0x72, 0xa4, 0x3c, 0x10, - 0xeb, 0x46, 0x53, 0x54, 0x8f, 0x04, 0x59, 0x94, 0xf5, 0xc6, 0x31, 0xff, 0x8b, 0xd9, 0x54, 0x16, - 0x5d, 0x3c, 0x6a, 0x2a, 0xaa, 0xa0, 0x4a, 0x8d, 0x63, 0xfe, 0x97, 0xb2, 0xe8, 0x02, 0xb9, 0x49, - 0x15, 0x2c, 0x8c, 0x26, 0x62, 0x8d, 0x1e, 0x1d, 0xf3, 0xbf, 0x9c, 0x45, 0x17, 0xc9, 0xfd, 0x0c, - 0xbf, 0x69, 0x4f, 0xa8, 0x1b, 0xaa, 0xf8, 0x51, 0x4b, 0xd4, 0x74, 0xfe, 0xbb, 0x38, 0x74, 0x09, - 0xce, 0xc7, 0x16, 0x54, 0x68, 0xe9, 0x87, 0x8a, 0x2a, 0x7d, 0x49, 0xac, 0xf3, 0xdf, 0xcd, 0x25, - 0xe6, 0xda, 0x14, 0x8e, 0x8f, 0x44, 0x59, 0x27, 0xdd, 0x25, 0x55, 0xac, 0xf3, 0xdf, 0xc3, 0x25, - 0xc6, 0xdd, 0x57, 0xd4, 0x3d, 0xa9, 0x5e, 0x17, 0x65, 0xfe, 0x7b, 0xb9, 0xc4, 0x94, 0x65, 0x45, - 0xdf, 0x27, 0x77, 0xcc, 0xbf, 0x8f, 0x43, 0x55, 0xd8, 0x8e, 0xce, 0x47, 0xd4, 0x0f, 0x95, 0x3a, - 0x66, 0x30, 0x84, 0x46, 0x43, 0x79, 0x28, 0xd6, 0xf9, 0xef, 0xe7, 0xd0, 0x65, 0xf2, 0x1d, 0x31, - 0xd2, 0x9b, 0x2d, 0x9a, 0xb0, 0xd7, 0x10, 0xf9, 0x1f, 0xe0, 0xd0, 0x35, 0xb8, 0x1c, 0x55, 0x0d, - 0x4f, 0xd6, 0xc0, 0xca, 0x87, 0xda, 0xfd, 0x20, 0x87, 0xae, 0x40, 0x25, 0xba, 0xff, 0x74, 0xda, - 0x86, 0x2e, 0x1d, 0x89, 0x4a, 0x4b, 0xe7, 0x7f, 0x28, 0xa9, 0x63, 0x4d, 0x91, 0xf7, 0x1b, 0x52, - 0x4d, 0xe7, 0x7f, 0x98, 0x43, 0x1b, 0xc4, 0x11, 0xf9, 0x2d, 0x07, 0x8a, 0x2c, 0xf2, 0x3f, 0xc2, - 0xa1, 0x9b, 0x70, 0x2d, 0x45, 0xa0, 0x28, 0xeb, 0x92, 0x7e, 0x6c, 0xe8, 0x8a, 0x62, 0x34, 0x04, - 0xf5, 0x40, 0xe4, 0x7f, 0x94, 0x43, 0x6f, 0xc3, 0x95, 0x14, 0xce, 0x96, 0x2a, 0x51, 0x36, 0x45, - 0x3e, 0xe0, 0x7f, 0x8c, 0x43, 0xef, 0xc0, 0x5b, 0xb1, 0xe5, 0xd7, 0x5a, 0xcd, 0xa6, 0xa2, 0xea, - 0x62, 0xdd, 0x38, 0x12, 0xeb, 0x92, 0x60, 0xe8, 0xc7, 0x4d, 0x91, 0xff, 0x71, 0x0e, 0xdd, 0x86, - 0x9d, 0x71, 0x69, 0x62, 0xdd, 0x50, 0x05, 0xf9, 0x40, 0x24, 0xab, 0xa3, 0x09, 0xba, 0xa4, 0xed, - 0x4b, 0x64, 0x79, 0x7e, 0x82, 0x43, 0xdb, 0x50, 0x4e, 0x6c, 0xba, 0xf8, 0x48, 0x17, 0x65, 0x8c, - 0x55, 0xfe, 0xa7, 0x93, 0x3b, 0x10, 0x34, 0x85, 0x8b, 0xf7, 0x33, 0x49, 0x1e, 0x49, 0xd6, 0x45, - 0xf5, 0x81, 0xd0, 0x20, 0xea, 0xef, 0xa9, 0x92, 0xb8, 0xcf, 0xff, 0x1c, 0x87, 0x6e, 0x40, 0x35, - 0x6a, 0x77, 0x21, 0x26, 0x31, 0x94, 0x1e, 0x08, 0x52, 0x83, 0xe8, 0xf3, 0xe7, 0x1c, 0x7a, 0x0f, - 0xde, 0x4d, 0x1a, 0x9c, 0xae, 0x0a, 0xb2, 0x26, 0xd4, 0x74, 0x3c, 0x6e, 0x5d, 0x11, 0xe9, 0x26, - 0x8b, 0x8f, 0x24, 0x4d, 0xd7, 0xf8, 0xbf, 0x48, 0xce, 0xa0, 0xa1, 0x28, 0x4d, 0xa3, 0x2e, 0xea, - 0x62, 0x0d, 0x9b, 0xcd, 0x5f, 0x26, 0x9b, 0xb1, 0x52, 0x47, 0x82, 0x7c, 0x6c, 0x1c, 0x2a, 0x4d, - 0x8d, 0xff, 0xab, 0xa4, 0xf2, 0x42, 0xbd, 0x8e, 0x8d, 0xd3, 0x90, 0xe4, 0x9a, 0x72, 0xd4, 0x6c, - 0x88, 0xba, 0xc8, 0xff, 0x75, 0x12, 0xbb, 0xc2, 0xd1, 0x9e, 0x74, 0xd0, 0x52, 0x5a, 0x1a, 0xff, - 0x37, 0xc9, 0xa6, 0xbd, 0x96, 0x76, 0x6c, 0x1c, 0x8a, 0xaa, 0xc8, 0xff, 0x6d, 0x52, 0x72, 0x80, - 0x29, 0x51, 0x3d, 0x92, 0x64, 0x01, 0x2b, 0xf7, 0x77, 0x49, 0x70, 0xc6, 0xc1, 0x4b, 0x05, 0xfd, - 0x3d, 0x87, 0xae, 0xc3, 0xd5, 0xe4, 0xfa, 0xca, 0x42, 0xc3, 0xd0, 0x44, 0xf5, 0x81, 0xa8, 0x1a, - 0xa2, 0xaa, 0x2a, 0x2a, 0xff, 0x2f, 0x49, 0x0c, 0x63, 0x59, 0x12, 0x9e, 0x02, 0xb6, 0x44, 0xb1, - 0xce, 0xff, 0x2b, 0x97, 0x62, 0xdf, 0x07, 0x82, 0x2e, 0x3e, 0x14, 0x8e, 0xf9, 0x7f, 0x4b, 0x6a, - 0x82, 0x65, 0x4b, 0x35, 0x31, 0xb6, 0x39, 0xff, 0x9e, 0x1c, 0x82, 0xf5, 0x0e, 0xcc, 0xe4, 0x3f, - 0x92, 0xaa, 0x3e, 0x10, 0x55, 0x02, 0x16, 0x02, 0x3b, 0x1f, 0xb0, 0xfc, 0x7f, 0x72, 0x49, 0x3f, - 0x25, 0x6a, 0x9a, 0x70, 0x20, 0x46, 0xcc, 0xe2, 0xdb, 0x72, 0x09, 0xc0, 0x1f, 0x34, 0x94, 0x3d, - 0xa1, 0x41, 0xd7, 0x57, 0x7c, 0x20, 0xaa, 0xc7, 0x0f, 0xc9, 0xe2, 0xfc, 0x51, 0x2e, 0x61, 0xfe, - 0x8c, 0xaf, 0x2e, 0xd6, 0x1a, 0x92, 0x2c, 0xf2, 0x7f, 0x9c, 0x43, 0xbb, 0x70, 0x2b, 0xa5, 0x3d, - 0x86, 0x22, 0x43, 0x90, 0x99, 0xbc, 0x3f, 0xc9, 0x25, 0x66, 0xc0, 0xf8, 0x13, 0x5e, 0xe5, 0xcf, - 0x72, 0x3b, 0x4f, 0xd9, 0x4f, 0xb4, 0xfc, 0xd2, 0x2e, 0x8b, 0x37, 0x04, 0xaa, 0x78, 0x9e, 0xd8, - 0xc5, 0x28, 0x61, 0xbc, 0x09, 0xe9, 0xad, 0x7a, 0x93, 0xcf, 0x8c, 0x93, 0xf5, 0x5a, 0x93, 0xcf, - 0xa6, 0x90, 0x1b, 0x1a, 0xcf, 0xed, 0xc8, 0xc0, 0x27, 0xeb, 0x36, 0x08, 0xc1, 0x0a, 0x66, 0x95, - 0x15, 0xe3, 0x50, 0x14, 0xea, 0xa2, 0xaa, 0xd1, 0x9f, 0xee, 0x60, 0xda, 0xa3, 0x80, 0x94, 0x41, - 0xeb, 0xd4, 0x3b, 0x61, 0x33, 0xf2, 0x89, 0xd9, 0x1d, 0x97, 0x28, 0x9b, 0x28, 0x89, 0xa0, 0x6d, - 0xba, 0x92, 0xd4, 0x9f, 0x88, 0x72, 0x4d, 0x3d, 0x6e, 0xea, 0x46, 0x5d, 0xd2, 0xc8, 0x94, 0xcf, - 0xa1, 0x8b, 0x34, 0x00, 0xc4, 0x9b, 0x89, 0x1f, 0xe6, 0x33, 0xe9, 0x7d, 0x99, 0x8f, 0xe0, 0xb3, - 0x3b, 0xcf, 0x89, 0x62, 0x61, 0x0e, 0x4f, 0x26, 0x5a, 0xf3, 0xe3, 0x29, 0xb6, 0x35, 0x1c, 0x6e, - 0xcf, 0xa1, 0x0a, 0x6c, 0x61, 0x72, 0x53, 0x50, 0x75, 0xa9, 0x26, 0x35, 0x05, 0x59, 0x37, 0xbe, - 0x4e, 0x91, 0x64, 0xb1, 0xce, 0x67, 0xd0, 0x0a, 0x00, 0x6e, 0xc3, 0x7e, 0xe0, 0x81, 0xc8, 0x67, - 0xd1, 0x06, 0xf0, 0xf8, 0xbd, 0x2e, 0x69, 0x35, 0x45, 0x96, 0xa9, 0xb9, 0x73, 0x68, 0x19, 0x8a, - 0x98, 0x4a, 0x8d, 0x22, 0xb7, 0xd3, 0x26, 0x0b, 0x1a, 0xcf, 0x92, 0x50, 0x19, 0x36, 0x34, 0x5d, - 0xa3, 0xab, 0xbc, 0x2f, 0xaa, 0x86, 0x22, 0x1f, 0x28, 0x74, 0xfc, 0xf3, 0xb0, 0x1e, 0x6b, 0xd9, - 0x17, 0xa4, 0x06, 0x19, 0x1c, 0x4f, 0x3e, 0xda, 0xa0, 0xb5, 0x6a, 0x35, 0x51, 0xd3, 0xf6, 0x5b, - 0x0d, 0x3e, 0xbb, 0x73, 0x0b, 0x20, 0x3c, 0x1e, 0xa1, 0x02, 0xe4, 0x64, 0x1c, 0x04, 0xc8, 0x76, - 0xdc, 0x57, 0x25, 0xad, 0x69, 0x88, 0x32, 0x5e, 0xc3, 0x3a, 0x9f, 0xd9, 0xd9, 0x27, 0x3b, 0x19, - 0x3b, 0x0b, 0xa1, 0x55, 0x28, 0x69, 0xb5, 0x7a, 0x24, 0x47, 0x61, 0x84, 0xf0, 0xf7, 0x57, 0x3c, - 0x2c, 0x61, 0x42, 0xf8, 0xeb, 0xab, 0x3b, 0x7f, 0x58, 0x02, 0x4e, 0x93, 0x9a, 0xa8, 0x09, 0x4b, - 0xd1, 0x5b, 0x5b, 0xe8, 0x52, 0xec, 0xe3, 0x5d, 0xe2, 0x72, 0x4f, 0x65, 0x7b, 0x42, 0x2b, 0xfd, - 0x76, 0x53, 0xe5, 0x3e, 0xce, 0x66, 0xd0, 0x97, 0x23, 0xbf, 0x2d, 0x8d, 0xde, 0x88, 0x42, 0xd7, - 0xc7, 0x0b, 0x93, 0x29, 0x17, 0xbc, 0x2a, 0x53, 0xaf, 0x54, 0x21, 0x03, 0xb6, 0xd2, 0xaf, 0xb8, - 0xa3, 0x77, 0xc6, 0xc5, 0xa7, 0x5d, 0xb7, 0xaa, 0x4c, 0xbf, 0xdf, 0x84, 0xd5, 0x4f, 0xfd, 0xf5, - 0x58, 0x44, 0xfd, 0x69, 0xbf, 0x2e, 0x9b, 0xad, 0x7e, 0xfa, 0x55, 0xfa, 0x88, 0xfa, 0x53, 0xef, - 0xda, 0xcf, 0x52, 0xff, 0xeb, 0x01, 0x8d, 0xdf, 0x57, 0x44, 0xe1, 0x35, 0x9f, 0x89, 0x77, 0x21, - 0x2b, 0xd7, 0xa6, 0xf2, 0xb0, 0xaf, 0x73, 0xdf, 0x08, 0xeb, 0x29, 0x97, 0x0f, 0x51, 0xb2, 0x6f, - 0xaa, 0xe6, 0x6f, 0x4f, 0x67, 0x0a, 0x47, 0x48, 0xb9, 0x7f, 0x17, 0x19, 0x61, 0xf2, 0xdd, 0xc0, - 0xc8, 0x08, 0xd3, 0xae, 0xf0, 0xb5, 0x83, 0x8b, 0x8a, 0xf1, 0x49, 0x8c, 0xf5, 0x4e, 0x9d, 0xc5, - 0xf5, 0x19, 0x5c, 0x6c, 0x90, 0x03, 0x58, 0x89, 0xdf, 0x8f, 0x43, 0xe1, 0x45, 0x8f, 0xd4, 0x8b, - 0x73, 0x95, 0xf4, 0x8b, 0x91, 0x31, 0x73, 0x8a, 0x5d, 0x18, 0xbb, 0x3e, 0xd7, 0x05, 0x9e, 0xca, - 0xd4, 0x0f, 0xa8, 0x31, 0xb4, 0x4f, 0x90, 0x3e, 0xed, 0xe2, 0xcc, 0x0c, 0xe9, 0xe1, 0x5e, 0xc6, - 0x64, 0x8f, 0xed, 0x65, 0x9a, 0xe4, 0xb7, 0xa7, 0x33, 0xb1, 0x65, 0xfe, 0x72, 0xe4, 0x1a, 0xe2, - 0x04, 0xfd, 0xa7, 0x7d, 0x19, 0x9e, 0xa1, 0xff, 0x31, 0x6c, 0xa4, 0x7d, 0x43, 0x89, 0x20, 0x65, - 0xca, 0x27, 0x96, 0x4a, 0xec, 0xf3, 0x41, 0xb2, 0xc0, 0xfe, 0x08, 0xb6, 0xd2, 0x2b, 0xbf, 0x11, - 0x47, 0x30, 0xb5, 0x34, 0x5c, 0xd9, 0x1a, 0xab, 0x96, 0x88, 0xdd, 0xbe, 0xf7, 0x72, 0x6f, 0xff, - 0x4b, 0xd7, 0x4e, 0x1d, 0xef, 0xc9, 0xe8, 0xf1, 0x6e, 0xdb, 0xed, 0xde, 0x66, 0xb2, 0xe8, 0x5f, - 0x10, 0xb4, 0xdd, 0x8e, 0x4f, 0xf8, 0xf9, 0xec, 0x72, 0xc3, 0x79, 0x66, 0xdf, 0x77, 0xbc, 0xdd, - 0x26, 0x6e, 0xfa, 0x87, 0xec, 0x0a, 0x7b, 0xbf, 0x77, 0x8f, 0x10, 0x1e, 0xe7, 0x49, 0x97, 0xbb, - 0xff, 0x1d, 0x00, 0x00, 0xff, 0xff, 0x21, 0x38, 0xa8, 0x61, 0x1c, 0x41, 0x00, 0x00, + 0xc8, 0x31, 0x2c, 0x2c, 0x11, 0x2c, 0xec, 0xcf, 0x36, 0xb6, 0x99, 0x68, 0x48, 0x3b, 0x16, 0xe5, + 0xe7, 0x1f, 0x8b, 0xb2, 0x69, 0xc7, 0xa2, 0x97, 0xdc, 0x8f, 0xf3, 0x9c, 0x7f, 0xbe, 0x3b, 0x13, + 0xa4, 0xd3, 0x69, 0x9e, 0x6f, 0xe1, 0xe4, 0x73, 0x0f, 0x36, 0x92, 0x7e, 0xc5, 0x4f, 0x42, 0xd7, + 0x63, 0xe9, 0x81, 0x35, 0x8a, 0x3b, 0x8a, 0x6c, 0xdc, 0x51, 0x44, 0x12, 0xec, 0xb8, 0x3e, 0x0b, + 0x24, 0xd8, 0x13, 0xe1, 0x9c, 0x25, 0xa3, 0x0a, 0x5c, 0x09, 0x92, 0xd1, 0x57, 0xe1, 0xde, 0xab, + 0x9f, 0xe4, 0x60, 0x23, 0x92, 0xfd, 0x32, 0x8b, 0xad, 0x40, 0xe1, 0x91, 0x3b, 0xf2, 0xa2, 0xe9, + 0xa9, 0xff, 0x3e, 0xad, 0xb6, 0xb7, 0xbc, 0x58, 0x6d, 0x2f, 0xbb, 0x60, 0x6d, 0x6f, 0xa2, 0x82, + 0xc7, 0x2d, 0x52, 0xc1, 0xcb, 0xa5, 0x54, 0xf0, 0xce, 0xa6, 0xd5, 0xde, 0xa8, 0xa1, 0xbc, 0x97, + 0x76, 0x08, 0xa0, 0xcb, 0x70, 0xce, 0xc2, 0xdb, 0xd9, 0xb4, 0xc2, 0x5b, 0x7e, 0xee, 0x40, 0xe7, + 0xaa, 0xba, 0xfd, 0x8f, 0xab, 0x56, 0x7d, 0xb5, 0x08, 0x97, 0x83, 0xd4, 0xaa, 0x65, 0x0e, 0x3d, + 0xa7, 0xe3, 0x0c, 0xcc, 0xbe, 0xb7, 0x78, 0xd1, 0xfc, 0x5d, 0xff, 0x28, 0xbf, 0x95, 0x08, 0x2c, + 0x13, 0x4b, 0xc5, 0xce, 0xf1, 0xe8, 0x2a, 0x94, 0xb0, 0x4c, 0xf2, 0xcd, 0xcd, 0x73, 0x99, 0x4e, + 0xc5, 0x91, 0x33, 0xc0, 0xc9, 0xb5, 0xee, 0xa2, 0x5d, 0xc0, 0xf2, 0xfd, 0xe8, 0xbc, 0x1e, 0x34, + 0xb3, 0xb8, 0x1c, 0x3b, 0x80, 0x71, 0x89, 0x03, 0xd8, 0xa7, 0x61, 0x6b, 0x10, 0xce, 0xc2, 0x70, + 0x2c, 0xbb, 0xef, 0x39, 0xde, 0x73, 0x86, 0xae, 0xcd, 0x48, 0x9b, 0xc4, 0x9a, 0xd0, 0xdb, 0xc0, + 0x47, 0xbb, 0x44, 0x6a, 0xce, 0xeb, 0x11, 0x7a, 0x9a, 0xf4, 0xc0, 0xb5, 0x17, 0x26, 0xa4, 0x1f, + 0xfb, 0xc1, 0xfe, 0x09, 0xec, 0x44, 0xbb, 0x44, 0x30, 0x4c, 0x6b, 0xd2, 0x5f, 0x98, 0xcc, 0x70, + 0x27, 0xb7, 0x61, 0x3f, 0x42, 0x4a, 0xe2, 0x79, 0x7b, 0x90, 0xd6, 0x86, 0x93, 0x12, 0xcb, 0xeb, + 0x9d, 0xfa, 0x49, 0x09, 0x7e, 0x46, 0x6f, 0xc1, 0xea, 0xa0, 0x6b, 0x3e, 0x37, 0x86, 0x4e, 0xff, + 0xcc, 0x73, 0xfb, 0xb4, 0xec, 0x46, 0x53, 0xfe, 0x15, 0xdc, 0xa0, 0x32, 0x3a, 0x36, 0x4e, 0xc2, + 0x68, 0x39, 0x66, 0x97, 0x30, 0xb2, 0xcf, 0x99, 0x98, 0xd8, 0x60, 0xb4, 0xf4, 0x5c, 0x0a, 0xd2, + 0x73, 0xa9, 0xbb, 0x61, 0x29, 0x9e, 0x27, 0xd3, 0xfe, 0xf4, 0x42, 0xd3, 0x4e, 0xaf, 0xc8, 0xa7, + 0x54, 0xae, 0x37, 0xfe, 0x37, 0x7d, 0x3b, 0x5e, 0x5b, 0x30, 0xc5, 0x42, 0xe7, 0x4f, 0xb1, 0xd0, + 0x3e, 0x6c, 0x3e, 0x35, 0x1d, 0xcf, 0x18, 0xf7, 0x3d, 0xa7, 0x6b, 0x98, 0xfd, 0xd1, 0x53, 0x7b, + 0x68, 0x5b, 0xe5, 0x4d, 0x32, 0xe4, 0x06, 0x6e, 0x6a, 0xe3, 0x16, 0x81, 0x35, 0xa0, 0x37, 0x81, + 0x1c, 0x46, 0x31, 0x18, 0x88, 0x61, 0x6c, 0xb3, 0x0c, 0xa7, 0xc4, 0xa8, 0x32, 0x4d, 0x74, 0x2a, + 0x47, 0x50, 0x99, 0x8e, 0xd1, 0x73, 0x79, 0xb6, 0x97, 0xf8, 0x16, 0x50, 0x5b, 0x87, 0x55, 0x23, + 0xaa, 0x6e, 0xf5, 0x17, 0x33, 0x80, 0xe2, 0xd0, 0x22, 0x47, 0x90, 0x37, 0x60, 0x2d, 0xee, 0x25, + 0x98, 0xf8, 0xd5, 0x98, 0x7f, 0x98, 0xea, 0x4c, 0xb2, 0xd3, 0x9d, 0xc9, 0x4c, 0xe7, 0x14, 0x75, + 0x7c, 0x8e, 0x1f, 0xf1, 0x7c, 0xc7, 0x27, 0x59, 0xd5, 0xef, 0xe4, 0x60, 0x97, 0x44, 0xd4, 0x53, + 0x7b, 0x98, 0xee, 0x8e, 0xa7, 0x69, 0x94, 0x59, 0x50, 0xa3, 0x6c, 0x42, 0xa3, 0x6b, 0x50, 0xf2, + 0xd8, 0x80, 0xd8, 0x15, 0x53, 0x85, 0xc1, 0x27, 0xe9, 0xee, 0xa4, 0x27, 0xc8, 0xa5, 0x78, 0x82, + 0xe3, 0xd0, 0xba, 0x93, 0x81, 0x79, 0xe6, 0x74, 0xa6, 0xdb, 0x77, 0xd2, 0x36, 0xf3, 0xe7, 0xb4, + 0xcd, 0x97, 0x41, 0x51, 0xf5, 0x93, 0x22, 0x94, 0x34, 0xa9, 0x45, 0x36, 0x05, 0xa3, 0xe5, 0x22, + 0x2c, 0xfb, 0x5b, 0x46, 0xfb, 0xe7, 0x3b, 0x64, 0xbf, 0xd0, 0x25, 0x28, 0x04, 0x81, 0x91, 0x4a, + 0x59, 0x66, 0x09, 0x24, 0xba, 0x09, 0xfc, 0x44, 0x22, 0xc7, 0xd3, 0xdb, 0x81, 0xf1, 0x3c, 0x14, + 0xed, 0x40, 0x7e, 0x68, 0x9f, 0x61, 0x7b, 0xde, 0xa0, 0xc2, 0xe9, 0xdb, 0x6c, 0x24, 0x5d, 0x84, + 0x65, 0xd2, 0x18, 0xa0, 0x28, 0x8f, 0x5f, 0x67, 0x40, 0x76, 0x69, 0x3a, 0x40, 0x4e, 0xa7, 0x46, + 0x28, 0x44, 0x36, 0xf3, 0x56, 0xd4, 0xc1, 0xf8, 0x8b, 0xf2, 0x02, 0x11, 0x69, 0x0f, 0x0a, 0xa7, + 0x43, 0xb7, 0x67, 0x8c, 0x87, 0x0e, 0xdb, 0xcf, 0xf5, 0xa8, 0xe4, 0xf6, 0xd0, 0x51, 0x97, 0x31, + 0x43, 0x7b, 0xe8, 0xa0, 0x37, 0x21, 0xef, 0xb9, 0x84, 0x73, 0x39, 0x9d, 0x73, 0xc9, 0x73, 0x31, + 0xdf, 0x6b, 0x00, 0x1d, 0x12, 0x3f, 0x2c, 0xc3, 0xa4, 0x67, 0x5f, 0x8e, 0x84, 0xb3, 0x22, 0xa3, + 0x0a, 0x1e, 0x66, 0x19, 0x79, 0xe6, 0x90, 0xb1, 0x40, 0xc8, 0xc2, 0xa8, 0x82, 0x87, 0x76, 0xa1, + 0x60, 0xf7, 0x2d, 0xca, 0x50, 0x0a, 0x18, 0x96, 0x09, 0x4d, 0xf0, 0xd0, 0xe7, 0x81, 0x67, 0xae, + 0xd9, 0x38, 0xb5, 0x4d, 0x6f, 0x3c, 0xb4, 0xe9, 0x8d, 0xa8, 0xb5, 0xc8, 0x49, 0x44, 0x93, 0x5a, + 0x07, 0xb4, 0x4d, 0x5d, 0x67, 0xcc, 0xec, 0x7d, 0x84, 0xbe, 0x08, 0x6b, 0x34, 0x46, 0x90, 0x7a, + 0x27, 0xde, 0xe9, 0x94, 0xab, 0x4e, 0x24, 0x24, 0xf8, 0x0c, 0xea, 0x6a, 0x27, 0xfa, 0x8a, 0xde, + 0x87, 0x12, 0x91, 0xc0, 0xee, 0x49, 0x17, 0x26, 0x6f, 0x55, 0xe3, 0xee, 0xf4, 0x66, 0xb5, 0x0a, + 0x9d, 0xe0, 0x19, 0x55, 0x61, 0x35, 0x5c, 0x1f, 0xa3, 0x3f, 0x2a, 0xef, 0xe0, 0xe9, 0xa9, 0xa5, + 0x60, 0x79, 0x64, 0xc2, 0x13, 0x2e, 0x10, 0xe6, 0xb9, 0x48, 0x79, 0x82, 0xf5, 0x91, 0x47, 0xd8, + 0x73, 0xf9, 0x2b, 0x84, 0x39, 0xca, 0x84, 0xa3, 0xc8, 0x16, 0x48, 0x1e, 0xa1, 0x03, 0x72, 0xee, + 0xea, 0xb8, 0xfd, 0xbe, 0xdd, 0xf1, 0x8c, 0xa1, 0x6d, 0x8e, 0x82, 0x12, 0x40, 0x38, 0xcb, 0x46, + 0xc0, 0xa1, 0x12, 0x06, 0x95, 0xb7, 0x12, 0x14, 0x6c, 0x94, 0xf6, 0x70, 0xe8, 0x0e, 0x49, 0xc2, + 0x51, 0x54, 0xe9, 0x0b, 0xfa, 0x2c, 0xf0, 0x91, 0xe9, 0x1b, 0xe4, 0x66, 0xf9, 0x26, 0xc1, 0x05, + 0x9a, 0xbc, 0x59, 0xae, 0xae, 0x85, 0xf3, 0xaf, 0xbb, 0x16, 0xf1, 0x71, 0xe6, 0xd8, 0x72, 0x5c, + 0xd2, 0xaf, 0x43, 0xd2, 0xd4, 0xa2, 0x0a, 0x84, 0x84, 0xdb, 0x3b, 0x38, 0x01, 0x9c, 0x88, 0xad, + 0xdb, 0x34, 0x01, 0x4c, 0x86, 0xcf, 0xd7, 0x61, 0x6d, 0xd0, 0x31, 0x07, 0xc6, 0xa9, 0xd3, 0xb5, + 0x8d, 0xae, 0xd3, 0x7f, 0x5c, 0xbe, 0x44, 0x8f, 0x2d, 0x98, 0x7a, 0xe0, 0x74, 0xed, 0xa6, 0xd3, + 0x7f, 0x8c, 0xde, 0x87, 0x15, 0xa2, 0x6f, 0xc7, 0xed, 0x7b, 0xf6, 0x33, 0xaf, 0x5c, 0x21, 0x76, + 0xb4, 0x35, 0xe1, 0xbd, 0x84, 0xfe, 0x73, 0x95, 0x6c, 0x6c, 0x9d, 0x32, 0xbe, 0xba, 0x28, 0x5a, + 0xfd, 0x2f, 0x5a, 0xbc, 0xf7, 0xdd, 0x2f, 0xf1, 0x63, 0x51, 0x67, 0x1f, 0xa6, 0xf2, 0x3e, 0x49, + 0xb2, 0xa2, 0x8e, 0x2e, 0x1b, 0x73, 0x74, 0x73, 0xc3, 0xc4, 0xfb, 0x50, 0x0e, 0x45, 0xf7, 0x1d, + 0xcf, 0x89, 0x40, 0x2e, 0x47, 0xc0, 0xb2, 0x1d, 0x8c, 0xe3, 0x37, 0x13, 0xe0, 0x44, 0x3b, 0x76, + 0xdc, 0xde, 0x00, 0x9f, 0x8f, 0xfd, 0x8e, 0x4b, 0xf1, 0x8e, 0x75, 0xbf, 0x99, 0x74, 0xac, 0xc3, + 0x7a, 0xd0, 0x91, 0x99, 0x05, 0xad, 0x73, 0x54, 0x26, 0xce, 0xa7, 0x38, 0xfc, 0x30, 0x68, 0x78, + 0xb1, 0xf7, 0x10, 0x6e, 0xcb, 0x51, 0xb8, 0x35, 0x60, 0x2b, 0x21, 0x9a, 0x42, 0xae, 0x30, 0x15, + 0x72, 0x28, 0x2e, 0x17, 0xc3, 0xaa, 0xfa, 0x5d, 0x19, 0xc8, 0x53, 0x67, 0x85, 0x73, 0x71, 0x7c, + 0x16, 0x66, 0x2b, 0x4e, 0x9e, 0x31, 0x0d, 0x1f, 0xcb, 0xfd, 0x0b, 0x3b, 0xf8, 0x19, 0xad, 0x41, + 0xd6, 0x19, 0xb0, 0xd5, 0xcd, 0x3a, 0x03, 0xcc, 0x43, 0x0e, 0xde, 0x78, 0x05, 0x57, 0x55, 0xf2, + 0xfc, 0x42, 0xb7, 0x6d, 0xf6, 0xfe, 0x69, 0x05, 0x56, 0x63, 0x3f, 0xbd, 0x40, 0x3b, 0x24, 0x2f, + 0x32, 0x34, 0x5d, 0xd0, 0xdb, 0x9a, 0xd1, 0x96, 0xef, 0xca, 0xca, 0x7d, 0x99, 0xbf, 0x80, 0xb6, + 0x49, 0x49, 0xc1, 0xa7, 0xeb, 0xea, 0x89, 0x24, 0x1f, 0xf2, 0x18, 0x19, 0x51, 0x76, 0x55, 0x92, + 0x0f, 0x31, 0xfd, 0xd7, 0x32, 0xe8, 0x35, 0xb8, 0x12, 0x69, 0xa8, 0x0b, 0xcd, 0xa6, 0x21, 0x69, + 0xc6, 0x81, 0xa2, 0xde, 0x17, 0xd4, 0x86, 0xd8, 0xe0, 0x7f, 0x3d, 0x83, 0x76, 0x62, 0x22, 0x3f, + 0x6a, 0x8b, 0x6d, 0xb1, 0xc1, 0xff, 0x46, 0x06, 0x5d, 0x87, 0xcb, 0x11, 0xba, 0x26, 0x6a, 0x9a, + 0xa4, 0xc8, 0x46, 0x4b, 0x55, 0x0e, 0x55, 0x51, 0xd3, 0xf8, 0xdf, 0xcc, 0x20, 0x44, 0xb4, 0xf6, + 0x39, 0x94, 0xbb, 0xfc, 0xef, 0x65, 0x50, 0x99, 0x14, 0x95, 0x7d, 0x9a, 0x50, 0xaf, 0x8b, 0x2d, + 0x5d, 0x6c, 0xf0, 0x7f, 0x90, 0x54, 0xe5, 0x58, 0xb9, 0x27, 0x36, 0x8c, 0x96, 0xa8, 0x1e, 0x0b, + 0xb2, 0x28, 0xeb, 0xcd, 0x13, 0xfe, 0x97, 0xb2, 0xa9, 0x2c, 0xba, 0x78, 0xdc, 0x52, 0x54, 0x41, + 0x95, 0x9a, 0x27, 0xfc, 0x2f, 0x67, 0xd1, 0x25, 0x72, 0x05, 0x2b, 0x58, 0x18, 0x4d, 0xc4, 0x1a, + 0x3d, 0x38, 0xe1, 0x7f, 0x25, 0x8b, 0x2e, 0x93, 0x8b, 0x1d, 0x7e, 0x53, 0x4d, 0x68, 0x18, 0xaa, + 0xf8, 0x51, 0x5b, 0xd4, 0x74, 0xfe, 0x7b, 0x38, 0x74, 0x05, 0x2e, 0xc6, 0x16, 0x54, 0x68, 0xeb, + 0x47, 0x8a, 0x2a, 0x7d, 0x49, 0x6c, 0xf0, 0xdf, 0xcb, 0x25, 0xe6, 0xda, 0x12, 0x4e, 0x8e, 0x45, + 0x59, 0x27, 0xdd, 0x25, 0x55, 0x6c, 0xf0, 0xdf, 0xc7, 0x25, 0xc6, 0x3d, 0x50, 0xd4, 0x9a, 0xd4, + 0x68, 0x88, 0x32, 0xff, 0xfd, 0x5c, 0x62, 0xca, 0xb2, 0xa2, 0x1f, 0x90, 0xcb, 0xe9, 0x3f, 0xc0, + 0xa1, 0x2a, 0xec, 0x46, 0xe7, 0x23, 0xea, 0x47, 0x4a, 0x03, 0x33, 0x18, 0x42, 0xb3, 0xa9, 0xdc, + 0x17, 0x1b, 0xfc, 0x0f, 0x72, 0xe8, 0x2a, 0xf9, 0x00, 0x19, 0xe9, 0xcd, 0x16, 0x4d, 0xa8, 0x35, + 0x45, 0xfe, 0x87, 0x38, 0x74, 0x03, 0xae, 0x46, 0x55, 0xc3, 0x93, 0x35, 0xb0, 0xf2, 0xa1, 0x76, + 0x3f, 0xcc, 0xa1, 0x6b, 0x50, 0x89, 0xee, 0x3f, 0x9d, 0xb6, 0xa1, 0x4b, 0xc7, 0xa2, 0xd2, 0xd6, + 0xf9, 0x1f, 0x49, 0xea, 0x58, 0x57, 0xe4, 0x83, 0xa6, 0x54, 0xd7, 0xf9, 0x1f, 0xe5, 0xd0, 0x16, + 0x71, 0x44, 0x7e, 0xcb, 0xa1, 0x22, 0x8b, 0xfc, 0x8f, 0x71, 0xe8, 0x26, 0xdc, 0x48, 0x11, 0x28, + 0xca, 0xba, 0xa4, 0x9f, 0x18, 0xba, 0xa2, 0x18, 0x4d, 0x41, 0x3d, 0x14, 0xf9, 0x1f, 0xe7, 0xd0, + 0xeb, 0x70, 0x2d, 0x85, 0xb3, 0xad, 0x4a, 0x94, 0x4d, 0x91, 0x0f, 0xf9, 0x9f, 0xe0, 0xd0, 0x9b, + 0xf0, 0x5a, 0x6c, 0xf9, 0xb5, 0x76, 0xab, 0xa5, 0xa8, 0xba, 0xd8, 0x30, 0x8e, 0xc5, 0x86, 0x24, + 0x18, 0xfa, 0x49, 0x4b, 0xe4, 0x7f, 0x92, 0x43, 0xb7, 0x60, 0x6f, 0x52, 0x9a, 0xd8, 0x30, 0x54, + 0x41, 0x3e, 0x14, 0xc9, 0xea, 0x68, 0x82, 0x2e, 0x69, 0x07, 0x12, 0x59, 0x9e, 0x9f, 0xe2, 0xd0, + 0x2e, 0x94, 0x13, 0x9b, 0x2e, 0x3e, 0xd0, 0x45, 0x19, 0x63, 0x95, 0xff, 0x99, 0xe4, 0x0e, 0x04, + 0x4d, 0xe1, 0xe2, 0xfd, 0x6c, 0x92, 0x47, 0x92, 0x75, 0x51, 0xbd, 0x27, 0x34, 0x89, 0xfa, 0x35, + 0x55, 0x12, 0x0f, 0xf8, 0x9f, 0xe7, 0xd0, 0x5b, 0x50, 0x8d, 0xda, 0x5d, 0x88, 0x49, 0x0c, 0xa5, + 0x7b, 0x82, 0xd4, 0x24, 0xfa, 0xfc, 0x39, 0x87, 0xde, 0x85, 0x77, 0x92, 0x06, 0xa7, 0xab, 0x82, + 0xac, 0x09, 0x75, 0x1d, 0x8f, 0xdb, 0x50, 0x44, 0xba, 0xc9, 0xe2, 0x03, 0x49, 0xd3, 0x35, 0xfe, + 0x2f, 0x92, 0x33, 0x68, 0x2a, 0x4a, 0xcb, 0x68, 0x88, 0xba, 0x58, 0xc7, 0x66, 0xf3, 0x97, 0xc9, + 0x66, 0xac, 0xd4, 0xb1, 0x20, 0x9f, 0x18, 0x47, 0x4a, 0x4b, 0xe3, 0xff, 0x2a, 0xa9, 0xbc, 0xd0, + 0x68, 0x60, 0xe3, 0x34, 0x24, 0xb9, 0xae, 0x1c, 0xb7, 0x9a, 0xa2, 0x2e, 0xf2, 0x7f, 0x9d, 0xc4, + 0xae, 0x70, 0x5c, 0x93, 0x0e, 0xdb, 0x4a, 0x5b, 0xe3, 0xff, 0x26, 0xd9, 0x54, 0x6b, 0x6b, 0x27, + 0xc6, 0x91, 0xa8, 0x8a, 0xfc, 0xdf, 0x26, 0x25, 0x07, 0x98, 0x12, 0xd5, 0x63, 0x49, 0x16, 0xb0, + 0x72, 0x7f, 0x97, 0x04, 0x67, 0x1c, 0xbc, 0x54, 0xd0, 0xdf, 0x73, 0xe8, 0x0d, 0xb8, 0x9e, 0x5c, + 0x5f, 0x59, 0x68, 0x1a, 0x9a, 0xa8, 0xde, 0x13, 0x55, 0x43, 0x54, 0x55, 0x45, 0xe5, 0xff, 0x25, + 0x89, 0x61, 0x2c, 0x4b, 0xc2, 0x53, 0xc0, 0x96, 0x28, 0x36, 0xf8, 0x7f, 0xe5, 0x52, 0xec, 0xfb, + 0x50, 0xd0, 0xc5, 0xfb, 0xc2, 0x09, 0xff, 0x6f, 0x49, 0x4d, 0xb0, 0x6c, 0xa9, 0x2e, 0xc6, 0x36, + 0xe7, 0xdf, 0x93, 0x43, 0xb0, 0xde, 0x81, 0x99, 0xfc, 0x47, 0x52, 0xd5, 0x7b, 0xa2, 0x4a, 0xc0, + 0x42, 0x60, 0xe7, 0x03, 0x96, 0xff, 0x4f, 0x2e, 0xe9, 0xa7, 0x44, 0x4d, 0x13, 0x0e, 0xc5, 0x88, + 0x59, 0x7c, 0x47, 0x2e, 0x01, 0xf8, 0xc3, 0xa6, 0x52, 0x13, 0x9a, 0x74, 0x7d, 0xc5, 0x7b, 0xa2, + 0x7a, 0x72, 0x9f, 0x2c, 0xce, 0x1f, 0xe7, 0x12, 0xe6, 0xcf, 0xf8, 0x1a, 0x62, 0xbd, 0x29, 0xc9, + 0x22, 0xff, 0x27, 0x39, 0xb4, 0x0f, 0x6f, 0xa7, 0xb4, 0xc7, 0x50, 0x64, 0x08, 0x32, 0x93, 0xf7, + 0xd5, 0x5c, 0x62, 0x06, 0x8c, 0x3f, 0xe1, 0x55, 0xfe, 0x2c, 0xb7, 0xf7, 0x98, 0xfd, 0xb6, 0xcb, + 0xaf, 0x09, 0xb3, 0x78, 0x43, 0xa0, 0x8a, 0xe7, 0x89, 0x5d, 0x8c, 0x12, 0xc6, 0x9b, 0x90, 0xde, + 0x6e, 0xb4, 0xf8, 0xcc, 0x24, 0x59, 0xaf, 0xb7, 0xf8, 0x6c, 0x0a, 0xb9, 0xa9, 0xf1, 0xdc, 0x9e, + 0x0c, 0x7c, 0xb2, 0xe0, 0x83, 0x10, 0xac, 0x61, 0x56, 0x59, 0x31, 0x8e, 0x44, 0xa1, 0x21, 0xaa, + 0x1a, 0xfd, 0xcd, 0x0f, 0xa6, 0x3d, 0x08, 0x48, 0x19, 0xb4, 0x49, 0xbd, 0x13, 0x36, 0x23, 0x9f, + 0x98, 0xdd, 0x73, 0x89, 0xb2, 0x89, 0x5a, 0x0a, 0xda, 0xa5, 0x2b, 0x49, 0xfd, 0x89, 0x28, 0xd7, + 0xd5, 0x93, 0x96, 0x6e, 0x34, 0x24, 0x8d, 0x4c, 0xf9, 0x02, 0xba, 0x4c, 0x03, 0x40, 0xbc, 0x99, + 0xf8, 0x61, 0x3e, 0x93, 0xde, 0x97, 0xf9, 0x08, 0x3e, 0xbb, 0xf7, 0x94, 0x28, 0x16, 0xe6, 0xf0, + 0x64, 0xa2, 0x75, 0x3f, 0x9e, 0x62, 0x5b, 0xc3, 0xe1, 0xf6, 0x02, 0xaa, 0xc0, 0x0e, 0x26, 0xb7, + 0x04, 0x55, 0x97, 0xea, 0x52, 0x4b, 0x90, 0x75, 0xe3, 0x1b, 0x14, 0x49, 0x16, 0x1b, 0x7c, 0x06, + 0xad, 0x01, 0xe0, 0x36, 0xec, 0x07, 0xee, 0x89, 0x7c, 0x16, 0x6d, 0x01, 0x8f, 0xdf, 0x1b, 0x92, + 0x56, 0x57, 0x64, 0x99, 0x9a, 0x3b, 0x87, 0x56, 0xa1, 0x88, 0xa9, 0xd4, 0x28, 0x72, 0x7b, 0x1d, + 0xb2, 0xa0, 0xf1, 0x2c, 0x09, 0x95, 0x61, 0x4b, 0xd3, 0x35, 0xba, 0xca, 0x07, 0xa2, 0x6a, 0x28, + 0xf2, 0xa1, 0x42, 0xc7, 0xbf, 0x08, 0x9b, 0xb1, 0x96, 0x03, 0x41, 0x6a, 0x92, 0xc1, 0xf1, 0xe4, + 0xa3, 0x0d, 0x5a, 0xbb, 0x5e, 0x17, 0x35, 0xed, 0xa0, 0xdd, 0xe4, 0xb3, 0x7b, 0x6f, 0x03, 0x84, + 0xc7, 0x23, 0x54, 0x80, 0x9c, 0x8c, 0x83, 0x00, 0xd9, 0x8e, 0xbb, 0xaa, 0xa4, 0xb5, 0x0c, 0x51, + 0xc6, 0x6b, 0xd8, 0xe0, 0x33, 0x7b, 0x07, 0x64, 0x27, 0x63, 0x67, 0x21, 0xb4, 0x0e, 0x25, 0xad, + 0xde, 0x88, 0xe4, 0x28, 0x8c, 0x10, 0xfe, 0x70, 0x8b, 0x87, 0x15, 0x4c, 0x08, 0x7f, 0xb6, 0x75, + 0xfb, 0x8f, 0x4a, 0xc0, 0x69, 0x52, 0x0b, 0xb5, 0x60, 0x25, 0x7a, 0xdd, 0x0b, 0x5d, 0x89, 0x7d, + 0xf5, 0x4b, 0xdc, 0x0a, 0xaa, 0xec, 0x4e, 0x69, 0xa5, 0x1f, 0x7d, 0xaa, 0xdc, 0xc7, 0xd9, 0x0c, + 0xfa, 0x72, 0xe4, 0x47, 0xa9, 0xd1, 0xab, 0x54, 0xe8, 0x8d, 0xc9, 0x8a, 0x66, 0xca, 0xcd, 0xb0, + 0xca, 0xcc, 0xbb, 0x58, 0xc8, 0x80, 0x9d, 0xf4, 0xbb, 0xf1, 0xe8, 0xcd, 0x49, 0xf1, 0x69, 0xf7, + 0xb4, 0x2a, 0xb3, 0x2f, 0x46, 0x61, 0xf5, 0x53, 0x7f, 0x76, 0x16, 0x51, 0x7f, 0xd6, 0xcf, 0xd2, + 0xe6, 0xab, 0x9f, 0x7e, 0x07, 0x3f, 0xa2, 0xfe, 0xcc, 0x4b, 0xfa, 0xf3, 0xd4, 0xff, 0x46, 0x40, + 0x93, 0x17, 0x1d, 0x51, 0x78, 0x3f, 0x68, 0xea, 0x25, 0xca, 0xca, 0x8d, 0x99, 0x3c, 0xec, 0xb3, + 0xde, 0x37, 0xc3, 0x66, 0xca, 0xad, 0x45, 0x94, 0xec, 0x9b, 0xaa, 0xf9, 0xeb, 0xb3, 0x99, 0xc2, + 0x11, 0x52, 0x2e, 0xee, 0x45, 0x46, 0x98, 0x7e, 0xa9, 0x30, 0x32, 0xc2, 0xac, 0xbb, 0x7f, 0x9d, + 0xe0, 0x86, 0x63, 0x7c, 0x12, 0x13, 0xbd, 0x53, 0x67, 0xf1, 0xc6, 0x1c, 0x2e, 0x36, 0xc8, 0x21, + 0xac, 0xc5, 0x2f, 0xd6, 0xa1, 0xf0, 0x86, 0x48, 0xea, 0x8d, 0xbb, 0x4a, 0xfa, 0x8d, 0xca, 0x98, + 0x39, 0xc5, 0x6e, 0x9a, 0xbd, 0xb1, 0xd0, 0xcd, 0x9f, 0xca, 0xcc, 0x2f, 0xaf, 0x31, 0xb4, 0x4f, + 0x91, 0x3e, 0xeb, 0xc6, 0xcd, 0x1c, 0xe9, 0xe1, 0x5e, 0xc6, 0x64, 0x4f, 0xec, 0x65, 0x9a, 0xe4, + 0xd7, 0x67, 0x33, 0xb1, 0x65, 0xfe, 0x72, 0xe4, 0xfe, 0xe2, 0x14, 0xfd, 0x67, 0x7d, 0x52, 0x9e, + 0xa3, 0xff, 0x09, 0x6c, 0xa5, 0x7d, 0x7c, 0x89, 0x20, 0x65, 0xc6, 0xb7, 0x99, 0x4a, 0xec, 0xbb, + 0x43, 0xb2, 0xc0, 0xfe, 0x00, 0x76, 0xd2, 0x2b, 0xbf, 0x11, 0x47, 0x30, 0xb3, 0x34, 0x5c, 0xd9, + 0x99, 0xa8, 0x96, 0x88, 0xbd, 0x81, 0xf7, 0xbc, 0x76, 0xf0, 0xa5, 0x1b, 0x67, 0x8e, 0xf7, 0x68, + 0xfc, 0x70, 0xbf, 0xe3, 0xf6, 0x6e, 0x31, 0x59, 0xf4, 0xbf, 0x0b, 0x3a, 0x6e, 0xd7, 0x27, 0xfc, + 0x42, 0x76, 0xb5, 0xe9, 0x3c, 0xb1, 0xef, 0x3a, 0xde, 0x7e, 0x0b, 0x37, 0xfd, 0x43, 0x76, 0x8d, + 0xbd, 0xdf, 0xb9, 0x43, 0x08, 0x0f, 0xf3, 0xa4, 0xcb, 0x7b, 0xff, 0x1d, 0x00, 0x00, 0xff, 0xff, + 0x19, 0x43, 0x3a, 0x54, 0x55, 0x41, 0x00, 0x00, } diff --git a/livekit/sip.go b/livekit/sip.go index 4f6c2f2cc..bceb2c306 100644 --- a/livekit/sip.go +++ b/livekit/sip.go @@ -675,6 +675,16 @@ func (p *CreateSIPParticipantRequest) Validate() error { if err := validateHeaderKeys(p.Headers); err != nil { return err } + + // Validate display_name if provided + if p.DisplayName != nil { + if len(displayName) > 128 { + return errors.New("display_name too long (max 128 characters)") + } + + // TODO: Validate display name doesn't contain invalid characters + } + return nil } diff --git a/protobufs/livekit_sip.proto b/protobufs/livekit_sip.proto index 0c881e7aa..16cf98974 100644 --- a/protobufs/livekit_sip.proto +++ b/protobufs/livekit_sip.proto @@ -669,7 +669,15 @@ message CreateSIPParticipantRequest { // Wait for the answer for the call before returning. bool wait_until_answered = 19; - // NEXT ID: 21 + + // Optional display name for the 'From' SIP header. + // + // Cases: + // 1) Unspecified: Use legacy behavior - display name will be set to be the caller's number. + // 2) Empty string: Do not send a display name, which will result in a CNAM lookup downstream. + // 3) Non-empty: Use the specified value as the display name. + optional string display_name = 21; + // NEXT ID: 22 } message SIPParticipantInfo { diff --git a/protobufs/rpc/sip.proto b/protobufs/rpc/sip.proto index 29c85ec22..1d4d2d982 100644 --- a/protobufs/rpc/sip.proto +++ b/protobufs/rpc/sip.proto @@ -105,7 +105,15 @@ message InternalCreateSIPParticipantRequest { // Wait for the answer for the call before returning. bool wait_until_answered = 29; - // NEXT ID: 31 + // Optional display name for the 'From' SIP header. + // + // Cases: + // 1) Unspecified: Use legacy behavior - display name will be set to be the caller's number. + // 2) Empty string: Do not send a display name, which will result in a CNAM lookup downstream. + // 3) Non-empty: Use the specified value as the display name. + optional string display_name = 31; + + // NEXT ID: 32 } message InternalCreateSIPParticipantResponse { diff --git a/rpc/sip.go b/rpc/sip.go index 4011d1431..358ef72e0 100644 --- a/rpc/sip.go +++ b/rpc/sip.go @@ -71,6 +71,9 @@ func NewCreateSIPParticipantRequest( req *livekit.CreateSIPParticipantRequest, trunk *livekit.SIPOutboundTrunkInfo, ) (*InternalCreateSIPParticipantRequest, error) { + if err := req.Validate(); err != nil { + return nil, err + } var ( hostname string enc livekit.SIPMediaEncryption @@ -190,6 +193,7 @@ func NewCreateSIPParticipantRequest( MaxCallDuration: req.MaxCallDuration, MediaEncryption: enc, WaitUntilAnswered: req.WaitUntilAnswered, + DisplayName: req.DisplayName, }, nil } diff --git a/rpc/sip.pb.go b/rpc/sip.pb.go index 264cb6880..eee8245cc 100644 --- a/rpc/sip.pb.go +++ b/rpc/sip.pb.go @@ -15,7 +15,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.36.9 -// protoc v4.23.4 +// protoc v3.21.12 // source: rpc/sip.proto package rpc @@ -91,8 +91,15 @@ type InternalCreateSIPParticipantRequest struct { MediaEncryption livekit.SIPMediaEncryption `protobuf:"varint,28,opt,name=media_encryption,json=mediaEncryption,proto3,enum=livekit.SIPMediaEncryption" json:"media_encryption,omitempty"` // Wait for the answer for the call before returning. WaitUntilAnswered bool `protobuf:"varint,29,opt,name=wait_until_answered,json=waitUntilAnswered,proto3" json:"wait_until_answered,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // Optional display name for the 'From' SIP header. + // + // Cases: + // 1) Unspecified: Use legacy behavior - display name will be set to be the caller's number. + // 2) Empty string: Do not send a display name, which will result in a CNAM lookup downstream. + // 3) Non-empty: Use the specified value as the display name. + DisplayName *string `protobuf:"bytes,31,opt,name=display_name,json=displayName,proto3,oneof" json:"display_name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *InternalCreateSIPParticipantRequest) Reset() { @@ -328,6 +335,13 @@ func (x *InternalCreateSIPParticipantRequest) GetWaitUntilAnswered() bool { return false } +func (x *InternalCreateSIPParticipantRequest) GetDisplayName() string { + if x != nil && x.DisplayName != nil { + return *x.DisplayName + } + return "" +} + type InternalCreateSIPParticipantResponse struct { state protoimpl.MessageState `protogen:"open.v1"` ParticipantId string `protobuf:"bytes,1,opt,name=participant_id,json=participantId,proto3" json:"participant_id,omitempty"` @@ -471,7 +485,7 @@ var File_rpc_sip_proto protoreflect.FileDescriptor const file_rpc_sip_proto_rawDesc = "" + "\n" + - "\rrpc/sip.proto\x12\x03rpc\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\roptions.proto\x1a\x11livekit_sip.proto\"\xf7\r\n" + + "\rrpc/sip.proto\x12\x03rpc\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\roptions.proto\x1a\x11livekit_sip.proto\"\xb0\x0e\n" + "#InternalCreateSIPParticipantRequest\x12\x1d\n" + "\n" + "project_id\x18\x12 \x01(\tR\tprojectId\x12\x1e\n" + @@ -504,7 +518,8 @@ const file_rpc_sip_proto_rawDesc = "" + "\x0fringing_timeout\x18\x17 \x01(\v2\x19.google.protobuf.DurationR\x0eringingTimeout\x12E\n" + "\x11max_call_duration\x18\x18 \x01(\v2\x19.google.protobuf.DurationR\x0fmaxCallDuration\x12F\n" + "\x10media_encryption\x18\x1c \x01(\x0e2\x1b.livekit.SIPMediaEncryptionR\x0fmediaEncryption\x12.\n" + - "\x13wait_until_answered\x18\x1d \x01(\bR\x11waitUntilAnswered\x1aH\n" + + "\x13wait_until_answered\x18\x1d \x01(\bR\x11waitUntilAnswered\x12&\n" + + "\fdisplay_name\x18\x1f \x01(\tH\x00R\vdisplayName\x88\x01\x01\x1aH\n" + "\x1aParticipantAttributesEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1a:\n" + @@ -516,7 +531,8 @@ const file_rpc_sip_proto_rawDesc = "" + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1aF\n" + "\x18AttributesToHeadersEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xa0\x01\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01B\x0f\n" + + "\r_display_name\"\xa0\x01\n" + "$InternalCreateSIPParticipantResponse\x12%\n" + "\x0eparticipant_id\x18\x01 \x01(\tR\rparticipantId\x121\n" + "\x14participant_identity\x18\x02 \x01(\tR\x13participantIdentity\x12\x1e\n" + @@ -593,6 +609,7 @@ func file_rpc_sip_proto_init() { if File_rpc_sip_proto != nil { return } + file_rpc_sip_proto_msgTypes[0].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ diff --git a/rpc/sip.psrpc.go b/rpc/sip.psrpc.go index e864ee941..24a0140b7 100644 --- a/rpc/sip.psrpc.go +++ b/rpc/sip.psrpc.go @@ -167,69 +167,71 @@ func (UnimplementedSIPInternalServer) TransferSIPParticipant(context.Context, *I } var psrpcFileDescriptor11 = []byte{ - // 1013 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x56, 0xcd, 0x72, 0xdb, 0x36, - 0x10, 0x1e, 0x5a, 0xf1, 0xdf, 0xca, 0xfa, 0x31, 0x64, 0x39, 0xb0, 0xdc, 0x38, 0xaa, 0xd3, 0xcc, - 0x28, 0x3d, 0x48, 0xad, 0x33, 0x9d, 0x76, 0x72, 0xe8, 0xd4, 0x71, 0xec, 0x89, 0x0e, 0x69, 0x5c, - 0x59, 0xb9, 0xf4, 0xc2, 0x81, 0x48, 0xd8, 0x46, 0x4d, 0x02, 0x2c, 0x00, 0x46, 0x51, 0xdf, 0x20, - 0x6f, 0xd1, 0x67, 0xc8, 0x13, 0xf5, 0x2d, 0x7a, 0xe8, 0xa5, 0x03, 0x80, 0xb4, 0x69, 0x59, 0x4a, - 0xad, 0xe9, 0x8d, 0xbb, 0xdf, 0xee, 0x07, 0xec, 0x62, 0xf1, 0x81, 0x50, 0x91, 0x49, 0xd0, 0x53, - 0x2c, 0xe9, 0x26, 0x52, 0x68, 0x81, 0x4a, 0x32, 0x09, 0x5a, 0xbb, 0x17, 0x42, 0x5c, 0x44, 0xb4, - 0x67, 0x5d, 0xa3, 0xf4, 0xbc, 0x47, 0xe3, 0x44, 0x4f, 0x5c, 0x44, 0x6b, 0x6f, 0x1a, 0x0c, 0x53, - 0x49, 0x34, 0x13, 0x3c, 0xc3, 0x2b, 0x22, 0x31, 0x96, 0xca, 0xcc, 0xcd, 0x88, 0xbd, 0xa7, 0x57, - 0x4c, 0xfb, 0xd7, 0x6b, 0xec, 0xff, 0x5d, 0x81, 0x27, 0x7d, 0xae, 0xa9, 0xe4, 0x24, 0x3a, 0x92, - 0x94, 0x68, 0x7a, 0xd6, 0x3f, 0x3d, 0x25, 0x52, 0xb3, 0x80, 0x25, 0x84, 0xeb, 0x01, 0xfd, 0x3d, - 0xa5, 0x4a, 0xa3, 0x47, 0x00, 0x89, 0x14, 0xbf, 0xd1, 0x40, 0xfb, 0x2c, 0xc4, 0xa8, 0xed, 0x75, - 0xd6, 0x07, 0xeb, 0x99, 0xa7, 0x1f, 0xa2, 0x3d, 0x28, 0x2b, 0x96, 0xf8, 0x01, 0x89, 0x22, 0x83, - 0x57, 0x1c, 0xae, 0x58, 0x72, 0x44, 0xa2, 0xa8, 0x1f, 0xa2, 0x36, 0x6c, 0x18, 0x5c, 0xcb, 0x94, - 0x5f, 0x99, 0x80, 0x86, 0x0d, 0x00, 0xc5, 0x92, 0xa1, 0x71, 0xf5, 0x43, 0x84, 0x61, 0x95, 0x84, - 0xa1, 0xa4, 0x4a, 0xe1, 0x25, 0x0b, 0xe6, 0x26, 0x6a, 0xc1, 0xda, 0xa5, 0x50, 0x9a, 0x93, 0x98, - 0xe2, 0x2d, 0x0b, 0x5d, 0xdb, 0xa8, 0x07, 0x8d, 0x90, 0x2a, 0xcd, 0xb8, 0xad, 0xda, 0x0f, 0x44, - 0xca, 0xb5, 0x9c, 0xe0, 0x3d, 0x1b, 0x86, 0x0a, 0xd0, 0x91, 0x43, 0xd0, 0x73, 0x58, 0xd7, 0x92, - 0x70, 0x95, 0x08, 0xa9, 0x71, 0xbd, 0xed, 0x75, 0xaa, 0x07, 0xcd, 0x6e, 0xd6, 0x96, 0xee, 0x59, - 0xff, 0x74, 0x98, 0x83, 0x83, 0x9b, 0x38, 0xb4, 0x0d, 0x2b, 0x3c, 0x8d, 0x47, 0x54, 0xe2, 0x92, - 0x25, 0xce, 0x2c, 0xf4, 0x10, 0x56, 0x6d, 0xc5, 0x5a, 0xe0, 0x07, 0x0e, 0x30, 0xe6, 0x50, 0x98, - 0x2d, 0xa7, 0xca, 0xf4, 0x34, 0xa6, 0x78, 0xd9, 0x6d, 0x39, 0xb7, 0x0d, 0x96, 0x10, 0xa5, 0xc6, - 0x42, 0x86, 0x78, 0xc5, 0x61, 0xb9, 0x8d, 0x76, 0x61, 0x5d, 0x0a, 0x11, 0xfb, 0x36, 0x71, 0xd5, - 0x81, 0xc6, 0xf1, 0xb3, 0x49, 0xfc, 0x16, 0xb6, 0x92, 0x9b, 0x83, 0xf1, 0x59, 0x48, 0xb9, 0x66, - 0x7a, 0x82, 0xd7, 0x6c, 0x5c, 0xa3, 0x80, 0xf5, 0x33, 0x08, 0x3d, 0x83, 0x7a, 0x31, 0xc5, 0xd2, - 0x56, 0x6d, 0x78, 0xad, 0xe0, 0x9f, 0xc5, 0x1e, 0x53, 0x4d, 0x42, 0xa2, 0x09, 0xae, 0xdd, 0x61, - 0x7f, 0x93, 0x41, 0xe8, 0x0f, 0xd8, 0x2e, 0xa6, 0x10, 0xad, 0x25, 0x1b, 0xa5, 0x9a, 0x2a, 0xbc, - 0xd9, 0x2e, 0x75, 0xca, 0x07, 0x47, 0x5d, 0x99, 0x04, 0xdd, 0x7b, 0x4c, 0x57, 0xb7, 0xe0, 0x3a, - 0xbc, 0x66, 0x39, 0x36, 0x07, 0x36, 0x68, 0x26, 0xb3, 0x30, 0xb4, 0x05, 0xcb, 0x5a, 0x5c, 0x51, - 0x8e, 0xd7, 0xed, 0xfe, 0x9c, 0x81, 0x9a, 0xb0, 0x32, 0x56, 0x7e, 0x2a, 0x23, 0x0c, 0xce, 0x3d, - 0x56, 0xef, 0x64, 0x84, 0x10, 0x3c, 0x08, 0x75, 0x7c, 0x8e, 0xcb, 0xd6, 0x69, 0xbf, 0xd1, 0x13, - 0xa8, 0x24, 0x11, 0x99, 0xf8, 0x21, 0x23, 0x91, 0x16, 0x9c, 0xe2, 0x8d, 0xb6, 0xd7, 0x59, 0x1b, - 0x6c, 0x18, 0xe7, 0xab, 0xcc, 0x87, 0xde, 0xc2, 0xea, 0x25, 0x25, 0x21, 0x95, 0x0a, 0x37, 0x6d, - 0x49, 0xdf, 0xdd, 0xbb, 0xa4, 0xd7, 0x2e, 0xcf, 0x15, 0x91, 0xb3, 0xa0, 0x14, 0x9a, 0xd9, 0xa7, - 0xaf, 0x45, 0xb1, 0x63, 0xdb, 0x96, 0xfe, 0x70, 0x51, 0xfa, 0xa1, 0x98, 0xee, 0x57, 0xe3, 0xf2, - 0x2e, 0x62, 0x96, 0xbd, 0x59, 0xcb, 0xac, 0x9c, 0x57, 0xd5, 0x5a, 0x70, 0xd9, 0x1b, 0xce, 0xa1, - 0xb8, 0x55, 0x61, 0x83, 0xdc, 0x45, 0xd0, 0x4b, 0xa8, 0x31, 0x1e, 0x44, 0x69, 0x48, 0xaf, 0x17, - 0xdc, 0xb5, 0x57, 0x6e, 0xa7, 0x78, 0xe5, 0x5c, 0xf4, 0x5b, 0xa7, 0x54, 0x83, 0x6a, 0x96, 0x91, - 0x73, 0xfc, 0x08, 0x75, 0xca, 0xc9, 0x28, 0xa2, 0xa1, 0x7f, 0x4e, 0x89, 0x4e, 0x25, 0x55, 0x78, - 0xa7, 0x5d, 0xea, 0x54, 0x0f, 0x1a, 0x45, 0x92, 0x13, 0x87, 0x0d, 0x6a, 0x59, 0x70, 0x66, 0xdb, - 0x3d, 0x48, 0xc6, 0x2f, 0x18, 0xbf, 0xf0, 0x35, 0x8b, 0xa9, 0x48, 0x35, 0x7e, 0xd8, 0xf6, 0x3a, - 0xe5, 0x83, 0x9d, 0xae, 0x13, 0xcf, 0x6e, 0x2e, 0x9e, 0xdd, 0x57, 0x99, 0x78, 0x0e, 0xaa, 0x59, - 0xc6, 0xd0, 0x25, 0xa0, 0x63, 0xd8, 0x8c, 0xc9, 0x07, 0xa7, 0x6e, 0xb9, 0xc2, 0x62, 0xfc, 0x5f, - 0x2c, 0xb5, 0x98, 0x7c, 0x30, 0xf2, 0x97, 0x3b, 0xd0, 0x09, 0xd4, 0x63, 0x1a, 0x32, 0xe2, 0x53, - 0x1e, 0xc8, 0x89, 0xad, 0x17, 0x7f, 0x61, 0xfb, 0xb1, 0x5b, 0x2c, 0xe5, 0x8d, 0x89, 0x39, 0xbe, - 0x0e, 0x19, 0xd4, 0xe2, 0xdb, 0x0e, 0xd4, 0x85, 0xc6, 0x98, 0x30, 0xed, 0xa7, 0x5c, 0xb3, 0xc8, - 0x27, 0x5c, 0x8d, 0xa9, 0xa4, 0x21, 0x7e, 0x64, 0x07, 0x78, 0xd3, 0x40, 0xef, 0x0c, 0x72, 0x98, - 0x01, 0xad, 0xd7, 0xd0, 0x9a, 0x7f, 0xc1, 0x50, 0x1d, 0x4a, 0x57, 0x74, 0x82, 0x3d, 0x7b, 0x37, - 0xcc, 0xa7, 0xb9, 0x5b, 0xef, 0x49, 0x94, 0xd2, 0x4c, 0x88, 0x9d, 0xf1, 0x62, 0xe9, 0x07, 0xaf, - 0xf5, 0x02, 0x36, 0x8a, 0xa7, 0xbe, 0x50, 0xee, 0x09, 0xe0, 0x79, 0x43, 0xbb, 0x28, 0xcf, 0xbc, - 0x29, 0x5c, 0x84, 0x67, 0xff, 0x4f, 0x0f, 0xbe, 0xfa, 0xfc, 0xc8, 0xab, 0x44, 0x70, 0x45, 0xd1, - 0x53, 0xa8, 0xde, 0xd6, 0xdd, 0x8c, 0xbf, 0x72, 0x4b, 0x71, 0xe7, 0xca, 0xf3, 0xd2, 0x7c, 0x79, - 0x9e, 0x7a, 0x35, 0x4b, 0x53, 0xaf, 0xe6, 0xfe, 0x5f, 0x4b, 0xf0, 0x34, 0xdf, 0xa2, 0x7d, 0x98, - 0xce, 0xa9, 0x9c, 0xfd, 0x3c, 0x4f, 0x31, 0x79, 0xd3, 0xef, 0xef, 0x63, 0x28, 0xeb, 0x8c, 0xc0, - 0xbc, 0x56, 0x6e, 0x4f, 0x90, 0xbb, 0x86, 0xe2, 0xae, 0x1c, 0x96, 0x66, 0xc8, 0xe1, 0x2f, 0x37, - 0x72, 0xf8, 0xc0, 0x0a, 0xc7, 0xf7, 0xb7, 0x84, 0xe3, 0xb3, 0x5b, 0x9c, 0x23, 0x88, 0x33, 0xae, - 0xe7, 0xf2, 0x82, 0xd7, 0xf3, 0xff, 0x4c, 0xe5, 0xc1, 0x3f, 0x1e, 0x94, 0xcf, 0xfa, 0xa7, 0x79, - 0x09, 0x68, 0x0c, 0x5b, 0xb3, 0x86, 0x01, 0x75, 0xee, 0x2b, 0x91, 0xad, 0x67, 0xf7, 0x88, 0x74, - 0x93, 0xb5, 0x0f, 0x9f, 0x3e, 0x7a, 0x2b, 0x75, 0xef, 0x27, 0xef, 0x1b, 0x0f, 0x29, 0xd8, 0x9e, - 0xdd, 0x3f, 0xf4, 0xf5, 0xfd, 0x9b, 0xdc, 0xda, 0xbe, 0xd3, 0xb5, 0x63, 0xf3, 0xbb, 0xb8, 0xdf, - 0xfc, 0xf4, 0xd1, 0xdb, 0xac, 0x7b, 0xad, 0x0a, 0x2a, 0xce, 0xc9, 0xcb, 0x2f, 0x7f, 0x7d, 0x7c, - 0xc1, 0xf4, 0x65, 0x3a, 0xea, 0x06, 0x22, 0xee, 0x65, 0x1a, 0xe4, 0xfe, 0x26, 0x03, 0x11, 0xf5, - 0x64, 0x12, 0x8c, 0x56, 0xac, 0xf5, 0xfc, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb5, 0xc9, 0x75, - 0x58, 0x9c, 0x0a, 0x00, 0x00, + // 1044 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x56, 0xcf, 0x52, 0x1b, 0xc7, + 0x13, 0xfe, 0x2d, 0x32, 0xff, 0x5a, 0xe8, 0x0f, 0x23, 0x84, 0x07, 0xf1, 0x33, 0x28, 0x38, 0x4e, + 0xc9, 0x39, 0xac, 0x12, 0x5c, 0xa9, 0xa4, 0x7c, 0x48, 0x05, 0x30, 0x14, 0x3a, 0x38, 0x26, 0x42, + 0xbe, 0xe4, 0xb2, 0x35, 0xda, 0x1d, 0x60, 0xc2, 0xee, 0xce, 0x66, 0x66, 0xd6, 0xb2, 0xf2, 0x04, + 0xf1, 0x5b, 0xe4, 0x11, 0x52, 0x7e, 0xa2, 0xbc, 0x47, 0x2e, 0xa9, 0x99, 0xd9, 0x85, 0x45, 0x48, + 0x0e, 0xaa, 0xdc, 0xb6, 0xfb, 0xeb, 0xfe, 0x66, 0xba, 0xd5, 0xfd, 0x8d, 0xa0, 0x22, 0x12, 0xbf, + 0x2b, 0x59, 0xe2, 0x26, 0x82, 0x2b, 0x8e, 0x4a, 0x22, 0xf1, 0x5b, 0xdb, 0x97, 0x9c, 0x5f, 0x86, + 0xb4, 0x6b, 0x5c, 0xc3, 0xf4, 0xa2, 0x4b, 0xa3, 0x44, 0x8d, 0x6d, 0x44, 0x6b, 0x67, 0x12, 0x0c, + 0x52, 0x41, 0x14, 0xe3, 0x71, 0x86, 0x57, 0x78, 0xa2, 0x2d, 0x99, 0x99, 0xeb, 0x21, 0x7b, 0x47, + 0xaf, 0x99, 0xf2, 0x6e, 0xce, 0xd8, 0xfb, 0xb3, 0x0a, 0x4f, 0x7b, 0xb1, 0xa2, 0x22, 0x26, 0xe1, + 0x91, 0xa0, 0x44, 0xd1, 0xf3, 0xde, 0xd9, 0x19, 0x11, 0x8a, 0xf9, 0x2c, 0x21, 0xb1, 0xea, 0xd3, + 0x5f, 0x53, 0x2a, 0x15, 0x7a, 0x02, 0x90, 0x08, 0xfe, 0x0b, 0xf5, 0x95, 0xc7, 0x02, 0x8c, 0xda, + 0x4e, 0x67, 0xb5, 0xbf, 0x9a, 0x79, 0x7a, 0x01, 0xda, 0x81, 0xb2, 0x64, 0x89, 0xe7, 0x93, 0x30, + 0xd4, 0x78, 0xc5, 0xe2, 0x92, 0x25, 0x47, 0x24, 0x0c, 0x7b, 0x01, 0x6a, 0xc3, 0x9a, 0xc6, 0x95, + 0x48, 0xe3, 0x6b, 0x1d, 0xd0, 0x30, 0x01, 0x20, 0x59, 0x32, 0xd0, 0xae, 0x5e, 0x80, 0x30, 0x2c, + 0x93, 0x20, 0x10, 0x54, 0x4a, 0xbc, 0x60, 0xc0, 0xdc, 0x44, 0x2d, 0x58, 0xb9, 0xe2, 0x52, 0xc5, + 0x24, 0xa2, 0x78, 0xc3, 0x40, 0x37, 0x36, 0xea, 0x42, 0x23, 0xa0, 0x52, 0xb1, 0xd8, 0x54, 0xed, + 0xf9, 0x3c, 0x8d, 0x95, 0x18, 0xe3, 0x1d, 0x13, 0x86, 0x0a, 0xd0, 0x91, 0x45, 0xd0, 0x0b, 0x58, + 0x55, 0x82, 0xc4, 0x32, 0xe1, 0x42, 0xe1, 0x7a, 0xdb, 0xe9, 0x54, 0xf7, 0x9b, 0x6e, 0xd6, 0x16, + 0xf7, 0xbc, 0x77, 0x36, 0xc8, 0xc1, 0xfe, 0x6d, 0x1c, 0xda, 0x84, 0xa5, 0x38, 0x8d, 0x86, 0x54, + 0xe0, 0x92, 0x21, 0xce, 0x2c, 0xf4, 0x18, 0x96, 0x4d, 0xc5, 0x8a, 0xe3, 0x47, 0x16, 0xd0, 0xe6, + 0x80, 0xeb, 0x2b, 0xa7, 0x52, 0xf7, 0x34, 0xa2, 0x78, 0xd1, 0x5e, 0x39, 0xb7, 0x35, 0x96, 0x10, + 0x29, 0x47, 0x5c, 0x04, 0x78, 0xc9, 0x62, 0xb9, 0x8d, 0xb6, 0x61, 0x55, 0x70, 0x1e, 0x79, 0x26, + 0x71, 0xd9, 0x82, 0xda, 0xf1, 0xa3, 0x4e, 0xfc, 0x1a, 0x36, 0x92, 0xdb, 0x1f, 0xc6, 0x63, 0x01, + 0x8d, 0x15, 0x53, 0x63, 0xbc, 0x62, 0xe2, 0x1a, 0x05, 0xac, 0x97, 0x41, 0xe8, 0x39, 0xd4, 0x8b, + 0x29, 0x86, 0xb6, 0x6a, 0xc2, 0x6b, 0x05, 0xff, 0x34, 0xf6, 0x88, 0x2a, 0x12, 0x10, 0x45, 0x70, + 0xed, 0x1e, 0xfb, 0xeb, 0x0c, 0x42, 0xbf, 0xc1, 0x66, 0x31, 0x85, 0x28, 0x25, 0xd8, 0x30, 0x55, + 0x54, 0xe2, 0xf5, 0x76, 0xa9, 0x53, 0xde, 0x3f, 0x72, 0x45, 0xe2, 0xbb, 0x0f, 0x98, 0x2e, 0xb7, + 0xe0, 0x3a, 0xb8, 0x61, 0x39, 0xd6, 0x3f, 0x58, 0xbf, 0x99, 0x4c, 0xc3, 0xd0, 0x06, 0x2c, 0x2a, + 0x7e, 0x4d, 0x63, 0xbc, 0x6a, 0xee, 0x67, 0x0d, 0xd4, 0x84, 0xa5, 0x91, 0xf4, 0x52, 0x11, 0x62, + 0xb0, 0xee, 0x91, 0x7c, 0x2b, 0x42, 0x84, 0xe0, 0x51, 0xa0, 0xa2, 0x0b, 0x5c, 0x36, 0x4e, 0xf3, + 0x8d, 0x9e, 0x42, 0x25, 0x09, 0xc9, 0xd8, 0x0b, 0x18, 0x09, 0x15, 0x8f, 0x29, 0x5e, 0x6b, 0x3b, + 0x9d, 0x95, 0xfe, 0x9a, 0x76, 0xbe, 0xca, 0x7c, 0xe8, 0x0d, 0x2c, 0x5f, 0x51, 0x12, 0x50, 0x21, + 0x71, 0xd3, 0x94, 0xf4, 0xcd, 0x83, 0x4b, 0x3a, 0xb5, 0x79, 0xb6, 0x88, 0x9c, 0x05, 0xa5, 0xd0, + 0xcc, 0x3e, 0x3d, 0xc5, 0x8b, 0x1d, 0xdb, 0x34, 0xf4, 0x07, 0xf3, 0xd2, 0x0f, 0xf8, 0x64, 0xbf, + 0x1a, 0x57, 0xf7, 0x11, 0x7d, 0xec, 0xed, 0x59, 0xfa, 0xe4, 0xbc, 0xaa, 0xd6, 0x9c, 0xc7, 0xde, + 0x72, 0x0e, 0xf8, 0x9d, 0x0a, 0x1b, 0xe4, 0x3e, 0x82, 0x0e, 0xa1, 0xc6, 0x62, 0x3f, 0x4c, 0x03, + 0x7a, 0x73, 0xe0, 0xb6, 0x59, 0xb9, 0xad, 0xe2, 0xca, 0xd9, 0xe8, 0x37, 0x56, 0xa9, 0xfa, 0xd5, + 0x2c, 0x23, 0xe7, 0xf8, 0x1e, 0xea, 0x34, 0x26, 0xc3, 0x90, 0x06, 0xde, 0x05, 0x25, 0x2a, 0x15, + 0x54, 0xe2, 0xad, 0x76, 0xa9, 0x53, 0xdd, 0x6f, 0x14, 0x49, 0x4e, 0x2c, 0xd6, 0xaf, 0x65, 0xc1, + 0x99, 0x6d, 0xee, 0x20, 0x58, 0x7c, 0xc9, 0xe2, 0x4b, 0x4f, 0xb1, 0x88, 0xf2, 0x54, 0xe1, 0xc7, + 0x6d, 0xa7, 0x53, 0xde, 0xdf, 0x72, 0xad, 0x78, 0xba, 0xb9, 0x78, 0xba, 0xaf, 0x32, 0xf1, 0xec, + 0x57, 0xb3, 0x8c, 0x81, 0x4d, 0x40, 0xc7, 0xb0, 0x1e, 0x91, 0xf7, 0x56, 0xdd, 0x72, 0x85, 0xc5, + 0xf8, 0xdf, 0x58, 0x6a, 0x11, 0x79, 0xaf, 0xe5, 0x2f, 0x77, 0xa0, 0x13, 0xa8, 0x47, 0x34, 0x60, + 0xc4, 0xa3, 0xb1, 0x2f, 0xc6, 0xa6, 0x5e, 0xfc, 0x7f, 0xd3, 0x8f, 0xed, 0x62, 0x29, 0xaf, 0x75, + 0xcc, 0xf1, 0x4d, 0x48, 0xbf, 0x16, 0xdd, 0x75, 0x20, 0x17, 0x1a, 0x23, 0xc2, 0x94, 0x97, 0xc6, + 0x8a, 0x85, 0x1e, 0x89, 0xe5, 0x88, 0x0a, 0x1a, 0xe0, 0x27, 0x66, 0x80, 0xd7, 0x35, 0xf4, 0x56, + 0x23, 0x07, 0x19, 0x80, 0xbe, 0x80, 0xb5, 0x80, 0x49, 0x33, 0xed, 0x46, 0x01, 0x76, 0xf5, 0x1a, + 0x9c, 0xfe, 0xaf, 0x5f, 0xce, 0xbc, 0x7a, 0xff, 0x7f, 0x77, 0x9c, 0xd6, 0x29, 0xb4, 0x66, 0x2f, + 0x22, 0xaa, 0x43, 0xe9, 0x9a, 0x8e, 0xb1, 0x63, 0x76, 0x48, 0x7f, 0xea, 0x1d, 0x7c, 0x47, 0xc2, + 0x94, 0x66, 0x82, 0x6d, 0x8d, 0x97, 0x0b, 0xdf, 0x39, 0xad, 0x97, 0xb0, 0x56, 0x9c, 0x8e, 0xb9, + 0x72, 0x4f, 0x00, 0xcf, 0x1a, 0xee, 0x79, 0x79, 0x66, 0x4d, 0xeb, 0x3c, 0x3c, 0x87, 0x35, 0xa8, + 0x78, 0xc5, 0xf6, 0xed, 0xfd, 0xe1, 0xc0, 0xe7, 0x9f, 0xde, 0x15, 0x99, 0xf0, 0x58, 0x52, 0xf4, + 0x0c, 0xaa, 0x77, 0x05, 0x3b, 0x3b, 0xb0, 0x72, 0x47, 0xaa, 0x67, 0xea, 0xfa, 0xc2, 0x6c, 0x5d, + 0x9f, 0x78, 0x6e, 0x4b, 0x13, 0xcf, 0xed, 0xde, 0x5f, 0x0b, 0xf0, 0x2c, 0xbf, 0xa2, 0x79, 0xd1, + 0x2e, 0xa8, 0x98, 0xfe, 0xae, 0x4f, 0x30, 0x39, 0x93, 0x0f, 0xf7, 0x2e, 0x94, 0x55, 0x46, 0xa0, + 0x9f, 0x39, 0x7b, 0x27, 0xc8, 0x5d, 0x03, 0x7e, 0x5f, 0x47, 0x4b, 0x53, 0x74, 0xf4, 0xa7, 0x5b, + 0x1d, 0x7d, 0x64, 0x14, 0xe7, 0xdb, 0x3b, 0x8a, 0xf3, 0xc9, 0x2b, 0xce, 0x50, 0xd2, 0x29, 0x7b, + 0xbd, 0x38, 0xe7, 0x5e, 0xff, 0x97, 0x31, 0xdd, 0xff, 0xdb, 0x81, 0xf2, 0x79, 0xef, 0x2c, 0x2f, + 0x01, 0x8d, 0x60, 0x63, 0xda, 0x30, 0xa0, 0xce, 0x43, 0xb5, 0xb5, 0xf5, 0xfc, 0x01, 0x91, 0x76, + 0xb2, 0xf6, 0xe0, 0xe3, 0x07, 0x67, 0xa9, 0xee, 0xfc, 0xe0, 0x7c, 0xe5, 0x20, 0x09, 0x9b, 0xd3, + 0xfb, 0x87, 0xbe, 0x7c, 0x78, 0x93, 0x5b, 0x9b, 0xf7, 0xba, 0x76, 0xac, 0xff, 0x67, 0xee, 0x35, + 0x3f, 0x7e, 0x70, 0xd6, 0xeb, 0x4e, 0xab, 0x82, 0x8a, 0x73, 0x72, 0xf8, 0xd9, 0xcf, 0xbb, 0x97, + 0x4c, 0x5d, 0xa5, 0x43, 0xd7, 0xe7, 0x51, 0x37, 0x13, 0x2f, 0xfb, 0x37, 0xd4, 0xe7, 0x61, 0x57, + 0x24, 0xfe, 0x70, 0xc9, 0x58, 0x2f, 0xfe, 0x09, 0x00, 0x00, 0xff, 0xff, 0x21, 0xf6, 0xbf, 0xd3, + 0xd5, 0x0a, 0x00, 0x00, } From 770fc8d1d1f998352d8a17e325ecbcb7ec63bc7f Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 17 Sep 2025 12:00:06 -0700 Subject: [PATCH 2/7] Whoopsie --- livekit/sip.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/livekit/sip.go b/livekit/sip.go index bceb2c306..2bda10c54 100644 --- a/livekit/sip.go +++ b/livekit/sip.go @@ -678,7 +678,7 @@ func (p *CreateSIPParticipantRequest) Validate() error { // Validate display_name if provided if p.DisplayName != nil { - if len(displayName) > 128 { + if len(*p.DisplayName) > 128 { return errors.New("display_name too long (max 128 characters)") } From 46aacaf45c616d963e3d51db9bec16aba43fafd5 Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 17 Sep 2025 12:54:07 -0700 Subject: [PATCH 3/7] What is this regen? --- infra/link_grpc.pb.go | 96 ++++++++-------- rpc/analytics_grpc.pb.go | 237 +++++++++++++++++++++++++++------------ 2 files changed, 207 insertions(+), 126 deletions(-) diff --git a/infra/link_grpc.pb.go b/infra/link_grpc.pb.go index 281cec953..9ea881154 100644 --- a/infra/link_grpc.pb.go +++ b/infra/link_grpc.pb.go @@ -1,20 +1,6 @@ -// Copyright 2023 LiveKit, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.5.1 +// - protoc-gen-go-grpc v1.2.0 // - protoc v4.23.4 // source: infra/link.proto @@ -29,19 +15,14 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.64.0 or later. -const _ = grpc.SupportPackageIsVersion9 - -const ( - Link_WatchLocalLinks_FullMethodName = "/rpc.Link/WatchLocalLinks" - Link_SimulateLinkState_FullMethodName = "/rpc.Link/SimulateLinkState" -) +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 // LinkClient is the client API for Link service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type LinkClient interface { - WatchLocalLinks(ctx context.Context, in *WatchLocalLinksRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[WatchLocalLinksResponse], error) + WatchLocalLinks(ctx context.Context, in *WatchLocalLinksRequest, opts ...grpc.CallOption) (Link_WatchLocalLinksClient, error) SimulateLinkState(ctx context.Context, in *SimulateLinkStateRequest, opts ...grpc.CallOption) (*SimulateLinkStateResponse, error) } @@ -53,13 +34,12 @@ func NewLinkClient(cc grpc.ClientConnInterface) LinkClient { return &linkClient{cc} } -func (c *linkClient) WatchLocalLinks(ctx context.Context, in *WatchLocalLinksRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[WatchLocalLinksResponse], error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - stream, err := c.cc.NewStream(ctx, &Link_ServiceDesc.Streams[0], Link_WatchLocalLinks_FullMethodName, cOpts...) +func (c *linkClient) WatchLocalLinks(ctx context.Context, in *WatchLocalLinksRequest, opts ...grpc.CallOption) (Link_WatchLocalLinksClient, error) { + stream, err := c.cc.NewStream(ctx, &Link_ServiceDesc.Streams[0], "/rpc.Link/WatchLocalLinks", opts...) if err != nil { return nil, err } - x := &grpc.GenericClientStream[WatchLocalLinksRequest, WatchLocalLinksResponse]{ClientStream: stream} + x := &linkWatchLocalLinksClient{stream} if err := x.ClientStream.SendMsg(in); err != nil { return nil, err } @@ -69,13 +49,26 @@ func (c *linkClient) WatchLocalLinks(ctx context.Context, in *WatchLocalLinksReq return x, nil } -// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. -type Link_WatchLocalLinksClient = grpc.ServerStreamingClient[WatchLocalLinksResponse] +type Link_WatchLocalLinksClient interface { + Recv() (*WatchLocalLinksResponse, error) + grpc.ClientStream +} + +type linkWatchLocalLinksClient struct { + grpc.ClientStream +} + +func (x *linkWatchLocalLinksClient) Recv() (*WatchLocalLinksResponse, error) { + m := new(WatchLocalLinksResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} func (c *linkClient) SimulateLinkState(ctx context.Context, in *SimulateLinkStateRequest, opts ...grpc.CallOption) (*SimulateLinkStateResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(SimulateLinkStateResponse) - err := c.cc.Invoke(ctx, Link_SimulateLinkState_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, "/rpc.Link/SimulateLinkState", in, out, opts...) if err != nil { return nil, err } @@ -84,28 +77,24 @@ func (c *linkClient) SimulateLinkState(ctx context.Context, in *SimulateLinkStat // LinkServer is the server API for Link service. // All implementations must embed UnimplementedLinkServer -// for forward compatibility. +// for forward compatibility type LinkServer interface { - WatchLocalLinks(*WatchLocalLinksRequest, grpc.ServerStreamingServer[WatchLocalLinksResponse]) error + WatchLocalLinks(*WatchLocalLinksRequest, Link_WatchLocalLinksServer) error SimulateLinkState(context.Context, *SimulateLinkStateRequest) (*SimulateLinkStateResponse, error) mustEmbedUnimplementedLinkServer() } -// UnimplementedLinkServer must be embedded to have -// forward compatible implementations. -// -// NOTE: this should be embedded by value instead of pointer to avoid a nil -// pointer dereference when methods are called. -type UnimplementedLinkServer struct{} +// UnimplementedLinkServer must be embedded to have forward compatible implementations. +type UnimplementedLinkServer struct { +} -func (UnimplementedLinkServer) WatchLocalLinks(*WatchLocalLinksRequest, grpc.ServerStreamingServer[WatchLocalLinksResponse]) error { +func (UnimplementedLinkServer) WatchLocalLinks(*WatchLocalLinksRequest, Link_WatchLocalLinksServer) error { return status.Errorf(codes.Unimplemented, "method WatchLocalLinks not implemented") } func (UnimplementedLinkServer) SimulateLinkState(context.Context, *SimulateLinkStateRequest) (*SimulateLinkStateResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method SimulateLinkState not implemented") } func (UnimplementedLinkServer) mustEmbedUnimplementedLinkServer() {} -func (UnimplementedLinkServer) testEmbeddedByValue() {} // UnsafeLinkServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to LinkServer will @@ -115,13 +104,6 @@ type UnsafeLinkServer interface { } func RegisterLinkServer(s grpc.ServiceRegistrar, srv LinkServer) { - // If the following call pancis, it indicates UnimplementedLinkServer was - // embedded by pointer and is nil. This will cause panics if an - // unimplemented method is ever invoked, so we test this at initialization - // time to prevent it from happening at runtime later due to I/O. - if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { - t.testEmbeddedByValue() - } s.RegisterService(&Link_ServiceDesc, srv) } @@ -130,11 +112,21 @@ func _Link_WatchLocalLinks_Handler(srv interface{}, stream grpc.ServerStream) er if err := stream.RecvMsg(m); err != nil { return err } - return srv.(LinkServer).WatchLocalLinks(m, &grpc.GenericServerStream[WatchLocalLinksRequest, WatchLocalLinksResponse]{ServerStream: stream}) + return srv.(LinkServer).WatchLocalLinks(m, &linkWatchLocalLinksServer{stream}) } -// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. -type Link_WatchLocalLinksServer = grpc.ServerStreamingServer[WatchLocalLinksResponse] +type Link_WatchLocalLinksServer interface { + Send(*WatchLocalLinksResponse) error + grpc.ServerStream +} + +type linkWatchLocalLinksServer struct { + grpc.ServerStream +} + +func (x *linkWatchLocalLinksServer) Send(m *WatchLocalLinksResponse) error { + return x.ServerStream.SendMsg(m) +} func _Link_SimulateLinkState_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(SimulateLinkStateRequest) @@ -146,7 +138,7 @@ func _Link_SimulateLinkState_Handler(srv interface{}, ctx context.Context, dec f } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: Link_SimulateLinkState_FullMethodName, + FullMethod: "/rpc.Link/SimulateLinkState", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(LinkServer).SimulateLinkState(ctx, req.(*SimulateLinkStateRequest)) diff --git a/rpc/analytics_grpc.pb.go b/rpc/analytics_grpc.pb.go index 6217bb431..10d4d28bd 100644 --- a/rpc/analytics_grpc.pb.go +++ b/rpc/analytics_grpc.pb.go @@ -1,20 +1,6 @@ -// Copyright 2023 LiveKit, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.5.1 +// - protoc-gen-go-grpc v1.2.0 // - protoc v4.23.4 // source: rpc/analytics.proto @@ -31,22 +17,16 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.64.0 or later. -const _ = grpc.SupportPackageIsVersion9 - -const ( - AnalyticsRecorderService_IngestStats_FullMethodName = "/livekit.AnalyticsRecorderService/IngestStats" - AnalyticsRecorderService_IngestEvents_FullMethodName = "/livekit.AnalyticsRecorderService/IngestEvents" - AnalyticsRecorderService_IngestNodeRoomStates_FullMethodName = "/livekit.AnalyticsRecorderService/IngestNodeRoomStates" -) +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 // AnalyticsRecorderServiceClient is the client API for AnalyticsRecorderService service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type AnalyticsRecorderServiceClient interface { - IngestStats(ctx context.Context, opts ...grpc.CallOption) (grpc.ClientStreamingClient[livekit.AnalyticsStats, emptypb.Empty], error) - IngestEvents(ctx context.Context, opts ...grpc.CallOption) (grpc.ClientStreamingClient[livekit.AnalyticsEvents, emptypb.Empty], error) - IngestNodeRoomStates(ctx context.Context, opts ...grpc.CallOption) (grpc.ClientStreamingClient[livekit.AnalyticsNodeRooms, emptypb.Empty], error) + IngestStats(ctx context.Context, opts ...grpc.CallOption) (AnalyticsRecorderService_IngestStatsClient, error) + IngestEvents(ctx context.Context, opts ...grpc.CallOption) (AnalyticsRecorderService_IngestEventsClient, error) + IngestNodeRoomStates(ctx context.Context, opts ...grpc.CallOption) (AnalyticsRecorderService_IngestNodeRoomStatesClient, error) } type analyticsRecorderServiceClient struct { @@ -57,74 +37,133 @@ func NewAnalyticsRecorderServiceClient(cc grpc.ClientConnInterface) AnalyticsRec return &analyticsRecorderServiceClient{cc} } -func (c *analyticsRecorderServiceClient) IngestStats(ctx context.Context, opts ...grpc.CallOption) (grpc.ClientStreamingClient[livekit.AnalyticsStats, emptypb.Empty], error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - stream, err := c.cc.NewStream(ctx, &AnalyticsRecorderService_ServiceDesc.Streams[0], AnalyticsRecorderService_IngestStats_FullMethodName, cOpts...) +func (c *analyticsRecorderServiceClient) IngestStats(ctx context.Context, opts ...grpc.CallOption) (AnalyticsRecorderService_IngestStatsClient, error) { + stream, err := c.cc.NewStream(ctx, &AnalyticsRecorderService_ServiceDesc.Streams[0], "/livekit.AnalyticsRecorderService/IngestStats", opts...) if err != nil { return nil, err } - x := &grpc.GenericClientStream[livekit.AnalyticsStats, emptypb.Empty]{ClientStream: stream} + x := &analyticsRecorderServiceIngestStatsClient{stream} return x, nil } -// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. -type AnalyticsRecorderService_IngestStatsClient = grpc.ClientStreamingClient[livekit.AnalyticsStats, emptypb.Empty] +type AnalyticsRecorderService_IngestStatsClient interface { + Send(*livekit.AnalyticsStats) error + CloseAndRecv() (*emptypb.Empty, error) + grpc.ClientStream +} + +type analyticsRecorderServiceIngestStatsClient struct { + grpc.ClientStream +} + +func (x *analyticsRecorderServiceIngestStatsClient) Send(m *livekit.AnalyticsStats) error { + return x.ClientStream.SendMsg(m) +} -func (c *analyticsRecorderServiceClient) IngestEvents(ctx context.Context, opts ...grpc.CallOption) (grpc.ClientStreamingClient[livekit.AnalyticsEvents, emptypb.Empty], error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - stream, err := c.cc.NewStream(ctx, &AnalyticsRecorderService_ServiceDesc.Streams[1], AnalyticsRecorderService_IngestEvents_FullMethodName, cOpts...) +func (x *analyticsRecorderServiceIngestStatsClient) CloseAndRecv() (*emptypb.Empty, error) { + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + m := new(emptypb.Empty) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *analyticsRecorderServiceClient) IngestEvents(ctx context.Context, opts ...grpc.CallOption) (AnalyticsRecorderService_IngestEventsClient, error) { + stream, err := c.cc.NewStream(ctx, &AnalyticsRecorderService_ServiceDesc.Streams[1], "/livekit.AnalyticsRecorderService/IngestEvents", opts...) if err != nil { return nil, err } - x := &grpc.GenericClientStream[livekit.AnalyticsEvents, emptypb.Empty]{ClientStream: stream} + x := &analyticsRecorderServiceIngestEventsClient{stream} return x, nil } -// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. -type AnalyticsRecorderService_IngestEventsClient = grpc.ClientStreamingClient[livekit.AnalyticsEvents, emptypb.Empty] +type AnalyticsRecorderService_IngestEventsClient interface { + Send(*livekit.AnalyticsEvents) error + CloseAndRecv() (*emptypb.Empty, error) + grpc.ClientStream +} -func (c *analyticsRecorderServiceClient) IngestNodeRoomStates(ctx context.Context, opts ...grpc.CallOption) (grpc.ClientStreamingClient[livekit.AnalyticsNodeRooms, emptypb.Empty], error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - stream, err := c.cc.NewStream(ctx, &AnalyticsRecorderService_ServiceDesc.Streams[2], AnalyticsRecorderService_IngestNodeRoomStates_FullMethodName, cOpts...) +type analyticsRecorderServiceIngestEventsClient struct { + grpc.ClientStream +} + +func (x *analyticsRecorderServiceIngestEventsClient) Send(m *livekit.AnalyticsEvents) error { + return x.ClientStream.SendMsg(m) +} + +func (x *analyticsRecorderServiceIngestEventsClient) CloseAndRecv() (*emptypb.Empty, error) { + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + m := new(emptypb.Empty) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *analyticsRecorderServiceClient) IngestNodeRoomStates(ctx context.Context, opts ...grpc.CallOption) (AnalyticsRecorderService_IngestNodeRoomStatesClient, error) { + stream, err := c.cc.NewStream(ctx, &AnalyticsRecorderService_ServiceDesc.Streams[2], "/livekit.AnalyticsRecorderService/IngestNodeRoomStates", opts...) if err != nil { return nil, err } - x := &grpc.GenericClientStream[livekit.AnalyticsNodeRooms, emptypb.Empty]{ClientStream: stream} + x := &analyticsRecorderServiceIngestNodeRoomStatesClient{stream} return x, nil } -// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. -type AnalyticsRecorderService_IngestNodeRoomStatesClient = grpc.ClientStreamingClient[livekit.AnalyticsNodeRooms, emptypb.Empty] +type AnalyticsRecorderService_IngestNodeRoomStatesClient interface { + Send(*livekit.AnalyticsNodeRooms) error + CloseAndRecv() (*emptypb.Empty, error) + grpc.ClientStream +} + +type analyticsRecorderServiceIngestNodeRoomStatesClient struct { + grpc.ClientStream +} + +func (x *analyticsRecorderServiceIngestNodeRoomStatesClient) Send(m *livekit.AnalyticsNodeRooms) error { + return x.ClientStream.SendMsg(m) +} + +func (x *analyticsRecorderServiceIngestNodeRoomStatesClient) CloseAndRecv() (*emptypb.Empty, error) { + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + m := new(emptypb.Empty) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} // AnalyticsRecorderServiceServer is the server API for AnalyticsRecorderService service. // All implementations must embed UnimplementedAnalyticsRecorderServiceServer -// for forward compatibility. +// for forward compatibility type AnalyticsRecorderServiceServer interface { - IngestStats(grpc.ClientStreamingServer[livekit.AnalyticsStats, emptypb.Empty]) error - IngestEvents(grpc.ClientStreamingServer[livekit.AnalyticsEvents, emptypb.Empty]) error - IngestNodeRoomStates(grpc.ClientStreamingServer[livekit.AnalyticsNodeRooms, emptypb.Empty]) error + IngestStats(AnalyticsRecorderService_IngestStatsServer) error + IngestEvents(AnalyticsRecorderService_IngestEventsServer) error + IngestNodeRoomStates(AnalyticsRecorderService_IngestNodeRoomStatesServer) error mustEmbedUnimplementedAnalyticsRecorderServiceServer() } -// UnimplementedAnalyticsRecorderServiceServer must be embedded to have -// forward compatible implementations. -// -// NOTE: this should be embedded by value instead of pointer to avoid a nil -// pointer dereference when methods are called. -type UnimplementedAnalyticsRecorderServiceServer struct{} +// UnimplementedAnalyticsRecorderServiceServer must be embedded to have forward compatible implementations. +type UnimplementedAnalyticsRecorderServiceServer struct { +} -func (UnimplementedAnalyticsRecorderServiceServer) IngestStats(grpc.ClientStreamingServer[livekit.AnalyticsStats, emptypb.Empty]) error { +func (UnimplementedAnalyticsRecorderServiceServer) IngestStats(AnalyticsRecorderService_IngestStatsServer) error { return status.Errorf(codes.Unimplemented, "method IngestStats not implemented") } -func (UnimplementedAnalyticsRecorderServiceServer) IngestEvents(grpc.ClientStreamingServer[livekit.AnalyticsEvents, emptypb.Empty]) error { +func (UnimplementedAnalyticsRecorderServiceServer) IngestEvents(AnalyticsRecorderService_IngestEventsServer) error { return status.Errorf(codes.Unimplemented, "method IngestEvents not implemented") } -func (UnimplementedAnalyticsRecorderServiceServer) IngestNodeRoomStates(grpc.ClientStreamingServer[livekit.AnalyticsNodeRooms, emptypb.Empty]) error { +func (UnimplementedAnalyticsRecorderServiceServer) IngestNodeRoomStates(AnalyticsRecorderService_IngestNodeRoomStatesServer) error { return status.Errorf(codes.Unimplemented, "method IngestNodeRoomStates not implemented") } func (UnimplementedAnalyticsRecorderServiceServer) mustEmbedUnimplementedAnalyticsRecorderServiceServer() { } -func (UnimplementedAnalyticsRecorderServiceServer) testEmbeddedByValue() {} // UnsafeAnalyticsRecorderServiceServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to AnalyticsRecorderServiceServer will @@ -134,36 +173,86 @@ type UnsafeAnalyticsRecorderServiceServer interface { } func RegisterAnalyticsRecorderServiceServer(s grpc.ServiceRegistrar, srv AnalyticsRecorderServiceServer) { - // If the following call pancis, it indicates UnimplementedAnalyticsRecorderServiceServer was - // embedded by pointer and is nil. This will cause panics if an - // unimplemented method is ever invoked, so we test this at initialization - // time to prevent it from happening at runtime later due to I/O. - if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { - t.testEmbeddedByValue() - } s.RegisterService(&AnalyticsRecorderService_ServiceDesc, srv) } func _AnalyticsRecorderService_IngestStats_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(AnalyticsRecorderServiceServer).IngestStats(&grpc.GenericServerStream[livekit.AnalyticsStats, emptypb.Empty]{ServerStream: stream}) + return srv.(AnalyticsRecorderServiceServer).IngestStats(&analyticsRecorderServiceIngestStatsServer{stream}) } -// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. -type AnalyticsRecorderService_IngestStatsServer = grpc.ClientStreamingServer[livekit.AnalyticsStats, emptypb.Empty] +type AnalyticsRecorderService_IngestStatsServer interface { + SendAndClose(*emptypb.Empty) error + Recv() (*livekit.AnalyticsStats, error) + grpc.ServerStream +} + +type analyticsRecorderServiceIngestStatsServer struct { + grpc.ServerStream +} + +func (x *analyticsRecorderServiceIngestStatsServer) SendAndClose(m *emptypb.Empty) error { + return x.ServerStream.SendMsg(m) +} + +func (x *analyticsRecorderServiceIngestStatsServer) Recv() (*livekit.AnalyticsStats, error) { + m := new(livekit.AnalyticsStats) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} func _AnalyticsRecorderService_IngestEvents_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(AnalyticsRecorderServiceServer).IngestEvents(&grpc.GenericServerStream[livekit.AnalyticsEvents, emptypb.Empty]{ServerStream: stream}) + return srv.(AnalyticsRecorderServiceServer).IngestEvents(&analyticsRecorderServiceIngestEventsServer{stream}) +} + +type AnalyticsRecorderService_IngestEventsServer interface { + SendAndClose(*emptypb.Empty) error + Recv() (*livekit.AnalyticsEvents, error) + grpc.ServerStream } -// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. -type AnalyticsRecorderService_IngestEventsServer = grpc.ClientStreamingServer[livekit.AnalyticsEvents, emptypb.Empty] +type analyticsRecorderServiceIngestEventsServer struct { + grpc.ServerStream +} + +func (x *analyticsRecorderServiceIngestEventsServer) SendAndClose(m *emptypb.Empty) error { + return x.ServerStream.SendMsg(m) +} + +func (x *analyticsRecorderServiceIngestEventsServer) Recv() (*livekit.AnalyticsEvents, error) { + m := new(livekit.AnalyticsEvents) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} func _AnalyticsRecorderService_IngestNodeRoomStates_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(AnalyticsRecorderServiceServer).IngestNodeRoomStates(&grpc.GenericServerStream[livekit.AnalyticsNodeRooms, emptypb.Empty]{ServerStream: stream}) + return srv.(AnalyticsRecorderServiceServer).IngestNodeRoomStates(&analyticsRecorderServiceIngestNodeRoomStatesServer{stream}) } -// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. -type AnalyticsRecorderService_IngestNodeRoomStatesServer = grpc.ClientStreamingServer[livekit.AnalyticsNodeRooms, emptypb.Empty] +type AnalyticsRecorderService_IngestNodeRoomStatesServer interface { + SendAndClose(*emptypb.Empty) error + Recv() (*livekit.AnalyticsNodeRooms, error) + grpc.ServerStream +} + +type analyticsRecorderServiceIngestNodeRoomStatesServer struct { + grpc.ServerStream +} + +func (x *analyticsRecorderServiceIngestNodeRoomStatesServer) SendAndClose(m *emptypb.Empty) error { + return x.ServerStream.SendMsg(m) +} + +func (x *analyticsRecorderServiceIngestNodeRoomStatesServer) Recv() (*livekit.AnalyticsNodeRooms, error) { + m := new(livekit.AnalyticsNodeRooms) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} // AnalyticsRecorderService_ServiceDesc is the grpc.ServiceDesc for AnalyticsRecorderService service. // It's only intended for direct use with grpc.RegisterService, From c01fdaefa86238964c3ef0b83dbdd31601fe109d Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 17 Sep 2025 19:55:19 +0000 Subject: [PATCH 4/7] generated protobuf --- infra/link_grpc.pb.go | 96 ++++++++------- livekit/livekit_sip.pb.go | 2 +- rpc/analytics_grpc.pb.go | 237 ++++++++++++-------------------------- rpc/sip.pb.go | 2 +- 4 files changed, 128 insertions(+), 209 deletions(-) diff --git a/infra/link_grpc.pb.go b/infra/link_grpc.pb.go index 9ea881154..281cec953 100644 --- a/infra/link_grpc.pb.go +++ b/infra/link_grpc.pb.go @@ -1,6 +1,20 @@ +// Copyright 2023 LiveKit, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.2.0 +// - protoc-gen-go-grpc v1.5.1 // - protoc v4.23.4 // source: infra/link.proto @@ -15,14 +29,19 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + Link_WatchLocalLinks_FullMethodName = "/rpc.Link/WatchLocalLinks" + Link_SimulateLinkState_FullMethodName = "/rpc.Link/SimulateLinkState" +) // LinkClient is the client API for Link service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type LinkClient interface { - WatchLocalLinks(ctx context.Context, in *WatchLocalLinksRequest, opts ...grpc.CallOption) (Link_WatchLocalLinksClient, error) + WatchLocalLinks(ctx context.Context, in *WatchLocalLinksRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[WatchLocalLinksResponse], error) SimulateLinkState(ctx context.Context, in *SimulateLinkStateRequest, opts ...grpc.CallOption) (*SimulateLinkStateResponse, error) } @@ -34,12 +53,13 @@ func NewLinkClient(cc grpc.ClientConnInterface) LinkClient { return &linkClient{cc} } -func (c *linkClient) WatchLocalLinks(ctx context.Context, in *WatchLocalLinksRequest, opts ...grpc.CallOption) (Link_WatchLocalLinksClient, error) { - stream, err := c.cc.NewStream(ctx, &Link_ServiceDesc.Streams[0], "/rpc.Link/WatchLocalLinks", opts...) +func (c *linkClient) WatchLocalLinks(ctx context.Context, in *WatchLocalLinksRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[WatchLocalLinksResponse], error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + stream, err := c.cc.NewStream(ctx, &Link_ServiceDesc.Streams[0], Link_WatchLocalLinks_FullMethodName, cOpts...) if err != nil { return nil, err } - x := &linkWatchLocalLinksClient{stream} + x := &grpc.GenericClientStream[WatchLocalLinksRequest, WatchLocalLinksResponse]{ClientStream: stream} if err := x.ClientStream.SendMsg(in); err != nil { return nil, err } @@ -49,26 +69,13 @@ func (c *linkClient) WatchLocalLinks(ctx context.Context, in *WatchLocalLinksReq return x, nil } -type Link_WatchLocalLinksClient interface { - Recv() (*WatchLocalLinksResponse, error) - grpc.ClientStream -} - -type linkWatchLocalLinksClient struct { - grpc.ClientStream -} - -func (x *linkWatchLocalLinksClient) Recv() (*WatchLocalLinksResponse, error) { - m := new(WatchLocalLinksResponse) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type Link_WatchLocalLinksClient = grpc.ServerStreamingClient[WatchLocalLinksResponse] func (c *linkClient) SimulateLinkState(ctx context.Context, in *SimulateLinkStateRequest, opts ...grpc.CallOption) (*SimulateLinkStateResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(SimulateLinkStateResponse) - err := c.cc.Invoke(ctx, "/rpc.Link/SimulateLinkState", in, out, opts...) + err := c.cc.Invoke(ctx, Link_SimulateLinkState_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -77,24 +84,28 @@ func (c *linkClient) SimulateLinkState(ctx context.Context, in *SimulateLinkStat // LinkServer is the server API for Link service. // All implementations must embed UnimplementedLinkServer -// for forward compatibility +// for forward compatibility. type LinkServer interface { - WatchLocalLinks(*WatchLocalLinksRequest, Link_WatchLocalLinksServer) error + WatchLocalLinks(*WatchLocalLinksRequest, grpc.ServerStreamingServer[WatchLocalLinksResponse]) error SimulateLinkState(context.Context, *SimulateLinkStateRequest) (*SimulateLinkStateResponse, error) mustEmbedUnimplementedLinkServer() } -// UnimplementedLinkServer must be embedded to have forward compatible implementations. -type UnimplementedLinkServer struct { -} +// UnimplementedLinkServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedLinkServer struct{} -func (UnimplementedLinkServer) WatchLocalLinks(*WatchLocalLinksRequest, Link_WatchLocalLinksServer) error { +func (UnimplementedLinkServer) WatchLocalLinks(*WatchLocalLinksRequest, grpc.ServerStreamingServer[WatchLocalLinksResponse]) error { return status.Errorf(codes.Unimplemented, "method WatchLocalLinks not implemented") } func (UnimplementedLinkServer) SimulateLinkState(context.Context, *SimulateLinkStateRequest) (*SimulateLinkStateResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method SimulateLinkState not implemented") } func (UnimplementedLinkServer) mustEmbedUnimplementedLinkServer() {} +func (UnimplementedLinkServer) testEmbeddedByValue() {} // UnsafeLinkServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to LinkServer will @@ -104,6 +115,13 @@ type UnsafeLinkServer interface { } func RegisterLinkServer(s grpc.ServiceRegistrar, srv LinkServer) { + // If the following call pancis, it indicates UnimplementedLinkServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } s.RegisterService(&Link_ServiceDesc, srv) } @@ -112,21 +130,11 @@ func _Link_WatchLocalLinks_Handler(srv interface{}, stream grpc.ServerStream) er if err := stream.RecvMsg(m); err != nil { return err } - return srv.(LinkServer).WatchLocalLinks(m, &linkWatchLocalLinksServer{stream}) + return srv.(LinkServer).WatchLocalLinks(m, &grpc.GenericServerStream[WatchLocalLinksRequest, WatchLocalLinksResponse]{ServerStream: stream}) } -type Link_WatchLocalLinksServer interface { - Send(*WatchLocalLinksResponse) error - grpc.ServerStream -} - -type linkWatchLocalLinksServer struct { - grpc.ServerStream -} - -func (x *linkWatchLocalLinksServer) Send(m *WatchLocalLinksResponse) error { - return x.ServerStream.SendMsg(m) -} +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type Link_WatchLocalLinksServer = grpc.ServerStreamingServer[WatchLocalLinksResponse] func _Link_SimulateLinkState_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(SimulateLinkStateRequest) @@ -138,7 +146,7 @@ func _Link_SimulateLinkState_Handler(srv interface{}, ctx context.Context, dec f } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpc.Link/SimulateLinkState", + FullMethod: Link_SimulateLinkState_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(LinkServer).SimulateLinkState(ctx, req.(*SimulateLinkStateRequest)) diff --git a/livekit/livekit_sip.pb.go b/livekit/livekit_sip.pb.go index fdd2f3c3b..6531bdf14 100644 --- a/livekit/livekit_sip.pb.go +++ b/livekit/livekit_sip.pb.go @@ -15,7 +15,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.36.9 -// protoc v3.21.12 +// protoc v4.23.4 // source: livekit_sip.proto package livekit diff --git a/rpc/analytics_grpc.pb.go b/rpc/analytics_grpc.pb.go index 10d4d28bd..6217bb431 100644 --- a/rpc/analytics_grpc.pb.go +++ b/rpc/analytics_grpc.pb.go @@ -1,6 +1,20 @@ +// Copyright 2023 LiveKit, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.2.0 +// - protoc-gen-go-grpc v1.5.1 // - protoc v4.23.4 // source: rpc/analytics.proto @@ -17,16 +31,22 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + AnalyticsRecorderService_IngestStats_FullMethodName = "/livekit.AnalyticsRecorderService/IngestStats" + AnalyticsRecorderService_IngestEvents_FullMethodName = "/livekit.AnalyticsRecorderService/IngestEvents" + AnalyticsRecorderService_IngestNodeRoomStates_FullMethodName = "/livekit.AnalyticsRecorderService/IngestNodeRoomStates" +) // AnalyticsRecorderServiceClient is the client API for AnalyticsRecorderService service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type AnalyticsRecorderServiceClient interface { - IngestStats(ctx context.Context, opts ...grpc.CallOption) (AnalyticsRecorderService_IngestStatsClient, error) - IngestEvents(ctx context.Context, opts ...grpc.CallOption) (AnalyticsRecorderService_IngestEventsClient, error) - IngestNodeRoomStates(ctx context.Context, opts ...grpc.CallOption) (AnalyticsRecorderService_IngestNodeRoomStatesClient, error) + IngestStats(ctx context.Context, opts ...grpc.CallOption) (grpc.ClientStreamingClient[livekit.AnalyticsStats, emptypb.Empty], error) + IngestEvents(ctx context.Context, opts ...grpc.CallOption) (grpc.ClientStreamingClient[livekit.AnalyticsEvents, emptypb.Empty], error) + IngestNodeRoomStates(ctx context.Context, opts ...grpc.CallOption) (grpc.ClientStreamingClient[livekit.AnalyticsNodeRooms, emptypb.Empty], error) } type analyticsRecorderServiceClient struct { @@ -37,133 +57,74 @@ func NewAnalyticsRecorderServiceClient(cc grpc.ClientConnInterface) AnalyticsRec return &analyticsRecorderServiceClient{cc} } -func (c *analyticsRecorderServiceClient) IngestStats(ctx context.Context, opts ...grpc.CallOption) (AnalyticsRecorderService_IngestStatsClient, error) { - stream, err := c.cc.NewStream(ctx, &AnalyticsRecorderService_ServiceDesc.Streams[0], "/livekit.AnalyticsRecorderService/IngestStats", opts...) +func (c *analyticsRecorderServiceClient) IngestStats(ctx context.Context, opts ...grpc.CallOption) (grpc.ClientStreamingClient[livekit.AnalyticsStats, emptypb.Empty], error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + stream, err := c.cc.NewStream(ctx, &AnalyticsRecorderService_ServiceDesc.Streams[0], AnalyticsRecorderService_IngestStats_FullMethodName, cOpts...) if err != nil { return nil, err } - x := &analyticsRecorderServiceIngestStatsClient{stream} + x := &grpc.GenericClientStream[livekit.AnalyticsStats, emptypb.Empty]{ClientStream: stream} return x, nil } -type AnalyticsRecorderService_IngestStatsClient interface { - Send(*livekit.AnalyticsStats) error - CloseAndRecv() (*emptypb.Empty, error) - grpc.ClientStream -} - -type analyticsRecorderServiceIngestStatsClient struct { - grpc.ClientStream -} - -func (x *analyticsRecorderServiceIngestStatsClient) Send(m *livekit.AnalyticsStats) error { - return x.ClientStream.SendMsg(m) -} +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type AnalyticsRecorderService_IngestStatsClient = grpc.ClientStreamingClient[livekit.AnalyticsStats, emptypb.Empty] -func (x *analyticsRecorderServiceIngestStatsClient) CloseAndRecv() (*emptypb.Empty, error) { - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - m := new(emptypb.Empty) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *analyticsRecorderServiceClient) IngestEvents(ctx context.Context, opts ...grpc.CallOption) (AnalyticsRecorderService_IngestEventsClient, error) { - stream, err := c.cc.NewStream(ctx, &AnalyticsRecorderService_ServiceDesc.Streams[1], "/livekit.AnalyticsRecorderService/IngestEvents", opts...) +func (c *analyticsRecorderServiceClient) IngestEvents(ctx context.Context, opts ...grpc.CallOption) (grpc.ClientStreamingClient[livekit.AnalyticsEvents, emptypb.Empty], error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + stream, err := c.cc.NewStream(ctx, &AnalyticsRecorderService_ServiceDesc.Streams[1], AnalyticsRecorderService_IngestEvents_FullMethodName, cOpts...) if err != nil { return nil, err } - x := &analyticsRecorderServiceIngestEventsClient{stream} + x := &grpc.GenericClientStream[livekit.AnalyticsEvents, emptypb.Empty]{ClientStream: stream} return x, nil } -type AnalyticsRecorderService_IngestEventsClient interface { - Send(*livekit.AnalyticsEvents) error - CloseAndRecv() (*emptypb.Empty, error) - grpc.ClientStream -} +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type AnalyticsRecorderService_IngestEventsClient = grpc.ClientStreamingClient[livekit.AnalyticsEvents, emptypb.Empty] -type analyticsRecorderServiceIngestEventsClient struct { - grpc.ClientStream -} - -func (x *analyticsRecorderServiceIngestEventsClient) Send(m *livekit.AnalyticsEvents) error { - return x.ClientStream.SendMsg(m) -} - -func (x *analyticsRecorderServiceIngestEventsClient) CloseAndRecv() (*emptypb.Empty, error) { - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - m := new(emptypb.Empty) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *analyticsRecorderServiceClient) IngestNodeRoomStates(ctx context.Context, opts ...grpc.CallOption) (AnalyticsRecorderService_IngestNodeRoomStatesClient, error) { - stream, err := c.cc.NewStream(ctx, &AnalyticsRecorderService_ServiceDesc.Streams[2], "/livekit.AnalyticsRecorderService/IngestNodeRoomStates", opts...) +func (c *analyticsRecorderServiceClient) IngestNodeRoomStates(ctx context.Context, opts ...grpc.CallOption) (grpc.ClientStreamingClient[livekit.AnalyticsNodeRooms, emptypb.Empty], error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + stream, err := c.cc.NewStream(ctx, &AnalyticsRecorderService_ServiceDesc.Streams[2], AnalyticsRecorderService_IngestNodeRoomStates_FullMethodName, cOpts...) if err != nil { return nil, err } - x := &analyticsRecorderServiceIngestNodeRoomStatesClient{stream} + x := &grpc.GenericClientStream[livekit.AnalyticsNodeRooms, emptypb.Empty]{ClientStream: stream} return x, nil } -type AnalyticsRecorderService_IngestNodeRoomStatesClient interface { - Send(*livekit.AnalyticsNodeRooms) error - CloseAndRecv() (*emptypb.Empty, error) - grpc.ClientStream -} - -type analyticsRecorderServiceIngestNodeRoomStatesClient struct { - grpc.ClientStream -} - -func (x *analyticsRecorderServiceIngestNodeRoomStatesClient) Send(m *livekit.AnalyticsNodeRooms) error { - return x.ClientStream.SendMsg(m) -} - -func (x *analyticsRecorderServiceIngestNodeRoomStatesClient) CloseAndRecv() (*emptypb.Empty, error) { - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - m := new(emptypb.Empty) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type AnalyticsRecorderService_IngestNodeRoomStatesClient = grpc.ClientStreamingClient[livekit.AnalyticsNodeRooms, emptypb.Empty] // AnalyticsRecorderServiceServer is the server API for AnalyticsRecorderService service. // All implementations must embed UnimplementedAnalyticsRecorderServiceServer -// for forward compatibility +// for forward compatibility. type AnalyticsRecorderServiceServer interface { - IngestStats(AnalyticsRecorderService_IngestStatsServer) error - IngestEvents(AnalyticsRecorderService_IngestEventsServer) error - IngestNodeRoomStates(AnalyticsRecorderService_IngestNodeRoomStatesServer) error + IngestStats(grpc.ClientStreamingServer[livekit.AnalyticsStats, emptypb.Empty]) error + IngestEvents(grpc.ClientStreamingServer[livekit.AnalyticsEvents, emptypb.Empty]) error + IngestNodeRoomStates(grpc.ClientStreamingServer[livekit.AnalyticsNodeRooms, emptypb.Empty]) error mustEmbedUnimplementedAnalyticsRecorderServiceServer() } -// UnimplementedAnalyticsRecorderServiceServer must be embedded to have forward compatible implementations. -type UnimplementedAnalyticsRecorderServiceServer struct { -} +// UnimplementedAnalyticsRecorderServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedAnalyticsRecorderServiceServer struct{} -func (UnimplementedAnalyticsRecorderServiceServer) IngestStats(AnalyticsRecorderService_IngestStatsServer) error { +func (UnimplementedAnalyticsRecorderServiceServer) IngestStats(grpc.ClientStreamingServer[livekit.AnalyticsStats, emptypb.Empty]) error { return status.Errorf(codes.Unimplemented, "method IngestStats not implemented") } -func (UnimplementedAnalyticsRecorderServiceServer) IngestEvents(AnalyticsRecorderService_IngestEventsServer) error { +func (UnimplementedAnalyticsRecorderServiceServer) IngestEvents(grpc.ClientStreamingServer[livekit.AnalyticsEvents, emptypb.Empty]) error { return status.Errorf(codes.Unimplemented, "method IngestEvents not implemented") } -func (UnimplementedAnalyticsRecorderServiceServer) IngestNodeRoomStates(AnalyticsRecorderService_IngestNodeRoomStatesServer) error { +func (UnimplementedAnalyticsRecorderServiceServer) IngestNodeRoomStates(grpc.ClientStreamingServer[livekit.AnalyticsNodeRooms, emptypb.Empty]) error { return status.Errorf(codes.Unimplemented, "method IngestNodeRoomStates not implemented") } func (UnimplementedAnalyticsRecorderServiceServer) mustEmbedUnimplementedAnalyticsRecorderServiceServer() { } +func (UnimplementedAnalyticsRecorderServiceServer) testEmbeddedByValue() {} // UnsafeAnalyticsRecorderServiceServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to AnalyticsRecorderServiceServer will @@ -173,86 +134,36 @@ type UnsafeAnalyticsRecorderServiceServer interface { } func RegisterAnalyticsRecorderServiceServer(s grpc.ServiceRegistrar, srv AnalyticsRecorderServiceServer) { + // If the following call pancis, it indicates UnimplementedAnalyticsRecorderServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } s.RegisterService(&AnalyticsRecorderService_ServiceDesc, srv) } func _AnalyticsRecorderService_IngestStats_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(AnalyticsRecorderServiceServer).IngestStats(&analyticsRecorderServiceIngestStatsServer{stream}) + return srv.(AnalyticsRecorderServiceServer).IngestStats(&grpc.GenericServerStream[livekit.AnalyticsStats, emptypb.Empty]{ServerStream: stream}) } -type AnalyticsRecorderService_IngestStatsServer interface { - SendAndClose(*emptypb.Empty) error - Recv() (*livekit.AnalyticsStats, error) - grpc.ServerStream -} - -type analyticsRecorderServiceIngestStatsServer struct { - grpc.ServerStream -} - -func (x *analyticsRecorderServiceIngestStatsServer) SendAndClose(m *emptypb.Empty) error { - return x.ServerStream.SendMsg(m) -} - -func (x *analyticsRecorderServiceIngestStatsServer) Recv() (*livekit.AnalyticsStats, error) { - m := new(livekit.AnalyticsStats) - if err := x.ServerStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type AnalyticsRecorderService_IngestStatsServer = grpc.ClientStreamingServer[livekit.AnalyticsStats, emptypb.Empty] func _AnalyticsRecorderService_IngestEvents_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(AnalyticsRecorderServiceServer).IngestEvents(&analyticsRecorderServiceIngestEventsServer{stream}) -} - -type AnalyticsRecorderService_IngestEventsServer interface { - SendAndClose(*emptypb.Empty) error - Recv() (*livekit.AnalyticsEvents, error) - grpc.ServerStream + return srv.(AnalyticsRecorderServiceServer).IngestEvents(&grpc.GenericServerStream[livekit.AnalyticsEvents, emptypb.Empty]{ServerStream: stream}) } -type analyticsRecorderServiceIngestEventsServer struct { - grpc.ServerStream -} - -func (x *analyticsRecorderServiceIngestEventsServer) SendAndClose(m *emptypb.Empty) error { - return x.ServerStream.SendMsg(m) -} - -func (x *analyticsRecorderServiceIngestEventsServer) Recv() (*livekit.AnalyticsEvents, error) { - m := new(livekit.AnalyticsEvents) - if err := x.ServerStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type AnalyticsRecorderService_IngestEventsServer = grpc.ClientStreamingServer[livekit.AnalyticsEvents, emptypb.Empty] func _AnalyticsRecorderService_IngestNodeRoomStates_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(AnalyticsRecorderServiceServer).IngestNodeRoomStates(&analyticsRecorderServiceIngestNodeRoomStatesServer{stream}) + return srv.(AnalyticsRecorderServiceServer).IngestNodeRoomStates(&grpc.GenericServerStream[livekit.AnalyticsNodeRooms, emptypb.Empty]{ServerStream: stream}) } -type AnalyticsRecorderService_IngestNodeRoomStatesServer interface { - SendAndClose(*emptypb.Empty) error - Recv() (*livekit.AnalyticsNodeRooms, error) - grpc.ServerStream -} - -type analyticsRecorderServiceIngestNodeRoomStatesServer struct { - grpc.ServerStream -} - -func (x *analyticsRecorderServiceIngestNodeRoomStatesServer) SendAndClose(m *emptypb.Empty) error { - return x.ServerStream.SendMsg(m) -} - -func (x *analyticsRecorderServiceIngestNodeRoomStatesServer) Recv() (*livekit.AnalyticsNodeRooms, error) { - m := new(livekit.AnalyticsNodeRooms) - if err := x.ServerStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type AnalyticsRecorderService_IngestNodeRoomStatesServer = grpc.ClientStreamingServer[livekit.AnalyticsNodeRooms, emptypb.Empty] // AnalyticsRecorderService_ServiceDesc is the grpc.ServiceDesc for AnalyticsRecorderService service. // It's only intended for direct use with grpc.RegisterService, diff --git a/rpc/sip.pb.go b/rpc/sip.pb.go index eee8245cc..46d869c9c 100644 --- a/rpc/sip.pb.go +++ b/rpc/sip.pb.go @@ -15,7 +15,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.36.9 -// protoc v3.21.12 +// protoc v4.23.4 // source: rpc/sip.proto package rpc From fe836b03388a605c5e00860446d6f4d16c308c71 Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 17 Sep 2025 13:16:26 -0700 Subject: [PATCH 5/7] Fixing test --- rpc/sip_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/rpc/sip_test.go b/rpc/sip_test.go index aa49f32e8..1ba8552c9 100644 --- a/rpc/sip_test.go +++ b/rpc/sip_test.go @@ -10,6 +10,7 @@ import ( func TestNewCreateSIPParticipantRequest(t *testing.T) { r := &livekit.CreateSIPParticipantRequest{ + SipTrunkId: "trunk", SipCallTo: "+3333", RoomName: "room", ParticipantIdentity: "", From b30e015248c830c02e13ea962286a9a3f2513455 Mon Sep 17 00:00:00 2001 From: Alex Date: Thu, 18 Sep 2025 12:51:34 -0700 Subject: [PATCH 6/7] Added changeset doc --- .changeset/tender-facts-mate.md | 5 +++++ package.json | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/tender-facts-mate.md diff --git a/.changeset/tender-facts-mate.md b/.changeset/tender-facts-mate.md new file mode 100644 index 000000000..615c81ffa --- /dev/null +++ b/.changeset/tender-facts-mate.md @@ -0,0 +1,5 @@ +--- +"github.com/livekit/protocol": minor +--- + +Added DisplayName field to CreateSIPParticipantRequest diff --git a/package.json b/package.json index a7d37c4d4..6c3bcc1cb 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ }, "devDependencies": { "@babel/core": "^7.27.1", - "@changesets/cli": "^2.29.4", + "@changesets/cli": "^2.29.7", "@livekit/changesets-changelog-github": "^0.0.4", "esbuild": "^0.25.4" }, From a903bff404a70165966bd9ff71037439bf75f74c Mon Sep 17 00:00:00 2001 From: Alex Date: Thu, 18 Sep 2025 12:54:07 -0700 Subject: [PATCH 7/7] Reverted package json change --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6c3bcc1cb..a7d37c4d4 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ }, "devDependencies": { "@babel/core": "^7.27.1", - "@changesets/cli": "^2.29.7", + "@changesets/cli": "^2.29.4", "@livekit/changesets-changelog-github": "^0.0.4", "esbuild": "^0.25.4" },