diff --git a/egress/notify_options.go b/egress/notify_options.go index ea63e4c62..6bdfddfab 100644 --- a/egress/notify_options.go +++ b/egress/notify_options.go @@ -31,10 +31,10 @@ func GetEgressNotifyOptions(egressInfo *livekit.EgressInfo) []webhook.NotifyOpti var whs []*livekit.WebhookConfig switch req := egressInfo.Request.(type) { - // case *livekit.EgressInfo_Egress: - // if req.Egress != nil { - // whs = req.Egress.Webhooks - // } + case *livekit.EgressInfo_Egress: + if req.Egress != nil { + whs = req.Egress.Webhooks + } case *livekit.EgressInfo_Replay: if req.Replay != nil { whs = req.Replay.Webhooks diff --git a/egress/types.go b/egress/types.go index fe910fb5f..c239ca0f0 100644 --- a/egress/types.go +++ b/egress/types.go @@ -75,12 +75,12 @@ type UploadRequest interface { func GetTypes(request any) (string, string) { switch req := request.(type) { - // case *livekit.EgressInfo_Egress: - // return getSourceTypeV2(req.Egress), GetOutputTypeV2(req.Egress.Outputs) + case *livekit.EgressInfo_Egress: + return getSourceTypeV2(req.Egress), GetOutputTypeV2(req.Egress.Outputs) case *livekit.EgressInfo_Replay: return getSourceTypeV2(req.Replay), GetOutputTypeV2(req.Replay.Outputs) - + case *livekit.EgressInfo_RoomComposite: return EgressTypeRoomComposite, GetOutputType(req.RoomComposite) diff --git a/livekit/livekit_egress.pb.go b/livekit/livekit_egress.pb.go index 968918fcd..61c041eef 100644 --- a/livekit/livekit_egress.pb.go +++ b/livekit/livekit_egress.pb.go @@ -2849,6 +2849,7 @@ type EgressInfo struct { UpdatedAt int64 `protobuf:"varint,18,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` // Types that are valid to be assigned to Request: // + // *EgressInfo_Egress // *EgressInfo_Replay // *EgressInfo_RoomComposite // *EgressInfo_Web @@ -2971,6 +2972,15 @@ func (x *EgressInfo) GetRequest() isEgressInfo_Request { return nil } +func (x *EgressInfo) GetEgress() *StartEgressRequest { + if x != nil { + if x, ok := x.Request.(*EgressInfo_Egress); ok { + return x.Egress + } + } + return nil +} + func (x *EgressInfo) GetReplay() *ExportReplayRequest { if x != nil { if x, ok := x.Request.(*EgressInfo_Replay); ok { @@ -3136,8 +3146,11 @@ type isEgressInfo_Request interface { isEgressInfo_Request() } +type EgressInfo_Egress struct { + Egress *StartEgressRequest `protobuf:"bytes,29,opt,name=egress,proto3,oneof"` +} + type EgressInfo_Replay struct { - // StartEgressRequest egress = 29; Replay *ExportReplayRequest `protobuf:"bytes,30,opt,name=replay,proto3,oneof"` } @@ -3161,6 +3174,8 @@ type EgressInfo_Track struct { Track *TrackEgressRequest `protobuf:"bytes,6,opt,name=track,proto3,oneof"` } +func (*EgressInfo_Egress) isEgressInfo_Request() {} + func (*EgressInfo_Replay) isEgressInfo_Request() {} func (*EgressInfo_RoomComposite) isEgressInfo_Request() {} @@ -5510,7 +5525,7 @@ const file_livekit_egress_proto_rawDesc = "" + "\x0fadd_stream_urls\x18\x04 \x03(\tR\raddStreamUrls\x12,\n" + "\x12remove_stream_urls\x18\x05 \x03(\tR\x10removeStreamUrls\"=\n" + "\x11StopEgressRequest\x12(\n" + - "\tegress_id\x18\x01 \x01(\tB\v\xbaP\begressIDR\begressId\"\xa8\n" + + "\tegress_id\x18\x01 \x01(\tB\v\xbaP\begressIDR\begressId\"\xdf\n" + "\n" + "\n" + "EgressInfo\x12(\n" + @@ -5525,7 +5540,8 @@ const file_livekit_egress_proto_rawDesc = "" + " \x01(\x03R\tstartedAt\x12\x19\n" + "\bended_at\x18\v \x01(\x03R\aendedAt\x12\x1d\n" + "\n" + - "updated_at\x18\x12 \x01(\x03R\tupdatedAt\x126\n" + + "updated_at\x18\x12 \x01(\x03R\tupdatedAt\x125\n" + + "\x06egress\x18\x1d \x01(\v2\x1b.livekit.StartEgressRequestH\x00R\x06egress\x126\n" + "\x06replay\x18\x1e \x01(\v2\x1c.livekit.ExportReplayRequestH\x00R\x06replay\x12L\n" + "\x0eroom_composite\x18\x04 \x01(\v2#.livekit.RoomCompositeEgressRequestH\x00R\rroomComposite\x12-\n" + "\x03web\x18\x0e \x01(\v2\x19.livekit.WebEgressRequestH\x00R\x03web\x12E\n" + @@ -5775,19 +5791,20 @@ const file_livekit_egress_proto_rawDesc = "" + "\vAudioMixing\x12\x12\n" + "\x0eDEFAULT_MIXING\x10\x00\x12\x16\n" + "\x12DUAL_CHANNEL_AGENT\x10\x01\x12\x1a\n" + - "\x16DUAL_CHANNEL_ALTERNATE\x10\x022\x9c\x05\n" + - "\x06Egress\x12T\n" + - "\x18StartRoomCompositeEgress\x12#.livekit.RoomCompositeEgressRequest\x1a\x13.livekit.EgressInfo\x12@\n" + - "\x0eStartWebEgress\x12\x19.livekit.WebEgressRequest\x1a\x13.livekit.EgressInfo\x12P\n" + - "\x16StartParticipantEgress\x12!.livekit.ParticipantEgressRequest\x1a\x13.livekit.EgressInfo\x12V\n" + - "\x19StartTrackCompositeEgress\x12$.livekit.TrackCompositeEgressRequest\x1a\x13.livekit.EgressInfo\x12D\n" + - "\x10StartTrackEgress\x12\x1b.livekit.TrackEgressRequest\x1a\x13.livekit.EgressInfo\x12A\n" + + "\x16DUAL_CHANNEL_ALTERNATE\x10\x022\xdd\x05\n" + + "\x06Egress\x12?\n" + + "\vStartEgress\x12\x1b.livekit.StartEgressRequest\x1a\x13.livekit.EgressInfo\x12A\n" + "\fUpdateLayout\x12\x1c.livekit.UpdateLayoutRequest\x1a\x13.livekit.EgressInfo\x12A\n" + "\fUpdateStream\x12\x1c.livekit.UpdateStreamRequest\x1a\x13.livekit.EgressInfo\x12E\n" + "\n" + "ListEgress\x12\x1a.livekit.ListEgressRequest\x1a\x1b.livekit.ListEgressResponse\x12=\n" + "\n" + - "StopEgress\x12\x1a.livekit.StopEgressRequest\x1a\x13.livekit.EgressInfoBFZ#github.com/livekit/protocol/livekit\xaa\x02\rLiveKit.Proto\xea\x02\x0eLiveKit::Protob\x06proto3" + "StopEgress\x12\x1a.livekit.StopEgressRequest\x1a\x13.livekit.EgressInfo\x12T\n" + + "\x18StartRoomCompositeEgress\x12#.livekit.RoomCompositeEgressRequest\x1a\x13.livekit.EgressInfo\x12@\n" + + "\x0eStartWebEgress\x12\x19.livekit.WebEgressRequest\x1a\x13.livekit.EgressInfo\x12P\n" + + "\x16StartParticipantEgress\x12!.livekit.ParticipantEgressRequest\x1a\x13.livekit.EgressInfo\x12V\n" + + "\x19StartTrackCompositeEgress\x12$.livekit.TrackCompositeEgressRequest\x1a\x13.livekit.EgressInfo\x12D\n" + + "\x10StartTrackEgress\x12\x1b.livekit.TrackEgressRequest\x1a\x13.livekit.EgressInfoBFZ#github.com/livekit/protocol/livekit\xaa\x02\rLiveKit.Proto\xea\x02\x0eLiveKit::Protob\x06proto3" var ( file_livekit_egress_proto_rawDescOnce sync.Once @@ -5915,109 +5932,112 @@ var file_livekit_egress_proto_depIdxs = []int32{ 60, // 45: livekit.ListEgressResponse.next_page_token:type_name -> livekit.TokenPagination 7, // 46: livekit.EgressInfo.source_type:type_name -> livekit.EgressSourceType 8, // 47: livekit.EgressInfo.status:type_name -> livekit.EgressStatus - 43, // 48: livekit.EgressInfo.replay:type_name -> livekit.ExportReplayRequest - 44, // 49: livekit.EgressInfo.room_composite:type_name -> livekit.RoomCompositeEgressRequest - 45, // 50: livekit.EgressInfo.web:type_name -> livekit.WebEgressRequest - 46, // 51: livekit.EgressInfo.participant:type_name -> livekit.ParticipantEgressRequest - 47, // 52: livekit.EgressInfo.track_composite:type_name -> livekit.TrackCompositeEgressRequest - 48, // 53: livekit.EgressInfo.track:type_name -> livekit.TrackEgressRequest - 37, // 54: livekit.EgressInfo.stream_results:type_name -> livekit.StreamInfo - 38, // 55: livekit.EgressInfo.file_results:type_name -> livekit.FileInfo - 39, // 56: livekit.EgressInfo.segment_results:type_name -> livekit.SegmentsInfo - 40, // 57: livekit.EgressInfo.image_results:type_name -> livekit.ImagesInfo - 53, // 58: livekit.EgressInfo.stream:type_name -> livekit.StreamInfoList - 38, // 59: livekit.EgressInfo.file:type_name -> livekit.FileInfo - 39, // 60: livekit.EgressInfo.segments:type_name -> livekit.SegmentsInfo - 10, // 61: livekit.StreamInfo.status:type_name -> livekit.StreamInfo.Status - 1, // 62: livekit.AutoParticipantEgress.preset:type_name -> livekit.EncodingOptionsPreset - 20, // 63: livekit.AutoParticipantEgress.advanced:type_name -> livekit.EncodingOptions - 50, // 64: livekit.AutoParticipantEgress.file_outputs:type_name -> livekit.EncodedFileOutput - 24, // 65: livekit.AutoParticipantEgress.segment_outputs:type_name -> livekit.SegmentedFileOutput - 27, // 66: livekit.AutoTrackEgress.s3:type_name -> livekit.S3Upload - 28, // 67: livekit.AutoTrackEgress.gcp:type_name -> livekit.GCPUpload - 29, // 68: livekit.AutoTrackEgress.azure:type_name -> livekit.AzureBlobUpload - 30, // 69: livekit.AutoTrackEgress.aliOSS:type_name -> livekit.AliOSSUpload - 12, // 70: livekit.ExportReplayRequest.template:type_name -> livekit.TemplateSource - 13, // 71: livekit.ExportReplayRequest.web:type_name -> livekit.WebSource - 14, // 72: livekit.ExportReplayRequest.media:type_name -> livekit.MediaSource - 1, // 73: livekit.ExportReplayRequest.preset:type_name -> livekit.EncodingOptionsPreset - 20, // 74: livekit.ExportReplayRequest.advanced:type_name -> livekit.EncodingOptions - 21, // 75: livekit.ExportReplayRequest.outputs:type_name -> livekit.Output - 26, // 76: livekit.ExportReplayRequest.storage:type_name -> livekit.StorageConfig - 55, // 77: livekit.ExportReplayRequest.webhooks:type_name -> livekit.WebhookConfig - 9, // 78: livekit.RoomCompositeEgressRequest.audio_mixing:type_name -> livekit.AudioMixing - 50, // 79: livekit.RoomCompositeEgressRequest.file:type_name -> livekit.EncodedFileOutput - 23, // 80: livekit.RoomCompositeEgressRequest.stream:type_name -> livekit.StreamOutput - 24, // 81: livekit.RoomCompositeEgressRequest.segments:type_name -> livekit.SegmentedFileOutput - 1, // 82: livekit.RoomCompositeEgressRequest.preset:type_name -> livekit.EncodingOptionsPreset - 20, // 83: livekit.RoomCompositeEgressRequest.advanced:type_name -> livekit.EncodingOptions - 50, // 84: livekit.RoomCompositeEgressRequest.file_outputs:type_name -> livekit.EncodedFileOutput - 23, // 85: livekit.RoomCompositeEgressRequest.stream_outputs:type_name -> livekit.StreamOutput - 24, // 86: livekit.RoomCompositeEgressRequest.segment_outputs:type_name -> livekit.SegmentedFileOutput - 25, // 87: livekit.RoomCompositeEgressRequest.image_outputs:type_name -> livekit.ImageOutput - 55, // 88: livekit.RoomCompositeEgressRequest.webhooks:type_name -> livekit.WebhookConfig - 50, // 89: livekit.WebEgressRequest.file:type_name -> livekit.EncodedFileOutput - 23, // 90: livekit.WebEgressRequest.stream:type_name -> livekit.StreamOutput - 24, // 91: livekit.WebEgressRequest.segments:type_name -> livekit.SegmentedFileOutput - 1, // 92: livekit.WebEgressRequest.preset:type_name -> livekit.EncodingOptionsPreset - 20, // 93: livekit.WebEgressRequest.advanced:type_name -> livekit.EncodingOptions - 50, // 94: livekit.WebEgressRequest.file_outputs:type_name -> livekit.EncodedFileOutput - 23, // 95: livekit.WebEgressRequest.stream_outputs:type_name -> livekit.StreamOutput - 24, // 96: livekit.WebEgressRequest.segment_outputs:type_name -> livekit.SegmentedFileOutput - 25, // 97: livekit.WebEgressRequest.image_outputs:type_name -> livekit.ImageOutput - 55, // 98: livekit.WebEgressRequest.webhooks:type_name -> livekit.WebhookConfig - 1, // 99: livekit.ParticipantEgressRequest.preset:type_name -> livekit.EncodingOptionsPreset - 20, // 100: livekit.ParticipantEgressRequest.advanced:type_name -> livekit.EncodingOptions - 50, // 101: livekit.ParticipantEgressRequest.file_outputs:type_name -> livekit.EncodedFileOutput - 23, // 102: livekit.ParticipantEgressRequest.stream_outputs:type_name -> livekit.StreamOutput - 24, // 103: livekit.ParticipantEgressRequest.segment_outputs:type_name -> livekit.SegmentedFileOutput - 25, // 104: livekit.ParticipantEgressRequest.image_outputs:type_name -> livekit.ImageOutput - 55, // 105: livekit.ParticipantEgressRequest.webhooks:type_name -> livekit.WebhookConfig - 50, // 106: livekit.TrackCompositeEgressRequest.file:type_name -> livekit.EncodedFileOutput - 23, // 107: livekit.TrackCompositeEgressRequest.stream:type_name -> livekit.StreamOutput - 24, // 108: livekit.TrackCompositeEgressRequest.segments:type_name -> livekit.SegmentedFileOutput - 1, // 109: livekit.TrackCompositeEgressRequest.preset:type_name -> livekit.EncodingOptionsPreset - 20, // 110: livekit.TrackCompositeEgressRequest.advanced:type_name -> livekit.EncodingOptions - 50, // 111: livekit.TrackCompositeEgressRequest.file_outputs:type_name -> livekit.EncodedFileOutput - 23, // 112: livekit.TrackCompositeEgressRequest.stream_outputs:type_name -> livekit.StreamOutput - 24, // 113: livekit.TrackCompositeEgressRequest.segment_outputs:type_name -> livekit.SegmentedFileOutput - 25, // 114: livekit.TrackCompositeEgressRequest.image_outputs:type_name -> livekit.ImageOutput - 55, // 115: livekit.TrackCompositeEgressRequest.webhooks:type_name -> livekit.WebhookConfig - 49, // 116: livekit.TrackEgressRequest.file:type_name -> livekit.DirectFileOutput - 55, // 117: livekit.TrackEgressRequest.webhooks:type_name -> livekit.WebhookConfig - 27, // 118: livekit.DirectFileOutput.s3:type_name -> livekit.S3Upload - 28, // 119: livekit.DirectFileOutput.gcp:type_name -> livekit.GCPUpload - 29, // 120: livekit.DirectFileOutput.azure:type_name -> livekit.AzureBlobUpload - 30, // 121: livekit.DirectFileOutput.aliOSS:type_name -> livekit.AliOSSUpload - 2, // 122: livekit.EncodedFileOutput.file_type:type_name -> livekit.EncodedFileType - 27, // 123: livekit.EncodedFileOutput.s3:type_name -> livekit.S3Upload - 28, // 124: livekit.EncodedFileOutput.gcp:type_name -> livekit.GCPUpload - 29, // 125: livekit.EncodedFileOutput.azure:type_name -> livekit.AzureBlobUpload - 30, // 126: livekit.EncodedFileOutput.aliOSS:type_name -> livekit.AliOSSUpload - 37, // 127: livekit.StreamInfoList.info:type_name -> livekit.StreamInfo - 44, // 128: livekit.Egress.StartRoomCompositeEgress:input_type -> livekit.RoomCompositeEgressRequest - 45, // 129: livekit.Egress.StartWebEgress:input_type -> livekit.WebEgressRequest - 46, // 130: livekit.Egress.StartParticipantEgress:input_type -> livekit.ParticipantEgressRequest - 47, // 131: livekit.Egress.StartTrackCompositeEgress:input_type -> livekit.TrackCompositeEgressRequest - 48, // 132: livekit.Egress.StartTrackEgress:input_type -> livekit.TrackEgressRequest - 51, // 133: livekit.Egress.UpdateLayout:input_type -> livekit.UpdateLayoutRequest - 52, // 134: livekit.Egress.UpdateStream:input_type -> livekit.UpdateStreamRequest - 32, // 135: livekit.Egress.ListEgress:input_type -> livekit.ListEgressRequest - 35, // 136: livekit.Egress.StopEgress:input_type -> livekit.StopEgressRequest - 36, // 137: livekit.Egress.StartRoomCompositeEgress:output_type -> livekit.EgressInfo - 36, // 138: livekit.Egress.StartWebEgress:output_type -> livekit.EgressInfo - 36, // 139: livekit.Egress.StartParticipantEgress:output_type -> livekit.EgressInfo - 36, // 140: livekit.Egress.StartTrackCompositeEgress:output_type -> livekit.EgressInfo - 36, // 141: livekit.Egress.StartTrackEgress:output_type -> livekit.EgressInfo - 36, // 142: livekit.Egress.UpdateLayout:output_type -> livekit.EgressInfo - 36, // 143: livekit.Egress.UpdateStream:output_type -> livekit.EgressInfo - 33, // 144: livekit.Egress.ListEgress:output_type -> livekit.ListEgressResponse - 36, // 145: livekit.Egress.StopEgress:output_type -> livekit.EgressInfo - 137, // [137:146] is the sub-list for method output_type - 128, // [128:137] is the sub-list for method input_type - 128, // [128:128] is the sub-list for extension type_name - 128, // [128:128] is the sub-list for extension extendee - 0, // [0:128] is the sub-list for field type_name + 11, // 48: livekit.EgressInfo.egress:type_name -> livekit.StartEgressRequest + 43, // 49: livekit.EgressInfo.replay:type_name -> livekit.ExportReplayRequest + 44, // 50: livekit.EgressInfo.room_composite:type_name -> livekit.RoomCompositeEgressRequest + 45, // 51: livekit.EgressInfo.web:type_name -> livekit.WebEgressRequest + 46, // 52: livekit.EgressInfo.participant:type_name -> livekit.ParticipantEgressRequest + 47, // 53: livekit.EgressInfo.track_composite:type_name -> livekit.TrackCompositeEgressRequest + 48, // 54: livekit.EgressInfo.track:type_name -> livekit.TrackEgressRequest + 37, // 55: livekit.EgressInfo.stream_results:type_name -> livekit.StreamInfo + 38, // 56: livekit.EgressInfo.file_results:type_name -> livekit.FileInfo + 39, // 57: livekit.EgressInfo.segment_results:type_name -> livekit.SegmentsInfo + 40, // 58: livekit.EgressInfo.image_results:type_name -> livekit.ImagesInfo + 53, // 59: livekit.EgressInfo.stream:type_name -> livekit.StreamInfoList + 38, // 60: livekit.EgressInfo.file:type_name -> livekit.FileInfo + 39, // 61: livekit.EgressInfo.segments:type_name -> livekit.SegmentsInfo + 10, // 62: livekit.StreamInfo.status:type_name -> livekit.StreamInfo.Status + 1, // 63: livekit.AutoParticipantEgress.preset:type_name -> livekit.EncodingOptionsPreset + 20, // 64: livekit.AutoParticipantEgress.advanced:type_name -> livekit.EncodingOptions + 50, // 65: livekit.AutoParticipantEgress.file_outputs:type_name -> livekit.EncodedFileOutput + 24, // 66: livekit.AutoParticipantEgress.segment_outputs:type_name -> livekit.SegmentedFileOutput + 27, // 67: livekit.AutoTrackEgress.s3:type_name -> livekit.S3Upload + 28, // 68: livekit.AutoTrackEgress.gcp:type_name -> livekit.GCPUpload + 29, // 69: livekit.AutoTrackEgress.azure:type_name -> livekit.AzureBlobUpload + 30, // 70: livekit.AutoTrackEgress.aliOSS:type_name -> livekit.AliOSSUpload + 12, // 71: livekit.ExportReplayRequest.template:type_name -> livekit.TemplateSource + 13, // 72: livekit.ExportReplayRequest.web:type_name -> livekit.WebSource + 14, // 73: livekit.ExportReplayRequest.media:type_name -> livekit.MediaSource + 1, // 74: livekit.ExportReplayRequest.preset:type_name -> livekit.EncodingOptionsPreset + 20, // 75: livekit.ExportReplayRequest.advanced:type_name -> livekit.EncodingOptions + 21, // 76: livekit.ExportReplayRequest.outputs:type_name -> livekit.Output + 26, // 77: livekit.ExportReplayRequest.storage:type_name -> livekit.StorageConfig + 55, // 78: livekit.ExportReplayRequest.webhooks:type_name -> livekit.WebhookConfig + 9, // 79: livekit.RoomCompositeEgressRequest.audio_mixing:type_name -> livekit.AudioMixing + 50, // 80: livekit.RoomCompositeEgressRequest.file:type_name -> livekit.EncodedFileOutput + 23, // 81: livekit.RoomCompositeEgressRequest.stream:type_name -> livekit.StreamOutput + 24, // 82: livekit.RoomCompositeEgressRequest.segments:type_name -> livekit.SegmentedFileOutput + 1, // 83: livekit.RoomCompositeEgressRequest.preset:type_name -> livekit.EncodingOptionsPreset + 20, // 84: livekit.RoomCompositeEgressRequest.advanced:type_name -> livekit.EncodingOptions + 50, // 85: livekit.RoomCompositeEgressRequest.file_outputs:type_name -> livekit.EncodedFileOutput + 23, // 86: livekit.RoomCompositeEgressRequest.stream_outputs:type_name -> livekit.StreamOutput + 24, // 87: livekit.RoomCompositeEgressRequest.segment_outputs:type_name -> livekit.SegmentedFileOutput + 25, // 88: livekit.RoomCompositeEgressRequest.image_outputs:type_name -> livekit.ImageOutput + 55, // 89: livekit.RoomCompositeEgressRequest.webhooks:type_name -> livekit.WebhookConfig + 50, // 90: livekit.WebEgressRequest.file:type_name -> livekit.EncodedFileOutput + 23, // 91: livekit.WebEgressRequest.stream:type_name -> livekit.StreamOutput + 24, // 92: livekit.WebEgressRequest.segments:type_name -> livekit.SegmentedFileOutput + 1, // 93: livekit.WebEgressRequest.preset:type_name -> livekit.EncodingOptionsPreset + 20, // 94: livekit.WebEgressRequest.advanced:type_name -> livekit.EncodingOptions + 50, // 95: livekit.WebEgressRequest.file_outputs:type_name -> livekit.EncodedFileOutput + 23, // 96: livekit.WebEgressRequest.stream_outputs:type_name -> livekit.StreamOutput + 24, // 97: livekit.WebEgressRequest.segment_outputs:type_name -> livekit.SegmentedFileOutput + 25, // 98: livekit.WebEgressRequest.image_outputs:type_name -> livekit.ImageOutput + 55, // 99: livekit.WebEgressRequest.webhooks:type_name -> livekit.WebhookConfig + 1, // 100: livekit.ParticipantEgressRequest.preset:type_name -> livekit.EncodingOptionsPreset + 20, // 101: livekit.ParticipantEgressRequest.advanced:type_name -> livekit.EncodingOptions + 50, // 102: livekit.ParticipantEgressRequest.file_outputs:type_name -> livekit.EncodedFileOutput + 23, // 103: livekit.ParticipantEgressRequest.stream_outputs:type_name -> livekit.StreamOutput + 24, // 104: livekit.ParticipantEgressRequest.segment_outputs:type_name -> livekit.SegmentedFileOutput + 25, // 105: livekit.ParticipantEgressRequest.image_outputs:type_name -> livekit.ImageOutput + 55, // 106: livekit.ParticipantEgressRequest.webhooks:type_name -> livekit.WebhookConfig + 50, // 107: livekit.TrackCompositeEgressRequest.file:type_name -> livekit.EncodedFileOutput + 23, // 108: livekit.TrackCompositeEgressRequest.stream:type_name -> livekit.StreamOutput + 24, // 109: livekit.TrackCompositeEgressRequest.segments:type_name -> livekit.SegmentedFileOutput + 1, // 110: livekit.TrackCompositeEgressRequest.preset:type_name -> livekit.EncodingOptionsPreset + 20, // 111: livekit.TrackCompositeEgressRequest.advanced:type_name -> livekit.EncodingOptions + 50, // 112: livekit.TrackCompositeEgressRequest.file_outputs:type_name -> livekit.EncodedFileOutput + 23, // 113: livekit.TrackCompositeEgressRequest.stream_outputs:type_name -> livekit.StreamOutput + 24, // 114: livekit.TrackCompositeEgressRequest.segment_outputs:type_name -> livekit.SegmentedFileOutput + 25, // 115: livekit.TrackCompositeEgressRequest.image_outputs:type_name -> livekit.ImageOutput + 55, // 116: livekit.TrackCompositeEgressRequest.webhooks:type_name -> livekit.WebhookConfig + 49, // 117: livekit.TrackEgressRequest.file:type_name -> livekit.DirectFileOutput + 55, // 118: livekit.TrackEgressRequest.webhooks:type_name -> livekit.WebhookConfig + 27, // 119: livekit.DirectFileOutput.s3:type_name -> livekit.S3Upload + 28, // 120: livekit.DirectFileOutput.gcp:type_name -> livekit.GCPUpload + 29, // 121: livekit.DirectFileOutput.azure:type_name -> livekit.AzureBlobUpload + 30, // 122: livekit.DirectFileOutput.aliOSS:type_name -> livekit.AliOSSUpload + 2, // 123: livekit.EncodedFileOutput.file_type:type_name -> livekit.EncodedFileType + 27, // 124: livekit.EncodedFileOutput.s3:type_name -> livekit.S3Upload + 28, // 125: livekit.EncodedFileOutput.gcp:type_name -> livekit.GCPUpload + 29, // 126: livekit.EncodedFileOutput.azure:type_name -> livekit.AzureBlobUpload + 30, // 127: livekit.EncodedFileOutput.aliOSS:type_name -> livekit.AliOSSUpload + 37, // 128: livekit.StreamInfoList.info:type_name -> livekit.StreamInfo + 11, // 129: livekit.Egress.StartEgress:input_type -> livekit.StartEgressRequest + 51, // 130: livekit.Egress.UpdateLayout:input_type -> livekit.UpdateLayoutRequest + 52, // 131: livekit.Egress.UpdateStream:input_type -> livekit.UpdateStreamRequest + 32, // 132: livekit.Egress.ListEgress:input_type -> livekit.ListEgressRequest + 35, // 133: livekit.Egress.StopEgress:input_type -> livekit.StopEgressRequest + 44, // 134: livekit.Egress.StartRoomCompositeEgress:input_type -> livekit.RoomCompositeEgressRequest + 45, // 135: livekit.Egress.StartWebEgress:input_type -> livekit.WebEgressRequest + 46, // 136: livekit.Egress.StartParticipantEgress:input_type -> livekit.ParticipantEgressRequest + 47, // 137: livekit.Egress.StartTrackCompositeEgress:input_type -> livekit.TrackCompositeEgressRequest + 48, // 138: livekit.Egress.StartTrackEgress:input_type -> livekit.TrackEgressRequest + 36, // 139: livekit.Egress.StartEgress:output_type -> livekit.EgressInfo + 36, // 140: livekit.Egress.UpdateLayout:output_type -> livekit.EgressInfo + 36, // 141: livekit.Egress.UpdateStream:output_type -> livekit.EgressInfo + 33, // 142: livekit.Egress.ListEgress:output_type -> livekit.ListEgressResponse + 36, // 143: livekit.Egress.StopEgress:output_type -> livekit.EgressInfo + 36, // 144: livekit.Egress.StartRoomCompositeEgress:output_type -> livekit.EgressInfo + 36, // 145: livekit.Egress.StartWebEgress:output_type -> livekit.EgressInfo + 36, // 146: livekit.Egress.StartParticipantEgress:output_type -> livekit.EgressInfo + 36, // 147: livekit.Egress.StartTrackCompositeEgress:output_type -> livekit.EgressInfo + 36, // 148: livekit.Egress.StartTrackEgress:output_type -> livekit.EgressInfo + 139, // [139:149] is the sub-list for method output_type + 129, // [129:139] is the sub-list for method input_type + 129, // [129:129] is the sub-list for extension type_name + 129, // [129:129] is the sub-list for extension extendee + 0, // [0:129] is the sub-list for field type_name } func init() { file_livekit_egress_proto_init() } @@ -6072,6 +6092,7 @@ func file_livekit_egress_proto_init() { (*StorageConfig_AliOSS)(nil), } file_livekit_egress_proto_msgTypes[25].OneofWrappers = []any{ + (*EgressInfo_Egress)(nil), (*EgressInfo_Replay)(nil), (*EgressInfo_RoomComposite)(nil), (*EgressInfo_Web)(nil), diff --git a/livekit/livekit_egress.twirp.go b/livekit/livekit_egress.twirp.go index b2b419706..32c179e8e 100644 --- a/livekit/livekit_egress.twirp.go +++ b/livekit/livekit_egress.twirp.go @@ -28,16 +28,7 @@ const _ = twirp.TwirpPackageMinVersion_8_1_0 type Egress interface { // Unified StartEgress RPC - // rpc StartEgress(StartEgressRequest) returns (EgressInfo); - StartRoomCompositeEgress(context.Context, *RoomCompositeEgressRequest) (*EgressInfo, error) - - StartWebEgress(context.Context, *WebEgressRequest) (*EgressInfo, error) - - StartParticipantEgress(context.Context, *ParticipantEgressRequest) (*EgressInfo, error) - - StartTrackCompositeEgress(context.Context, *TrackCompositeEgressRequest) (*EgressInfo, error) - - StartTrackEgress(context.Context, *TrackEgressRequest) (*EgressInfo, error) + StartEgress(context.Context, *StartEgressRequest) (*EgressInfo, error) // Update url/template or stream outputs // rpc UpdateEgress(UpdateEgressRequest) returns (EgressInfo); @@ -50,6 +41,17 @@ type Egress interface { // Stop a recording or stream StopEgress(context.Context, *StopEgressRequest) (*EgressInfo, error) + + // To be deprecated + StartRoomCompositeEgress(context.Context, *RoomCompositeEgressRequest) (*EgressInfo, error) + + StartWebEgress(context.Context, *WebEgressRequest) (*EgressInfo, error) + + StartParticipantEgress(context.Context, *ParticipantEgressRequest) (*EgressInfo, error) + + StartTrackCompositeEgress(context.Context, *TrackCompositeEgressRequest) (*EgressInfo, error) + + StartTrackEgress(context.Context, *TrackEgressRequest) (*EgressInfo, error) } // ====================== @@ -58,7 +60,7 @@ type Egress interface { type egressProtobufClient struct { client HTTPClient - urls [9]string + urls [10]string interceptor twirp.Interceptor opts twirp.ClientOptions } @@ -86,16 +88,17 @@ func NewEgressProtobufClient(baseURL string, client HTTPClient, opts ...twirp.Cl // Build method URLs: []/./ serviceURL := sanitizeBaseURL(baseURL) serviceURL += baseServicePath(pathPrefix, "livekit", "Egress") - urls := [9]string{ + urls := [10]string{ + serviceURL + "StartEgress", + serviceURL + "UpdateLayout", + serviceURL + "UpdateStream", + serviceURL + "ListEgress", + serviceURL + "StopEgress", serviceURL + "StartRoomCompositeEgress", serviceURL + "StartWebEgress", serviceURL + "StartParticipantEgress", serviceURL + "StartTrackCompositeEgress", serviceURL + "StartTrackEgress", - serviceURL + "UpdateLayout", - serviceURL + "UpdateStream", - serviceURL + "ListEgress", - serviceURL + "StopEgress", } return &egressProtobufClient{ @@ -106,20 +109,20 @@ func NewEgressProtobufClient(baseURL string, client HTTPClient, opts ...twirp.Cl } } -func (c *egressProtobufClient) StartRoomCompositeEgress(ctx context.Context, in *RoomCompositeEgressRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) StartEgress(ctx context.Context, in *StartEgressRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "StartRoomCompositeEgress") - caller := c.callStartRoomCompositeEgress + ctx = ctxsetters.WithMethodName(ctx, "StartEgress") + caller := c.callStartEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *RoomCompositeEgressRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *StartEgressRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*RoomCompositeEgressRequest) + typedReq, ok := req.(*StartEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*RoomCompositeEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*StartEgressRequest) when calling interceptor") } - return c.callStartRoomCompositeEgress(ctx, typedReq) + return c.callStartEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -135,7 +138,7 @@ func (c *egressProtobufClient) StartRoomCompositeEgress(ctx context.Context, in return caller(ctx, in) } -func (c *egressProtobufClient) callStartRoomCompositeEgress(ctx context.Context, in *RoomCompositeEgressRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) callStartEgress(ctx context.Context, in *StartEgressRequest) (*EgressInfo, error) { out := new(EgressInfo) ctx, err := doProtobufRequest(ctx, c.client, c.opts.Hooks, c.urls[0], in, out) if err != nil { @@ -152,20 +155,20 @@ func (c *egressProtobufClient) callStartRoomCompositeEgress(ctx context.Context, return out, nil } -func (c *egressProtobufClient) StartWebEgress(ctx context.Context, in *WebEgressRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) UpdateLayout(ctx context.Context, in *UpdateLayoutRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "StartWebEgress") - caller := c.callStartWebEgress + ctx = ctxsetters.WithMethodName(ctx, "UpdateLayout") + caller := c.callUpdateLayout if c.interceptor != nil { - caller = func(ctx context.Context, req *WebEgressRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *UpdateLayoutRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*WebEgressRequest) + typedReq, ok := req.(*UpdateLayoutRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*WebEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*UpdateLayoutRequest) when calling interceptor") } - return c.callStartWebEgress(ctx, typedReq) + return c.callUpdateLayout(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -181,7 +184,7 @@ func (c *egressProtobufClient) StartWebEgress(ctx context.Context, in *WebEgress return caller(ctx, in) } -func (c *egressProtobufClient) callStartWebEgress(ctx context.Context, in *WebEgressRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) callUpdateLayout(ctx context.Context, in *UpdateLayoutRequest) (*EgressInfo, error) { out := new(EgressInfo) ctx, err := doProtobufRequest(ctx, c.client, c.opts.Hooks, c.urls[1], in, out) if err != nil { @@ -198,20 +201,20 @@ func (c *egressProtobufClient) callStartWebEgress(ctx context.Context, in *WebEg return out, nil } -func (c *egressProtobufClient) StartParticipantEgress(ctx context.Context, in *ParticipantEgressRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) UpdateStream(ctx context.Context, in *UpdateStreamRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "StartParticipantEgress") - caller := c.callStartParticipantEgress + ctx = ctxsetters.WithMethodName(ctx, "UpdateStream") + caller := c.callUpdateStream if c.interceptor != nil { - caller = func(ctx context.Context, req *ParticipantEgressRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *UpdateStreamRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*ParticipantEgressRequest) + typedReq, ok := req.(*UpdateStreamRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*ParticipantEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*UpdateStreamRequest) when calling interceptor") } - return c.callStartParticipantEgress(ctx, typedReq) + return c.callUpdateStream(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -227,7 +230,7 @@ func (c *egressProtobufClient) StartParticipantEgress(ctx context.Context, in *P return caller(ctx, in) } -func (c *egressProtobufClient) callStartParticipantEgress(ctx context.Context, in *ParticipantEgressRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) callUpdateStream(ctx context.Context, in *UpdateStreamRequest) (*EgressInfo, error) { out := new(EgressInfo) ctx, err := doProtobufRequest(ctx, c.client, c.opts.Hooks, c.urls[2], in, out) if err != nil { @@ -244,26 +247,26 @@ func (c *egressProtobufClient) callStartParticipantEgress(ctx context.Context, i return out, nil } -func (c *egressProtobufClient) StartTrackCompositeEgress(ctx context.Context, in *TrackCompositeEgressRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) ListEgress(ctx context.Context, in *ListEgressRequest) (*ListEgressResponse, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "StartTrackCompositeEgress") - caller := c.callStartTrackCompositeEgress + ctx = ctxsetters.WithMethodName(ctx, "ListEgress") + caller := c.callListEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *TrackCompositeEgressRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *ListEgressRequest) (*ListEgressResponse, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*TrackCompositeEgressRequest) + typedReq, ok := req.(*ListEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*TrackCompositeEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*ListEgressRequest) when calling interceptor") } - return c.callStartTrackCompositeEgress(ctx, typedReq) + return c.callListEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { - typedResp, ok := resp.(*EgressInfo) + typedResp, ok := resp.(*ListEgressResponse) if !ok { - return nil, twirp.InternalError("failed type assertion resp.(*EgressInfo) when calling interceptor") + return nil, twirp.InternalError("failed type assertion resp.(*ListEgressResponse) when calling interceptor") } return typedResp, err } @@ -273,8 +276,8 @@ func (c *egressProtobufClient) StartTrackCompositeEgress(ctx context.Context, in return caller(ctx, in) } -func (c *egressProtobufClient) callStartTrackCompositeEgress(ctx context.Context, in *TrackCompositeEgressRequest) (*EgressInfo, error) { - out := new(EgressInfo) +func (c *egressProtobufClient) callListEgress(ctx context.Context, in *ListEgressRequest) (*ListEgressResponse, error) { + out := new(ListEgressResponse) ctx, err := doProtobufRequest(ctx, c.client, c.opts.Hooks, c.urls[3], in, out) if err != nil { twerr, ok := err.(twirp.Error) @@ -290,20 +293,20 @@ func (c *egressProtobufClient) callStartTrackCompositeEgress(ctx context.Context return out, nil } -func (c *egressProtobufClient) StartTrackEgress(ctx context.Context, in *TrackEgressRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) StopEgress(ctx context.Context, in *StopEgressRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "StartTrackEgress") - caller := c.callStartTrackEgress + ctx = ctxsetters.WithMethodName(ctx, "StopEgress") + caller := c.callStopEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *TrackEgressRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *StopEgressRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*TrackEgressRequest) + typedReq, ok := req.(*StopEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*TrackEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*StopEgressRequest) when calling interceptor") } - return c.callStartTrackEgress(ctx, typedReq) + return c.callStopEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -319,7 +322,7 @@ func (c *egressProtobufClient) StartTrackEgress(ctx context.Context, in *TrackEg return caller(ctx, in) } -func (c *egressProtobufClient) callStartTrackEgress(ctx context.Context, in *TrackEgressRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) callStopEgress(ctx context.Context, in *StopEgressRequest) (*EgressInfo, error) { out := new(EgressInfo) ctx, err := doProtobufRequest(ctx, c.client, c.opts.Hooks, c.urls[4], in, out) if err != nil { @@ -336,20 +339,20 @@ func (c *egressProtobufClient) callStartTrackEgress(ctx context.Context, in *Tra return out, nil } -func (c *egressProtobufClient) UpdateLayout(ctx context.Context, in *UpdateLayoutRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) StartRoomCompositeEgress(ctx context.Context, in *RoomCompositeEgressRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "UpdateLayout") - caller := c.callUpdateLayout + ctx = ctxsetters.WithMethodName(ctx, "StartRoomCompositeEgress") + caller := c.callStartRoomCompositeEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *UpdateLayoutRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *RoomCompositeEgressRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*UpdateLayoutRequest) + typedReq, ok := req.(*RoomCompositeEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*UpdateLayoutRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*RoomCompositeEgressRequest) when calling interceptor") } - return c.callUpdateLayout(ctx, typedReq) + return c.callStartRoomCompositeEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -365,7 +368,7 @@ func (c *egressProtobufClient) UpdateLayout(ctx context.Context, in *UpdateLayou return caller(ctx, in) } -func (c *egressProtobufClient) callUpdateLayout(ctx context.Context, in *UpdateLayoutRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) callStartRoomCompositeEgress(ctx context.Context, in *RoomCompositeEgressRequest) (*EgressInfo, error) { out := new(EgressInfo) ctx, err := doProtobufRequest(ctx, c.client, c.opts.Hooks, c.urls[5], in, out) if err != nil { @@ -382,20 +385,20 @@ func (c *egressProtobufClient) callUpdateLayout(ctx context.Context, in *UpdateL return out, nil } -func (c *egressProtobufClient) UpdateStream(ctx context.Context, in *UpdateStreamRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) StartWebEgress(ctx context.Context, in *WebEgressRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "UpdateStream") - caller := c.callUpdateStream + ctx = ctxsetters.WithMethodName(ctx, "StartWebEgress") + caller := c.callStartWebEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *UpdateStreamRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *WebEgressRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*UpdateStreamRequest) + typedReq, ok := req.(*WebEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*UpdateStreamRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*WebEgressRequest) when calling interceptor") } - return c.callUpdateStream(ctx, typedReq) + return c.callStartWebEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -411,7 +414,7 @@ func (c *egressProtobufClient) UpdateStream(ctx context.Context, in *UpdateStrea return caller(ctx, in) } -func (c *egressProtobufClient) callUpdateStream(ctx context.Context, in *UpdateStreamRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) callStartWebEgress(ctx context.Context, in *WebEgressRequest) (*EgressInfo, error) { out := new(EgressInfo) ctx, err := doProtobufRequest(ctx, c.client, c.opts.Hooks, c.urls[6], in, out) if err != nil { @@ -428,26 +431,26 @@ func (c *egressProtobufClient) callUpdateStream(ctx context.Context, in *UpdateS return out, nil } -func (c *egressProtobufClient) ListEgress(ctx context.Context, in *ListEgressRequest) (*ListEgressResponse, error) { +func (c *egressProtobufClient) StartParticipantEgress(ctx context.Context, in *ParticipantEgressRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "ListEgress") - caller := c.callListEgress + ctx = ctxsetters.WithMethodName(ctx, "StartParticipantEgress") + caller := c.callStartParticipantEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *ListEgressRequest) (*ListEgressResponse, error) { + caller = func(ctx context.Context, req *ParticipantEgressRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*ListEgressRequest) + typedReq, ok := req.(*ParticipantEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*ListEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*ParticipantEgressRequest) when calling interceptor") } - return c.callListEgress(ctx, typedReq) + return c.callStartParticipantEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { - typedResp, ok := resp.(*ListEgressResponse) + typedResp, ok := resp.(*EgressInfo) if !ok { - return nil, twirp.InternalError("failed type assertion resp.(*ListEgressResponse) when calling interceptor") + return nil, twirp.InternalError("failed type assertion resp.(*EgressInfo) when calling interceptor") } return typedResp, err } @@ -457,8 +460,8 @@ func (c *egressProtobufClient) ListEgress(ctx context.Context, in *ListEgressReq return caller(ctx, in) } -func (c *egressProtobufClient) callListEgress(ctx context.Context, in *ListEgressRequest) (*ListEgressResponse, error) { - out := new(ListEgressResponse) +func (c *egressProtobufClient) callStartParticipantEgress(ctx context.Context, in *ParticipantEgressRequest) (*EgressInfo, error) { + out := new(EgressInfo) ctx, err := doProtobufRequest(ctx, c.client, c.opts.Hooks, c.urls[7], in, out) if err != nil { twerr, ok := err.(twirp.Error) @@ -474,20 +477,20 @@ func (c *egressProtobufClient) callListEgress(ctx context.Context, in *ListEgres return out, nil } -func (c *egressProtobufClient) StopEgress(ctx context.Context, in *StopEgressRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) StartTrackCompositeEgress(ctx context.Context, in *TrackCompositeEgressRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "StopEgress") - caller := c.callStopEgress + ctx = ctxsetters.WithMethodName(ctx, "StartTrackCompositeEgress") + caller := c.callStartTrackCompositeEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *StopEgressRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *TrackCompositeEgressRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*StopEgressRequest) + typedReq, ok := req.(*TrackCompositeEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*StopEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*TrackCompositeEgressRequest) when calling interceptor") } - return c.callStopEgress(ctx, typedReq) + return c.callStartTrackCompositeEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -503,7 +506,7 @@ func (c *egressProtobufClient) StopEgress(ctx context.Context, in *StopEgressReq return caller(ctx, in) } -func (c *egressProtobufClient) callStopEgress(ctx context.Context, in *StopEgressRequest) (*EgressInfo, error) { +func (c *egressProtobufClient) callStartTrackCompositeEgress(ctx context.Context, in *TrackCompositeEgressRequest) (*EgressInfo, error) { out := new(EgressInfo) ctx, err := doProtobufRequest(ctx, c.client, c.opts.Hooks, c.urls[8], in, out) if err != nil { @@ -520,13 +523,59 @@ func (c *egressProtobufClient) callStopEgress(ctx context.Context, in *StopEgres return out, nil } +func (c *egressProtobufClient) StartTrackEgress(ctx context.Context, in *TrackEgressRequest) (*EgressInfo, error) { + ctx = ctxsetters.WithPackageName(ctx, "livekit") + ctx = ctxsetters.WithServiceName(ctx, "Egress") + ctx = ctxsetters.WithMethodName(ctx, "StartTrackEgress") + caller := c.callStartTrackEgress + if c.interceptor != nil { + caller = func(ctx context.Context, req *TrackEgressRequest) (*EgressInfo, error) { + resp, err := c.interceptor( + func(ctx context.Context, req interface{}) (interface{}, error) { + typedReq, ok := req.(*TrackEgressRequest) + if !ok { + return nil, twirp.InternalError("failed type assertion req.(*TrackEgressRequest) when calling interceptor") + } + return c.callStartTrackEgress(ctx, typedReq) + }, + )(ctx, req) + if resp != nil { + typedResp, ok := resp.(*EgressInfo) + if !ok { + return nil, twirp.InternalError("failed type assertion resp.(*EgressInfo) when calling interceptor") + } + return typedResp, err + } + return nil, err + } + } + return caller(ctx, in) +} + +func (c *egressProtobufClient) callStartTrackEgress(ctx context.Context, in *TrackEgressRequest) (*EgressInfo, error) { + out := new(EgressInfo) + ctx, err := doProtobufRequest(ctx, c.client, c.opts.Hooks, c.urls[9], in, out) + if err != nil { + twerr, ok := err.(twirp.Error) + if !ok { + twerr = twirp.InternalErrorWith(err) + } + callClientError(ctx, c.opts.Hooks, twerr) + return nil, err + } + + callClientResponseReceived(ctx, c.opts.Hooks) + + return out, nil +} + // ================== // Egress JSON Client // ================== type egressJSONClient struct { client HTTPClient - urls [9]string + urls [10]string interceptor twirp.Interceptor opts twirp.ClientOptions } @@ -554,16 +603,17 @@ func NewEgressJSONClient(baseURL string, client HTTPClient, opts ...twirp.Client // Build method URLs: []/./ serviceURL := sanitizeBaseURL(baseURL) serviceURL += baseServicePath(pathPrefix, "livekit", "Egress") - urls := [9]string{ + urls := [10]string{ + serviceURL + "StartEgress", + serviceURL + "UpdateLayout", + serviceURL + "UpdateStream", + serviceURL + "ListEgress", + serviceURL + "StopEgress", serviceURL + "StartRoomCompositeEgress", serviceURL + "StartWebEgress", serviceURL + "StartParticipantEgress", serviceURL + "StartTrackCompositeEgress", serviceURL + "StartTrackEgress", - serviceURL + "UpdateLayout", - serviceURL + "UpdateStream", - serviceURL + "ListEgress", - serviceURL + "StopEgress", } return &egressJSONClient{ @@ -574,20 +624,20 @@ func NewEgressJSONClient(baseURL string, client HTTPClient, opts ...twirp.Client } } -func (c *egressJSONClient) StartRoomCompositeEgress(ctx context.Context, in *RoomCompositeEgressRequest) (*EgressInfo, error) { +func (c *egressJSONClient) StartEgress(ctx context.Context, in *StartEgressRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "StartRoomCompositeEgress") - caller := c.callStartRoomCompositeEgress + ctx = ctxsetters.WithMethodName(ctx, "StartEgress") + caller := c.callStartEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *RoomCompositeEgressRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *StartEgressRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*RoomCompositeEgressRequest) + typedReq, ok := req.(*StartEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*RoomCompositeEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*StartEgressRequest) when calling interceptor") } - return c.callStartRoomCompositeEgress(ctx, typedReq) + return c.callStartEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -603,7 +653,7 @@ func (c *egressJSONClient) StartRoomCompositeEgress(ctx context.Context, in *Roo return caller(ctx, in) } -func (c *egressJSONClient) callStartRoomCompositeEgress(ctx context.Context, in *RoomCompositeEgressRequest) (*EgressInfo, error) { +func (c *egressJSONClient) callStartEgress(ctx context.Context, in *StartEgressRequest) (*EgressInfo, error) { out := new(EgressInfo) ctx, err := doJSONRequest(ctx, c.client, c.opts.Hooks, c.urls[0], in, out) if err != nil { @@ -620,20 +670,20 @@ func (c *egressJSONClient) callStartRoomCompositeEgress(ctx context.Context, in return out, nil } -func (c *egressJSONClient) StartWebEgress(ctx context.Context, in *WebEgressRequest) (*EgressInfo, error) { +func (c *egressJSONClient) UpdateLayout(ctx context.Context, in *UpdateLayoutRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "StartWebEgress") - caller := c.callStartWebEgress + ctx = ctxsetters.WithMethodName(ctx, "UpdateLayout") + caller := c.callUpdateLayout if c.interceptor != nil { - caller = func(ctx context.Context, req *WebEgressRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *UpdateLayoutRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*WebEgressRequest) + typedReq, ok := req.(*UpdateLayoutRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*WebEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*UpdateLayoutRequest) when calling interceptor") } - return c.callStartWebEgress(ctx, typedReq) + return c.callUpdateLayout(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -649,7 +699,7 @@ func (c *egressJSONClient) StartWebEgress(ctx context.Context, in *WebEgressRequ return caller(ctx, in) } -func (c *egressJSONClient) callStartWebEgress(ctx context.Context, in *WebEgressRequest) (*EgressInfo, error) { +func (c *egressJSONClient) callUpdateLayout(ctx context.Context, in *UpdateLayoutRequest) (*EgressInfo, error) { out := new(EgressInfo) ctx, err := doJSONRequest(ctx, c.client, c.opts.Hooks, c.urls[1], in, out) if err != nil { @@ -666,20 +716,20 @@ func (c *egressJSONClient) callStartWebEgress(ctx context.Context, in *WebEgress return out, nil } -func (c *egressJSONClient) StartParticipantEgress(ctx context.Context, in *ParticipantEgressRequest) (*EgressInfo, error) { +func (c *egressJSONClient) UpdateStream(ctx context.Context, in *UpdateStreamRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "StartParticipantEgress") - caller := c.callStartParticipantEgress + ctx = ctxsetters.WithMethodName(ctx, "UpdateStream") + caller := c.callUpdateStream if c.interceptor != nil { - caller = func(ctx context.Context, req *ParticipantEgressRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *UpdateStreamRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*ParticipantEgressRequest) + typedReq, ok := req.(*UpdateStreamRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*ParticipantEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*UpdateStreamRequest) when calling interceptor") } - return c.callStartParticipantEgress(ctx, typedReq) + return c.callUpdateStream(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -695,7 +745,7 @@ func (c *egressJSONClient) StartParticipantEgress(ctx context.Context, in *Parti return caller(ctx, in) } -func (c *egressJSONClient) callStartParticipantEgress(ctx context.Context, in *ParticipantEgressRequest) (*EgressInfo, error) { +func (c *egressJSONClient) callUpdateStream(ctx context.Context, in *UpdateStreamRequest) (*EgressInfo, error) { out := new(EgressInfo) ctx, err := doJSONRequest(ctx, c.client, c.opts.Hooks, c.urls[2], in, out) if err != nil { @@ -712,26 +762,26 @@ func (c *egressJSONClient) callStartParticipantEgress(ctx context.Context, in *P return out, nil } -func (c *egressJSONClient) StartTrackCompositeEgress(ctx context.Context, in *TrackCompositeEgressRequest) (*EgressInfo, error) { +func (c *egressJSONClient) ListEgress(ctx context.Context, in *ListEgressRequest) (*ListEgressResponse, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "StartTrackCompositeEgress") - caller := c.callStartTrackCompositeEgress + ctx = ctxsetters.WithMethodName(ctx, "ListEgress") + caller := c.callListEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *TrackCompositeEgressRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *ListEgressRequest) (*ListEgressResponse, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*TrackCompositeEgressRequest) + typedReq, ok := req.(*ListEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*TrackCompositeEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*ListEgressRequest) when calling interceptor") } - return c.callStartTrackCompositeEgress(ctx, typedReq) + return c.callListEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { - typedResp, ok := resp.(*EgressInfo) + typedResp, ok := resp.(*ListEgressResponse) if !ok { - return nil, twirp.InternalError("failed type assertion resp.(*EgressInfo) when calling interceptor") + return nil, twirp.InternalError("failed type assertion resp.(*ListEgressResponse) when calling interceptor") } return typedResp, err } @@ -741,8 +791,8 @@ func (c *egressJSONClient) StartTrackCompositeEgress(ctx context.Context, in *Tr return caller(ctx, in) } -func (c *egressJSONClient) callStartTrackCompositeEgress(ctx context.Context, in *TrackCompositeEgressRequest) (*EgressInfo, error) { - out := new(EgressInfo) +func (c *egressJSONClient) callListEgress(ctx context.Context, in *ListEgressRequest) (*ListEgressResponse, error) { + out := new(ListEgressResponse) ctx, err := doJSONRequest(ctx, c.client, c.opts.Hooks, c.urls[3], in, out) if err != nil { twerr, ok := err.(twirp.Error) @@ -758,20 +808,20 @@ func (c *egressJSONClient) callStartTrackCompositeEgress(ctx context.Context, in return out, nil } -func (c *egressJSONClient) StartTrackEgress(ctx context.Context, in *TrackEgressRequest) (*EgressInfo, error) { +func (c *egressJSONClient) StopEgress(ctx context.Context, in *StopEgressRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "StartTrackEgress") - caller := c.callStartTrackEgress + ctx = ctxsetters.WithMethodName(ctx, "StopEgress") + caller := c.callStopEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *TrackEgressRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *StopEgressRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*TrackEgressRequest) + typedReq, ok := req.(*StopEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*TrackEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*StopEgressRequest) when calling interceptor") } - return c.callStartTrackEgress(ctx, typedReq) + return c.callStopEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -787,7 +837,7 @@ func (c *egressJSONClient) StartTrackEgress(ctx context.Context, in *TrackEgress return caller(ctx, in) } -func (c *egressJSONClient) callStartTrackEgress(ctx context.Context, in *TrackEgressRequest) (*EgressInfo, error) { +func (c *egressJSONClient) callStopEgress(ctx context.Context, in *StopEgressRequest) (*EgressInfo, error) { out := new(EgressInfo) ctx, err := doJSONRequest(ctx, c.client, c.opts.Hooks, c.urls[4], in, out) if err != nil { @@ -804,20 +854,20 @@ func (c *egressJSONClient) callStartTrackEgress(ctx context.Context, in *TrackEg return out, nil } -func (c *egressJSONClient) UpdateLayout(ctx context.Context, in *UpdateLayoutRequest) (*EgressInfo, error) { +func (c *egressJSONClient) StartRoomCompositeEgress(ctx context.Context, in *RoomCompositeEgressRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "UpdateLayout") - caller := c.callUpdateLayout + ctx = ctxsetters.WithMethodName(ctx, "StartRoomCompositeEgress") + caller := c.callStartRoomCompositeEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *UpdateLayoutRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *RoomCompositeEgressRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*UpdateLayoutRequest) + typedReq, ok := req.(*RoomCompositeEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*UpdateLayoutRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*RoomCompositeEgressRequest) when calling interceptor") } - return c.callUpdateLayout(ctx, typedReq) + return c.callStartRoomCompositeEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -833,7 +883,7 @@ func (c *egressJSONClient) UpdateLayout(ctx context.Context, in *UpdateLayoutReq return caller(ctx, in) } -func (c *egressJSONClient) callUpdateLayout(ctx context.Context, in *UpdateLayoutRequest) (*EgressInfo, error) { +func (c *egressJSONClient) callStartRoomCompositeEgress(ctx context.Context, in *RoomCompositeEgressRequest) (*EgressInfo, error) { out := new(EgressInfo) ctx, err := doJSONRequest(ctx, c.client, c.opts.Hooks, c.urls[5], in, out) if err != nil { @@ -850,20 +900,20 @@ func (c *egressJSONClient) callUpdateLayout(ctx context.Context, in *UpdateLayou return out, nil } -func (c *egressJSONClient) UpdateStream(ctx context.Context, in *UpdateStreamRequest) (*EgressInfo, error) { +func (c *egressJSONClient) StartWebEgress(ctx context.Context, in *WebEgressRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "UpdateStream") - caller := c.callUpdateStream + ctx = ctxsetters.WithMethodName(ctx, "StartWebEgress") + caller := c.callStartWebEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *UpdateStreamRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *WebEgressRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*UpdateStreamRequest) + typedReq, ok := req.(*WebEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*UpdateStreamRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*WebEgressRequest) when calling interceptor") } - return c.callUpdateStream(ctx, typedReq) + return c.callStartWebEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -879,7 +929,7 @@ func (c *egressJSONClient) UpdateStream(ctx context.Context, in *UpdateStreamReq return caller(ctx, in) } -func (c *egressJSONClient) callUpdateStream(ctx context.Context, in *UpdateStreamRequest) (*EgressInfo, error) { +func (c *egressJSONClient) callStartWebEgress(ctx context.Context, in *WebEgressRequest) (*EgressInfo, error) { out := new(EgressInfo) ctx, err := doJSONRequest(ctx, c.client, c.opts.Hooks, c.urls[6], in, out) if err != nil { @@ -896,26 +946,26 @@ func (c *egressJSONClient) callUpdateStream(ctx context.Context, in *UpdateStrea return out, nil } -func (c *egressJSONClient) ListEgress(ctx context.Context, in *ListEgressRequest) (*ListEgressResponse, error) { +func (c *egressJSONClient) StartParticipantEgress(ctx context.Context, in *ParticipantEgressRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "ListEgress") - caller := c.callListEgress + ctx = ctxsetters.WithMethodName(ctx, "StartParticipantEgress") + caller := c.callStartParticipantEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *ListEgressRequest) (*ListEgressResponse, error) { + caller = func(ctx context.Context, req *ParticipantEgressRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*ListEgressRequest) + typedReq, ok := req.(*ParticipantEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*ListEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*ParticipantEgressRequest) when calling interceptor") } - return c.callListEgress(ctx, typedReq) + return c.callStartParticipantEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { - typedResp, ok := resp.(*ListEgressResponse) + typedResp, ok := resp.(*EgressInfo) if !ok { - return nil, twirp.InternalError("failed type assertion resp.(*ListEgressResponse) when calling interceptor") + return nil, twirp.InternalError("failed type assertion resp.(*EgressInfo) when calling interceptor") } return typedResp, err } @@ -925,8 +975,8 @@ func (c *egressJSONClient) ListEgress(ctx context.Context, in *ListEgressRequest return caller(ctx, in) } -func (c *egressJSONClient) callListEgress(ctx context.Context, in *ListEgressRequest) (*ListEgressResponse, error) { - out := new(ListEgressResponse) +func (c *egressJSONClient) callStartParticipantEgress(ctx context.Context, in *ParticipantEgressRequest) (*EgressInfo, error) { + out := new(EgressInfo) ctx, err := doJSONRequest(ctx, c.client, c.opts.Hooks, c.urls[7], in, out) if err != nil { twerr, ok := err.(twirp.Error) @@ -942,20 +992,20 @@ func (c *egressJSONClient) callListEgress(ctx context.Context, in *ListEgressReq return out, nil } -func (c *egressJSONClient) StopEgress(ctx context.Context, in *StopEgressRequest) (*EgressInfo, error) { +func (c *egressJSONClient) StartTrackCompositeEgress(ctx context.Context, in *TrackCompositeEgressRequest) (*EgressInfo, error) { ctx = ctxsetters.WithPackageName(ctx, "livekit") ctx = ctxsetters.WithServiceName(ctx, "Egress") - ctx = ctxsetters.WithMethodName(ctx, "StopEgress") - caller := c.callStopEgress + ctx = ctxsetters.WithMethodName(ctx, "StartTrackCompositeEgress") + caller := c.callStartTrackCompositeEgress if c.interceptor != nil { - caller = func(ctx context.Context, req *StopEgressRequest) (*EgressInfo, error) { + caller = func(ctx context.Context, req *TrackCompositeEgressRequest) (*EgressInfo, error) { resp, err := c.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*StopEgressRequest) + typedReq, ok := req.(*TrackCompositeEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*StopEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*TrackCompositeEgressRequest) when calling interceptor") } - return c.callStopEgress(ctx, typedReq) + return c.callStartTrackCompositeEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -971,7 +1021,7 @@ func (c *egressJSONClient) StopEgress(ctx context.Context, in *StopEgressRequest return caller(ctx, in) } -func (c *egressJSONClient) callStopEgress(ctx context.Context, in *StopEgressRequest) (*EgressInfo, error) { +func (c *egressJSONClient) callStartTrackCompositeEgress(ctx context.Context, in *TrackCompositeEgressRequest) (*EgressInfo, error) { out := new(EgressInfo) ctx, err := doJSONRequest(ctx, c.client, c.opts.Hooks, c.urls[8], in, out) if err != nil { @@ -988,6 +1038,52 @@ func (c *egressJSONClient) callStopEgress(ctx context.Context, in *StopEgressReq return out, nil } +func (c *egressJSONClient) StartTrackEgress(ctx context.Context, in *TrackEgressRequest) (*EgressInfo, error) { + ctx = ctxsetters.WithPackageName(ctx, "livekit") + ctx = ctxsetters.WithServiceName(ctx, "Egress") + ctx = ctxsetters.WithMethodName(ctx, "StartTrackEgress") + caller := c.callStartTrackEgress + if c.interceptor != nil { + caller = func(ctx context.Context, req *TrackEgressRequest) (*EgressInfo, error) { + resp, err := c.interceptor( + func(ctx context.Context, req interface{}) (interface{}, error) { + typedReq, ok := req.(*TrackEgressRequest) + if !ok { + return nil, twirp.InternalError("failed type assertion req.(*TrackEgressRequest) when calling interceptor") + } + return c.callStartTrackEgress(ctx, typedReq) + }, + )(ctx, req) + if resp != nil { + typedResp, ok := resp.(*EgressInfo) + if !ok { + return nil, twirp.InternalError("failed type assertion resp.(*EgressInfo) when calling interceptor") + } + return typedResp, err + } + return nil, err + } + } + return caller(ctx, in) +} + +func (c *egressJSONClient) callStartTrackEgress(ctx context.Context, in *TrackEgressRequest) (*EgressInfo, error) { + out := new(EgressInfo) + ctx, err := doJSONRequest(ctx, c.client, c.opts.Hooks, c.urls[9], in, out) + if err != nil { + twerr, ok := err.(twirp.Error) + if !ok { + twerr = twirp.InternalErrorWith(err) + } + callClientError(ctx, c.opts.Hooks, twerr) + return nil, err + } + + callClientResponseReceived(ctx, c.opts.Hooks) + + return out, nil +} + // ===================== // Egress Server Handler // ===================== @@ -1085,6 +1181,21 @@ func (s *egressServer) ServeHTTP(resp http.ResponseWriter, req *http.Request) { } switch method { + case "StartEgress": + s.serveStartEgress(ctx, resp, req) + return + case "UpdateLayout": + s.serveUpdateLayout(ctx, resp, req) + return + case "UpdateStream": + s.serveUpdateStream(ctx, resp, req) + return + case "ListEgress": + s.serveListEgress(ctx, resp, req) + return + case "StopEgress": + s.serveStopEgress(ctx, resp, req) + return case "StartRoomCompositeEgress": s.serveStartRoomCompositeEgress(ctx, resp, req) return @@ -1100,18 +1211,6 @@ func (s *egressServer) ServeHTTP(resp http.ResponseWriter, req *http.Request) { case "StartTrackEgress": s.serveStartTrackEgress(ctx, resp, req) return - case "UpdateLayout": - s.serveUpdateLayout(ctx, resp, req) - return - case "UpdateStream": - s.serveUpdateStream(ctx, resp, req) - return - case "ListEgress": - s.serveListEgress(ctx, resp, req) - return - case "StopEgress": - s.serveStopEgress(ctx, resp, req) - return default: msg := fmt.Sprintf("no handler for path %q", req.URL.Path) s.writeError(ctx, resp, badRouteError(msg, req.Method, req.URL.Path)) @@ -1119,7 +1218,7 @@ func (s *egressServer) ServeHTTP(resp http.ResponseWriter, req *http.Request) { } } -func (s *egressServer) serveStartRoomCompositeEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { header := req.Header.Get("Content-Type") i := strings.Index(header, ";") if i == -1 { @@ -1127,9 +1226,9 @@ func (s *egressServer) serveStartRoomCompositeEgress(ctx context.Context, resp h } switch strings.TrimSpace(strings.ToLower(header[:i])) { case "application/json": - s.serveStartRoomCompositeEgressJSON(ctx, resp, req) + s.serveStartEgressJSON(ctx, resp, req) case "application/protobuf": - s.serveStartRoomCompositeEgressProtobuf(ctx, resp, req) + s.serveStartEgressProtobuf(ctx, resp, req) default: msg := fmt.Sprintf("unexpected Content-Type: %q", req.Header.Get("Content-Type")) twerr := badRouteError(msg, req.Method, req.URL.Path) @@ -1137,9 +1236,9 @@ func (s *egressServer) serveStartRoomCompositeEgress(ctx context.Context, resp h } } -func (s *egressServer) serveStartRoomCompositeEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "StartRoomCompositeEgress") + ctx = ctxsetters.WithMethodName(ctx, "StartEgress") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -1152,23 +1251,23 @@ func (s *egressServer) serveStartRoomCompositeEgressJSON(ctx context.Context, re s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - reqContent := new(RoomCompositeEgressRequest) + reqContent := new(StartEgressRequest) unmarshaler := protojson.UnmarshalOptions{DiscardUnknown: true} if err = unmarshaler.Unmarshal(rawReqBody, reqContent); err != nil { s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - handler := s.Egress.StartRoomCompositeEgress + handler := s.Egress.StartEgress if s.interceptor != nil { - handler = func(ctx context.Context, req *RoomCompositeEgressRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *StartEgressRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*RoomCompositeEgressRequest) + typedReq, ok := req.(*StartEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*RoomCompositeEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*StartEgressRequest) when calling interceptor") } - return s.Egress.StartRoomCompositeEgress(ctx, typedReq) + return s.Egress.StartEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -1194,7 +1293,7 @@ func (s *egressServer) serveStartRoomCompositeEgressJSON(ctx context.Context, re return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartRoomCompositeEgress. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartEgress. nil responses are not supported")) return } @@ -1220,9 +1319,9 @@ func (s *egressServer) serveStartRoomCompositeEgressJSON(ctx context.Context, re callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveStartRoomCompositeEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "StartRoomCompositeEgress") + ctx = ctxsetters.WithMethodName(ctx, "StartEgress") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -1234,22 +1333,22 @@ func (s *egressServer) serveStartRoomCompositeEgressProtobuf(ctx context.Context s.handleRequestBodyError(ctx, resp, "failed to read request body", err) return } - reqContent := new(RoomCompositeEgressRequest) + reqContent := new(StartEgressRequest) if err = proto.Unmarshal(buf, reqContent); err != nil { s.writeError(ctx, resp, malformedRequestError("the protobuf request could not be decoded")) return } - handler := s.Egress.StartRoomCompositeEgress + handler := s.Egress.StartEgress if s.interceptor != nil { - handler = func(ctx context.Context, req *RoomCompositeEgressRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *StartEgressRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*RoomCompositeEgressRequest) + typedReq, ok := req.(*StartEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*RoomCompositeEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*StartEgressRequest) when calling interceptor") } - return s.Egress.StartRoomCompositeEgress(ctx, typedReq) + return s.Egress.StartEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -1275,7 +1374,7 @@ func (s *egressServer) serveStartRoomCompositeEgressProtobuf(ctx context.Context return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartRoomCompositeEgress. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartEgress. nil responses are not supported")) return } @@ -1299,7 +1398,7 @@ func (s *egressServer) serveStartRoomCompositeEgressProtobuf(ctx context.Context callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveStartWebEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveUpdateLayout(ctx context.Context, resp http.ResponseWriter, req *http.Request) { header := req.Header.Get("Content-Type") i := strings.Index(header, ";") if i == -1 { @@ -1307,9 +1406,9 @@ func (s *egressServer) serveStartWebEgress(ctx context.Context, resp http.Respon } switch strings.TrimSpace(strings.ToLower(header[:i])) { case "application/json": - s.serveStartWebEgressJSON(ctx, resp, req) + s.serveUpdateLayoutJSON(ctx, resp, req) case "application/protobuf": - s.serveStartWebEgressProtobuf(ctx, resp, req) + s.serveUpdateLayoutProtobuf(ctx, resp, req) default: msg := fmt.Sprintf("unexpected Content-Type: %q", req.Header.Get("Content-Type")) twerr := badRouteError(msg, req.Method, req.URL.Path) @@ -1317,9 +1416,9 @@ func (s *egressServer) serveStartWebEgress(ctx context.Context, resp http.Respon } } -func (s *egressServer) serveStartWebEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveUpdateLayoutJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "StartWebEgress") + ctx = ctxsetters.WithMethodName(ctx, "UpdateLayout") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -1332,23 +1431,23 @@ func (s *egressServer) serveStartWebEgressJSON(ctx context.Context, resp http.Re s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - reqContent := new(WebEgressRequest) + reqContent := new(UpdateLayoutRequest) unmarshaler := protojson.UnmarshalOptions{DiscardUnknown: true} if err = unmarshaler.Unmarshal(rawReqBody, reqContent); err != nil { s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - handler := s.Egress.StartWebEgress + handler := s.Egress.UpdateLayout if s.interceptor != nil { - handler = func(ctx context.Context, req *WebEgressRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *UpdateLayoutRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*WebEgressRequest) + typedReq, ok := req.(*UpdateLayoutRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*WebEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*UpdateLayoutRequest) when calling interceptor") } - return s.Egress.StartWebEgress(ctx, typedReq) + return s.Egress.UpdateLayout(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -1374,7 +1473,7 @@ func (s *egressServer) serveStartWebEgressJSON(ctx context.Context, resp http.Re return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartWebEgress. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling UpdateLayout. nil responses are not supported")) return } @@ -1400,9 +1499,9 @@ func (s *egressServer) serveStartWebEgressJSON(ctx context.Context, resp http.Re callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveStartWebEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveUpdateLayoutProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "StartWebEgress") + ctx = ctxsetters.WithMethodName(ctx, "UpdateLayout") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -1414,22 +1513,22 @@ func (s *egressServer) serveStartWebEgressProtobuf(ctx context.Context, resp htt s.handleRequestBodyError(ctx, resp, "failed to read request body", err) return } - reqContent := new(WebEgressRequest) + reqContent := new(UpdateLayoutRequest) if err = proto.Unmarshal(buf, reqContent); err != nil { s.writeError(ctx, resp, malformedRequestError("the protobuf request could not be decoded")) return } - handler := s.Egress.StartWebEgress + handler := s.Egress.UpdateLayout if s.interceptor != nil { - handler = func(ctx context.Context, req *WebEgressRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *UpdateLayoutRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*WebEgressRequest) + typedReq, ok := req.(*UpdateLayoutRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*WebEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*UpdateLayoutRequest) when calling interceptor") } - return s.Egress.StartWebEgress(ctx, typedReq) + return s.Egress.UpdateLayout(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -1455,7 +1554,7 @@ func (s *egressServer) serveStartWebEgressProtobuf(ctx context.Context, resp htt return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartWebEgress. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling UpdateLayout. nil responses are not supported")) return } @@ -1479,7 +1578,7 @@ func (s *egressServer) serveStartWebEgressProtobuf(ctx context.Context, resp htt callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveStartParticipantEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveUpdateStream(ctx context.Context, resp http.ResponseWriter, req *http.Request) { header := req.Header.Get("Content-Type") i := strings.Index(header, ";") if i == -1 { @@ -1487,9 +1586,9 @@ func (s *egressServer) serveStartParticipantEgress(ctx context.Context, resp htt } switch strings.TrimSpace(strings.ToLower(header[:i])) { case "application/json": - s.serveStartParticipantEgressJSON(ctx, resp, req) + s.serveUpdateStreamJSON(ctx, resp, req) case "application/protobuf": - s.serveStartParticipantEgressProtobuf(ctx, resp, req) + s.serveUpdateStreamProtobuf(ctx, resp, req) default: msg := fmt.Sprintf("unexpected Content-Type: %q", req.Header.Get("Content-Type")) twerr := badRouteError(msg, req.Method, req.URL.Path) @@ -1497,9 +1596,9 @@ func (s *egressServer) serveStartParticipantEgress(ctx context.Context, resp htt } } -func (s *egressServer) serveStartParticipantEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveUpdateStreamJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "StartParticipantEgress") + ctx = ctxsetters.WithMethodName(ctx, "UpdateStream") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -1512,23 +1611,23 @@ func (s *egressServer) serveStartParticipantEgressJSON(ctx context.Context, resp s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - reqContent := new(ParticipantEgressRequest) + reqContent := new(UpdateStreamRequest) unmarshaler := protojson.UnmarshalOptions{DiscardUnknown: true} if err = unmarshaler.Unmarshal(rawReqBody, reqContent); err != nil { s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - handler := s.Egress.StartParticipantEgress + handler := s.Egress.UpdateStream if s.interceptor != nil { - handler = func(ctx context.Context, req *ParticipantEgressRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *UpdateStreamRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*ParticipantEgressRequest) + typedReq, ok := req.(*UpdateStreamRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*ParticipantEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*UpdateStreamRequest) when calling interceptor") } - return s.Egress.StartParticipantEgress(ctx, typedReq) + return s.Egress.UpdateStream(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -1554,7 +1653,7 @@ func (s *egressServer) serveStartParticipantEgressJSON(ctx context.Context, resp return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartParticipantEgress. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling UpdateStream. nil responses are not supported")) return } @@ -1580,9 +1679,9 @@ func (s *egressServer) serveStartParticipantEgressJSON(ctx context.Context, resp callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveStartParticipantEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveUpdateStreamProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "StartParticipantEgress") + ctx = ctxsetters.WithMethodName(ctx, "UpdateStream") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -1594,22 +1693,22 @@ func (s *egressServer) serveStartParticipantEgressProtobuf(ctx context.Context, s.handleRequestBodyError(ctx, resp, "failed to read request body", err) return } - reqContent := new(ParticipantEgressRequest) + reqContent := new(UpdateStreamRequest) if err = proto.Unmarshal(buf, reqContent); err != nil { s.writeError(ctx, resp, malformedRequestError("the protobuf request could not be decoded")) return } - handler := s.Egress.StartParticipantEgress + handler := s.Egress.UpdateStream if s.interceptor != nil { - handler = func(ctx context.Context, req *ParticipantEgressRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *UpdateStreamRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*ParticipantEgressRequest) + typedReq, ok := req.(*UpdateStreamRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*ParticipantEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*UpdateStreamRequest) when calling interceptor") } - return s.Egress.StartParticipantEgress(ctx, typedReq) + return s.Egress.UpdateStream(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -1635,7 +1734,7 @@ func (s *egressServer) serveStartParticipantEgressProtobuf(ctx context.Context, return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartParticipantEgress. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling UpdateStream. nil responses are not supported")) return } @@ -1659,7 +1758,7 @@ func (s *egressServer) serveStartParticipantEgressProtobuf(ctx context.Context, callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveStartTrackCompositeEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveListEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { header := req.Header.Get("Content-Type") i := strings.Index(header, ";") if i == -1 { @@ -1667,9 +1766,9 @@ func (s *egressServer) serveStartTrackCompositeEgress(ctx context.Context, resp } switch strings.TrimSpace(strings.ToLower(header[:i])) { case "application/json": - s.serveStartTrackCompositeEgressJSON(ctx, resp, req) + s.serveListEgressJSON(ctx, resp, req) case "application/protobuf": - s.serveStartTrackCompositeEgressProtobuf(ctx, resp, req) + s.serveListEgressProtobuf(ctx, resp, req) default: msg := fmt.Sprintf("unexpected Content-Type: %q", req.Header.Get("Content-Type")) twerr := badRouteError(msg, req.Method, req.URL.Path) @@ -1677,9 +1776,189 @@ func (s *egressServer) serveStartTrackCompositeEgress(ctx context.Context, resp } } -func (s *egressServer) serveStartTrackCompositeEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveListEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { + var err error + ctx = ctxsetters.WithMethodName(ctx, "ListEgress") + ctx, err = callRequestRouted(ctx, s.hooks) + if err != nil { + s.writeError(ctx, resp, err) + return + } + + d := json.NewDecoder(req.Body) + rawReqBody := json.RawMessage{} + if err := d.Decode(&rawReqBody); err != nil { + s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) + return + } + reqContent := new(ListEgressRequest) + unmarshaler := protojson.UnmarshalOptions{DiscardUnknown: true} + if err = unmarshaler.Unmarshal(rawReqBody, reqContent); err != nil { + s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) + return + } + + handler := s.Egress.ListEgress + if s.interceptor != nil { + handler = func(ctx context.Context, req *ListEgressRequest) (*ListEgressResponse, error) { + resp, err := s.interceptor( + func(ctx context.Context, req interface{}) (interface{}, error) { + typedReq, ok := req.(*ListEgressRequest) + if !ok { + return nil, twirp.InternalError("failed type assertion req.(*ListEgressRequest) when calling interceptor") + } + return s.Egress.ListEgress(ctx, typedReq) + }, + )(ctx, req) + if resp != nil { + typedResp, ok := resp.(*ListEgressResponse) + if !ok { + return nil, twirp.InternalError("failed type assertion resp.(*ListEgressResponse) when calling interceptor") + } + return typedResp, err + } + return nil, err + } + } + + // Call service method + var respContent *ListEgressResponse + func() { + defer ensurePanicResponses(ctx, resp, s.hooks) + respContent, err = handler(ctx, reqContent) + }() + + if err != nil { + s.writeError(ctx, resp, err) + return + } + if respContent == nil { + s.writeError(ctx, resp, twirp.InternalError("received a nil *ListEgressResponse and nil error while calling ListEgress. nil responses are not supported")) + return + } + + ctx = callResponsePrepared(ctx, s.hooks) + + marshaler := &protojson.MarshalOptions{UseProtoNames: !s.jsonCamelCase, EmitUnpopulated: !s.jsonSkipDefaults} + respBytes, err := marshaler.Marshal(respContent) + if err != nil { + s.writeError(ctx, resp, wrapInternal(err, "failed to marshal json response")) + return + } + + ctx = ctxsetters.WithStatusCode(ctx, http.StatusOK) + resp.Header().Set("Content-Type", "application/json") + resp.Header().Set("Content-Length", strconv.Itoa(len(respBytes))) + resp.WriteHeader(http.StatusOK) + + if n, err := resp.Write(respBytes); err != nil { + msg := fmt.Sprintf("failed to write response, %d of %d bytes written: %s", n, len(respBytes), err.Error()) + twerr := twirp.NewError(twirp.Unknown, msg) + ctx = callError(ctx, s.hooks, twerr) + } + callResponseSent(ctx, s.hooks) +} + +func (s *egressServer) serveListEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { + var err error + ctx = ctxsetters.WithMethodName(ctx, "ListEgress") + ctx, err = callRequestRouted(ctx, s.hooks) + if err != nil { + s.writeError(ctx, resp, err) + return + } + + buf, err := io.ReadAll(req.Body) + if err != nil { + s.handleRequestBodyError(ctx, resp, "failed to read request body", err) + return + } + reqContent := new(ListEgressRequest) + if err = proto.Unmarshal(buf, reqContent); err != nil { + s.writeError(ctx, resp, malformedRequestError("the protobuf request could not be decoded")) + return + } + + handler := s.Egress.ListEgress + if s.interceptor != nil { + handler = func(ctx context.Context, req *ListEgressRequest) (*ListEgressResponse, error) { + resp, err := s.interceptor( + func(ctx context.Context, req interface{}) (interface{}, error) { + typedReq, ok := req.(*ListEgressRequest) + if !ok { + return nil, twirp.InternalError("failed type assertion req.(*ListEgressRequest) when calling interceptor") + } + return s.Egress.ListEgress(ctx, typedReq) + }, + )(ctx, req) + if resp != nil { + typedResp, ok := resp.(*ListEgressResponse) + if !ok { + return nil, twirp.InternalError("failed type assertion resp.(*ListEgressResponse) when calling interceptor") + } + return typedResp, err + } + return nil, err + } + } + + // Call service method + var respContent *ListEgressResponse + func() { + defer ensurePanicResponses(ctx, resp, s.hooks) + respContent, err = handler(ctx, reqContent) + }() + + if err != nil { + s.writeError(ctx, resp, err) + return + } + if respContent == nil { + s.writeError(ctx, resp, twirp.InternalError("received a nil *ListEgressResponse and nil error while calling ListEgress. nil responses are not supported")) + return + } + + ctx = callResponsePrepared(ctx, s.hooks) + + respBytes, err := proto.Marshal(respContent) + if err != nil { + s.writeError(ctx, resp, wrapInternal(err, "failed to marshal proto response")) + return + } + + ctx = ctxsetters.WithStatusCode(ctx, http.StatusOK) + resp.Header().Set("Content-Type", "application/protobuf") + resp.Header().Set("Content-Length", strconv.Itoa(len(respBytes))) + resp.WriteHeader(http.StatusOK) + if n, err := resp.Write(respBytes); err != nil { + msg := fmt.Sprintf("failed to write response, %d of %d bytes written: %s", n, len(respBytes), err.Error()) + twerr := twirp.NewError(twirp.Unknown, msg) + ctx = callError(ctx, s.hooks, twerr) + } + callResponseSent(ctx, s.hooks) +} + +func (s *egressServer) serveStopEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { + header := req.Header.Get("Content-Type") + i := strings.Index(header, ";") + if i == -1 { + i = len(header) + } + switch strings.TrimSpace(strings.ToLower(header[:i])) { + case "application/json": + s.serveStopEgressJSON(ctx, resp, req) + case "application/protobuf": + s.serveStopEgressProtobuf(ctx, resp, req) + default: + msg := fmt.Sprintf("unexpected Content-Type: %q", req.Header.Get("Content-Type")) + twerr := badRouteError(msg, req.Method, req.URL.Path) + s.writeError(ctx, resp, twerr) + } +} + +func (s *egressServer) serveStopEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "StartTrackCompositeEgress") + ctx = ctxsetters.WithMethodName(ctx, "StopEgress") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -1692,23 +1971,23 @@ func (s *egressServer) serveStartTrackCompositeEgressJSON(ctx context.Context, r s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - reqContent := new(TrackCompositeEgressRequest) + reqContent := new(StopEgressRequest) unmarshaler := protojson.UnmarshalOptions{DiscardUnknown: true} if err = unmarshaler.Unmarshal(rawReqBody, reqContent); err != nil { s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - handler := s.Egress.StartTrackCompositeEgress + handler := s.Egress.StopEgress if s.interceptor != nil { - handler = func(ctx context.Context, req *TrackCompositeEgressRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *StopEgressRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*TrackCompositeEgressRequest) + typedReq, ok := req.(*StopEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*TrackCompositeEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*StopEgressRequest) when calling interceptor") } - return s.Egress.StartTrackCompositeEgress(ctx, typedReq) + return s.Egress.StopEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -1734,7 +2013,7 @@ func (s *egressServer) serveStartTrackCompositeEgressJSON(ctx context.Context, r return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartTrackCompositeEgress. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StopEgress. nil responses are not supported")) return } @@ -1760,9 +2039,9 @@ func (s *egressServer) serveStartTrackCompositeEgressJSON(ctx context.Context, r callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveStartTrackCompositeEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStopEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "StartTrackCompositeEgress") + ctx = ctxsetters.WithMethodName(ctx, "StopEgress") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -1774,22 +2053,22 @@ func (s *egressServer) serveStartTrackCompositeEgressProtobuf(ctx context.Contex s.handleRequestBodyError(ctx, resp, "failed to read request body", err) return } - reqContent := new(TrackCompositeEgressRequest) + reqContent := new(StopEgressRequest) if err = proto.Unmarshal(buf, reqContent); err != nil { s.writeError(ctx, resp, malformedRequestError("the protobuf request could not be decoded")) return } - handler := s.Egress.StartTrackCompositeEgress + handler := s.Egress.StopEgress if s.interceptor != nil { - handler = func(ctx context.Context, req *TrackCompositeEgressRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *StopEgressRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*TrackCompositeEgressRequest) + typedReq, ok := req.(*StopEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*TrackCompositeEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*StopEgressRequest) when calling interceptor") } - return s.Egress.StartTrackCompositeEgress(ctx, typedReq) + return s.Egress.StopEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -1815,7 +2094,7 @@ func (s *egressServer) serveStartTrackCompositeEgressProtobuf(ctx context.Contex return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartTrackCompositeEgress. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StopEgress. nil responses are not supported")) return } @@ -1839,7 +2118,7 @@ func (s *egressServer) serveStartTrackCompositeEgressProtobuf(ctx context.Contex callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveStartTrackEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartRoomCompositeEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { header := req.Header.Get("Content-Type") i := strings.Index(header, ";") if i == -1 { @@ -1847,9 +2126,9 @@ func (s *egressServer) serveStartTrackEgress(ctx context.Context, resp http.Resp } switch strings.TrimSpace(strings.ToLower(header[:i])) { case "application/json": - s.serveStartTrackEgressJSON(ctx, resp, req) + s.serveStartRoomCompositeEgressJSON(ctx, resp, req) case "application/protobuf": - s.serveStartTrackEgressProtobuf(ctx, resp, req) + s.serveStartRoomCompositeEgressProtobuf(ctx, resp, req) default: msg := fmt.Sprintf("unexpected Content-Type: %q", req.Header.Get("Content-Type")) twerr := badRouteError(msg, req.Method, req.URL.Path) @@ -1857,9 +2136,9 @@ func (s *egressServer) serveStartTrackEgress(ctx context.Context, resp http.Resp } } -func (s *egressServer) serveStartTrackEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartRoomCompositeEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "StartTrackEgress") + ctx = ctxsetters.WithMethodName(ctx, "StartRoomCompositeEgress") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -1872,23 +2151,23 @@ func (s *egressServer) serveStartTrackEgressJSON(ctx context.Context, resp http. s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - reqContent := new(TrackEgressRequest) + reqContent := new(RoomCompositeEgressRequest) unmarshaler := protojson.UnmarshalOptions{DiscardUnknown: true} if err = unmarshaler.Unmarshal(rawReqBody, reqContent); err != nil { s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - handler := s.Egress.StartTrackEgress + handler := s.Egress.StartRoomCompositeEgress if s.interceptor != nil { - handler = func(ctx context.Context, req *TrackEgressRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *RoomCompositeEgressRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*TrackEgressRequest) + typedReq, ok := req.(*RoomCompositeEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*TrackEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*RoomCompositeEgressRequest) when calling interceptor") } - return s.Egress.StartTrackEgress(ctx, typedReq) + return s.Egress.StartRoomCompositeEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -1914,7 +2193,7 @@ func (s *egressServer) serveStartTrackEgressJSON(ctx context.Context, resp http. return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartTrackEgress. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartRoomCompositeEgress. nil responses are not supported")) return } @@ -1940,9 +2219,9 @@ func (s *egressServer) serveStartTrackEgressJSON(ctx context.Context, resp http. callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveStartTrackEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartRoomCompositeEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "StartTrackEgress") + ctx = ctxsetters.WithMethodName(ctx, "StartRoomCompositeEgress") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -1954,22 +2233,22 @@ func (s *egressServer) serveStartTrackEgressProtobuf(ctx context.Context, resp h s.handleRequestBodyError(ctx, resp, "failed to read request body", err) return } - reqContent := new(TrackEgressRequest) + reqContent := new(RoomCompositeEgressRequest) if err = proto.Unmarshal(buf, reqContent); err != nil { s.writeError(ctx, resp, malformedRequestError("the protobuf request could not be decoded")) return } - handler := s.Egress.StartTrackEgress + handler := s.Egress.StartRoomCompositeEgress if s.interceptor != nil { - handler = func(ctx context.Context, req *TrackEgressRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *RoomCompositeEgressRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*TrackEgressRequest) + typedReq, ok := req.(*RoomCompositeEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*TrackEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*RoomCompositeEgressRequest) when calling interceptor") } - return s.Egress.StartTrackEgress(ctx, typedReq) + return s.Egress.StartRoomCompositeEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -1995,7 +2274,7 @@ func (s *egressServer) serveStartTrackEgressProtobuf(ctx context.Context, resp h return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartTrackEgress. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartRoomCompositeEgress. nil responses are not supported")) return } @@ -2019,7 +2298,7 @@ func (s *egressServer) serveStartTrackEgressProtobuf(ctx context.Context, resp h callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveUpdateLayout(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartWebEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { header := req.Header.Get("Content-Type") i := strings.Index(header, ";") if i == -1 { @@ -2027,9 +2306,9 @@ func (s *egressServer) serveUpdateLayout(ctx context.Context, resp http.Response } switch strings.TrimSpace(strings.ToLower(header[:i])) { case "application/json": - s.serveUpdateLayoutJSON(ctx, resp, req) + s.serveStartWebEgressJSON(ctx, resp, req) case "application/protobuf": - s.serveUpdateLayoutProtobuf(ctx, resp, req) + s.serveStartWebEgressProtobuf(ctx, resp, req) default: msg := fmt.Sprintf("unexpected Content-Type: %q", req.Header.Get("Content-Type")) twerr := badRouteError(msg, req.Method, req.URL.Path) @@ -2037,9 +2316,9 @@ func (s *egressServer) serveUpdateLayout(ctx context.Context, resp http.Response } } -func (s *egressServer) serveUpdateLayoutJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartWebEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "UpdateLayout") + ctx = ctxsetters.WithMethodName(ctx, "StartWebEgress") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -2052,23 +2331,23 @@ func (s *egressServer) serveUpdateLayoutJSON(ctx context.Context, resp http.Resp s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - reqContent := new(UpdateLayoutRequest) + reqContent := new(WebEgressRequest) unmarshaler := protojson.UnmarshalOptions{DiscardUnknown: true} if err = unmarshaler.Unmarshal(rawReqBody, reqContent); err != nil { s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - handler := s.Egress.UpdateLayout + handler := s.Egress.StartWebEgress if s.interceptor != nil { - handler = func(ctx context.Context, req *UpdateLayoutRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *WebEgressRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*UpdateLayoutRequest) + typedReq, ok := req.(*WebEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*UpdateLayoutRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*WebEgressRequest) when calling interceptor") } - return s.Egress.UpdateLayout(ctx, typedReq) + return s.Egress.StartWebEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -2094,7 +2373,7 @@ func (s *egressServer) serveUpdateLayoutJSON(ctx context.Context, resp http.Resp return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling UpdateLayout. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartWebEgress. nil responses are not supported")) return } @@ -2120,9 +2399,9 @@ func (s *egressServer) serveUpdateLayoutJSON(ctx context.Context, resp http.Resp callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveUpdateLayoutProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartWebEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "UpdateLayout") + ctx = ctxsetters.WithMethodName(ctx, "StartWebEgress") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -2134,22 +2413,22 @@ func (s *egressServer) serveUpdateLayoutProtobuf(ctx context.Context, resp http. s.handleRequestBodyError(ctx, resp, "failed to read request body", err) return } - reqContent := new(UpdateLayoutRequest) + reqContent := new(WebEgressRequest) if err = proto.Unmarshal(buf, reqContent); err != nil { s.writeError(ctx, resp, malformedRequestError("the protobuf request could not be decoded")) return } - handler := s.Egress.UpdateLayout + handler := s.Egress.StartWebEgress if s.interceptor != nil { - handler = func(ctx context.Context, req *UpdateLayoutRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *WebEgressRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*UpdateLayoutRequest) + typedReq, ok := req.(*WebEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*UpdateLayoutRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*WebEgressRequest) when calling interceptor") } - return s.Egress.UpdateLayout(ctx, typedReq) + return s.Egress.StartWebEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -2175,7 +2454,7 @@ func (s *egressServer) serveUpdateLayoutProtobuf(ctx context.Context, resp http. return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling UpdateLayout. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartWebEgress. nil responses are not supported")) return } @@ -2199,7 +2478,7 @@ func (s *egressServer) serveUpdateLayoutProtobuf(ctx context.Context, resp http. callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveUpdateStream(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartParticipantEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { header := req.Header.Get("Content-Type") i := strings.Index(header, ";") if i == -1 { @@ -2207,9 +2486,9 @@ func (s *egressServer) serveUpdateStream(ctx context.Context, resp http.Response } switch strings.TrimSpace(strings.ToLower(header[:i])) { case "application/json": - s.serveUpdateStreamJSON(ctx, resp, req) + s.serveStartParticipantEgressJSON(ctx, resp, req) case "application/protobuf": - s.serveUpdateStreamProtobuf(ctx, resp, req) + s.serveStartParticipantEgressProtobuf(ctx, resp, req) default: msg := fmt.Sprintf("unexpected Content-Type: %q", req.Header.Get("Content-Type")) twerr := badRouteError(msg, req.Method, req.URL.Path) @@ -2217,9 +2496,9 @@ func (s *egressServer) serveUpdateStream(ctx context.Context, resp http.Response } } -func (s *egressServer) serveUpdateStreamJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartParticipantEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "UpdateStream") + ctx = ctxsetters.WithMethodName(ctx, "StartParticipantEgress") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -2232,23 +2511,23 @@ func (s *egressServer) serveUpdateStreamJSON(ctx context.Context, resp http.Resp s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - reqContent := new(UpdateStreamRequest) + reqContent := new(ParticipantEgressRequest) unmarshaler := protojson.UnmarshalOptions{DiscardUnknown: true} if err = unmarshaler.Unmarshal(rawReqBody, reqContent); err != nil { s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - handler := s.Egress.UpdateStream + handler := s.Egress.StartParticipantEgress if s.interceptor != nil { - handler = func(ctx context.Context, req *UpdateStreamRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *ParticipantEgressRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*UpdateStreamRequest) + typedReq, ok := req.(*ParticipantEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*UpdateStreamRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*ParticipantEgressRequest) when calling interceptor") } - return s.Egress.UpdateStream(ctx, typedReq) + return s.Egress.StartParticipantEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -2274,7 +2553,7 @@ func (s *egressServer) serveUpdateStreamJSON(ctx context.Context, resp http.Resp return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling UpdateStream. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartParticipantEgress. nil responses are not supported")) return } @@ -2300,9 +2579,9 @@ func (s *egressServer) serveUpdateStreamJSON(ctx context.Context, resp http.Resp callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveUpdateStreamProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartParticipantEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "UpdateStream") + ctx = ctxsetters.WithMethodName(ctx, "StartParticipantEgress") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -2314,22 +2593,22 @@ func (s *egressServer) serveUpdateStreamProtobuf(ctx context.Context, resp http. s.handleRequestBodyError(ctx, resp, "failed to read request body", err) return } - reqContent := new(UpdateStreamRequest) + reqContent := new(ParticipantEgressRequest) if err = proto.Unmarshal(buf, reqContent); err != nil { s.writeError(ctx, resp, malformedRequestError("the protobuf request could not be decoded")) return } - handler := s.Egress.UpdateStream + handler := s.Egress.StartParticipantEgress if s.interceptor != nil { - handler = func(ctx context.Context, req *UpdateStreamRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *ParticipantEgressRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*UpdateStreamRequest) + typedReq, ok := req.(*ParticipantEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*UpdateStreamRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*ParticipantEgressRequest) when calling interceptor") } - return s.Egress.UpdateStream(ctx, typedReq) + return s.Egress.StartParticipantEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -2355,7 +2634,7 @@ func (s *egressServer) serveUpdateStreamProtobuf(ctx context.Context, resp http. return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling UpdateStream. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartParticipantEgress. nil responses are not supported")) return } @@ -2379,7 +2658,7 @@ func (s *egressServer) serveUpdateStreamProtobuf(ctx context.Context, resp http. callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveListEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartTrackCompositeEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { header := req.Header.Get("Content-Type") i := strings.Index(header, ";") if i == -1 { @@ -2387,9 +2666,9 @@ func (s *egressServer) serveListEgress(ctx context.Context, resp http.ResponseWr } switch strings.TrimSpace(strings.ToLower(header[:i])) { case "application/json": - s.serveListEgressJSON(ctx, resp, req) + s.serveStartTrackCompositeEgressJSON(ctx, resp, req) case "application/protobuf": - s.serveListEgressProtobuf(ctx, resp, req) + s.serveStartTrackCompositeEgressProtobuf(ctx, resp, req) default: msg := fmt.Sprintf("unexpected Content-Type: %q", req.Header.Get("Content-Type")) twerr := badRouteError(msg, req.Method, req.URL.Path) @@ -2397,9 +2676,9 @@ func (s *egressServer) serveListEgress(ctx context.Context, resp http.ResponseWr } } -func (s *egressServer) serveListEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartTrackCompositeEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "ListEgress") + ctx = ctxsetters.WithMethodName(ctx, "StartTrackCompositeEgress") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -2412,29 +2691,29 @@ func (s *egressServer) serveListEgressJSON(ctx context.Context, resp http.Respon s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - reqContent := new(ListEgressRequest) + reqContent := new(TrackCompositeEgressRequest) unmarshaler := protojson.UnmarshalOptions{DiscardUnknown: true} if err = unmarshaler.Unmarshal(rawReqBody, reqContent); err != nil { s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - handler := s.Egress.ListEgress + handler := s.Egress.StartTrackCompositeEgress if s.interceptor != nil { - handler = func(ctx context.Context, req *ListEgressRequest) (*ListEgressResponse, error) { + handler = func(ctx context.Context, req *TrackCompositeEgressRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*ListEgressRequest) + typedReq, ok := req.(*TrackCompositeEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*ListEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*TrackCompositeEgressRequest) when calling interceptor") } - return s.Egress.ListEgress(ctx, typedReq) + return s.Egress.StartTrackCompositeEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { - typedResp, ok := resp.(*ListEgressResponse) + typedResp, ok := resp.(*EgressInfo) if !ok { - return nil, twirp.InternalError("failed type assertion resp.(*ListEgressResponse) when calling interceptor") + return nil, twirp.InternalError("failed type assertion resp.(*EgressInfo) when calling interceptor") } return typedResp, err } @@ -2443,7 +2722,7 @@ func (s *egressServer) serveListEgressJSON(ctx context.Context, resp http.Respon } // Call service method - var respContent *ListEgressResponse + var respContent *EgressInfo func() { defer ensurePanicResponses(ctx, resp, s.hooks) respContent, err = handler(ctx, reqContent) @@ -2454,7 +2733,7 @@ func (s *egressServer) serveListEgressJSON(ctx context.Context, resp http.Respon return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *ListEgressResponse and nil error while calling ListEgress. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartTrackCompositeEgress. nil responses are not supported")) return } @@ -2480,9 +2759,9 @@ func (s *egressServer) serveListEgressJSON(ctx context.Context, resp http.Respon callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveListEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartTrackCompositeEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "ListEgress") + ctx = ctxsetters.WithMethodName(ctx, "StartTrackCompositeEgress") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -2494,28 +2773,28 @@ func (s *egressServer) serveListEgressProtobuf(ctx context.Context, resp http.Re s.handleRequestBodyError(ctx, resp, "failed to read request body", err) return } - reqContent := new(ListEgressRequest) + reqContent := new(TrackCompositeEgressRequest) if err = proto.Unmarshal(buf, reqContent); err != nil { s.writeError(ctx, resp, malformedRequestError("the protobuf request could not be decoded")) return } - handler := s.Egress.ListEgress + handler := s.Egress.StartTrackCompositeEgress if s.interceptor != nil { - handler = func(ctx context.Context, req *ListEgressRequest) (*ListEgressResponse, error) { + handler = func(ctx context.Context, req *TrackCompositeEgressRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*ListEgressRequest) + typedReq, ok := req.(*TrackCompositeEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*ListEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*TrackCompositeEgressRequest) when calling interceptor") } - return s.Egress.ListEgress(ctx, typedReq) + return s.Egress.StartTrackCompositeEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { - typedResp, ok := resp.(*ListEgressResponse) + typedResp, ok := resp.(*EgressInfo) if !ok { - return nil, twirp.InternalError("failed type assertion resp.(*ListEgressResponse) when calling interceptor") + return nil, twirp.InternalError("failed type assertion resp.(*EgressInfo) when calling interceptor") } return typedResp, err } @@ -2524,7 +2803,7 @@ func (s *egressServer) serveListEgressProtobuf(ctx context.Context, resp http.Re } // Call service method - var respContent *ListEgressResponse + var respContent *EgressInfo func() { defer ensurePanicResponses(ctx, resp, s.hooks) respContent, err = handler(ctx, reqContent) @@ -2535,7 +2814,7 @@ func (s *egressServer) serveListEgressProtobuf(ctx context.Context, resp http.Re return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *ListEgressResponse and nil error while calling ListEgress. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartTrackCompositeEgress. nil responses are not supported")) return } @@ -2559,7 +2838,7 @@ func (s *egressServer) serveListEgressProtobuf(ctx context.Context, resp http.Re callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveStopEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartTrackEgress(ctx context.Context, resp http.ResponseWriter, req *http.Request) { header := req.Header.Get("Content-Type") i := strings.Index(header, ";") if i == -1 { @@ -2567,9 +2846,9 @@ func (s *egressServer) serveStopEgress(ctx context.Context, resp http.ResponseWr } switch strings.TrimSpace(strings.ToLower(header[:i])) { case "application/json": - s.serveStopEgressJSON(ctx, resp, req) + s.serveStartTrackEgressJSON(ctx, resp, req) case "application/protobuf": - s.serveStopEgressProtobuf(ctx, resp, req) + s.serveStartTrackEgressProtobuf(ctx, resp, req) default: msg := fmt.Sprintf("unexpected Content-Type: %q", req.Header.Get("Content-Type")) twerr := badRouteError(msg, req.Method, req.URL.Path) @@ -2577,9 +2856,9 @@ func (s *egressServer) serveStopEgress(ctx context.Context, resp http.ResponseWr } } -func (s *egressServer) serveStopEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartTrackEgressJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "StopEgress") + ctx = ctxsetters.WithMethodName(ctx, "StartTrackEgress") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -2592,23 +2871,23 @@ func (s *egressServer) serveStopEgressJSON(ctx context.Context, resp http.Respon s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - reqContent := new(StopEgressRequest) + reqContent := new(TrackEgressRequest) unmarshaler := protojson.UnmarshalOptions{DiscardUnknown: true} if err = unmarshaler.Unmarshal(rawReqBody, reqContent); err != nil { s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) return } - handler := s.Egress.StopEgress + handler := s.Egress.StartTrackEgress if s.interceptor != nil { - handler = func(ctx context.Context, req *StopEgressRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *TrackEgressRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*StopEgressRequest) + typedReq, ok := req.(*TrackEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*StopEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*TrackEgressRequest) when calling interceptor") } - return s.Egress.StopEgress(ctx, typedReq) + return s.Egress.StartTrackEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -2634,7 +2913,7 @@ func (s *egressServer) serveStopEgressJSON(ctx context.Context, resp http.Respon return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StopEgress. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartTrackEgress. nil responses are not supported")) return } @@ -2660,9 +2939,9 @@ func (s *egressServer) serveStopEgressJSON(ctx context.Context, resp http.Respon callResponseSent(ctx, s.hooks) } -func (s *egressServer) serveStopEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { +func (s *egressServer) serveStartTrackEgressProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { var err error - ctx = ctxsetters.WithMethodName(ctx, "StopEgress") + ctx = ctxsetters.WithMethodName(ctx, "StartTrackEgress") ctx, err = callRequestRouted(ctx, s.hooks) if err != nil { s.writeError(ctx, resp, err) @@ -2674,22 +2953,22 @@ func (s *egressServer) serveStopEgressProtobuf(ctx context.Context, resp http.Re s.handleRequestBodyError(ctx, resp, "failed to read request body", err) return } - reqContent := new(StopEgressRequest) + reqContent := new(TrackEgressRequest) if err = proto.Unmarshal(buf, reqContent); err != nil { s.writeError(ctx, resp, malformedRequestError("the protobuf request could not be decoded")) return } - handler := s.Egress.StopEgress + handler := s.Egress.StartTrackEgress if s.interceptor != nil { - handler = func(ctx context.Context, req *StopEgressRequest) (*EgressInfo, error) { + handler = func(ctx context.Context, req *TrackEgressRequest) (*EgressInfo, error) { resp, err := s.interceptor( func(ctx context.Context, req interface{}) (interface{}, error) { - typedReq, ok := req.(*StopEgressRequest) + typedReq, ok := req.(*TrackEgressRequest) if !ok { - return nil, twirp.InternalError("failed type assertion req.(*StopEgressRequest) when calling interceptor") + return nil, twirp.InternalError("failed type assertion req.(*TrackEgressRequest) when calling interceptor") } - return s.Egress.StopEgress(ctx, typedReq) + return s.Egress.StartTrackEgress(ctx, typedReq) }, )(ctx, req) if resp != nil { @@ -2715,7 +2994,7 @@ func (s *egressServer) serveStopEgressProtobuf(ctx context.Context, resp http.Re return } if respContent == nil { - s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StopEgress. nil responses are not supported")) + s.writeError(ctx, resp, twirp.InternalError("received a nil *EgressInfo and nil error while calling StartTrackEgress. nil responses are not supported")) return } @@ -2755,271 +3034,272 @@ func (s *egressServer) PathPrefix() string { } var twirpFileDescriptor2 = []byte{ - // 4243 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7b, 0xcd, 0x6f, 0x1b, 0x49, - 0x76, 0xb8, 0xba, 0xf9, 0xfd, 0xf8, 0xd5, 0x2a, 0xc9, 0x32, 0x2d, 0xef, 0x8c, 0xbd, 0xed, 0x9d, - 0xb1, 0x47, 0x9e, 0x95, 0xf5, 0x93, 0x3c, 0xf6, 0xac, 0x7f, 0x99, 0xc5, 0x50, 0x62, 0x4b, 0xe4, - 0x5a, 0x12, 0xb9, 0x4d, 0x6a, 0x3c, 0x09, 0x82, 0x34, 0x5a, 0xec, 0x12, 0xd5, 0x10, 0xd9, 0xcd, - 0xed, 0x6e, 0xca, 0xd6, 0xde, 0x72, 0x09, 0x90, 0x20, 0x1b, 0x04, 0x09, 0x72, 0x49, 0x02, 0xe4, - 0x12, 0x04, 0x41, 0xb2, 0x97, 0x5c, 0x7d, 0xc9, 0xde, 0xf7, 0x10, 0x20, 0x41, 0x90, 0xff, 0x21, - 0x41, 0x16, 0xb9, 0xe4, 0x1e, 0xd4, 0x47, 0x7f, 0xb0, 0xd5, 0x92, 0x49, 0x6b, 0x32, 0xb9, 0xec, - 0x49, 0xac, 0xf7, 0x5e, 0x55, 0xbf, 0xaa, 0xf7, 0x51, 0xef, 0xbd, 0x7a, 0x82, 0xe5, 0xa1, 0x79, - 0x8e, 0xcf, 0x4c, 0x4f, 0xc3, 0x03, 0x07, 0xbb, 0xee, 0xfa, 0xd8, 0xb1, 0x3d, 0x1b, 0xe5, 0x38, - 0x74, 0x35, 0x40, 0x8f, 0x6c, 0x03, 0x0f, 0x39, 0x7a, 0x75, 0x79, 0x68, 0x0f, 0x06, 0xd8, 0x79, - 0x62, 0x8f, 0x3d, 0xd3, 0xb6, 0x38, 0x54, 0xfe, 0xb7, 0x14, 0xa0, 0xae, 0xa7, 0x3b, 0x9e, 0x42, - 0x97, 0x52, 0xf1, 0x4f, 0x26, 0xd8, 0xf5, 0xd0, 0x5d, 0x28, 0x38, 0xb6, 0x3d, 0xd2, 0x2c, 0x7d, - 0x84, 0x6b, 0xc2, 0x7d, 0xe1, 0x51, 0x41, 0xcd, 0x13, 0xc0, 0xa1, 0x3e, 0xc2, 0xe8, 0x33, 0xc8, - 0x7b, 0x78, 0x34, 0x1e, 0xea, 0x1e, 0xae, 0x89, 0xf7, 0x85, 0x47, 0xc5, 0xcd, 0xdb, 0xeb, 0xfc, - 0x93, 0xeb, 0x3d, 0x8e, 0xe8, 0xda, 0x13, 0xa7, 0x8f, 0x9b, 0x0b, 0x6a, 0x40, 0x8a, 0x3e, 0x86, - 0xd4, 0x6b, 0x7c, 0x5c, 0x4b, 0xd1, 0x19, 0x28, 0x98, 0xf1, 0x0a, 0x1f, 0x07, 0xc4, 0x84, 0x00, - 0x7d, 0x0a, 0x99, 0x11, 0x36, 0x4c, 0xbd, 0x96, 0xa6, 0x94, 0xcb, 0x01, 0xe5, 0x01, 0x81, 0x06, - 0xb4, 0x8c, 0x08, 0x7d, 0x0e, 0xd9, 0xb1, 0x83, 0x5d, 0xec, 0xd5, 0x32, 0xf7, 0x85, 0x47, 0x95, - 0xcd, 0x0f, 0x03, 0x72, 0xc5, 0xea, 0xdb, 0x86, 0x69, 0x0d, 0xda, 0x6c, 0xc3, 0x1d, 0x4a, 0xd5, - 0x14, 0x54, 0x4e, 0x8f, 0x9e, 0x41, 0x5e, 0x37, 0xce, 0x75, 0xab, 0x8f, 0x8d, 0x5a, 0x96, 0x7e, - 0xaa, 0x76, 0xd5, 0xdc, 0xa6, 0xa0, 0x06, 0xb4, 0xe8, 0x13, 0xc8, 0xd9, 0x13, 0x6f, 0x3c, 0xf1, - 0xdc, 0x5a, 0xee, 0x7e, 0xea, 0x51, 0x71, 0xb3, 0x1a, 0x4c, 0x6b, 0x53, 0xb8, 0xea, 0xe3, 0xd1, - 0x06, 0xe4, 0x5c, 0xcf, 0x76, 0xf4, 0x01, 0xae, 0xe5, 0xe9, 0x17, 0x56, 0x02, 0xd2, 0x2e, 0x83, - 0xef, 0xd8, 0xd6, 0x89, 0x39, 0x50, 0x7d, 0x32, 0xb4, 0x09, 0xf9, 0xd7, 0xf8, 0xf8, 0xd4, 0xb6, - 0xcf, 0xdc, 0x5a, 0x81, 0xae, 0xbe, 0x12, 0x3d, 0x29, 0x82, 0xe0, 0x53, 0x02, 0xba, 0xed, 0x3c, - 0x64, 0x5d, 0x7a, 0x2a, 0xdb, 0x00, 0x79, 0xcc, 0x39, 0x97, 0xff, 0x48, 0x80, 0xca, 0xb4, 0x34, - 0xd0, 0x0a, 0x64, 0x87, 0xfa, 0x85, 0x3d, 0xf1, 0xb8, 0x48, 0xf9, 0x08, 0x7d, 0x00, 0xa0, 0x4f, - 0x0c, 0xd3, 0xd6, 0x6c, 0x6b, 0x78, 0x41, 0x45, 0x9a, 0x57, 0x0b, 0x14, 0xd2, 0xb6, 0x86, 0x17, - 0x04, 0x7d, 0x6e, 0x1a, 0x98, 0xa3, 0x53, 0x0c, 0x4d, 0x21, 0x14, 0xfd, 0x31, 0x54, 0xfb, 0x13, - 0xd7, 0xb3, 0x47, 0xda, 0xb1, 0xee, 0x62, 0x6d, 0xe2, 0x0c, 0xa9, 0xe4, 0x0a, 0x6a, 0x99, 0x81, - 0xb7, 0x75, 0x17, 0x1f, 0x39, 0x43, 0xf9, 0xf7, 0x05, 0x28, 0x04, 0xc2, 0x46, 0x12, 0xa4, 0x08, - 0x25, 0x63, 0x84, 0xfc, 0xbc, 0x21, 0x17, 0x9f, 0x02, 0xd2, 0x5f, 0xeb, 0xa6, 0xa7, 0xb9, 0x44, - 0x9b, 0x35, 0xd7, 0x1c, 0x58, 0x3a, 0x63, 0x24, 0xaf, 0x4a, 0x14, 0x43, 0xd5, 0xbc, 0x4b, 0xe1, - 0xf2, 0xaf, 0x04, 0x28, 0x46, 0xd4, 0x09, 0x3d, 0x87, 0x0a, 0x5b, 0xdc, 0x73, 0xf4, 0xfe, 0x99, - 0x66, 0x1a, 0x8c, 0xb1, 0xed, 0xea, 0xdb, 0x4e, 0x89, 0x22, 0x7a, 0x04, 0xde, 0x6a, 0x34, 0x17, - 0xd4, 0xe8, 0xd8, 0x40, 0x4d, 0x58, 0x1c, 0xeb, 0x8e, 0x67, 0xf6, 0xcd, 0xb1, 0x6e, 0x79, 0x1a, - 0xc5, 0x71, 0xa3, 0xb8, 0x13, 0x08, 0xae, 0x13, 0x52, 0x7c, 0x45, 0x08, 0x9a, 0x0b, 0xaa, 0x34, - 0x8e, 0xc1, 0xd0, 0x1a, 0x64, 0xe8, 0x66, 0xb9, 0x81, 0x84, 0x6a, 0x5f, 0x27, 0x50, 0x2e, 0x74, - 0x46, 0x82, 0x1e, 0x42, 0xda, 0xd0, 0x3d, 0xdf, 0x42, 0x96, 0x02, 0xd2, 0x86, 0xee, 0xe9, 0x9c, - 0x92, 0x12, 0x6c, 0xe7, 0x20, 0x43, 0x59, 0x92, 0x7f, 0x07, 0xa4, 0x38, 0x17, 0x68, 0x15, 0xf2, - 0xa6, 0x81, 0x2d, 0xcf, 0xf4, 0x2e, 0x7c, 0x1b, 0xf7, 0xc7, 0x68, 0x1d, 0x96, 0xc6, 0x0e, 0x3e, - 0xc1, 0x8e, 0xe6, 0xf6, 0x1d, 0x8c, 0x2d, 0xcd, 0x3d, 0xd5, 0x1d, 0xcc, 0xa5, 0xb2, 0xc8, 0x50, - 0x5d, 0x8a, 0xe9, 0x12, 0x84, 0xfc, 0x02, 0x8a, 0x11, 0x3e, 0xd1, 0x63, 0xc8, 0x3a, 0xf6, 0xc4, - 0xc3, 0x6e, 0x4d, 0xa0, 0x4a, 0xbc, 0x34, 0xbd, 0x1b, 0x95, 0xe0, 0x54, 0x4e, 0x22, 0xff, 0x97, - 0x00, 0x10, 0x82, 0xd1, 0x43, 0xc8, 0xc7, 0xa4, 0x00, 0x6f, 0x3b, 0x39, 0x2f, 0x10, 0x00, 0xff, - 0x69, 0xa0, 0x2d, 0x58, 0x8e, 0x9e, 0x7d, 0xb0, 0x17, 0xc2, 0x64, 0xa1, 0xb9, 0xa0, 0x2e, 0x45, - 0xb0, 0x2d, 0x7f, 0x63, 0x3f, 0x82, 0xe8, 0xd1, 0x6b, 0x67, 0xa6, 0x65, 0xd0, 0x13, 0xaf, 0x6c, - 0x7e, 0x90, 0x24, 0xaf, 0x96, 0x75, 0x62, 0xaf, 0xbf, 0x34, 0x2d, 0xa3, 0xb9, 0xa0, 0x56, 0x23, - 0x13, 0x09, 0x08, 0x3d, 0x81, 0x5c, 0xff, 0x54, 0xb7, 0x2c, 0xcc, 0x14, 0xad, 0xb2, 0x79, 0x2b, - 0x26, 0x34, 0x86, 0x54, 0x7d, 0x2a, 0x22, 0x8e, 0x91, 0xee, 0xf5, 0x4f, 0xe5, 0x3a, 0x40, 0x28, - 0x2b, 0xb4, 0x05, 0x05, 0x17, 0x0f, 0x71, 0xdf, 0xb3, 0x1d, 0xff, 0xc0, 0x6e, 0x4d, 0xc9, 0xb4, - 0xcb, 0xb1, 0x6a, 0x48, 0x27, 0xff, 0x4c, 0x80, 0x52, 0x14, 0xf7, 0xbf, 0x7c, 0x6e, 0x2b, 0x90, - 0xf1, 0xec, 0xb1, 0xd9, 0xa7, 0x87, 0x45, 0xa8, 0xd8, 0x30, 0xdc, 0xd2, 0x3f, 0xa7, 0xa0, 0x1a, - 0x73, 0x9b, 0x68, 0x19, 0x32, 0xaf, 0x4d, 0xc3, 0x3b, 0xa5, 0xfc, 0x64, 0x54, 0x36, 0x20, 0x6e, - 0xe8, 0x14, 0x9b, 0x83, 0x53, 0x8f, 0x7e, 0x31, 0xa3, 0xf2, 0x11, 0xa1, 0x36, 0xf0, 0xd8, 0x3b, - 0xa5, 0x9f, 0xc8, 0xa8, 0x6c, 0x80, 0xbe, 0x03, 0x85, 0x13, 0x47, 0x1f, 0x61, 0x87, 0x5c, 0x37, - 0x69, 0x8a, 0x09, 0x01, 0xe8, 0x29, 0x14, 0x99, 0xd3, 0xe8, 0xdb, 0x06, 0xee, 0xf3, 0x3b, 0x60, - 0x29, 0x6e, 0x3b, 0x06, 0xee, 0xab, 0xcc, 0xb9, 0xd0, 0xdf, 0xe8, 0x01, 0x94, 0xd9, 0xac, 0x63, - 0xd3, 0xa3, 0xeb, 0x66, 0xe9, 0xba, 0x25, 0x0a, 0xdc, 0x66, 0x30, 0xf4, 0x10, 0xaa, 0x8c, 0xe8, - 0xc4, 0x21, 0xb7, 0xa2, 0xd5, 0xbf, 0xa8, 0xe5, 0x28, 0x59, 0x85, 0x82, 0x77, 0x7d, 0x28, 0xe1, - 0x81, 0x39, 0x0f, 0xc6, 0x43, 0x3e, 0xc6, 0x03, 0x35, 0x36, 0xce, 0xc3, 0x79, 0xf0, 0x9b, 0xf0, - 0xc0, 0x66, 0xf9, 0x3c, 0x14, 0x18, 0x0f, 0x14, 0xe8, 0xf3, 0xf0, 0x29, 0xa0, 0x33, 0x7c, 0xa1, - 0xd1, 0xfd, 0x6a, 0xa6, 0xe5, 0x61, 0xe7, 0x5c, 0x1f, 0xd6, 0xe0, 0xbe, 0xf0, 0x48, 0x50, 0xa5, - 0x33, 0x7c, 0xb1, 0x4b, 0x10, 0x2d, 0x0e, 0x47, 0x0f, 0xfd, 0x6d, 0xfd, 0x64, 0xa2, 0x0f, 0x89, - 0x44, 0x8b, 0x64, 0xc9, 0x6d, 0xb1, 0x26, 0xf0, 0xad, 0xfd, 0x98, 0xc1, 0x09, 0x21, 0xfb, 0xb6, - 0x4f, 0x58, 0x0a, 0x09, 0x29, 0x82, 0x13, 0xca, 0x7f, 0x28, 0x42, 0x96, 0x5d, 0x6a, 0xe8, 0x13, - 0x48, 0x9f, 0x98, 0x43, 0x16, 0x0d, 0x44, 0x0d, 0x7a, 0xd7, 0x1c, 0x62, 0x46, 0xd2, 0x5c, 0x50, - 0x29, 0x09, 0x7a, 0x02, 0x59, 0xd7, 0x73, 0xb0, 0x3e, 0xe2, 0x9e, 0xf0, 0x56, 0xe4, 0xd6, 0x23, - 0xe0, 0x80, 0x9c, 0x93, 0xa1, 0x17, 0x90, 0x77, 0xf1, 0x60, 0x84, 0x2d, 0xcf, 0xe5, 0xee, 0xef, - 0x3b, 0xe1, 0x14, 0x86, 0xc0, 0xc6, 0xd4, 0x87, 0x02, 0x7a, 0xb4, 0x0e, 0x59, 0x73, 0xa4, 0x0f, - 0xb0, 0x7b, 0x29, 0x5e, 0x68, 0x11, 0x70, 0xf8, 0x2d, 0x46, 0x15, 0xbd, 0x93, 0xb3, 0x33, 0xdd, - 0xc9, 0xe4, 0x7e, 0xed, 0x53, 0x90, 0xfc, 0x07, 0x02, 0x40, 0xc8, 0x06, 0xfa, 0x0c, 0x0a, 0x64, - 0xbf, 0x9a, 0x77, 0x31, 0x66, 0xe7, 0x52, 0x89, 0x87, 0x10, 0x8c, 0xeb, 0xde, 0xc5, 0x18, 0xab, - 0xf9, 0x13, 0xfe, 0x8b, 0xf8, 0x5d, 0xf2, 0x7b, 0xac, 0x7b, 0xa7, 0xcc, 0xe6, 0xd4, 0x60, 0x8c, - 0x3e, 0x01, 0xc9, 0x30, 0x5d, 0xfd, 0x78, 0x88, 0xb5, 0x91, 0x6e, 0x99, 0x27, 0xd8, 0xf5, 0xf8, - 0x5d, 0x57, 0xe5, 0xf0, 0x03, 0x0e, 0x96, 0x5f, 0x41, 0x29, 0x7a, 0x9c, 0x68, 0x0b, 0xf2, 0x34, - 0xa6, 0xeb, 0xdb, 0x43, 0xce, 0xcc, 0xed, 0xd8, 0xb9, 0x77, 0x38, 0x5a, 0x0d, 0x08, 0x11, 0x82, - 0xf4, 0xc4, 0x19, 0xba, 0x35, 0xf1, 0x7e, 0xea, 0x51, 0x41, 0xa5, 0xbf, 0xe5, 0xbf, 0x4e, 0xc3, - 0x52, 0xc2, 0xa9, 0x13, 0x29, 0xc5, 0x3e, 0xf0, 0x61, 0xb2, 0x94, 0x12, 0xbe, 0xf3, 0x10, 0xaa, - 0x64, 0x8f, 0x24, 0x9e, 0xd4, 0xc8, 0xed, 0x61, 0xbe, 0xe1, 0x5b, 0xaf, 0xf8, 0xe0, 0x0e, 0x85, - 0x12, 0xb3, 0x18, 0x0f, 0xf5, 0x8b, 0xa1, 0xe9, 0x7a, 0x2c, 0xfa, 0xa4, 0xfe, 0x46, 0x2d, 0xf9, - 0x40, 0x1a, 0x81, 0x7e, 0x0a, 0x88, 0x7c, 0x58, 0x9b, 0xa6, 0x2c, 0x52, 0x4a, 0x89, 0x60, 0x3a, - 0x51, 0xea, 0x4f, 0x40, 0xe2, 0xda, 0xa2, 0x19, 0x13, 0x47, 0x27, 0xae, 0x89, 0xea, 0x4a, 0x59, - 0xad, 0x72, 0x78, 0x83, 0x83, 0x91, 0x12, 0x61, 0xd3, 0x9d, 0x9c, 0x10, 0x36, 0x81, 0xee, 0xf4, - 0x0a, 0x7d, 0xec, 0x52, 0x9a, 0x70, 0x13, 0x6c, 0x9c, 0x28, 0xc5, 0x7c, 0xa2, 0x14, 0xd1, 0x03, - 0x10, 0xdd, 0x2d, 0xea, 0xb7, 0x8a, 0x9b, 0x8b, 0xe1, 0x47, 0xb6, 0x8e, 0xc6, 0x43, 0x5b, 0x27, - 0xb7, 0x8e, 0xe8, 0x6e, 0x91, 0xd0, 0x79, 0xd0, 0x1f, 0x73, 0x7d, 0x0d, 0x43, 0xe7, 0xbd, 0x9d, - 0x4e, 0x40, 0x46, 0x08, 0xd0, 0x06, 0x64, 0xf4, 0x9f, 0x4e, 0x1c, 0x4c, 0x1d, 0x55, 0x34, 0x9e, - 0xad, 0x13, 0xe8, 0xf6, 0xd0, 0x3e, 0x0e, 0xe8, 0x19, 0x21, 0x31, 0x55, 0x7d, 0x68, 0xb6, 0xbb, - 0x5d, 0xea, 0x7e, 0xa2, 0xa6, 0x5a, 0xa7, 0xe0, 0x80, 0x9e, 0x93, 0x11, 0x63, 0x60, 0xd1, 0xad, - 0xfc, 0x9f, 0x29, 0x28, 0x46, 0x4c, 0x8c, 0x6c, 0xba, 0xaf, 0x8f, 0xbd, 0x89, 0x13, 0xf1, 0x54, - 0x02, 0x3b, 0x66, 0x0e, 0x0f, 0x1c, 0x55, 0x70, 0x2f, 0x88, 0xc9, 0xf7, 0x42, 0x6a, 0xea, 0x5e, - 0x48, 0xd0, 0x9d, 0x74, 0xa2, 0xee, 0xd4, 0x2f, 0x4b, 0x2f, 0x13, 0xb3, 0x4a, 0xca, 0xf0, 0x35, - 0x92, 0x7b, 0x0a, 0x45, 0xea, 0x27, 0xb8, 0x2f, 0xcf, 0xc6, 0x7c, 0x39, 0x9d, 0xce, 0x7d, 0xb9, - 0x19, 0xfc, 0x4e, 0x94, 0x77, 0xee, 0x3a, 0x79, 0xe7, 0x67, 0x92, 0x77, 0x61, 0x66, 0x79, 0xc3, - 0xfc, 0xf2, 0x2e, 0xce, 0x2b, 0xef, 0x5f, 0x0a, 0x50, 0x9e, 0xf2, 0x90, 0x7c, 0x2f, 0xc2, 0x4c, - 0x7b, 0x11, 0x67, 0xde, 0x4b, 0x6a, 0xfe, 0xbd, 0xa4, 0x67, 0xdb, 0x0b, 0x50, 0x07, 0x46, 0x2e, - 0x38, 0x47, 0xfe, 0x8f, 0x34, 0xe4, 0x7d, 0x4e, 0x91, 0x0c, 0xa0, 0xf7, 0xfb, 0xd8, 0x75, 0xb5, - 0x33, 0xcc, 0x63, 0xe1, 0xed, 0xd4, 0x2f, 0x3a, 0xa2, 0x5a, 0x60, 0xe0, 0x97, 0xf8, 0x02, 0xdd, - 0x85, 0xac, 0x8b, 0xfb, 0x0e, 0x66, 0x51, 0x0b, 0xc7, 0x73, 0x10, 0x7a, 0x04, 0x65, 0x17, 0xbb, - 0xae, 0x69, 0x5b, 0x9a, 0x67, 0x9f, 0x61, 0x8b, 0xf9, 0x22, 0x46, 0x53, 0xe2, 0x98, 0x1e, 0x41, - 0xa0, 0xc7, 0x50, 0xd5, 0x5d, 0x77, 0x32, 0xc2, 0x9a, 0x63, 0x0f, 0xb1, 0xa6, 0x3b, 0x16, 0xbd, - 0x7c, 0x29, 0xad, 0xa0, 0x96, 0x19, 0x4e, 0xb5, 0x87, 0xb8, 0xee, 0x58, 0xe8, 0xc7, 0x70, 0x3b, - 0x4a, 0x8c, 0xdf, 0x78, 0xd8, 0xb1, 0xf4, 0x21, 0x89, 0xf0, 0xca, 0x74, 0xd2, 0xea, 0x2f, 0x3a, - 0xe2, 0xdb, 0xce, 0x72, 0x38, 0x4b, 0xe1, 0x24, 0xad, 0x86, 0x9a, 0x04, 0x35, 0x88, 0x91, 0x39, - 0x78, 0x40, 0x5c, 0x20, 0x73, 0xac, 0x7c, 0x44, 0x2e, 0x25, 0x6c, 0x19, 0x63, 0xdb, 0xb4, 0x3c, - 0x6e, 0x5d, 0xc1, 0x98, 0xcc, 0x39, 0x9e, 0xf4, 0xcf, 0x78, 0x8e, 0x5d, 0x50, 0xf9, 0x08, 0x3d, - 0x02, 0xe9, 0xc4, 0x76, 0xfa, 0x58, 0x23, 0x57, 0x97, 0xe6, 0x7a, 0x17, 0x43, 0x76, 0xa7, 0xe6, - 0xd5, 0x0a, 0x85, 0x77, 0x74, 0xef, 0xb4, 0x4b, 0xa0, 0xe8, 0x4b, 0xc8, 0x8f, 0xb0, 0xa7, 0xd3, - 0xa4, 0x85, 0x25, 0xcd, 0xf7, 0x2e, 0xe9, 0xcb, 0xfa, 0x01, 0xa7, 0x50, 0x2c, 0xcf, 0xb9, 0x60, - 0xe7, 0x11, 0xcc, 0x42, 0x1f, 0x40, 0xce, 0xd3, 0x07, 0x03, 0xd3, 0x1a, 0x50, 0xe3, 0xe1, 0xe7, - 0xe5, 0xc3, 0xd0, 0x53, 0x58, 0xea, 0xdb, 0x96, 0x47, 0x7d, 0xbc, 0xe9, 0x8e, 0x6d, 0xd7, 0xa4, - 0x6e, 0xbe, 0x10, 0x92, 0x22, 0x8e, 0x6f, 0x84, 0x68, 0x92, 0x73, 0x8d, 0x1d, 0xfb, 0xcd, 0x05, - 0xb7, 0x9f, 0x30, 0x74, 0xe8, 0x10, 0xa8, 0x9f, 0x73, 0x51, 0x92, 0xd5, 0xff, 0x0f, 0xe5, 0x29, - 0x06, 0x49, 0x06, 0x1b, 0x68, 0x8b, 0x4a, 0x7e, 0x12, 0xb7, 0x76, 0xae, 0x0f, 0x27, 0x98, 0x5f, - 0x6d, 0x6c, 0xf0, 0x42, 0xfc, 0x5c, 0x90, 0xcf, 0xa1, 0x10, 0x28, 0x3c, 0xfa, 0x08, 0x8a, 0x7d, - 0x07, 0xd3, 0xc0, 0x5a, 0x1f, 0xba, 0x51, 0x75, 0x8b, 0xc2, 0x23, 0xa7, 0x2e, 0x4e, 0x9d, 0x7a, - 0xc0, 0x74, 0xea, 0x9d, 0x4c, 0xcb, 0xbf, 0x27, 0x40, 0x35, 0x66, 0x3f, 0xe8, 0x63, 0x28, 0xe9, - 0xfd, 0xbe, 0x3d, 0xb1, 0xbc, 0x48, 0x79, 0x87, 0x9d, 0x51, 0x91, 0x23, 0xe8, 0xb5, 0xf9, 0x3d, - 0xf0, 0x87, 0xd4, 0x2a, 0x22, 0x5a, 0x0f, 0x1c, 0x4e, 0xcc, 0xe2, 0x23, 0xa8, 0x90, 0x83, 0xd5, - 0x4d, 0x0b, 0x3b, 0xd1, 0x0b, 0xbb, 0x1c, 0x40, 0xc9, 0x62, 0xf2, 0x5f, 0x08, 0x50, 0x8a, 0x5a, - 0xe5, 0xcd, 0x4d, 0xee, 0x1b, 0x54, 0x64, 0xf9, 0xb7, 0xa1, 0x18, 0x39, 0xbc, 0x84, 0xda, 0xc4, - 0x2a, 0xe4, 0x27, 0x2e, 0x31, 0xa1, 0x91, 0x2f, 0xdc, 0x60, 0x8c, 0xee, 0x41, 0x7e, 0xac, 0xbb, - 0xee, 0x6b, 0xdb, 0x61, 0x99, 0x24, 0xe7, 0x33, 0x00, 0xca, 0x7f, 0x2f, 0xc0, 0xe2, 0xbe, 0xe9, - 0xce, 0x53, 0x62, 0x7b, 0x04, 0x05, 0x56, 0xdb, 0x23, 0xa6, 0xce, 0x36, 0x5f, 0x7c, 0xdb, 0xc9, - 0x33, 0x58, 0xab, 0xa1, 0xfa, 0xbf, 0xa8, 0x3d, 0xeb, 0x7d, 0xcf, 0x3c, 0xc7, 0x3c, 0x4c, 0xe4, - 0x23, 0xf4, 0x1c, 0x60, 0x4c, 0xee, 0x31, 0xe6, 0x8e, 0xd2, 0x31, 0x9f, 0x4a, 0x7d, 0x51, 0x47, - 0x1f, 0x98, 0x16, 0x8d, 0x7b, 0xd4, 0x02, 0xa1, 0xa5, 0x40, 0xf9, 0x77, 0x05, 0x40, 0x51, 0x6e, - 0xdd, 0xb1, 0x6d, 0xb9, 0x24, 0x88, 0xca, 0x98, 0x1e, 0x1e, 0x5d, 0x4e, 0xe8, 0x19, 0x1d, 0xc9, - 0x93, 0x55, 0x46, 0x81, 0xbe, 0x84, 0xaa, 0x85, 0xdf, 0x78, 0x5a, 0xe4, 0xfb, 0xe2, 0x3b, 0xbe, - 0x5f, 0x26, 0x13, 0x3a, 0x01, 0x0f, 0xff, 0x28, 0xc0, 0xd2, 0xd1, 0xd8, 0xd0, 0x3d, 0x3c, 0x7d, - 0x66, 0x53, 0xc7, 0x22, 0x5c, 0x77, 0x2c, 0x5c, 0x84, 0x62, 0x28, 0xc2, 0xb0, 0xf8, 0x95, 0x9a, - 0x2a, 0x7e, 0x7d, 0x0c, 0x55, 0xdd, 0x30, 0x34, 0x96, 0x89, 0x68, 0x34, 0x18, 0x4e, 0xd3, 0x60, - 0xb8, 0xac, 0x1b, 0x06, 0x8b, 0x9b, 0x8f, 0x9c, 0xa1, 0x4b, 0x62, 0x4e, 0x07, 0x8f, 0xec, 0x73, - 0x3c, 0x45, 0x9a, 0xa1, 0xa4, 0x12, 0xc3, 0x84, 0xd4, 0xf2, 0x17, 0xb0, 0xd8, 0xf5, 0xec, 0xf1, - 0x7b, 0xb2, 0x2f, 0xff, 0x2d, 0x00, 0x84, 0x07, 0x3b, 0xc7, 0xbe, 0x65, 0xc8, 0x51, 0xad, 0x0a, - 0xd4, 0xa6, 0xf0, 0xb6, 0x93, 0x25, 0x90, 0x56, 0x43, 0x65, 0x7f, 0x8d, 0x69, 0xcd, 0x2b, 0xc7, - 0x34, 0xef, 0x05, 0x14, 0x59, 0x31, 0x91, 0x65, 0x35, 0xab, 0x34, 0x00, 0xba, 0x13, 0x93, 0x36, - 0xab, 0x9a, 0xd1, 0xb4, 0x06, 0xdc, 0xe0, 0x37, 0xfa, 0x3e, 0xc9, 0xfb, 0x74, 0x6f, 0xe2, 0xf2, - 0x8a, 0xca, 0xad, 0xf8, 0x34, 0x8a, 0x54, 0x39, 0x11, 0xfa, 0x00, 0x80, 0x16, 0xeb, 0xb0, 0xa1, - 0xe9, 0x1e, 0x75, 0xc1, 0x29, 0xb5, 0xc0, 0x21, 0x75, 0x0f, 0xdd, 0xa1, 0x86, 0xcc, 0x90, 0x45, - 0x8a, 0xcc, 0xd1, 0x71, 0x9d, 0x16, 0x2c, 0x27, 0x54, 0x3d, 0x28, 0x12, 0xb1, 0x99, 0x1c, 0x52, - 0xf7, 0xd0, 0x33, 0xe2, 0x1a, 0x48, 0x6e, 0x50, 0xfb, 0x30, 0x96, 0x4c, 0x2a, 0x6f, 0xc6, 0xb6, - 0xe3, 0xa9, 0x14, 0xc9, 0xa5, 0x42, 0xe2, 0x03, 0x46, 0x8d, 0xf6, 0xa1, 0x42, 0x0f, 0xa6, 0x6f, - 0x8f, 0xe8, 0x15, 0x81, 0xb9, 0xdd, 0x3c, 0x08, 0xe6, 0xab, 0xb6, 0x3d, 0xda, 0xf1, 0xb1, 0x53, - 0xc2, 0x6d, 0x2e, 0xa8, 0x65, 0x27, 0x8a, 0x45, 0xdf, 0x67, 0xf5, 0xee, 0x4a, 0xac, 0x18, 0xf8, - 0x0a, 0x1f, 0xc7, 0x27, 0xd2, 0xb2, 0xb7, 0x02, 0xc5, 0x48, 0xdd, 0xa5, 0xb6, 0x44, 0xa7, 0x7d, - 0x37, 0xa9, 0x26, 0x15, 0x9f, 0x1e, 0x9d, 0x87, 0xda, 0x50, 0x65, 0x55, 0xa0, 0x70, 0x13, 0x2c, - 0xb9, 0xf8, 0x5e, 0x68, 0x7c, 0x04, 0x7f, 0xe5, 0x2e, 0x2a, 0xde, 0x14, 0x1a, 0x6d, 0x41, 0x86, - 0x42, 0x78, 0xf6, 0x71, 0x77, 0x7a, 0x99, 0xf8, 0x6c, 0x46, 0x8b, 0x5e, 0x40, 0x85, 0x5b, 0x89, - 0x83, 0xdd, 0xc9, 0xd0, 0x73, 0x6b, 0xd5, 0x98, 0xdb, 0x60, 0xb6, 0x42, 0xdd, 0x46, 0x99, 0x91, - 0xaa, 0x8c, 0x12, 0x3d, 0x85, 0x12, 0xcd, 0xaa, 0xfd, 0x99, 0x12, 0x9d, 0xb9, 0x38, 0x55, 0x70, - 0xa0, 0xf3, 0x8a, 0x84, 0xcc, 0x9f, 0xf5, 0x43, 0xf0, 0x93, 0xb9, 0x60, 0xe2, 0x62, 0xac, 0x92, - 0xc6, 0x33, 0x37, 0xe6, 0xab, 0x2a, 0x9c, 0xda, 0x9f, 0xff, 0x39, 0x94, 0x59, 0xe0, 0xef, 0xcf, - 0x5e, 0x8e, 0x31, 0x4c, 0x43, 0x7f, 0x36, 0xb7, 0x44, 0x29, 0xfd, 0x99, 0xcb, 0x90, 0xc1, 0x8e, - 0x63, 0x3b, 0x2c, 0xd8, 0x50, 0xd9, 0x80, 0xa8, 0x28, 0xfd, 0x41, 0x13, 0x89, 0xda, 0x0a, 0xab, - 0x5b, 0x51, 0x08, 0x49, 0x19, 0x50, 0x0d, 0x72, 0x06, 0xf6, 0x74, 0x73, 0xe8, 0xd6, 0x6e, 0xd1, - 0x69, 0xfe, 0x10, 0x3d, 0x86, 0x45, 0x3f, 0x87, 0xd0, 0x86, 0x76, 0x9f, 0xa5, 0xab, 0xb7, 0x59, - 0x6a, 0xeb, 0x23, 0xf6, 0x39, 0x1c, 0xad, 0xc3, 0xd2, 0xb1, 0xde, 0x3f, 0x9b, 0x8c, 0x35, 0x5e, - 0xac, 0xd0, 0x26, 0x2e, 0x36, 0x6a, 0x77, 0x58, 0x99, 0x96, 0xa1, 0x78, 0xcc, 0x7e, 0xe4, 0x62, - 0x03, 0xdd, 0x83, 0xa2, 0x83, 0x3d, 0xe7, 0x42, 0xa3, 0xf7, 0x77, 0xed, 0x2e, 0x65, 0x0b, 0x28, - 0x68, 0x87, 0x40, 0xd0, 0x67, 0x41, 0xe9, 0x26, 0x17, 0x7b, 0xd9, 0x09, 0x05, 0x46, 0x6e, 0x87, - 0x6d, 0xb1, 0x26, 0x34, 0x85, 0xa0, 0x80, 0xf3, 0x98, 0x17, 0x87, 0xe2, 0x79, 0x8d, 0x2f, 0x2b, - 0x4e, 0xce, 0xca, 0x43, 0xcf, 0x23, 0xd5, 0x9e, 0x52, 0xbc, 0x40, 0x14, 0x91, 0x11, 0x9f, 0x14, - 0x10, 0x6f, 0x17, 0x20, 0xe7, 0x30, 0x4d, 0x23, 0x69, 0x09, 0x13, 0x94, 0xfc, 0x73, 0x11, 0x20, - 0xe4, 0x2d, 0xf9, 0x5d, 0x21, 0xe2, 0x66, 0xc4, 0xeb, 0xdc, 0x4c, 0x6a, 0xda, 0xcd, 0xac, 0x42, - 0x7e, 0xaa, 0x60, 0x90, 0x52, 0x83, 0x31, 0xda, 0x0c, 0x7c, 0x1d, 0x4b, 0x31, 0x57, 0x13, 0x0e, - 0x6a, 0x3d, 0xe6, 0xf0, 0x02, 0x4d, 0xc9, 0x46, 0x35, 0x45, 0x86, 0xf2, 0x50, 0x77, 0x89, 0xda, - 0x12, 0xc1, 0xe8, 0x2c, 0x73, 0x4c, 0xa9, 0x45, 0x02, 0x54, 0x09, 0xac, 0xee, 0x11, 0x75, 0x21, - 0x68, 0x13, 0xbb, 0xf4, 0x88, 0xcb, 0xaa, 0x3f, 0x94, 0xd7, 0x21, 0xcb, 0xbe, 0x82, 0x00, 0xb2, - 0xf5, 0x9d, 0x5e, 0xeb, 0x2b, 0x45, 0x5a, 0x40, 0x25, 0xc8, 0xef, 0xb6, 0x0e, 0x5b, 0xdd, 0xa6, - 0xd2, 0x90, 0x04, 0x82, 0xd9, 0xad, 0xb7, 0xf6, 0x95, 0x86, 0x24, 0xca, 0x3f, 0x17, 0x20, 0xef, - 0x4b, 0xc5, 0xaf, 0x44, 0x45, 0x43, 0x10, 0x7f, 0xfc, 0x0d, 0x1d, 0x5b, 0x36, 0x76, 0x6c, 0x08, - 0xd2, 0xae, 0xf9, 0x53, 0xcc, 0x8f, 0x93, 0xfe, 0x26, 0xf4, 0x81, 0xa2, 0xb3, 0xb8, 0x2c, 0x18, - 0xcb, 0xff, 0x22, 0x42, 0x29, 0xaa, 0x13, 0x97, 0xeb, 0x43, 0xc2, 0xcc, 0xf5, 0xa1, 0xfc, 0x15, - 0xf5, 0xa1, 0x28, 0xbf, 0xe2, 0x15, 0xfc, 0xa6, 0x22, 0xfc, 0x3e, 0x86, 0xc5, 0x60, 0xe1, 0x80, - 0x71, 0x16, 0x6a, 0x4a, 0x3e, 0x22, 0xb0, 0xd0, 0xa7, 0xb0, 0x32, 0xcd, 0x4a, 0x30, 0x83, 0xb9, - 0x8b, 0xe5, 0x28, 0x3b, 0xc1, 0xac, 0x07, 0x24, 0x9f, 0x64, 0xde, 0x8c, 0x59, 0x6a, 0x86, 0x7e, - 0xbf, 0xc4, 0x81, 0xcc, 0x56, 0xa7, 0x25, 0x94, 0xbd, 0x4e, 0x42, 0xb9, 0x29, 0x09, 0xc9, 0x7f, - 0x2c, 0x00, 0x84, 0xfe, 0x6c, 0xf6, 0x02, 0xcb, 0xbd, 0xb0, 0x3a, 0x42, 0x98, 0x12, 0xe8, 0xaa, - 0x7e, 0x21, 0xe4, 0x32, 0x4b, 0x73, 0x28, 0x8d, 0xfc, 0xe7, 0x22, 0xdc, 0xaa, 0x4f, 0x3c, 0xfb, - 0xd2, 0x3d, 0x17, 0x79, 0xe1, 0x15, 0x66, 0x7a, 0xe1, 0x5d, 0x48, 0x7c, 0xe1, 0x15, 0xdf, 0xf1, - 0xc2, 0xbb, 0x10, 0x79, 0xe1, 0xfd, 0x82, 0xdf, 0x40, 0xfe, 0x33, 0x6f, 0x8a, 0x5e, 0x05, 0xab, - 0x49, 0xa5, 0x5d, 0xfe, 0xe2, 0x4b, 0xaf, 0xa2, 0x36, 0x7f, 0xf5, 0x55, 0xc2, 0xab, 0xc8, 0x5f, - 0x21, 0x4d, 0x57, 0xb8, 0xb6, 0xa8, 0x1d, 0xdc, 0x48, 0x7c, 0x19, 0xe2, 0xed, 0xf8, 0x5b, 0xbd, - 0xfc, 0x27, 0x22, 0x54, 0xc9, 0xe1, 0x44, 0xae, 0xdc, 0xa9, 0x2a, 0xb2, 0x30, 0x43, 0x15, 0x39, - 0x73, 0x5d, 0x3d, 0x4a, 0x9c, 0xa9, 0x86, 0x93, 0x9a, 0xb9, 0x86, 0x93, 0x9e, 0xbf, 0x86, 0x93, - 0x9d, 0xb7, 0x1e, 0xf5, 0x0f, 0x69, 0x58, 0x4a, 0x88, 0xe7, 0x48, 0xb0, 0xcc, 0xe2, 0xb9, 0xe9, - 0x60, 0x99, 0xc1, 0x48, 0xb0, 0xcc, 0x7f, 0x91, 0x4c, 0xb8, 0xca, 0x5e, 0x8b, 0xed, 0x93, 0x13, - 0x17, 0x7b, 0xda, 0xc8, 0xe5, 0x2a, 0x5b, 0xa6, 0xe0, 0x36, 0x85, 0x1e, 0xb8, 0xc4, 0x43, 0x63, - 0xcb, 0x88, 0x50, 0x31, 0xdd, 0x2d, 0x62, 0xcb, 0x08, 0x68, 0xa2, 0x4d, 0x11, 0xe9, 0xb9, 0x9b, - 0x22, 0x32, 0x33, 0x37, 0x45, 0x64, 0xe7, 0x6b, 0x8a, 0xc8, 0xdd, 0xa0, 0x29, 0x22, 0xff, 0x7e, - 0x4d, 0x11, 0x85, 0xd9, 0x9b, 0x22, 0x60, 0xfe, 0xa6, 0x88, 0xe2, 0x8d, 0x9a, 0x22, 0xfe, 0x35, - 0x0b, 0xab, 0x57, 0xc7, 0xf0, 0xd7, 0xe7, 0xe4, 0x61, 0x02, 0x29, 0x5e, 0xd3, 0x3d, 0x91, 0x8a, - 0xf7, 0x2d, 0x3c, 0x07, 0xf6, 0xf6, 0xa6, 0x8d, 0xcc, 0x37, 0xa6, 0x35, 0xa8, 0x55, 0xa9, 0x44, - 0x62, 0xcf, 0xfb, 0x07, 0x14, 0xa7, 0xb2, 0xb7, 0x4c, 0x36, 0x88, 0x35, 0x3c, 0xa4, 0x67, 0x68, - 0xbb, 0xc8, 0x24, 0xb4, 0x5d, 0xa0, 0xa7, 0x3c, 0x34, 0x63, 0x8a, 0x73, 0x8d, 0x13, 0xa3, 0xe1, - 0x96, 0xff, 0x84, 0xb7, 0x15, 0x8b, 0x03, 0x93, 0x9f, 0xf0, 0xf8, 0x14, 0x3f, 0x0a, 0xfc, 0x61, - 0x24, 0xb0, 0x83, 0x77, 0x3f, 0xe3, 0xf1, 0xd9, 0xe1, 0x53, 0x5e, 0xa8, 0xb6, 0xf9, 0x1b, 0xa8, - 0x6d, 0x61, 0x0e, 0xb5, 0x8d, 0x7b, 0xfa, 0xe2, 0x7c, 0x9e, 0xfe, 0x37, 0x82, 0x34, 0xc7, 0x5f, - 0xa0, 0x14, 0xcf, 0x39, 0x22, 0xa7, 0xe5, 0x27, 0x3a, 0xd7, 0xdc, 0x13, 0xe5, 0xf9, 0xef, 0x09, - 0xf4, 0x03, 0x3f, 0x73, 0xf1, 0x17, 0xa9, 0xd0, 0x45, 0x12, 0xdf, 0x41, 0x79, 0xea, 0xe2, 0x4f, - 0x8d, 0x1a, 0x96, 0x34, 0xbb, 0x61, 0xb1, 0x0f, 0x45, 0x2f, 0xa8, 0xff, 0xce, 0x80, 0x14, 0x4f, - 0x6c, 0xbf, 0xa5, 0x16, 0x9f, 0x52, 0x72, 0x8b, 0x4f, 0xa0, 0xf7, 0xe9, 0xf7, 0xd4, 0xfb, 0xcc, - 0xfb, 0xe9, 0x7d, 0xf6, 0x46, 0x7a, 0xff, 0x6d, 0xb9, 0xeb, 0xb8, 0xde, 0x17, 0x6e, 0xaa, 0xf7, - 0x70, 0x33, 0xbd, 0x2f, 0x7e, 0x13, 0x7a, 0x5f, 0x7e, 0x2f, 0xbd, 0xaf, 0xdc, 0x44, 0xef, 0xff, - 0x26, 0x0d, 0xb5, 0xab, 0x2a, 0x33, 0xd7, 0xdf, 0x26, 0xd1, 0xe6, 0x2b, 0x31, 0xd6, 0x7c, 0xf5, - 0x5d, 0x28, 0x4d, 0x75, 0x5d, 0x31, 0x4b, 0x28, 0xba, 0x61, 0xbf, 0x55, 0x44, 0x65, 0xd2, 0x37, - 0x08, 0x8a, 0x33, 0x37, 0x08, 0x8a, 0xb3, 0x37, 0x55, 0x99, 0xdc, 0xcd, 0x54, 0x26, 0xff, 0x4d, - 0xa8, 0x4c, 0xe1, 0xbd, 0x54, 0x06, 0x66, 0x54, 0x99, 0x88, 0xa2, 0xfc, 0x2c, 0x0b, 0x77, 0xaf, - 0xa9, 0xbb, 0xbd, 0xab, 0xe1, 0x96, 0xb5, 0x1c, 0x85, 0xdd, 0x89, 0x62, 0xd0, 0x9d, 0x48, 0x11, - 0xbc, 0x3b, 0x51, 0x8d, 0x8e, 0x0c, 0x32, 0x2d, 0xd6, 0xd4, 0x98, 0x4a, 0x6c, 0x6a, 0x8c, 0xb5, - 0x34, 0xfe, 0x1f, 0x39, 0xce, 0xfc, 0x8d, 0x1c, 0x67, 0xf6, 0x06, 0x8e, 0x33, 0xf7, 0xeb, 0x80, - 0xe1, 0x7d, 0xac, 0xa0, 0x7a, 0x13, 0xc7, 0xf9, 0x2b, 0x01, 0xd0, 0xe5, 0x02, 0xf2, 0xf5, 0x66, - 0xf0, 0x51, 0xa4, 0xc1, 0x51, 0x8c, 0x37, 0x38, 0x86, 0xed, 0x8d, 0x4f, 0xb8, 0xfe, 0xa6, 0x62, - 0x85, 0xf7, 0x86, 0xe9, 0xe0, 0xbe, 0x97, 0xd0, 0xae, 0xf6, 0x11, 0x94, 0x5f, 0xe3, 0x63, 0xd7, - 0xee, 0x9f, 0x61, 0x2f, 0x6c, 0x5f, 0x6e, 0x2e, 0xa8, 0xa5, 0x00, 0x4c, 0x02, 0xe9, 0xe8, 0xde, - 0x33, 0xf3, 0xee, 0x5d, 0xfe, 0x53, 0x11, 0xa4, 0x38, 0x07, 0xbf, 0xce, 0xe1, 0x7f, 0x29, 0xc2, - 0xe2, 0x25, 0x93, 0xf9, 0xb6, 0xfa, 0xea, 0xb2, 0xd7, 0x9d, 0x66, 0x6a, 0xa6, 0xd3, 0x4c, 0xcf, - 0x7c, 0x9a, 0x99, 0xf9, 0x4f, 0x33, 0x37, 0xef, 0x69, 0xbe, 0xf2, 0x5f, 0x4d, 0xf7, 0x69, 0x66, - 0x3a, 0xff, 0xab, 0xe9, 0x15, 0x29, 0xae, 0xfc, 0x67, 0xc1, 0x7b, 0x6c, 0x97, 0x3f, 0xd5, 0xcc, - 0xbb, 0x32, 0x7f, 0x65, 0x65, 0x8c, 0x6a, 0x91, 0x96, 0xc3, 0xb2, 0x6e, 0x18, 0x4c, 0xec, 0xb1, - 0x57, 0xd6, 0x28, 0x69, 0x2a, 0xfa, 0xca, 0x1a, 0x52, 0xcb, 0x3f, 0x80, 0xca, 0xf4, 0xb3, 0x04, - 0x7a, 0x08, 0x69, 0xd3, 0x3a, 0xb1, 0x2f, 0xbd, 0x52, 0x47, 0x9e, 0x9b, 0x28, 0xc1, 0xda, 0x2b, - 0x28, 0x45, 0x7b, 0xb4, 0xd1, 0x0a, 0xa0, 0xfa, 0x51, 0xa3, 0xd5, 0xd6, 0x76, 0x9a, 0xf5, 0xc3, - 0x43, 0x65, 0x5f, 0xdb, 0x6e, 0xf7, 0x9a, 0xd2, 0xc2, 0x65, 0xf8, 0xbe, 0xb2, 0xdb, 0x93, 0x04, - 0x74, 0x1b, 0x96, 0xa6, 0xe1, 0x6a, 0x6b, 0xaf, 0xd9, 0x93, 0xc4, 0xb5, 0x7f, 0x12, 0xe0, 0x56, - 0xe2, 0xed, 0x83, 0x24, 0x28, 0x35, 0x37, 0x9f, 0x3d, 0xd5, 0x9e, 0x6f, 0x6e, 0x74, 0xb4, 0xad, - 0x0d, 0x69, 0x61, 0x1a, 0xf2, 0x6c, 0x43, 0x12, 0xd0, 0x22, 0x94, 0x29, 0xe4, 0xff, 0x6d, 0x7c, - 0xce, 0x88, 0xc4, 0x18, 0xe8, 0xd9, 0x86, 0x94, 0x42, 0x77, 0xe0, 0x56, 0xa7, 0xad, 0xf6, 0xd4, - 0x7a, 0xab, 0xa7, 0x4d, 0x2d, 0x99, 0xbe, 0x02, 0xf5, 0x6c, 0x43, 0xca, 0xa0, 0x55, 0x58, 0x99, - 0x46, 0x05, 0x1f, 0xc9, 0x5e, 0x85, 0x7b, 0xb6, 0x21, 0xe5, 0xd6, 0xb6, 0x79, 0x63, 0x77, 0x68, - 0x74, 0x68, 0x19, 0xa4, 0x86, 0xb2, 0x5b, 0x3f, 0xda, 0xef, 0x69, 0xbb, 0xad, 0x7d, 0xa5, 0xf7, - 0x9b, 0x1d, 0x45, 0x5a, 0x40, 0x39, 0x48, 0x1d, 0x74, 0x9e, 0x4a, 0x02, 0xf9, 0xd1, 0xde, 0xdb, - 0x93, 0x44, 0x06, 0xd9, 0x92, 0x52, 0x6b, 0x4d, 0x5f, 0x52, 0x7e, 0x6f, 0x68, 0x74, 0x89, 0x8e, - 0xda, 0xee, 0xb5, 0x77, 0xda, 0xfb, 0xd2, 0x02, 0xca, 0x43, 0x5a, 0xed, 0x1d, 0x74, 0xd8, 0x1a, - 0x5d, 0xb5, 0x27, 0x89, 0xa8, 0x0c, 0x85, 0x57, 0xca, 0x76, 0xb7, 0xbd, 0xf3, 0x52, 0xe9, 0x49, - 0xa9, 0xb5, 0x43, 0xb8, 0x95, 0xd8, 0x6c, 0x8a, 0x1e, 0xc0, 0x3d, 0x7f, 0xc1, 0xae, 0xb2, 0x77, - 0xa0, 0x1c, 0xf6, 0x94, 0x06, 0xe5, 0x2e, 0xba, 0x3e, 0x39, 0xf1, 0xfd, 0x6e, 0x08, 0x11, 0xd6, - 0x9e, 0xc4, 0x9a, 0x5d, 0x79, 0x23, 0x60, 0x01, 0x32, 0xad, 0xc3, 0x86, 0xf2, 0xb5, 0xb4, 0x40, - 0x18, 0xe8, 0xb5, 0x0e, 0x94, 0x6e, 0xaf, 0x4e, 0x18, 0x5b, 0x3b, 0x81, 0x6a, 0xac, 0x8b, 0x90, - 0x28, 0x49, 0xeb, 0xa0, 0xbe, 0xa7, 0x68, 0xdd, 0xa3, 0xdd, 0xdd, 0xd6, 0xd7, 0x9a, 0x3f, 0x73, - 0x15, 0x56, 0xa6, 0xe0, 0x91, 0x65, 0xd0, 0x3d, 0xb8, 0x3b, 0x85, 0x3b, 0x6c, 0x1f, 0x2a, 0x5a, - 0xfb, 0x2b, 0x45, 0x7d, 0xa5, 0xb6, 0x7a, 0x8a, 0x24, 0xae, 0xfd, 0x08, 0xa4, 0xf8, 0x6b, 0x3b, - 0x59, 0x50, 0xd9, 0x53, 0x95, 0x6e, 0x57, 0xeb, 0xb6, 0x8f, 0xd4, 0x1d, 0x45, 0x23, 0x27, 0xaf, - 0xbd, 0x52, 0xb6, 0xd9, 0xc7, 0x12, 0x70, 0xdd, 0xc6, 0x4b, 0x49, 0x58, 0xfb, 0x2b, 0x01, 0x4a, - 0xd1, 0x37, 0x78, 0xb4, 0x04, 0x55, 0x9f, 0xb8, 0x57, 0x57, 0x7b, 0xad, 0xc3, 0x3d, 0x69, 0x81, - 0x68, 0x1a, 0x07, 0xf2, 0x87, 0x24, 0x21, 0x02, 0x52, 0x0e, 0x1b, 0x84, 0x4a, 0x8c, 0x4c, 0xdd, - 0x69, 0x1f, 0x74, 0xf6, 0x95, 0x9e, 0x22, 0xa5, 0x22, 0x74, 0xfc, 0xa5, 0x29, 0x8d, 0x10, 0x54, - 0xfc, 0xd5, 0xb6, 0xdb, 0x6a, 0x4f, 0x69, 0x48, 0x19, 0x54, 0x83, 0x65, 0x0e, 0xdb, 0x6f, 0x1d, - 0xb4, 0x7a, 0x9a, 0xaa, 0xd4, 0x77, 0x9a, 0x4a, 0x43, 0xca, 0xae, 0x1d, 0xf1, 0x7f, 0x20, 0xe1, - 0xc5, 0x2f, 0x04, 0x15, 0x5f, 0x98, 0x07, 0xad, 0xaf, 0x19, 0x7b, 0x2b, 0x80, 0x1a, 0x47, 0xf5, - 0xfd, 0xc0, 0xe2, 0xea, 0x7b, 0xca, 0x21, 0x31, 0xc5, 0x55, 0x58, 0x99, 0x86, 0xef, 0xf7, 0x14, - 0xf5, 0xb0, 0x4e, 0x0e, 0x71, 0xf3, 0x2f, 0x33, 0x90, 0xe5, 0x05, 0xf3, 0x1e, 0xd4, 0x68, 0x7d, - 0x20, 0xa1, 0xfe, 0x87, 0x66, 0x79, 0xe1, 0x5f, 0x4d, 0xea, 0x79, 0x41, 0x5f, 0x12, 0xc5, 0xd6, - 0x1d, 0x2f, 0xa8, 0x7e, 0xa0, 0xab, 0x9f, 0xfa, 0x93, 0x57, 0xe8, 0xc0, 0x0a, 0x5d, 0xe1, 0xf2, - 0xcb, 0xc7, 0xbb, 0x5f, 0xff, 0x93, 0x57, 0xfc, 0x0a, 0xee, 0xd0, 0x15, 0x93, 0x12, 0x0e, 0x34, - 0x53, 0x1f, 0x40, 0xf2, 0xba, 0x0d, 0x90, 0xc2, 0x75, 0xf9, 0x72, 0xd7, 0xf5, 0x03, 0x24, 0xaf, - 0x52, 0x87, 0x52, 0xf4, 0x96, 0x42, 0x61, 0xf0, 0x9a, 0x70, 0x79, 0xbd, 0x63, 0x09, 0xe6, 0x53, - 0x2e, 0x2d, 0x31, 0x75, 0x4b, 0x25, 0x2f, 0xa1, 0x00, 0x84, 0x5d, 0x4e, 0x28, 0x0c, 0xe0, 0x2f, - 0x35, 0x6a, 0xad, 0xde, 0x4d, 0xc4, 0xf1, 0xb6, 0xa8, 0x2f, 0x00, 0xc2, 0x3e, 0x1f, 0x14, 0x7d, - 0x04, 0x8e, 0x35, 0xff, 0x24, 0x72, 0xb1, 0xbd, 0xfb, 0x5b, 0x0f, 0x06, 0xa6, 0x77, 0x3a, 0x39, - 0x5e, 0xef, 0xdb, 0xa3, 0x27, 0x9c, 0xe0, 0x89, 0xdf, 0x35, 0xef, 0x03, 0xfe, 0x4e, 0x2c, 0xef, - 0x9b, 0xe7, 0xf8, 0x25, 0xeb, 0xf1, 0xf3, 0xec, 0x7f, 0x17, 0x2b, 0x7c, 0xfc, 0xe2, 0x05, 0x05, - 0x1c, 0x67, 0xe9, 0x94, 0xad, 0xff, 0x09, 0x00, 0x00, 0xff, 0xff, 0xd9, 0xf3, 0x78, 0xc1, 0x1a, - 0x3a, 0x00, 0x00, + // 4267 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x3b, 0x4b, 0x70, 0x1c, 0x49, + 0x56, 0xaa, 0xea, 0xff, 0xeb, 0x5f, 0x29, 0x25, 0x6b, 0xda, 0xf2, 0x7a, 0xec, 0x6d, 0xef, 0x8c, + 0x3d, 0xf2, 0xac, 0x6c, 0x24, 0xaf, 0x3d, 0x6b, 0x98, 0x65, 0x5a, 0xea, 0x92, 0xd5, 0x6b, 0x49, + 0xdd, 0x5b, 0xdd, 0x1a, 0x0f, 0x04, 0x41, 0x45, 0xa9, 0x2b, 0xd5, 0xaa, 0x50, 0x77, 0x55, 0x6f, + 0x55, 0xb5, 0x6c, 0xed, 0x8d, 0x0b, 0x11, 0x10, 0x2c, 0x41, 0x40, 0x70, 0x81, 0x03, 0x17, 0x82, + 0x03, 0xec, 0x85, 0xab, 0x2f, 0xec, 0x7d, 0x0f, 0x44, 0x40, 0x10, 0x9c, 0x08, 0xee, 0x10, 0x6c, + 0x70, 0xe1, 0x4e, 0xe4, 0xa7, 0xaa, 0xb2, 0x4b, 0x25, 0xb9, 0xdb, 0x1a, 0x86, 0xcb, 0x9e, 0xd4, + 0xf9, 0xde, 0xcb, 0xac, 0x97, 0xf9, 0x3e, 0xf9, 0xde, 0xcb, 0x27, 0x58, 0x1e, 0x5a, 0x67, 0xf8, + 0xd4, 0xf2, 0x75, 0x3c, 0x70, 0xb1, 0xe7, 0xad, 0x8f, 0x5d, 0xc7, 0x77, 0x50, 0x8e, 0x43, 0x57, + 0x43, 0xf4, 0xc8, 0x31, 0xf1, 0x90, 0xa3, 0x57, 0x97, 0x87, 0xce, 0x60, 0x80, 0xdd, 0x47, 0xce, + 0xd8, 0xb7, 0x1c, 0x9b, 0x43, 0xeb, 0xff, 0x9a, 0x02, 0xd4, 0xf5, 0x0d, 0xd7, 0x57, 0xe9, 0x52, + 0x1a, 0xfe, 0xf1, 0x04, 0x7b, 0x3e, 0xba, 0x05, 0x05, 0xd7, 0x71, 0x46, 0xba, 0x6d, 0x8c, 0x70, + 0x4d, 0xba, 0x2b, 0x3d, 0x28, 0x68, 0x79, 0x02, 0x38, 0x30, 0x46, 0x18, 0x7d, 0x0f, 0xf2, 0x3e, + 0x1e, 0x8d, 0x87, 0x86, 0x8f, 0x6b, 0xf2, 0x5d, 0xe9, 0x41, 0x71, 0xe3, 0x83, 0x75, 0xfe, 0xc9, + 0xf5, 0x1e, 0x47, 0x74, 0x9d, 0x89, 0xdb, 0xc7, 0xbb, 0x0b, 0x5a, 0x48, 0x8a, 0x3e, 0x86, 0xd4, + 0x6b, 0x7c, 0x54, 0x4b, 0xd1, 0x19, 0x28, 0x9c, 0xf1, 0x0a, 0x1f, 0x85, 0xc4, 0x84, 0x00, 0x7d, + 0x0a, 0x99, 0x11, 0x36, 0x2d, 0xa3, 0x96, 0xa6, 0x94, 0xcb, 0x21, 0xe5, 0x3e, 0x81, 0x86, 0xb4, + 0x8c, 0x08, 0x7d, 0x06, 0xd9, 0xb1, 0x8b, 0x3d, 0xec, 0xd7, 0x32, 0x77, 0xa5, 0x07, 0x95, 0x8d, + 0x0f, 0x43, 0x72, 0xd5, 0xee, 0x3b, 0xa6, 0x65, 0x0f, 0xda, 0x6c, 0xc3, 0x1d, 0x4a, 0xb5, 0x2b, + 0x69, 0x9c, 0x1e, 0x3d, 0x85, 0xbc, 0x61, 0x9e, 0x19, 0x76, 0x1f, 0x9b, 0xb5, 0x2c, 0xfd, 0x54, + 0xed, 0xb2, 0xb9, 0xbb, 0x92, 0x16, 0xd2, 0xa2, 0x4f, 0x20, 0xe7, 0x4c, 0xfc, 0xf1, 0xc4, 0xf7, + 0x6a, 0xb9, 0xbb, 0xa9, 0x07, 0xc5, 0x8d, 0x6a, 0x38, 0xad, 0x4d, 0xe1, 0x5a, 0x80, 0x47, 0x8f, + 0x21, 0xe7, 0xf9, 0x8e, 0x6b, 0x0c, 0x70, 0x2d, 0x4f, 0xbf, 0xb0, 0x12, 0x92, 0x76, 0x19, 0x7c, + 0xdb, 0xb1, 0x8f, 0xad, 0x81, 0x16, 0x90, 0xa1, 0x0d, 0xc8, 0xbf, 0xc6, 0x47, 0x27, 0x8e, 0x73, + 0xea, 0xd5, 0x0a, 0x74, 0xf5, 0x15, 0xf1, 0xa4, 0x08, 0x82, 0x4f, 0x09, 0xe9, 0xb6, 0xf2, 0x90, + 0xf5, 0xe8, 0xa9, 0x6c, 0x01, 0xe4, 0x31, 0xe7, 0xbc, 0xfe, 0xc7, 0x12, 0x54, 0xa6, 0xa5, 0x81, + 0x56, 0x20, 0x3b, 0x34, 0xce, 0x9d, 0x89, 0xcf, 0x45, 0xca, 0x47, 0xe8, 0x36, 0x80, 0x31, 0x31, + 0x2d, 0x47, 0x77, 0xec, 0xe1, 0x39, 0x15, 0x69, 0x5e, 0x2b, 0x50, 0x48, 0xdb, 0x1e, 0x9e, 0x13, + 0xf4, 0x99, 0x65, 0x62, 0x8e, 0x4e, 0x31, 0x34, 0x85, 0x50, 0xf4, 0xc7, 0x50, 0xed, 0x4f, 0x3c, + 0xdf, 0x19, 0xe9, 0x47, 0x86, 0x87, 0xf5, 0x89, 0x3b, 0xa4, 0x92, 0x2b, 0x68, 0x65, 0x06, 0xde, + 0x32, 0x3c, 0x7c, 0xe8, 0x0e, 0xeb, 0x7f, 0x20, 0x41, 0x21, 0x14, 0x36, 0x52, 0x20, 0x45, 0x28, + 0x19, 0x23, 0xe4, 0xe7, 0x35, 0xb9, 0xf8, 0x14, 0x90, 0xf1, 0xda, 0xb0, 0x7c, 0xdd, 0x23, 0xda, + 0xac, 0x7b, 0xd6, 0xc0, 0x36, 0x18, 0x23, 0x79, 0x4d, 0xa1, 0x18, 0xaa, 0xe6, 0x5d, 0x0a, 0xaf, + 0xff, 0x52, 0x82, 0xa2, 0xa0, 0x4e, 0xe8, 0x19, 0x54, 0xd8, 0xe2, 0xbe, 0x6b, 0xf4, 0x4f, 0x75, + 0xcb, 0x64, 0x8c, 0x6d, 0x55, 0xdf, 0x76, 0x4a, 0x14, 0xd1, 0x23, 0xf0, 0x56, 0x73, 0x77, 0x41, + 0x13, 0xc7, 0x26, 0xda, 0x85, 0xc5, 0xb1, 0xe1, 0xfa, 0x56, 0xdf, 0x1a, 0x1b, 0xb6, 0xaf, 0x53, + 0x1c, 0x37, 0x8a, 0x9b, 0xa1, 0xe0, 0x3a, 0x11, 0xc5, 0x97, 0x84, 0x60, 0x77, 0x41, 0x53, 0xc6, + 0x31, 0x18, 0x5a, 0x83, 0x0c, 0xdd, 0x2c, 0x37, 0x90, 0x48, 0xed, 0x1b, 0x04, 0xca, 0x85, 0xce, + 0x48, 0xd0, 0x7d, 0x48, 0x9b, 0x86, 0x1f, 0x58, 0xc8, 0x52, 0x48, 0xda, 0x34, 0x7c, 0x83, 0x53, + 0x52, 0x82, 0xad, 0x1c, 0x64, 0x28, 0x4b, 0xf5, 0xdf, 0x05, 0x25, 0xce, 0x05, 0x5a, 0x85, 0xbc, + 0x65, 0x62, 0xdb, 0xb7, 0xfc, 0xf3, 0xc0, 0xc6, 0x83, 0x31, 0x5a, 0x87, 0xa5, 0xb1, 0x8b, 0x8f, + 0xb1, 0xab, 0x7b, 0x7d, 0x17, 0x63, 0x5b, 0xf7, 0x4e, 0x0c, 0x17, 0x73, 0xa9, 0x2c, 0x32, 0x54, + 0x97, 0x62, 0xba, 0x04, 0x51, 0x7f, 0x0e, 0x45, 0x81, 0x4f, 0xf4, 0x10, 0xb2, 0xae, 0x33, 0xf1, + 0xb1, 0x57, 0x93, 0xa8, 0x12, 0x2f, 0x4d, 0xef, 0x46, 0x23, 0x38, 0x8d, 0x93, 0xd4, 0xff, 0x5b, + 0x02, 0x88, 0xc0, 0xe8, 0x3e, 0xe4, 0x63, 0x52, 0x80, 0xb7, 0x9d, 0x9c, 0x1f, 0x0a, 0x80, 0xff, + 0x34, 0xd1, 0x26, 0x2c, 0x8b, 0x67, 0x1f, 0xee, 0x85, 0x30, 0x59, 0xd8, 0x5d, 0xd0, 0x96, 0x04, + 0x6c, 0x2b, 0xd8, 0xd8, 0x0f, 0x41, 0x3c, 0x7a, 0xfd, 0xd4, 0xb2, 0x4d, 0x7a, 0xe2, 0x95, 0x8d, + 0xdb, 0x49, 0xf2, 0x6a, 0xd9, 0xc7, 0xce, 0xfa, 0x4b, 0xcb, 0x36, 0x77, 0x17, 0xb4, 0xaa, 0x30, + 0x91, 0x80, 0xd0, 0x23, 0xc8, 0xf5, 0x4f, 0x0c, 0xdb, 0xc6, 0x4c, 0xd1, 0x2a, 0x1b, 0x37, 0x62, + 0x42, 0x63, 0x48, 0x2d, 0xa0, 0x22, 0xe2, 0x18, 0x19, 0x7e, 0xff, 0xa4, 0xde, 0x00, 0x88, 0x64, + 0x85, 0x36, 0xa1, 0xe0, 0xe1, 0x21, 0xee, 0xfb, 0x8e, 0x1b, 0x1c, 0xd8, 0x8d, 0x29, 0x99, 0x76, + 0x39, 0x56, 0x8b, 0xe8, 0xea, 0x3f, 0x95, 0xa0, 0x24, 0xe2, 0xfe, 0x8f, 0xcf, 0x6d, 0x05, 0x32, + 0xbe, 0x33, 0xb6, 0xfa, 0xf4, 0xb0, 0x08, 0x15, 0x1b, 0x46, 0x5b, 0xfa, 0xa7, 0x14, 0x54, 0x63, + 0x6e, 0x13, 0x2d, 0x43, 0xe6, 0xb5, 0x65, 0xfa, 0x27, 0x94, 0x9f, 0x8c, 0xc6, 0x06, 0xc4, 0x0d, + 0x9d, 0x60, 0x6b, 0x70, 0xe2, 0xd3, 0x2f, 0x66, 0x34, 0x3e, 0x22, 0xd4, 0x26, 0x1e, 0xfb, 0x27, + 0xf4, 0x13, 0x19, 0x8d, 0x0d, 0xd0, 0xb7, 0xa0, 0x70, 0xec, 0x1a, 0x23, 0xec, 0x92, 0xeb, 0x26, + 0x4d, 0x31, 0x11, 0x00, 0x3d, 0x81, 0x22, 0x73, 0x1a, 0x7d, 0xc7, 0xc4, 0x7d, 0x7e, 0x07, 0x2c, + 0xc5, 0x6d, 0xc7, 0xc4, 0x7d, 0x8d, 0x39, 0x17, 0xfa, 0x1b, 0xdd, 0x83, 0x32, 0x9b, 0x75, 0x64, + 0xf9, 0x74, 0xdd, 0x2c, 0x5d, 0xb7, 0x44, 0x81, 0x5b, 0x0c, 0x86, 0xee, 0x43, 0x95, 0x11, 0x1d, + 0xbb, 0xe4, 0x56, 0xb4, 0xfb, 0xe7, 0xb5, 0x1c, 0x25, 0xab, 0x50, 0xf0, 0x4e, 0x00, 0x25, 0x3c, + 0x30, 0xe7, 0xc1, 0x78, 0xc8, 0xc7, 0x78, 0xa0, 0xc6, 0xc6, 0x79, 0x38, 0x0b, 0x7f, 0x13, 0x1e, + 0xd8, 0xac, 0x80, 0x87, 0x02, 0xe3, 0x81, 0x02, 0x03, 0x1e, 0x3e, 0x05, 0x74, 0x8a, 0xcf, 0x75, + 0xba, 0x5f, 0xdd, 0xb2, 0x7d, 0xec, 0x9e, 0x19, 0xc3, 0x1a, 0xdc, 0x95, 0x1e, 0x48, 0x9a, 0x72, + 0x8a, 0xcf, 0x77, 0x08, 0xa2, 0xc5, 0xe1, 0xe8, 0x7e, 0xb0, 0xad, 0x1f, 0x4f, 0x8c, 0x21, 0x91, + 0x68, 0x91, 0x2c, 0xb9, 0x25, 0xd7, 0x24, 0xbe, 0xb5, 0x1f, 0x31, 0x38, 0x21, 0x64, 0xdf, 0x0e, + 0x08, 0x4b, 0x11, 0x21, 0x45, 0x70, 0xc2, 0xfa, 0x1f, 0xc9, 0x90, 0x65, 0x97, 0x1a, 0xfa, 0x04, + 0xd2, 0xc7, 0xd6, 0x90, 0x45, 0x03, 0xa2, 0x41, 0xef, 0x58, 0x43, 0xcc, 0x48, 0x76, 0x17, 0x34, + 0x4a, 0x82, 0x1e, 0x41, 0xd6, 0xf3, 0x5d, 0x6c, 0x8c, 0xb8, 0x27, 0xbc, 0x21, 0xdc, 0x7a, 0x04, + 0x1c, 0x92, 0x73, 0x32, 0xf4, 0x1c, 0xf2, 0x1e, 0x1e, 0x8c, 0xb0, 0xed, 0x7b, 0xdc, 0xfd, 0x7d, + 0x2b, 0x9a, 0xc2, 0x10, 0xd8, 0x9c, 0xfa, 0x50, 0x48, 0x8f, 0xd6, 0x21, 0x6b, 0x8d, 0x8c, 0x01, + 0xf6, 0x2e, 0xc4, 0x0b, 0x2d, 0x02, 0x8e, 0xbe, 0xc5, 0xa8, 0xc4, 0x3b, 0x39, 0x3b, 0xd3, 0x9d, + 0x4c, 0xee, 0xd7, 0x3e, 0x05, 0xd5, 0xff, 0x50, 0x02, 0x88, 0xd8, 0x40, 0xdf, 0x83, 0x02, 0xd9, + 0xaf, 0xee, 0x9f, 0x8f, 0xd9, 0xb9, 0x54, 0xe2, 0x21, 0x04, 0xe3, 0xba, 0x77, 0x3e, 0xc6, 0x5a, + 0xfe, 0x98, 0xff, 0x22, 0x7e, 0x97, 0xfc, 0x1e, 0x1b, 0xfe, 0x09, 0xb3, 0x39, 0x2d, 0x1c, 0xa3, + 0x4f, 0x40, 0x31, 0x2d, 0xcf, 0x38, 0x1a, 0x62, 0x7d, 0x64, 0xd8, 0xd6, 0x31, 0xf6, 0x7c, 0x7e, + 0xd7, 0x55, 0x39, 0x7c, 0x9f, 0x83, 0xeb, 0xaf, 0xa0, 0x24, 0x1e, 0x27, 0xda, 0x84, 0x3c, 0x8d, + 0xe9, 0xfa, 0xce, 0x90, 0x33, 0xf3, 0x41, 0xec, 0xdc, 0x3b, 0x1c, 0xad, 0x85, 0x84, 0x08, 0x41, + 0x7a, 0xe2, 0x0e, 0xbd, 0x9a, 0x7c, 0x37, 0xf5, 0xa0, 0xa0, 0xd1, 0xdf, 0xf5, 0xbf, 0x4e, 0xc3, + 0x52, 0xc2, 0xa9, 0x13, 0x29, 0xc5, 0x3e, 0xf0, 0x61, 0xb2, 0x94, 0x12, 0xbe, 0x73, 0x1f, 0xaa, + 0x64, 0x8f, 0x24, 0x9e, 0xd4, 0xc9, 0xed, 0x61, 0xbd, 0xe1, 0x5b, 0xaf, 0x04, 0xe0, 0x0e, 0x85, + 0x12, 0xb3, 0x18, 0x0f, 0x8d, 0xf3, 0xa1, 0xe5, 0xf9, 0x2c, 0xfa, 0xa4, 0xfe, 0x46, 0x2b, 0x05, + 0x40, 0x1a, 0x81, 0x7e, 0x0a, 0x88, 0x7c, 0x58, 0x9f, 0xa6, 0x2c, 0x52, 0x4a, 0x85, 0x60, 0x3a, + 0x22, 0xf5, 0x27, 0xa0, 0x70, 0x6d, 0xd1, 0xcd, 0x89, 0x6b, 0x10, 0xd7, 0x44, 0x75, 0xa5, 0xac, + 0x55, 0x39, 0xbc, 0xc9, 0xc1, 0x48, 0x15, 0xd8, 0xf4, 0x26, 0xc7, 0x84, 0x4d, 0xa0, 0x3b, 0xbd, + 0x44, 0x1f, 0xbb, 0x94, 0x26, 0xda, 0x04, 0x1b, 0x27, 0x4a, 0x31, 0x9f, 0x28, 0x45, 0x74, 0x0f, + 0x64, 0x6f, 0x93, 0xfa, 0xad, 0xe2, 0xc6, 0x62, 0xf4, 0x91, 0xcd, 0xc3, 0xf1, 0xd0, 0x31, 0xc8, + 0xad, 0x23, 0x7b, 0x9b, 0x24, 0x74, 0x1e, 0xf4, 0xc7, 0x5c, 0x5f, 0xa3, 0xd0, 0xf9, 0xc5, 0x76, + 0x27, 0x24, 0x23, 0x04, 0xe8, 0x31, 0x64, 0x8c, 0x9f, 0x4c, 0x5c, 0x4c, 0x1d, 0x95, 0x18, 0xcf, + 0x36, 0x08, 0x74, 0x6b, 0xe8, 0x1c, 0x85, 0xf4, 0x8c, 0x90, 0x98, 0xaa, 0x31, 0xb4, 0xda, 0xdd, + 0x2e, 0x75, 0x3f, 0xa2, 0xa9, 0x36, 0x28, 0x38, 0xa4, 0xe7, 0x64, 0xc4, 0x18, 0x58, 0x74, 0x5b, + 0xff, 0xaf, 0x14, 0x14, 0x05, 0x13, 0x23, 0x9b, 0xee, 0x1b, 0x63, 0x7f, 0xe2, 0x0a, 0x9e, 0x4a, + 0x62, 0xc7, 0xcc, 0xe1, 0xa1, 0xa3, 0x0a, 0xef, 0x05, 0x39, 0xf9, 0x5e, 0x48, 0x4d, 0xdd, 0x0b, + 0x09, 0xba, 0x93, 0x4e, 0xd4, 0x9d, 0xc6, 0x45, 0xe9, 0x65, 0x62, 0x56, 0x49, 0x19, 0xbe, 0x42, + 0x72, 0x4f, 0xa0, 0x48, 0xfd, 0x04, 0xf7, 0xe5, 0xd9, 0x98, 0x2f, 0xa7, 0xd3, 0xb9, 0x2f, 0xb7, + 0xc2, 0xdf, 0x89, 0xf2, 0xce, 0x5d, 0x25, 0xef, 0xfc, 0x4c, 0xf2, 0x2e, 0xcc, 0x2c, 0x6f, 0x98, + 0x5f, 0xde, 0xc5, 0x79, 0xe5, 0xfd, 0x0b, 0x09, 0xca, 0x53, 0x1e, 0x92, 0xef, 0x45, 0x9a, 0x69, + 0x2f, 0xf2, 0xcc, 0x7b, 0x49, 0xcd, 0xbf, 0x97, 0xf4, 0x6c, 0x7b, 0x01, 0xea, 0xc0, 0xc8, 0x05, + 0xe7, 0xd6, 0xff, 0x33, 0x0d, 0xf9, 0x80, 0x53, 0x54, 0x07, 0x30, 0xfa, 0x7d, 0xec, 0x79, 0xfa, + 0x29, 0xe6, 0xb1, 0xf0, 0x56, 0xea, 0xe7, 0x1d, 0x59, 0x2b, 0x30, 0xf0, 0x4b, 0x7c, 0x8e, 0x6e, + 0x41, 0xd6, 0xc3, 0x7d, 0x17, 0xb3, 0xa8, 0x85, 0xe3, 0x39, 0x08, 0x3d, 0x80, 0xb2, 0x87, 0x3d, + 0xcf, 0x72, 0x6c, 0xdd, 0x77, 0x4e, 0xb1, 0xcd, 0x7c, 0x11, 0xa3, 0x29, 0x71, 0x4c, 0x8f, 0x20, + 0xd0, 0x43, 0xa8, 0x1a, 0x9e, 0x37, 0x19, 0x61, 0xdd, 0x75, 0x86, 0x58, 0x37, 0x5c, 0x9b, 0x5e, + 0xbe, 0x94, 0x56, 0xd2, 0xca, 0x0c, 0xa7, 0x39, 0x43, 0xdc, 0x70, 0x6d, 0xf4, 0x23, 0xf8, 0x40, + 0x24, 0xc6, 0x6f, 0x7c, 0xec, 0xda, 0xc6, 0x90, 0x44, 0x78, 0x65, 0x3a, 0x69, 0xf5, 0xe7, 0x1d, + 0xf9, 0x6d, 0x67, 0x39, 0x9a, 0xa5, 0x72, 0x92, 0x56, 0x53, 0x4b, 0x82, 0x9a, 0xc4, 0xc8, 0x5c, + 0x3c, 0x20, 0x2e, 0x90, 0x39, 0x56, 0x3e, 0x22, 0x97, 0x12, 0xb6, 0xcd, 0xb1, 0x63, 0xd9, 0x3e, + 0xb7, 0xae, 0x70, 0x4c, 0xe6, 0x1c, 0x4d, 0xfa, 0xa7, 0x3c, 0xc7, 0x2e, 0x68, 0x7c, 0x84, 0x1e, + 0x80, 0x72, 0xec, 0xb8, 0x7d, 0xac, 0x93, 0xab, 0x4b, 0xf7, 0xfc, 0xf3, 0x21, 0xbb, 0x53, 0xf3, + 0x5a, 0x85, 0xc2, 0x3b, 0x86, 0x7f, 0xd2, 0x25, 0x50, 0xf4, 0x05, 0xe4, 0x47, 0xd8, 0x37, 0x68, + 0xd2, 0xc2, 0x92, 0xe6, 0x3b, 0x17, 0xf4, 0x65, 0x7d, 0x9f, 0x53, 0xa8, 0xb6, 0xef, 0x9e, 0xb3, + 0xf3, 0x08, 0x67, 0xa1, 0xdb, 0x90, 0xf3, 0x8d, 0xc1, 0xc0, 0xb2, 0x07, 0xd4, 0x78, 0xf8, 0x79, + 0x05, 0x30, 0xf4, 0x04, 0x96, 0xfa, 0x8e, 0xed, 0x53, 0x1f, 0x6f, 0x79, 0x63, 0xc7, 0xb3, 0xa8, + 0x9b, 0x2f, 0x44, 0xa4, 0x88, 0xe3, 0x9b, 0x11, 0x9a, 0xe4, 0x5c, 0x63, 0xd7, 0x79, 0x73, 0xce, + 0xed, 0x27, 0x0a, 0x1d, 0x3a, 0x04, 0x1a, 0xe4, 0x5c, 0x94, 0x64, 0xf5, 0xd7, 0xa1, 0x3c, 0xc5, + 0x20, 0xc9, 0x60, 0x43, 0x6d, 0xd1, 0xc8, 0x4f, 0xe2, 0xd6, 0xce, 0x8c, 0xe1, 0x04, 0xf3, 0xab, + 0x8d, 0x0d, 0x9e, 0xcb, 0x9f, 0x49, 0xf5, 0x33, 0x28, 0x84, 0x0a, 0x8f, 0x3e, 0x82, 0x62, 0xdf, + 0xc5, 0x34, 0xb0, 0x36, 0x86, 0x9e, 0xa8, 0x6e, 0x22, 0x5c, 0x38, 0x75, 0x79, 0xea, 0xd4, 0x43, + 0xa6, 0x53, 0xef, 0x64, 0xba, 0xfe, 0xfb, 0x12, 0x54, 0x63, 0xf6, 0x83, 0x3e, 0x86, 0x92, 0xd1, + 0xef, 0x3b, 0x13, 0xdb, 0x17, 0xca, 0x3b, 0xec, 0x8c, 0x8a, 0x1c, 0x41, 0xaf, 0xcd, 0xef, 0x40, + 0x30, 0xa4, 0x56, 0x21, 0x68, 0x3d, 0x70, 0x38, 0x31, 0x8b, 0x8f, 0xa0, 0x42, 0x0e, 0xd6, 0xb0, + 0x6c, 0xec, 0x8a, 0x17, 0x76, 0x39, 0x84, 0x92, 0xc5, 0xea, 0x7f, 0x29, 0x41, 0x49, 0xb4, 0xca, + 0xeb, 0x9b, 0xdc, 0xd7, 0xa8, 0xc8, 0xf5, 0xdf, 0x81, 0xa2, 0x70, 0x78, 0x09, 0xb5, 0x89, 0x55, + 0xc8, 0x4f, 0x3c, 0x62, 0x42, 0xa3, 0x40, 0xb8, 0xe1, 0x18, 0xdd, 0x81, 0xfc, 0xd8, 0xf0, 0xbc, + 0xd7, 0x8e, 0xcb, 0x32, 0x49, 0xce, 0x67, 0x08, 0xac, 0xff, 0x9d, 0x04, 0x8b, 0x7b, 0x96, 0x37, + 0x4f, 0x89, 0xed, 0x01, 0x14, 0x58, 0x6d, 0x8f, 0x98, 0x3a, 0xdb, 0x7c, 0xf1, 0x6d, 0x27, 0xcf, + 0x60, 0xad, 0xa6, 0x16, 0xfc, 0xa2, 0xf6, 0x6c, 0xf4, 0x7d, 0xeb, 0x0c, 0xf3, 0x30, 0x91, 0x8f, + 0xd0, 0x33, 0x80, 0x31, 0xb9, 0xc7, 0x98, 0x3b, 0x4a, 0xc7, 0x7c, 0x2a, 0xf5, 0x45, 0x1d, 0x63, + 0x60, 0xd9, 0x34, 0xee, 0xd1, 0x0a, 0x84, 0x96, 0x02, 0xeb, 0xbf, 0x27, 0x01, 0x12, 0xb9, 0xf5, + 0xc6, 0x8e, 0xed, 0x91, 0x20, 0x2a, 0x63, 0xf9, 0x78, 0x74, 0x31, 0xa1, 0x67, 0x74, 0x24, 0x4f, + 0xd6, 0x18, 0x05, 0xfa, 0x02, 0xaa, 0x36, 0x7e, 0xe3, 0xeb, 0xc2, 0xf7, 0xe5, 0x77, 0x7c, 0xbf, + 0x4c, 0x26, 0x74, 0x42, 0x1e, 0xfe, 0x41, 0x82, 0xa5, 0xc3, 0xb1, 0x69, 0xf8, 0x78, 0xfa, 0xcc, + 0xa6, 0x8e, 0x45, 0xba, 0xea, 0x58, 0xb8, 0x08, 0xe5, 0x48, 0x84, 0x51, 0xf1, 0x2b, 0x35, 0x55, + 0xfc, 0xfa, 0x18, 0xaa, 0x86, 0x69, 0xea, 0x2c, 0x13, 0xd1, 0x69, 0x30, 0x9c, 0xa6, 0xc1, 0x70, + 0xd9, 0x30, 0x4d, 0x16, 0x37, 0x1f, 0xba, 0x43, 0x8f, 0xc4, 0x9c, 0x2e, 0x1e, 0x39, 0x67, 0x78, + 0x8a, 0x34, 0x43, 0x49, 0x15, 0x86, 0x89, 0xa8, 0xeb, 0x9f, 0xc3, 0x62, 0xd7, 0x77, 0xc6, 0xef, + 0xc9, 0x7e, 0xfd, 0xdf, 0x01, 0x20, 0x3a, 0xd8, 0x39, 0xf6, 0x5d, 0x87, 0x1c, 0xd5, 0xaa, 0x50, + 0x6d, 0x0a, 0x6f, 0x3b, 0x59, 0x02, 0x69, 0x35, 0x35, 0xf6, 0xd7, 0x9c, 0xd6, 0xbc, 0x72, 0x4c, + 0xf3, 0x9e, 0x43, 0x91, 0x15, 0x13, 0x59, 0x56, 0xb3, 0x4a, 0x03, 0xa0, 0x9b, 0x31, 0x69, 0xb3, + 0xaa, 0x19, 0x4d, 0x6b, 0xc0, 0x0b, 0x7f, 0xa3, 0xef, 0x92, 0xbc, 0xcf, 0xf0, 0x27, 0x1e, 0xaf, + 0xa8, 0xdc, 0x88, 0x4f, 0xa3, 0x48, 0x8d, 0x13, 0xa1, 0xdb, 0x00, 0xb4, 0x58, 0x87, 0x4d, 0xdd, + 0xf0, 0xa9, 0x0b, 0x4e, 0x69, 0x05, 0x0e, 0x69, 0xf8, 0xe8, 0x26, 0x35, 0x64, 0x86, 0x2c, 0x52, + 0x64, 0x8e, 0x8e, 0x1b, 0xb4, 0x60, 0x39, 0xa1, 0xea, 0x41, 0x91, 0x88, 0xcd, 0xe4, 0x90, 0x06, + 0xc9, 0xcb, 0xb2, 0xec, 0x40, 0x6a, 0xb7, 0xa9, 0xde, 0xdd, 0x12, 0xf2, 0xa0, 0x78, 0xa9, 0x9b, + 0x84, 0x07, 0x8c, 0x18, 0x3d, 0x25, 0x1e, 0x85, 0xa4, 0x14, 0xb5, 0x0f, 0x63, 0x39, 0xa8, 0xfa, + 0x66, 0xec, 0xb8, 0xbe, 0x46, 0x91, 0xc2, 0x3c, 0x46, 0x8d, 0xf6, 0xa0, 0x42, 0xcf, 0xb3, 0xef, + 0x8c, 0xe8, 0xcd, 0x82, 0xb9, 0xb9, 0xdd, 0x0b, 0xe7, 0x6b, 0x8e, 0x33, 0xda, 0x0e, 0xb0, 0xf1, + 0xcf, 0x97, 0x5d, 0x11, 0x8b, 0xbe, 0xcb, 0xca, 0xe4, 0x95, 0x58, 0x0d, 0xf1, 0x15, 0x3e, 0x8a, + 0x4f, 0xa4, 0xd5, 0x72, 0x15, 0x8a, 0x42, 0xb9, 0xa6, 0xb6, 0x44, 0xa7, 0x7d, 0x3b, 0xa9, 0x94, + 0x15, 0x9f, 0x2e, 0xce, 0x43, 0x6d, 0xa8, 0xb2, 0xe2, 0x51, 0xb4, 0x09, 0x96, 0x93, 0x7c, 0x27, + 0xb2, 0x59, 0x82, 0xbf, 0x74, 0x17, 0x15, 0x7f, 0x0a, 0x8d, 0x36, 0x21, 0x43, 0x21, 0x3c, 0x69, + 0xb9, 0x35, 0xbd, 0x4c, 0x7c, 0x36, 0xa3, 0x45, 0xcf, 0xa1, 0xc2, 0x8d, 0xcb, 0xc5, 0xde, 0x64, + 0xe8, 0x7b, 0xb5, 0x6a, 0xcc, 0xdb, 0x30, 0x13, 0xa3, 0xde, 0xa6, 0xcc, 0x48, 0x35, 0x46, 0x89, + 0x9e, 0x40, 0x89, 0x26, 0xe3, 0xc1, 0x4c, 0x85, 0xce, 0x5c, 0x9c, 0xaa, 0x53, 0xd0, 0x79, 0x45, + 0x42, 0x16, 0xcc, 0xfa, 0x01, 0x04, 0x39, 0x60, 0x38, 0x71, 0x31, 0x56, 0x80, 0xe3, 0x09, 0x1f, + 0x73, 0x71, 0x15, 0x4e, 0x1d, 0xcc, 0xff, 0x0c, 0xca, 0x2c, 0x5f, 0x08, 0x66, 0x2f, 0xc7, 0x18, + 0xa6, 0x19, 0x03, 0x9b, 0x5b, 0xa2, 0x94, 0xc1, 0xcc, 0x65, 0xc8, 0x60, 0xd7, 0x75, 0x5c, 0x16, + 0xa3, 0x68, 0x6c, 0x40, 0x34, 0x9b, 0xfe, 0xa0, 0xf9, 0x47, 0x6d, 0x85, 0x95, 0xbb, 0x28, 0x84, + 0x64, 0x1a, 0xa8, 0x06, 0x39, 0x13, 0xfb, 0x86, 0x35, 0xf4, 0x6a, 0x37, 0xe8, 0xb4, 0x60, 0x88, + 0x1e, 0xc2, 0x62, 0x90, 0x7a, 0xe8, 0x43, 0xa7, 0xcf, 0xb2, 0xdc, 0x0f, 0x58, 0x46, 0x1c, 0x20, + 0xf6, 0x38, 0x1c, 0xad, 0xc3, 0xd2, 0x91, 0xd1, 0x3f, 0x9d, 0x8c, 0x75, 0x5e, 0xe3, 0xd0, 0x27, + 0x1e, 0x36, 0x6b, 0x37, 0x59, 0x75, 0x97, 0xa1, 0x78, 0xa8, 0x7f, 0xe8, 0x61, 0x13, 0xdd, 0x81, + 0xa2, 0x8b, 0x7d, 0xf7, 0x5c, 0xa7, 0xd7, 0x7e, 0xed, 0x16, 0x65, 0x0b, 0x28, 0x68, 0x9b, 0x40, + 0x88, 0xc5, 0xf1, 0x8a, 0x4f, 0x2e, 0xf6, 0x20, 0x14, 0x09, 0x8c, 0x5c, 0x2a, 0x5b, 0x72, 0x4d, + 0xda, 0x95, 0xc2, 0xba, 0xcf, 0x43, 0x5e, 0x53, 0x8a, 0xa7, 0x43, 0x81, 0xac, 0x38, 0x39, 0xab, + 0x2a, 0x3d, 0x13, 0x8a, 0x44, 0xa5, 0x78, 0x5d, 0x49, 0x90, 0x11, 0x9f, 0x14, 0x12, 0x6f, 0x15, + 0x20, 0xe7, 0x32, 0x4d, 0x23, 0xd9, 0x0c, 0x13, 0x54, 0xfd, 0x67, 0x32, 0x40, 0xc4, 0x5b, 0xf2, + 0x73, 0x84, 0xe0, 0x9d, 0xe4, 0xab, 0xbc, 0x53, 0x6a, 0xda, 0x3b, 0xad, 0x42, 0x7e, 0xaa, 0xce, + 0x90, 0xd2, 0xc2, 0x31, 0xda, 0x08, 0x5d, 0x24, 0xcb, 0x4c, 0x57, 0x13, 0x0e, 0x6a, 0x3d, 0xe6, + 0x27, 0x43, 0x4d, 0xc9, 0x8a, 0x9a, 0x52, 0x87, 0xf2, 0xd0, 0xf0, 0x88, 0xda, 0x12, 0xc1, 0x18, + 0x2c, 0xe1, 0x4c, 0x69, 0x45, 0x02, 0xd4, 0x08, 0xac, 0xe1, 0x13, 0x75, 0x21, 0x68, 0x0b, 0x7b, + 0xf4, 0x88, 0xcb, 0x5a, 0x30, 0xac, 0xaf, 0x43, 0x96, 0x7d, 0x05, 0x01, 0x64, 0x1b, 0xdb, 0xbd, + 0xd6, 0x97, 0xaa, 0xb2, 0x80, 0x4a, 0x90, 0xdf, 0x69, 0x1d, 0xb4, 0xba, 0xbb, 0x6a, 0x53, 0x91, + 0x08, 0x66, 0xa7, 0xd1, 0xda, 0x53, 0x9b, 0x8a, 0x5c, 0xff, 0x99, 0x04, 0xf9, 0x40, 0x2a, 0x41, + 0x01, 0x4b, 0x8c, 0x5c, 0x82, 0xf1, 0xd7, 0x74, 0x6c, 0xd9, 0xd8, 0xb1, 0x21, 0x48, 0x7b, 0xd6, + 0x4f, 0x30, 0x3f, 0x4e, 0xfa, 0x9b, 0xd0, 0x87, 0x8a, 0xce, 0xc2, 0xb9, 0x70, 0x5c, 0xff, 0x67, + 0x19, 0x4a, 0xa2, 0x4e, 0x5c, 0x2c, 0x2b, 0x49, 0x33, 0x97, 0x95, 0xf2, 0x97, 0x94, 0x95, 0x44, + 0x7e, 0xe5, 0x4b, 0xf8, 0x4d, 0x09, 0xfc, 0x3e, 0x84, 0xc5, 0x70, 0xe1, 0x90, 0x71, 0x16, 0xa1, + 0x2a, 0x01, 0x22, 0xb4, 0xd0, 0x27, 0xb0, 0x32, 0xcd, 0x4a, 0x38, 0x83, 0xb9, 0x8b, 0x65, 0x91, + 0x9d, 0x70, 0xd6, 0x3d, 0x92, 0x86, 0x32, 0x6f, 0xc6, 0x2c, 0x35, 0x43, 0xbf, 0x5f, 0xe2, 0x40, + 0x66, 0xab, 0xd3, 0x12, 0xca, 0x5e, 0x25, 0xa1, 0xdc, 0x94, 0x84, 0xea, 0x7f, 0x22, 0x01, 0x44, + 0xfe, 0x6c, 0xf6, 0xba, 0xcc, 0x9d, 0xa8, 0xa8, 0x42, 0x98, 0x92, 0xe8, 0xaa, 0x41, 0xfd, 0xe4, + 0x22, 0x4b, 0x73, 0x28, 0x4d, 0xfd, 0x2f, 0x64, 0xb8, 0xd1, 0x98, 0xf8, 0xce, 0x85, 0x7b, 0x4e, + 0x78, 0x18, 0x96, 0x66, 0x7a, 0x18, 0x5e, 0x48, 0x7c, 0x18, 0x96, 0xdf, 0xf1, 0x30, 0xbc, 0x20, + 0x3c, 0x0c, 0x7f, 0xce, 0x6f, 0xa0, 0xe0, 0x75, 0x38, 0x45, 0xaf, 0x82, 0xd5, 0xa4, 0x8a, 0x30, + 0x7f, 0x28, 0xa6, 0x57, 0x51, 0x9b, 0x3f, 0x16, 0xab, 0xd1, 0x55, 0x14, 0xac, 0x90, 0xa6, 0x2b, + 0x5c, 0x59, 0x0b, 0x0f, 0x6f, 0x24, 0xbe, 0x0c, 0xf1, 0x76, 0xfc, 0x89, 0xbf, 0xfe, 0xa7, 0x32, + 0x54, 0xc9, 0xe1, 0x08, 0x57, 0xee, 0x54, 0xf1, 0x59, 0x9a, 0xa1, 0xf8, 0x9c, 0xb9, 0xaa, 0x8c, + 0x25, 0xcf, 0x54, 0xfa, 0x49, 0xcd, 0x5c, 0xfa, 0x49, 0xcf, 0x5f, 0xfa, 0xc9, 0xce, 0x5b, 0xc6, + 0xfa, 0xfb, 0x34, 0x2c, 0x25, 0xc4, 0x73, 0x24, 0xc6, 0x66, 0xf1, 0xdc, 0x74, 0x8c, 0xcd, 0x60, + 0x24, 0xc6, 0xe6, 0xbf, 0x48, 0x02, 0x5d, 0x65, 0x8f, 0xcc, 0xce, 0xf1, 0xb1, 0x87, 0x7d, 0x7d, + 0xe4, 0x71, 0x95, 0x2d, 0x53, 0x70, 0x9b, 0x42, 0xf7, 0x3d, 0xe2, 0xa1, 0xb1, 0x6d, 0x0a, 0x54, + 0x4c, 0x77, 0x8b, 0xd8, 0x36, 0x43, 0x1a, 0xb1, 0x97, 0x22, 0x3d, 0x77, 0x2f, 0x45, 0x66, 0xe6, + 0x5e, 0x8a, 0xec, 0x7c, 0xbd, 0x14, 0xb9, 0x6b, 0xf4, 0x52, 0xe4, 0xdf, 0xaf, 0x97, 0xa2, 0x30, + 0x7b, 0x2f, 0x05, 0xcc, 0xdf, 0x4b, 0x51, 0xbc, 0x56, 0x2f, 0xc5, 0xbf, 0x64, 0x61, 0xf5, 0xf2, + 0x18, 0xfe, 0xea, 0x54, 0x3e, 0xca, 0x3b, 0xe5, 0x2b, 0x9a, 0x2e, 0x52, 0xf1, 0x76, 0x87, 0x67, + 0xc0, 0x9e, 0xec, 0xf4, 0x91, 0xf5, 0xc6, 0xb2, 0x07, 0xb5, 0x2a, 0x95, 0x48, 0xac, 0x2b, 0x60, + 0x9f, 0xe2, 0x34, 0xf6, 0x04, 0xca, 0x06, 0xb1, 0x3e, 0x89, 0xf4, 0x0c, 0xdd, 0x1a, 0x99, 0x84, + 0x6e, 0x0d, 0xf4, 0x84, 0x87, 0x66, 0x4c, 0x71, 0xae, 0x70, 0x62, 0x34, 0xdc, 0x0a, 0x5e, 0xfe, + 0x36, 0x63, 0x71, 0x60, 0xf2, 0xcb, 0x1f, 0x9f, 0x12, 0x44, 0x81, 0x3f, 0x10, 0x02, 0x3b, 0x78, + 0xf7, 0xeb, 0x1f, 0x9f, 0x1d, 0xbd, 0x00, 0x46, 0x6a, 0x9b, 0xbf, 0x86, 0xda, 0x16, 0xe6, 0x50, + 0xdb, 0xb8, 0xa7, 0x2f, 0xce, 0xe7, 0xe9, 0x7f, 0x23, 0x4c, 0x73, 0x82, 0x05, 0x4a, 0xf1, 0x9c, + 0x43, 0x38, 0xad, 0x20, 0xd1, 0xb9, 0xe2, 0x9e, 0x28, 0xcf, 0x7f, 0x4f, 0xa0, 0xef, 0x07, 0x99, + 0x4b, 0xb0, 0x48, 0x85, 0x2e, 0x92, 0xf8, 0x7c, 0xca, 0x53, 0x97, 0x60, 0xaa, 0x68, 0x58, 0xca, + 0xec, 0x86, 0xc5, 0x3e, 0x24, 0x5e, 0x50, 0xff, 0x93, 0x01, 0x25, 0x9e, 0xd8, 0x7e, 0x43, 0x9d, + 0x41, 0xa5, 0xe4, 0xce, 0xa0, 0x50, 0xef, 0xd3, 0xef, 0xa9, 0xf7, 0x99, 0xf7, 0xd3, 0xfb, 0xec, + 0xb5, 0xf4, 0xfe, 0x9b, 0x72, 0xd7, 0x71, 0xbd, 0x2f, 0x5c, 0x57, 0xef, 0xe1, 0x7a, 0x7a, 0x5f, + 0xfc, 0x3a, 0xf4, 0xbe, 0xfc, 0x5e, 0x7a, 0x5f, 0xb9, 0x8e, 0xde, 0xff, 0x4d, 0x1a, 0x6a, 0x97, + 0x55, 0x66, 0xae, 0xbe, 0x4d, 0xc4, 0x9e, 0x2d, 0x39, 0xd6, 0xb3, 0xf5, 0x6d, 0x28, 0x4d, 0x35, + 0x6b, 0x31, 0x4b, 0x28, 0x7a, 0x51, 0x9b, 0x96, 0xa0, 0x32, 0xe9, 0x6b, 0x04, 0xc5, 0x99, 0x6b, + 0x04, 0xc5, 0xd9, 0xeb, 0xaa, 0x4c, 0xee, 0x7a, 0x2a, 0x93, 0xff, 0x3a, 0x54, 0xa6, 0xf0, 0x5e, + 0x2a, 0x03, 0x33, 0xaa, 0x8c, 0xa0, 0x28, 0x3f, 0xcd, 0xc2, 0xad, 0x2b, 0xea, 0x6e, 0xef, 0xea, + 0xd3, 0x65, 0x9d, 0x4a, 0x51, 0x53, 0xa3, 0x1c, 0x36, 0x35, 0x52, 0x04, 0x6f, 0x6a, 0xd4, 0xc4, + 0x91, 0x49, 0xa6, 0xc5, 0x7a, 0x21, 0x53, 0x89, 0xbd, 0x90, 0xb1, 0x4e, 0xc8, 0xff, 0x27, 0xc7, + 0x99, 0xbf, 0x96, 0xe3, 0xcc, 0x5e, 0xc3, 0x71, 0xe6, 0x7e, 0x15, 0x30, 0xbc, 0x8f, 0x15, 0x54, + 0xaf, 0xe3, 0x38, 0x7f, 0x29, 0x01, 0xba, 0x58, 0x40, 0xbe, 0xda, 0x0c, 0x3e, 0x12, 0xfa, 0x22, + 0xe5, 0x78, 0x5f, 0x64, 0xd4, 0x15, 0xf9, 0x88, 0xeb, 0x6f, 0x2a, 0x56, 0x78, 0x6f, 0x5a, 0x2e, + 0xee, 0xfb, 0x09, 0x5d, 0x6e, 0x1f, 0x41, 0xf9, 0x35, 0x3e, 0xf2, 0x9c, 0xfe, 0x29, 0xf6, 0xa3, + 0xae, 0xe7, 0xdd, 0x05, 0xad, 0x14, 0x82, 0x49, 0x20, 0x2d, 0xee, 0x3d, 0x33, 0xef, 0xde, 0xeb, + 0x7f, 0x26, 0x83, 0x12, 0xe7, 0xe0, 0x57, 0x39, 0xfc, 0x2f, 0x64, 0x58, 0xbc, 0x60, 0x32, 0xdf, + 0x54, 0x3b, 0x5e, 0xf6, 0xaa, 0xd3, 0x4c, 0xcd, 0x74, 0x9a, 0xe9, 0x99, 0x4f, 0x33, 0x33, 0xff, + 0x69, 0xe6, 0xe6, 0x3d, 0xcd, 0x57, 0xc1, 0x63, 0xeb, 0x1e, 0xcd, 0x4c, 0xe7, 0x7f, 0x6c, 0xbd, + 0x24, 0xc5, 0xad, 0xff, 0x79, 0xf8, 0x8c, 0xdb, 0xe5, 0x4f, 0x35, 0xf3, 0xae, 0xcc, 0x1f, 0x67, + 0x19, 0xa3, 0xba, 0xd0, 0xa9, 0x58, 0x36, 0x4c, 0x93, 0x89, 0x3d, 0xf6, 0x38, 0x2b, 0x92, 0xa6, + 0xc4, 0xc7, 0xd9, 0x88, 0xba, 0xfe, 0x7d, 0xa8, 0x4c, 0x3f, 0x4b, 0xa0, 0xfb, 0x90, 0xb6, 0xec, + 0x63, 0xe7, 0xc2, 0xe3, 0xb6, 0xf0, 0xdc, 0x44, 0x09, 0xd6, 0x5e, 0x41, 0x49, 0x6c, 0xed, 0x46, + 0x2b, 0x80, 0x1a, 0x87, 0xcd, 0x56, 0x5b, 0xdf, 0xde, 0x6d, 0x1c, 0x1c, 0xa8, 0x7b, 0xfa, 0x56, + 0xbb, 0xb7, 0xab, 0x2c, 0x5c, 0x84, 0xef, 0xa9, 0x3b, 0x3d, 0x45, 0x42, 0x1f, 0xc0, 0xd2, 0x34, + 0x5c, 0x6b, 0xbd, 0xd8, 0xed, 0x29, 0xf2, 0xda, 0x3f, 0x4a, 0x70, 0x23, 0xf1, 0xf6, 0x41, 0x0a, + 0x94, 0x76, 0x37, 0x9e, 0x3e, 0xd1, 0x9f, 0x6d, 0x3c, 0xee, 0xe8, 0x9b, 0x8f, 0x95, 0x85, 0x69, + 0xc8, 0xd3, 0xc7, 0x8a, 0x84, 0x16, 0xa1, 0x4c, 0x21, 0xbf, 0xf6, 0xf8, 0x33, 0x46, 0x24, 0xc7, + 0x40, 0x4f, 0x1f, 0x2b, 0x29, 0x74, 0x13, 0x6e, 0x74, 0xda, 0x5a, 0x4f, 0x6b, 0xb4, 0x7a, 0xfa, + 0xd4, 0x92, 0xe9, 0x4b, 0x50, 0x4f, 0x1f, 0x2b, 0x19, 0xb4, 0x0a, 0x2b, 0xd3, 0xa8, 0xf0, 0x23, + 0xd9, 0xcb, 0x70, 0x4f, 0x1f, 0x2b, 0xb9, 0xb5, 0x2d, 0xde, 0x0f, 0x1e, 0x19, 0x1d, 0x5a, 0x06, + 0xa5, 0xa9, 0xee, 0x34, 0x0e, 0xf7, 0x7a, 0xfa, 0x4e, 0x6b, 0x4f, 0xed, 0xfd, 0x56, 0x47, 0x55, + 0x16, 0x50, 0x0e, 0x52, 0xfb, 0x9d, 0x27, 0x8a, 0x44, 0x7e, 0xb4, 0x5f, 0xbc, 0x50, 0x64, 0x06, + 0xd9, 0x54, 0x52, 0x6b, 0xbb, 0x81, 0xa4, 0x82, 0x96, 0x52, 0x71, 0x89, 0x8e, 0xd6, 0xee, 0xb5, + 0xb7, 0xdb, 0x7b, 0xca, 0x02, 0xca, 0x43, 0x5a, 0xeb, 0xed, 0x77, 0xd8, 0x1a, 0x5d, 0xad, 0xa7, + 0xc8, 0xa8, 0x0c, 0x85, 0x57, 0xea, 0x56, 0xb7, 0xbd, 0xfd, 0x52, 0xed, 0x29, 0xa9, 0xb5, 0x03, + 0xb8, 0x91, 0xd8, 0xa3, 0x8a, 0xee, 0xc1, 0x9d, 0x60, 0xc1, 0xae, 0xfa, 0x62, 0x5f, 0x3d, 0xe8, + 0xa9, 0x4d, 0xca, 0x9d, 0xb8, 0x3e, 0x39, 0xf1, 0xbd, 0x6e, 0x04, 0x91, 0xd6, 0x1e, 0xc5, 0x7a, + 0x64, 0x79, 0xff, 0x60, 0x01, 0x32, 0xad, 0x83, 0xa6, 0xfa, 0x95, 0xb2, 0x40, 0x18, 0xe8, 0xb5, + 0xf6, 0xd5, 0x6e, 0xaf, 0x41, 0x18, 0x5b, 0x3b, 0x86, 0x6a, 0xac, 0xf9, 0x90, 0x28, 0x49, 0x6b, + 0xbf, 0xf1, 0x42, 0xd5, 0xbb, 0x87, 0x3b, 0x3b, 0xad, 0xaf, 0xf4, 0x60, 0xe6, 0x2a, 0xac, 0x4c, + 0xc1, 0x85, 0x65, 0xd0, 0x1d, 0xb8, 0x35, 0x85, 0x3b, 0x68, 0x1f, 0xa8, 0x7a, 0xfb, 0x4b, 0x55, + 0x7b, 0xa5, 0xb5, 0x7a, 0xaa, 0x22, 0xaf, 0xfd, 0x10, 0x94, 0xf8, 0x23, 0x3d, 0x59, 0x50, 0x7d, + 0xa1, 0xa9, 0xdd, 0xae, 0xde, 0x6d, 0x1f, 0x6a, 0xdb, 0xaa, 0x4e, 0x4e, 0x5e, 0x7f, 0xa5, 0x6e, + 0xb1, 0x8f, 0x25, 0xe0, 0xba, 0xcd, 0x97, 0x8a, 0xb4, 0xf6, 0x57, 0x12, 0x94, 0xc4, 0xa7, 0x7b, + 0xb4, 0x04, 0xd5, 0x80, 0xb8, 0xd7, 0xd0, 0x7a, 0xad, 0x83, 0x17, 0xca, 0x02, 0xd1, 0x34, 0x0e, + 0xe4, 0x0f, 0x49, 0x92, 0x00, 0x52, 0x0f, 0x9a, 0x84, 0x4a, 0x16, 0xa6, 0x6e, 0xb7, 0xf7, 0x3b, + 0x7b, 0x6a, 0x4f, 0x55, 0x52, 0x02, 0x1d, 0x7f, 0x69, 0x4a, 0x23, 0x04, 0x95, 0x60, 0xb5, 0xad, + 0xb6, 0xd6, 0x53, 0x9b, 0x4a, 0x06, 0xd5, 0x60, 0x99, 0xc3, 0xf6, 0x5a, 0xfb, 0xad, 0x9e, 0xae, + 0xa9, 0x8d, 0xed, 0x5d, 0xb5, 0xa9, 0x64, 0xd7, 0x0e, 0xf9, 0xff, 0x9d, 0xf0, 0xe2, 0x17, 0x82, + 0x4a, 0x20, 0xcc, 0xfd, 0xd6, 0x57, 0x8c, 0xbd, 0x15, 0x40, 0xcd, 0xc3, 0xc6, 0x5e, 0x68, 0x71, + 0x8d, 0x17, 0xea, 0x01, 0x31, 0xc5, 0x55, 0x58, 0x99, 0x86, 0xef, 0xf5, 0x54, 0xed, 0xa0, 0x41, + 0x0e, 0x71, 0xe3, 0xdf, 0x32, 0x90, 0xe5, 0x05, 0xf3, 0xdf, 0x84, 0xa2, 0xd0, 0x35, 0x80, 0xae, + 0xea, 0x25, 0x58, 0x4d, 0xea, 0x8a, 0x41, 0x0d, 0x28, 0x89, 0xee, 0x15, 0x45, 0x51, 0x57, 0x82, + 0xd7, 0x7d, 0xc7, 0x12, 0xcc, 0x18, 0x2e, 0x2c, 0x31, 0xe5, 0x5e, 0x93, 0x97, 0x50, 0x01, 0xa2, + 0xae, 0x1e, 0x14, 0x45, 0x9e, 0x17, 0x1a, 0x93, 0x56, 0x6f, 0x25, 0xe2, 0x78, 0x1b, 0xd0, 0xe7, + 0x00, 0x51, 0x5f, 0x0b, 0x12, 0x5f, 0x2f, 0x63, 0xcd, 0x2e, 0xc9, 0x5c, 0xf4, 0xa0, 0x46, 0x8f, + 0x2d, 0xa1, 0x98, 0x8a, 0x66, 0x69, 0x97, 0x48, 0x5e, 0xf5, 0x0b, 0xe2, 0x25, 0x0c, 0xd7, 0x0f, + 0x4b, 0x49, 0xe8, 0xf2, 0xbe, 0x89, 0xe4, 0x15, 0x3a, 0xb0, 0x42, 0x57, 0xb8, 0xf8, 0x8c, 0xf4, + 0xee, 0x56, 0x8a, 0xe4, 0x15, 0xbf, 0x84, 0x9b, 0x74, 0xc5, 0xa4, 0xec, 0x0d, 0xcd, 0xd4, 0x54, + 0x91, 0xbc, 0x6e, 0x13, 0x94, 0x68, 0xdd, 0x0b, 0x3a, 0x79, 0x31, 0x36, 0x4e, 0x5c, 0x65, 0x6b, + 0xe7, 0xb7, 0xef, 0x0d, 0x2c, 0xff, 0x64, 0x72, 0xb4, 0xde, 0x77, 0x46, 0x8f, 0x38, 0xc1, 0xa3, + 0xa0, 0x5b, 0x3f, 0x00, 0xfc, 0xad, 0x5c, 0xde, 0xb3, 0xce, 0xf0, 0x4b, 0xd6, 0x5b, 0xe8, 0x3b, + 0xff, 0x21, 0x57, 0xf8, 0xf8, 0xf9, 0x73, 0x0a, 0x38, 0xca, 0xd2, 0x29, 0x9b, 0xff, 0x1b, 0x00, + 0x00, 0xff, 0xff, 0x7c, 0xd5, 0xb3, 0x4e, 0x92, 0x3a, 0x00, 0x00, } diff --git a/protobufs/livekit_egress.proto b/protobufs/livekit_egress.proto index 37bb20f59..e35e34f17 100644 --- a/protobufs/livekit_egress.proto +++ b/protobufs/livekit_egress.proto @@ -25,12 +25,7 @@ option ruby_package = "LiveKit::Proto"; service Egress { // Unified StartEgress RPC - // rpc StartEgress(StartEgressRequest) returns (EgressInfo); - rpc StartRoomCompositeEgress(RoomCompositeEgressRequest) returns (EgressInfo); - rpc StartWebEgress(WebEgressRequest) returns (EgressInfo); - rpc StartParticipantEgress(ParticipantEgressRequest) returns (EgressInfo); - rpc StartTrackCompositeEgress(TrackCompositeEgressRequest) returns (EgressInfo); - rpc StartTrackEgress(TrackEgressRequest) returns (EgressInfo); + rpc StartEgress(StartEgressRequest) returns (EgressInfo); // Update url/template or stream outputs // rpc UpdateEgress(UpdateEgressRequest) returns (EgressInfo); @@ -42,6 +37,13 @@ service Egress { // Stop a recording or stream rpc StopEgress(StopEgressRequest) returns (EgressInfo); + + // To be deprecated + rpc StartRoomCompositeEgress(RoomCompositeEgressRequest) returns (EgressInfo); + rpc StartWebEgress(WebEgressRequest) returns (EgressInfo); + rpc StartParticipantEgress(ParticipantEgressRequest) returns (EgressInfo); + rpc StartTrackCompositeEgress(TrackCompositeEgressRequest) returns (EgressInfo); + rpc StartTrackEgress(TrackEgressRequest) returns (EgressInfo); } // --- Core Request --- @@ -371,7 +373,7 @@ message EgressInfo { int64 updated_at = 18; oneof request { - // StartEgressRequest egress = 29; + StartEgressRequest egress = 29; ExportReplayRequest replay = 30; RoomCompositeEgressRequest room_composite = 4;