diff --git a/api/historyservice/v1/request_response.pb.go b/api/historyservice/v1/request_response.pb.go index 2674a85222e..24364302136 100644 --- a/api/historyservice/v1/request_response.pb.go +++ b/api/historyservice/v1/request_response.pb.go @@ -6979,6 +6979,149 @@ func (m *DeleteDLQTasksResponse) XXX_DiscardUnknown() { var xxx_messageInfo_DeleteDLQTasksResponse proto.InternalMessageInfo +type AddTasksRequest struct { + // Even though we can obtain the shard ID from the tasks, we still need the shard_id in the request for routing. If + // not, it would be possible to include tasks for shards that belong to different hosts, and we'd need to fan-out the + // request, which would be more complicated. + ShardId int32 `protobuf:"varint,1,opt,name=shard_id,json=shardId,proto3" json:"shard_id,omitempty"` + Tasks []*AddTasksRequest_Task `protobuf:"bytes,2,rep,name=tasks,proto3" json:"tasks,omitempty"` +} + +func (m *AddTasksRequest) Reset() { *m = AddTasksRequest{} } +func (*AddTasksRequest) ProtoMessage() {} +func (*AddTasksRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_b8c78c1d460a3711, []int{121} +} +func (m *AddTasksRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *AddTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_AddTasksRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *AddTasksRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_AddTasksRequest.Merge(m, src) +} +func (m *AddTasksRequest) XXX_Size() int { + return m.Size() +} +func (m *AddTasksRequest) XXX_DiscardUnknown() { + xxx_messageInfo_AddTasksRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_AddTasksRequest proto.InternalMessageInfo + +func (m *AddTasksRequest) GetShardId() int32 { + if m != nil { + return m.ShardId + } + return 0 +} + +func (m *AddTasksRequest) GetTasks() []*AddTasksRequest_Task { + if m != nil { + return m.Tasks + } + return nil +} + +type AddTasksRequest_Task struct { + // category is needed to deserialize the tasks. Examples include "transfer", "timer", etc. See the history/tasks + // package for a definitive list. Warning: this is not the same as the stringified value of a TaskCategory enum. + Category string `protobuf:"bytes,1,opt,name=category,proto3" json:"category,omitempty"` + // blob is the serialized task. + Blob *v14.DataBlob `protobuf:"bytes,2,opt,name=blob,proto3" json:"blob,omitempty"` +} + +func (m *AddTasksRequest_Task) Reset() { *m = AddTasksRequest_Task{} } +func (*AddTasksRequest_Task) ProtoMessage() {} +func (*AddTasksRequest_Task) Descriptor() ([]byte, []int) { + return fileDescriptor_b8c78c1d460a3711, []int{121, 0} +} +func (m *AddTasksRequest_Task) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *AddTasksRequest_Task) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_AddTasksRequest_Task.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *AddTasksRequest_Task) XXX_Merge(src proto.Message) { + xxx_messageInfo_AddTasksRequest_Task.Merge(m, src) +} +func (m *AddTasksRequest_Task) XXX_Size() int { + return m.Size() +} +func (m *AddTasksRequest_Task) XXX_DiscardUnknown() { + xxx_messageInfo_AddTasksRequest_Task.DiscardUnknown(m) +} + +var xxx_messageInfo_AddTasksRequest_Task proto.InternalMessageInfo + +func (m *AddTasksRequest_Task) GetCategory() string { + if m != nil { + return m.Category + } + return "" +} + +func (m *AddTasksRequest_Task) GetBlob() *v14.DataBlob { + if m != nil { + return m.Blob + } + return nil +} + +type AddTasksResponse struct { +} + +func (m *AddTasksResponse) Reset() { *m = AddTasksResponse{} } +func (*AddTasksResponse) ProtoMessage() {} +func (*AddTasksResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_b8c78c1d460a3711, []int{122} +} +func (m *AddTasksResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *AddTasksResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_AddTasksResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *AddTasksResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_AddTasksResponse.Merge(m, src) +} +func (m *AddTasksResponse) XXX_Size() int { + return m.Size() +} +func (m *AddTasksResponse) XXX_DiscardUnknown() { + xxx_messageInfo_AddTasksResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_AddTasksResponse proto.InternalMessageInfo + func init() { proto.RegisterType((*StartWorkflowExecutionRequest)(nil), "temporal.server.api.historyservice.v1.StartWorkflowExecutionRequest") proto.RegisterType((*StartWorkflowExecutionResponse)(nil), "temporal.server.api.historyservice.v1.StartWorkflowExecutionResponse") @@ -7105,6 +7248,9 @@ func init() { proto.RegisterType((*GetDLQTasksResponse)(nil), "temporal.server.api.historyservice.v1.GetDLQTasksResponse") proto.RegisterType((*DeleteDLQTasksRequest)(nil), "temporal.server.api.historyservice.v1.DeleteDLQTasksRequest") proto.RegisterType((*DeleteDLQTasksResponse)(nil), "temporal.server.api.historyservice.v1.DeleteDLQTasksResponse") + proto.RegisterType((*AddTasksRequest)(nil), "temporal.server.api.historyservice.v1.AddTasksRequest") + proto.RegisterType((*AddTasksRequest_Task)(nil), "temporal.server.api.historyservice.v1.AddTasksRequest.Task") + proto.RegisterType((*AddTasksResponse)(nil), "temporal.server.api.historyservice.v1.AddTasksResponse") } func init() { @@ -7112,344 +7258,347 @@ func init() { } var fileDescriptor_b8c78c1d460a3711 = []byte{ - // 5380 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x5b, 0x6c, 0x1c, 0xd7, - 0x79, 0xb0, 0x66, 0x2f, 0xe4, 0xee, 0x47, 0x72, 0x2f, 0xc3, 0xdb, 0x8a, 0x94, 0x56, 0xd4, 0x48, - 0xb2, 0x28, 0xd9, 0x5a, 0xd9, 0x92, 0x1d, 0x2b, 0xfe, 0x63, 0x3b, 0x22, 0x75, 0xa3, 0x4c, 0x39, - 0xf4, 0x90, 0x96, 0x9d, 0xc4, 0xf2, 0x78, 0xb8, 0x73, 0x48, 0x4e, 0xb4, 0x3b, 0xb3, 0x9a, 0x99, - 0xe5, 0xc5, 0x7f, 0x81, 0x14, 0x08, 0xda, 0x26, 0x7e, 0x68, 0x5d, 0x14, 0x05, 0x82, 0x22, 0xed, - 0x43, 0x81, 0xd4, 0x46, 0x81, 0xa2, 0x0f, 0x29, 0x50, 0xf4, 0x21, 0x2f, 0x7d, 0x08, 0x8a, 0xa2, - 0x0f, 0x6e, 0x5e, 0x6a, 0xb4, 0xe8, 0xc5, 0x72, 0x8b, 0x26, 0x6f, 0x7e, 0xeb, 0xe5, 0xa9, 0x38, - 0xb7, 0xb9, 0xef, 0xec, 0x8d, 0xaa, 0x9c, 0xd4, 0x6f, 0x9c, 0x73, 0xce, 0xf7, 0x9d, 0xef, 0x7c, - 0xd7, 0x73, 0xbe, 0xf3, 0x9d, 0x25, 0x7c, 0xc5, 0x41, 0xcd, 0x96, 0x69, 0xa9, 0x8d, 0x8b, 0x36, - 0xb2, 0x76, 0x91, 0x75, 0x51, 0x6d, 0xe9, 0x17, 0x77, 0x74, 0xdb, 0x31, 0xad, 0x03, 0xdc, 0xa2, - 0xd7, 0xd1, 0xc5, 0xdd, 0x67, 0x2e, 0x5a, 0xe8, 0x41, 0x1b, 0xd9, 0x8e, 0x62, 0x21, 0xbb, 0x65, - 0x1a, 0x36, 0xaa, 0xb5, 0x2c, 0xd3, 0x31, 0xc5, 0x33, 0x1c, 0xba, 0x46, 0xa1, 0x6b, 0x6a, 0x4b, - 0xaf, 0x05, 0xa1, 0x6b, 0xbb, 0xcf, 0xcc, 0x55, 0xb7, 0x4d, 0x73, 0xbb, 0x81, 0x2e, 0x12, 0xa0, - 0xcd, 0xf6, 0xd6, 0x45, 0xad, 0x6d, 0xa9, 0x8e, 0x6e, 0x1a, 0x14, 0xcd, 0xdc, 0x89, 0x70, 0xbf, - 0xa3, 0x37, 0x91, 0xed, 0xa8, 0xcd, 0x16, 0x1b, 0x70, 0x52, 0x43, 0x2d, 0x64, 0x68, 0xc8, 0xa8, - 0xeb, 0xc8, 0xbe, 0xb8, 0x6d, 0x6e, 0x9b, 0xa4, 0x9d, 0xfc, 0xc5, 0x86, 0x9c, 0x76, 0x17, 0x82, - 0x57, 0x50, 0x37, 0x9b, 0x4d, 0xd3, 0xc0, 0x94, 0x37, 0x91, 0x6d, 0xab, 0xdb, 0x8c, 0xe0, 0xb9, - 0x33, 0x81, 0x51, 0x8c, 0xd2, 0xe8, 0xb0, 0xb3, 0x81, 0x61, 0x8e, 0x6a, 0xdf, 0x7f, 0xd0, 0x46, - 0x6d, 0x14, 0x1d, 0x18, 0x9c, 0x15, 0x19, 0xed, 0xa6, 0x8d, 0x07, 0xed, 0x99, 0xd6, 0xfd, 0xad, - 0x86, 0xb9, 0xc7, 0x46, 0x3d, 0x11, 0x18, 0xc5, 0x3b, 0xa3, 0xd8, 0x4e, 0x05, 0xc6, 0x3d, 0x68, - 0xa3, 0x38, 0xda, 0x82, 0xc8, 0x48, 0x5b, 0xdd, 0x6c, 0x74, 0x5b, 0xea, 0x96, 0xaa, 0x37, 0xda, - 0x56, 0xcc, 0x0a, 0xce, 0xc7, 0x29, 0x40, 0xbd, 0x61, 0xd6, 0xef, 0x47, 0xc7, 0x3e, 0x95, 0xa0, - 0x2c, 0xd1, 0xd1, 0xe7, 0xe2, 0x46, 0xbb, 0x2c, 0xa2, 0x12, 0x62, 0x43, 0x9f, 0x4c, 0x1c, 0x1a, - 0xe2, 0xe6, 0xd9, 0xc4, 0xc1, 0x58, 0x58, 0x6c, 0xe0, 0x85, 0xb8, 0x81, 0x9d, 0xb9, 0x5f, 0x8b, - 0x1b, 0x6e, 0xa8, 0x4d, 0x64, 0xb7, 0xd4, 0x7a, 0x0c, 0xe7, 0x9e, 0x8e, 0x1b, 0x6f, 0xa1, 0x56, - 0x43, 0xaf, 0x13, 0xe5, 0x8e, 0x42, 0x5c, 0x8e, 0x83, 0x68, 0x21, 0xcb, 0xd6, 0x6d, 0x07, 0x19, - 0x74, 0x0e, 0xb4, 0x8f, 0xea, 0x6d, 0x0c, 0x6e, 0x33, 0xa0, 0x97, 0x7b, 0x00, 0xe2, 0x8b, 0x52, - 0x9a, 0x6d, 0x47, 0xdd, 0x6c, 0x20, 0xc5, 0x76, 0x54, 0x87, 0xcf, 0xfa, 0xa5, 0x58, 0xed, 0xeb, - 0x6a, 0xdc, 0x73, 0x2f, 0xc4, 0x4d, 0xac, 0x6a, 0x4d, 0xdd, 0xe8, 0x0a, 0x2b, 0xfd, 0x7c, 0x04, - 0x8e, 0xaf, 0x3b, 0xaa, 0xe5, 0xbc, 0xc1, 0xa6, 0xbb, 0xce, 0x97, 0x25, 0x53, 0x00, 0xf1, 0x24, - 0x8c, 0xbb, 0xbc, 0x55, 0x74, 0xad, 0x22, 0x2c, 0x08, 0x8b, 0x79, 0x79, 0xcc, 0x6d, 0x5b, 0xd1, - 0xc4, 0x3a, 0x4c, 0xd8, 0x18, 0x87, 0xc2, 0x26, 0xa9, 0xa4, 0x16, 0x84, 0xc5, 0xb1, 0x4b, 0x2f, - 0xb9, 0x82, 0x22, 0xee, 0x26, 0xb4, 0xa0, 0xda, 0xee, 0x33, 0xb5, 0xc4, 0x99, 0xe5, 0x71, 0x82, - 0x94, 0xd3, 0xb1, 0x03, 0xd3, 0x2d, 0xd5, 0x42, 0x86, 0xa3, 0xb8, 0x9c, 0x57, 0x74, 0x63, 0xcb, - 0xac, 0xa4, 0xc9, 0x64, 0xcf, 0xd6, 0xe2, 0x5c, 0x9c, 0xab, 0x91, 0xbb, 0xcf, 0xd4, 0xd6, 0x08, - 0xb4, 0x3b, 0xcb, 0x8a, 0xb1, 0x65, 0xca, 0x93, 0xad, 0x68, 0xa3, 0x58, 0x81, 0x51, 0xd5, 0xc1, - 0xd8, 0x9c, 0x4a, 0x66, 0x41, 0x58, 0xcc, 0xca, 0xfc, 0x53, 0x6c, 0x82, 0xe4, 0x4a, 0xd0, 0xa3, - 0x02, 0xed, 0xb7, 0x74, 0xea, 0x26, 0x15, 0xec, 0x0f, 0x2b, 0x59, 0x42, 0xd0, 0x5c, 0x8d, 0x3a, - 0xcb, 0x1a, 0x77, 0x96, 0xb5, 0x0d, 0xee, 0x2c, 0x97, 0x32, 0xef, 0xff, 0xf3, 0x09, 0x41, 0x3e, - 0xb1, 0x17, 0x5e, 0xf9, 0x75, 0x17, 0x13, 0x1e, 0x2b, 0xee, 0xc0, 0xd1, 0xba, 0x69, 0x38, 0xba, - 0xd1, 0x46, 0x8a, 0x6a, 0x2b, 0x06, 0xda, 0x53, 0x74, 0x43, 0x77, 0x74, 0xd5, 0x31, 0xad, 0xca, - 0xc8, 0x82, 0xb0, 0x58, 0xb8, 0x74, 0x21, 0xc8, 0x63, 0x62, 0x5d, 0x78, 0xb1, 0xcb, 0x0c, 0xee, - 0xaa, 0xfd, 0x2a, 0xda, 0x5b, 0xe1, 0x40, 0xf2, 0x4c, 0x3d, 0xb6, 0x5d, 0xbc, 0x03, 0x65, 0xde, - 0xa3, 0x29, 0xcc, 0x05, 0x55, 0x46, 0xc9, 0x3a, 0x16, 0x82, 0x33, 0xb0, 0x4e, 0x3c, 0xc7, 0x0d, - 0xfa, 0xa7, 0x5c, 0x72, 0x41, 0x59, 0x8b, 0x78, 0x17, 0x66, 0x1a, 0xaa, 0xed, 0x28, 0x75, 0xb3, - 0xd9, 0x6a, 0x20, 0xc2, 0x19, 0x0b, 0xd9, 0xed, 0x86, 0x53, 0xc9, 0xc5, 0xe1, 0x64, 0x2e, 0x86, - 0xc8, 0xe8, 0xa0, 0x61, 0xaa, 0x9a, 0x2d, 0x4f, 0x61, 0xf8, 0x65, 0x17, 0x5c, 0x26, 0xd0, 0xe2, - 0xdb, 0x30, 0xbf, 0xa5, 0x5b, 0xb6, 0xa3, 0xb8, 0x52, 0xc0, 0x5e, 0x44, 0xd9, 0x54, 0xeb, 0xf7, - 0xcd, 0xad, 0xad, 0x4a, 0x9e, 0x20, 0x3f, 0x1a, 0x61, 0xfc, 0x35, 0x16, 0xc5, 0x96, 0x32, 0xdf, - 0xc7, 0x7c, 0xaf, 0x10, 0x1c, 0x5c, 0xed, 0x36, 0x54, 0xfb, 0xfe, 0x12, 0x45, 0x20, 0xbe, 0x05, - 0x53, 0xb6, 0xd9, 0xb6, 0xea, 0x48, 0xd9, 0xc5, 0x76, 0x6b, 0x1a, 0x0a, 0x91, 0x57, 0x05, 0x08, - 0xe2, 0xf3, 0x9d, 0xa8, 0xc6, 0xa8, 0x90, 0x75, 0x97, 0x82, 0xac, 0x63, 0x08, 0x59, 0xa4, 0x78, - 0xfc, 0x6d, 0xd2, 0xcf, 0x04, 0xa8, 0x76, 0xd2, 0x78, 0x6a, 0x94, 0xe2, 0x34, 0x8c, 0x58, 0x6d, - 0xc3, 0x33, 0xb3, 0xac, 0xd5, 0x36, 0x56, 0x34, 0xf1, 0x65, 0xc8, 0x12, 0x4f, 0xcf, 0x0c, 0xeb, - 0x5c, 0xac, 0xae, 0x93, 0x11, 0x98, 0x9c, 0xbb, 0xa8, 0xee, 0x98, 0xd6, 0x32, 0xfe, 0x94, 0x29, - 0x9c, 0x68, 0xc0, 0x24, 0x52, 0xb7, 0x91, 0x15, 0x64, 0x1c, 0x33, 0x9d, 0xee, 0x76, 0xba, 0x66, - 0x36, 0x1a, 0x7e, 0x7e, 0xbd, 0x86, 0x83, 0x2c, 0x27, 0x5a, 0x2e, 0x13, 0xd4, 0xfe, 0x7e, 0xe9, - 0x6f, 0x53, 0x30, 0x73, 0x13, 0x39, 0x77, 0xa8, 0x97, 0x5b, 0xc7, 0x4e, 0xae, 0x0f, 0x7f, 0x72, - 0x13, 0xf2, 0xae, 0x75, 0x45, 0x97, 0x1c, 0xe5, 0x7d, 0x90, 0x97, 0x1e, 0xac, 0x78, 0x19, 0x66, - 0xd0, 0x7e, 0x0b, 0xd5, 0x1d, 0xa4, 0x29, 0x06, 0xda, 0x77, 0x14, 0xb4, 0x8b, 0x1d, 0x88, 0xae, - 0x91, 0x95, 0xa7, 0xe5, 0x49, 0xde, 0xfb, 0x2a, 0xda, 0x77, 0xae, 0xe3, 0xbe, 0x15, 0x4d, 0x7c, - 0x1a, 0xa6, 0xea, 0x6d, 0x8b, 0x78, 0x9a, 0x4d, 0x4b, 0x35, 0xea, 0x3b, 0x8a, 0x63, 0xde, 0x47, - 0x06, 0xf1, 0x05, 0xe3, 0xb2, 0xc8, 0xfa, 0x96, 0x48, 0xd7, 0x06, 0xee, 0x11, 0x35, 0x98, 0xe2, - 0xfa, 0xc2, 0x82, 0xac, 0xa2, 0x3b, 0xa8, 0xc9, 0x1c, 0xc1, 0xa5, 0x5a, 0xc2, 0xe6, 0x8b, 0xca, - 0x8b, 0xc0, 0xde, 0xa2, 0x2d, 0x2b, 0x0e, 0x6a, 0xca, 0xe2, 0x6e, 0xa4, 0x4d, 0xfa, 0x71, 0x1e, - 0x66, 0x23, 0x3c, 0x65, 0x7a, 0x13, 0xe0, 0x98, 0x30, 0x04, 0xc7, 0x56, 0x60, 0xc2, 0x53, 0x91, - 0x83, 0x16, 0x62, 0xec, 0x3f, 0xdd, 0x0d, 0xd9, 0xc6, 0x41, 0x0b, 0xc9, 0xe3, 0x7b, 0xbe, 0x2f, - 0x51, 0x82, 0x89, 0x38, 0x9e, 0x8f, 0x19, 0x3e, 0x5e, 0x7f, 0x19, 0x8e, 0xb6, 0x2c, 0xb4, 0xab, - 0x9b, 0x6d, 0x5b, 0x21, 0xde, 0x1e, 0x69, 0xde, 0xf8, 0x0c, 0x19, 0x3f, 0xc3, 0x07, 0xac, 0xd3, - 0x7e, 0x0e, 0x7a, 0x01, 0x26, 0x89, 0x8f, 0xa1, 0x0e, 0xc1, 0x05, 0xca, 0x12, 0xa0, 0x12, 0xee, - 0xba, 0x81, 0x7b, 0xf8, 0xf0, 0x65, 0x00, 0xe2, 0x2b, 0xc8, 0xfe, 0x90, 0x38, 0xcf, 0xc8, 0xaa, - 0xdc, 0xed, 0x23, 0x5e, 0x98, 0xa7, 0xe6, 0x79, 0x87, 0xff, 0x29, 0xae, 0x41, 0xd9, 0x76, 0xf4, - 0xfa, 0xfd, 0x03, 0xc5, 0x87, 0x6b, 0xb4, 0x0f, 0x5c, 0x45, 0x0a, 0xee, 0x36, 0x88, 0xff, 0x1f, - 0x9e, 0x8c, 0x60, 0x54, 0xec, 0xfa, 0x0e, 0xd2, 0xda, 0x0d, 0xa4, 0x38, 0x26, 0xe5, 0x0a, 0x89, - 0x2b, 0x66, 0xdb, 0xa9, 0x8c, 0xf5, 0xe6, 0xe1, 0xce, 0x84, 0xa6, 0x59, 0x67, 0x08, 0x37, 0x4c, - 0xc2, 0xc4, 0x0d, 0x8a, 0xad, 0xa3, 0xa6, 0x4f, 0x74, 0xd4, 0xf4, 0x6f, 0x42, 0xc1, 0x55, 0x0f, - 0xb2, 0x75, 0xa9, 0x14, 0x49, 0x18, 0x8a, 0x8f, 0xbe, 0x6e, 0x34, 0x8a, 0xa8, 0x1c, 0xd5, 0x5e, - 0x57, 0xd5, 0xc8, 0xa7, 0xf8, 0x06, 0x14, 0x03, 0xc8, 0xdb, 0x76, 0xa5, 0x44, 0xb0, 0xd7, 0x3a, - 0x04, 0xb9, 0x58, 0xb4, 0x6d, 0x5b, 0x2e, 0xf8, 0xf1, 0xb6, 0x6d, 0xf1, 0x1e, 0x94, 0x83, 0xf6, - 0xa9, 0x23, 0xbb, 0x52, 0x26, 0xac, 0x7c, 0xba, 0x2f, 0xe3, 0xd4, 0x91, 0x2d, 0x97, 0x76, 0x43, - 0x2d, 0xe2, 0x4b, 0x70, 0x4c, 0xc7, 0xea, 0x1b, 0x16, 0x23, 0x32, 0xb0, 0xa1, 0x6a, 0x15, 0x71, - 0x41, 0x58, 0xcc, 0xc9, 0x15, 0xdd, 0x5e, 0x0f, 0x4a, 0xe5, 0x3a, 0xed, 0x17, 0x9f, 0x85, 0xd9, - 0x88, 0x26, 0x3b, 0xfb, 0x24, 0x0a, 0x4c, 0x52, 0x37, 0x15, 0xd4, 0xe6, 0x8d, 0x7d, 0x1c, 0x13, - 0x2e, 0xc3, 0x0c, 0x03, 0x70, 0x37, 0x22, 0x2c, 0x74, 0x4c, 0x11, 0x8f, 0x3a, 0x49, 0x7a, 0x3d, - 0x23, 0x27, 0x81, 0xe4, 0x2d, 0x98, 0xda, 0x23, 0xc1, 0x2a, 0x14, 0xe0, 0xa6, 0xfb, 0x0f, 0x70, - 0x7b, 0x91, 0xb6, 0xdb, 0x99, 0x5c, 0xae, 0x94, 0xbf, 0x9d, 0xc9, 0xe5, 0x4b, 0x70, 0x3b, 0x93, - 0x83, 0xd2, 0xd8, 0xed, 0x4c, 0x6e, 0xbc, 0x34, 0x71, 0x3b, 0x93, 0x2b, 0x94, 0x8a, 0xd2, 0x4f, - 0x53, 0x30, 0x8b, 0x03, 0xc9, 0x17, 0x41, 0xe1, 0x10, 0x83, 0xc2, 0xef, 0xe5, 0xa0, 0x12, 0x65, - 0xea, 0x17, 0x51, 0xe1, 0x8b, 0xa8, 0x70, 0xe8, 0x51, 0x61, 0xbc, 0xa3, 0xaa, 0xc7, 0xfa, 0xd7, - 0xc2, 0xa1, 0xf9, 0xd7, 0x5f, 0xcc, 0xa0, 0x93, 0xe0, 0xd5, 0xcb, 0x83, 0x78, 0x75, 0xb1, 0xa3, - 0x57, 0x8f, 0xf5, 0xbb, 0x13, 0xa5, 0x82, 0xf4, 0x3d, 0x01, 0xe6, 0x65, 0x64, 0x23, 0x27, 0x14, - 0x78, 0x1e, 0x83, 0xd7, 0x95, 0xaa, 0x70, 0x2c, 0x9e, 0x14, 0xea, 0xab, 0xa4, 0x0f, 0xd3, 0xb0, - 0x20, 0xa3, 0xba, 0x69, 0x69, 0xfe, 0x83, 0x04, 0xb3, 0xee, 0x3e, 0x08, 0x7e, 0x13, 0xc4, 0xe8, - 0x11, 0xbd, 0x7f, 0xca, 0xcb, 0x91, 0xb3, 0xb9, 0xf8, 0x14, 0x88, 0xdc, 0x04, 0xb5, 0xb0, 0xfb, - 0x2a, 0xb9, 0x3d, 0xdc, 0xb3, 0xcc, 0xc2, 0x28, 0xb1, 0x5d, 0xd7, 0x63, 0x8d, 0xe0, 0xcf, 0x15, - 0x4d, 0x3c, 0x0e, 0xc0, 0x73, 0x31, 0xcc, 0x31, 0xe5, 0xe5, 0x3c, 0x6b, 0x59, 0xd1, 0xc4, 0x77, - 0x60, 0xbc, 0x65, 0x36, 0x1a, 0x6e, 0x2a, 0x85, 0xfa, 0xa4, 0x17, 0x07, 0x3d, 0xa2, 0xd1, 0x4c, - 0xca, 0x18, 0x46, 0xc9, 0x99, 0xe8, 0x1e, 0x26, 0x47, 0x07, 0x3b, 0x4c, 0x4a, 0xff, 0x95, 0x83, - 0x93, 0x09, 0xa2, 0x62, 0xc1, 0x27, 0x12, 0x33, 0x84, 0x81, 0x63, 0x46, 0x62, 0x3c, 0x48, 0x25, - 0xc6, 0x83, 0xfe, 0x84, 0xb6, 0x08, 0xa5, 0x0e, 0xf1, 0xa6, 0x60, 0x07, 0xf1, 0x46, 0xc2, 0x58, - 0x36, 0x1a, 0xc6, 0x7c, 0x79, 0xa4, 0x91, 0x60, 0x1e, 0xe9, 0x0a, 0x54, 0x98, 0x7f, 0xf7, 0x65, - 0x91, 0xd8, 0x6e, 0x71, 0x94, 0xec, 0x16, 0x67, 0x68, 0xbf, 0x97, 0x19, 0x62, 0x7b, 0xc5, 0x07, - 0x30, 0xeb, 0x58, 0xaa, 0x61, 0xeb, 0x78, 0xda, 0xe0, 0x61, 0x9e, 0xa6, 0x56, 0xbe, 0xdc, 0xcd, - 0xe1, 0x6e, 0x70, 0x70, 0xbf, 0xf0, 0x48, 0x32, 0x6c, 0xda, 0x89, 0xeb, 0x12, 0xb7, 0xe1, 0x78, - 0x4c, 0xd2, 0xcb, 0x17, 0xea, 0xf2, 0x7d, 0x84, 0xba, 0xb9, 0x88, 0x5d, 0x79, 0x51, 0xef, 0x24, - 0x8c, 0x07, 0x02, 0xce, 0x18, 0x09, 0x38, 0x63, 0x9b, 0xbe, 0x48, 0x73, 0x13, 0x0a, 0x9e, 0x38, - 0x49, 0xb2, 0x6d, 0xbc, 0xc7, 0x64, 0xdb, 0x84, 0x0b, 0x47, 0x52, 0x6b, 0xcb, 0x30, 0xce, 0x25, - 0x4d, 0xd0, 0x4c, 0xf4, 0x88, 0x66, 0x8c, 0x41, 0x11, 0x24, 0x26, 0x8c, 0x3e, 0x68, 0x23, 0x16, - 0xed, 0xd2, 0x8b, 0x63, 0x97, 0x5e, 0xaf, 0xf5, 0x74, 0xcf, 0x52, 0xeb, 0x6a, 0x3d, 0xb5, 0xd7, - 0x28, 0xde, 0xeb, 0x86, 0x63, 0x1d, 0xc8, 0x7c, 0x16, 0xcf, 0x74, 0x8b, 0x03, 0xe6, 0x81, 0x5e, - 0x84, 0x1c, 0xcb, 0x74, 0xe3, 0x30, 0x87, 0x49, 0x3e, 0x19, 0x14, 0x1b, 0xbf, 0xa6, 0xc0, 0xf0, - 0x77, 0xe8, 0x48, 0xd9, 0x05, 0xc1, 0x1a, 0xcd, 0xa2, 0x33, 0x8b, 0x61, 0xfc, 0x73, 0xee, 0x1d, - 0x18, 0xf7, 0x93, 0x2c, 0x96, 0x20, 0x7d, 0x1f, 0x1d, 0x30, 0x07, 0x8d, 0xff, 0x14, 0x5f, 0x80, - 0xec, 0xae, 0xda, 0x68, 0x77, 0xd8, 0x3b, 0x92, 0x3b, 0x14, 0xbf, 0x1b, 0xc0, 0xd8, 0x0e, 0x64, - 0x0a, 0xf2, 0x42, 0xea, 0x8a, 0x40, 0x03, 0x9b, 0x2f, 0x4c, 0x5c, 0xad, 0x3b, 0xfa, 0xae, 0xee, - 0x1c, 0x7c, 0x11, 0x26, 0xfa, 0x0d, 0x13, 0x7e, 0xce, 0x3d, 0xc2, 0x30, 0xf1, 0x8f, 0x19, 0x1e, - 0x26, 0x62, 0x45, 0xc5, 0xc2, 0xc4, 0xab, 0x50, 0x0c, 0xb1, 0x8b, 0x05, 0x8a, 0x33, 0xc1, 0xb5, - 0xf8, 0x3c, 0x18, 0x3b, 0xff, 0x10, 0x16, 0xca, 0x85, 0x20, 0x4b, 0x23, 0x86, 0x9d, 0x1a, 0xc4, - 0xb0, 0x7d, 0x9e, 0x3b, 0x1d, 0xf4, 0xdc, 0x08, 0xaa, 0x7c, 0x73, 0xcc, 0x9a, 0x94, 0x90, 0x43, - 0xca, 0xf4, 0x38, 0xe1, 0x3c, 0xc3, 0x73, 0x95, 0xa2, 0x59, 0x0f, 0xb8, 0xa7, 0x3b, 0x50, 0xde, - 0x41, 0xaa, 0xe5, 0x6c, 0x22, 0xd5, 0x51, 0x34, 0xe4, 0xa8, 0x7a, 0xc3, 0x66, 0x27, 0xc7, 0xee, - 0xb9, 0xf3, 0x92, 0x0b, 0x7a, 0x8d, 0x42, 0x46, 0x63, 0xf1, 0xc8, 0xc0, 0xb1, 0xf8, 0x82, 0xcf, - 0x70, 0x5c, 0x83, 0x22, 0x3a, 0x92, 0xf7, 0xac, 0xe1, 0x55, 0xde, 0xe1, 0x69, 0x51, 0x6e, 0x40, - 0x8f, 0xe5, 0x73, 0x39, 0xf9, 0x80, 0xcb, 0x91, 0xfe, 0x42, 0x80, 0x53, 0x54, 0x8d, 0x02, 0x9e, - 0x94, 0x5d, 0x1a, 0xf4, 0xe5, 0x0d, 0x4c, 0x28, 0xb1, 0xab, 0x0a, 0x14, 0xba, 0xc3, 0xba, 0xd6, - 0xd5, 0xa2, 0x7a, 0x20, 0x41, 0x2e, 0x72, 0xec, 0xac, 0x41, 0xfa, 0x20, 0x0d, 0xa7, 0x93, 0x01, - 0x99, 0x79, 0xec, 0x79, 0x3b, 0x12, 0x7e, 0x73, 0xc7, 0xec, 0xe3, 0xd6, 0x61, 0xc5, 0x9a, 0xa5, - 0x54, 0x45, 0xc0, 0x47, 0xd0, 0xa0, 0x5d, 0x22, 0x28, 0xa8, 0xcc, 0x6c, 0x49, 0xac, 0xb7, 0x2b, - 0x29, 0x12, 0x2f, 0x5e, 0x1a, 0xd4, 0xc5, 0xb0, 0xcb, 0x82, 0x09, 0xd5, 0xd7, 0x65, 0xe3, 0xf3, - 0x8e, 0x85, 0x8f, 0x05, 0x6e, 0x8e, 0x24, 0x9c, 0x8c, 0x21, 0xbd, 0x7e, 0x8b, 0x5f, 0xd1, 0xc4, - 0x6f, 0x41, 0xd9, 0x40, 0x7b, 0xa1, 0xed, 0x4f, 0xe6, 0x50, 0xee, 0x32, 0x8a, 0x06, 0xda, 0x0b, - 0xdc, 0x64, 0xfc, 0xa9, 0x80, 0x03, 0x4e, 0x44, 0x52, 0x37, 0x54, 0xbd, 0xd1, 0x97, 0x8a, 0xed, - 0x40, 0x61, 0x8b, 0xc0, 0x84, 0x14, 0xec, 0xea, 0x20, 0x0a, 0x16, 0x98, 0x5d, 0x9e, 0xd8, 0xf2, - 0x7f, 0x4a, 0xa7, 0xb0, 0xdb, 0xed, 0x08, 0xc2, 0x8e, 0x5b, 0xff, 0x21, 0xc0, 0xdc, 0x8a, 0xed, - 0x1f, 0x70, 0x57, 0x6d, 0xe8, 0xda, 0xe3, 0xc8, 0xc7, 0xb9, 0x2e, 0x22, 0x3d, 0xa0, 0x8b, 0x88, - 0x8f, 0xb8, 0x99, 0xf8, 0x88, 0x2b, 0x5d, 0x81, 0xf9, 0xd8, 0x85, 0x33, 0xbd, 0x3f, 0x0a, 0x39, - 0xdd, 0x56, 0x76, 0x71, 0x1b, 0x59, 0x75, 0x4e, 0x1e, 0xd5, 0x6d, 0x32, 0x04, 0x3b, 0x1c, 0x29, - 0x1a, 0xd0, 0x6e, 0x71, 0x67, 0xdb, 0x07, 0xef, 0x5a, 0x7e, 0xf7, 0x1e, 0xd4, 0x87, 0xe5, 0x1e, - 0xf4, 0xa1, 0x1b, 0x09, 0xbe, 0x08, 0xc0, 0x95, 0x62, 0x0d, 0xfb, 0xca, 0x04, 0x38, 0xb6, 0xfa, - 0x73, 0x50, 0xaa, 0xab, 0x46, 0x1d, 0xb9, 0x1b, 0x0b, 0xc4, 0xb9, 0x50, 0xa4, 0xed, 0x32, 0x6f, - 0xf6, 0xbb, 0x5f, 0x3f, 0xce, 0xc7, 0xe4, 0x7e, 0x93, 0x48, 0x88, 0xba, 0xdf, 0x27, 0x5c, 0xef, - 0xdb, 0x01, 0x8e, 0x59, 0x89, 0xcf, 0xf8, 0xfd, 0x03, 0xff, 0xf7, 0x8d, 0xbf, 0xe3, 0xec, 0x9d, - 0x8d, 0x3f, 0x0e, 0x84, 0x2d, 0xeb, 0x47, 0x44, 0x91, 0xa3, 0xeb, 0x27, 0x12, 0xee, 0x6b, 0x61, - 0xdf, 0x82, 0x42, 0x50, 0x5f, 0xfa, 0xd0, 0xe2, 0x6e, 0xf3, 0xcb, 0x13, 0x01, 0x95, 0x93, 0xce, - 0xc4, 0xeb, 0x9b, 0x0b, 0x14, 0xf0, 0x6c, 0xfe, 0x21, 0xff, 0xa7, 0x3c, 0x5b, 0xcc, 0xc2, 0xbb, - 0x7b, 0xb6, 0x9f, 0xa4, 0xa0, 0xba, 0xae, 0x6f, 0x1b, 0x6a, 0x63, 0x98, 0x32, 0xa0, 0x2d, 0x28, - 0xd8, 0x04, 0x49, 0x48, 0x19, 0x5e, 0xee, 0x5e, 0x07, 0x94, 0x38, 0xb7, 0x3c, 0x41, 0xd1, 0x72, - 0x52, 0x74, 0x98, 0x47, 0xfb, 0x0e, 0xb2, 0xf0, 0x4c, 0x31, 0x87, 0xb8, 0x74, 0xbf, 0x12, 0x3b, - 0xca, 0xb1, 0x45, 0xba, 0xc4, 0x1a, 0x4c, 0xd6, 0x77, 0xf4, 0x86, 0xe6, 0xcd, 0x63, 0x1a, 0x8d, - 0x03, 0x22, 0x81, 0x9c, 0x5c, 0x26, 0x5d, 0x1c, 0xe8, 0x6b, 0x46, 0xe3, 0x40, 0x3a, 0x09, 0x27, - 0x3a, 0xae, 0x85, 0xe9, 0xe7, 0x4f, 0x05, 0x38, 0xcb, 0xc6, 0xe8, 0xce, 0xce, 0xd0, 0xb5, 0x57, - 0xdf, 0x11, 0xe0, 0x28, 0xe3, 0xfa, 0x9e, 0xee, 0xec, 0x28, 0x71, 0x85, 0x58, 0xb7, 0x7a, 0x15, - 0x40, 0x37, 0x82, 0xe4, 0x19, 0x3b, 0x38, 0x90, 0xdb, 0xe6, 0x55, 0x58, 0xec, 0x8e, 0x22, 0xb1, - 0xc6, 0x45, 0xfa, 0xb1, 0x00, 0x27, 0x64, 0xd4, 0x34, 0x77, 0x11, 0xc5, 0x34, 0xe0, 0x35, 0xe1, - 0xa3, 0x3b, 0xd8, 0x07, 0x4f, 0xe4, 0xe9, 0xd0, 0x89, 0x5c, 0x92, 0x70, 0xa8, 0xe8, 0x44, 0x3e, - 0x97, 0x7d, 0x0a, 0x4e, 0x6e, 0x20, 0xab, 0xa9, 0x1b, 0xaa, 0x83, 0x86, 0x91, 0xba, 0x09, 0x65, - 0x87, 0xe3, 0x09, 0x09, 0x7b, 0xa9, 0xab, 0xb0, 0xbb, 0x52, 0x20, 0x97, 0x5c, 0xe4, 0xbf, 0x00, - 0x36, 0x77, 0x1a, 0xa4, 0xa4, 0x15, 0x31, 0xd6, 0xff, 0xb7, 0x00, 0xd5, 0x6b, 0x08, 0x87, 0xf7, - 0x61, 0xf8, 0xfe, 0xe8, 0xb4, 0xeb, 0x1c, 0x94, 0x5c, 0xcc, 0xfc, 0xc0, 0x4b, 0x8f, 0x40, 0xee, - 0xfd, 0x14, 0xbb, 0x2a, 0x23, 0x17, 0x74, 0x0d, 0xd3, 0x46, 0xf1, 0x1c, 0x12, 0x69, 0x5f, 0xd8, - 0x2d, 0x75, 0x5c, 0x3b, 0xe3, 0xcf, 0x07, 0x02, 0x1c, 0x27, 0x17, 0x34, 0x43, 0x16, 0x82, 0xd2, - 0xd3, 0x5c, 0xbf, 0x85, 0xa0, 0x89, 0x33, 0xcb, 0xe3, 0x04, 0x29, 0xf7, 0x35, 0xcf, 0x43, 0xb5, - 0xd3, 0xf0, 0x64, 0x0f, 0xf3, 0x3b, 0x69, 0x38, 0xc3, 0x90, 0xd0, 0x5d, 0xc3, 0x30, 0x4b, 0x6d, - 0x76, 0xd8, 0xf9, 0xdc, 0xe8, 0x61, 0xad, 0x3d, 0x90, 0x10, 0xda, 0xfc, 0x88, 0x2f, 0xfa, 0xec, - 0x8f, 0xd5, 0x80, 0x46, 0xd3, 0x8b, 0x15, 0x3e, 0x64, 0x85, 0x8f, 0xe0, 0x27, 0xe6, 0x2e, 0xe6, - 0x9b, 0x79, 0xf4, 0xe6, 0x9b, 0xed, 0x64, 0xbe, 0x8b, 0xf0, 0x44, 0x37, 0x8e, 0x30, 0x15, 0xfd, - 0x79, 0x0a, 0xe6, 0x79, 0x9a, 0xcc, 0x7f, 0x80, 0xfb, 0x5c, 0xd8, 0xef, 0x65, 0x98, 0xd1, 0x6d, - 0x25, 0xa6, 0x3a, 0x95, 0xc8, 0x26, 0x27, 0x4f, 0xea, 0xf6, 0x8d, 0x70, 0xd9, 0xa9, 0x78, 0x1b, - 0xc6, 0x28, 0xaf, 0xe8, 0x36, 0x31, 0xd3, 0xef, 0x36, 0x11, 0x08, 0x34, 0xf9, 0x5b, 0x5c, 0x85, - 0x71, 0x56, 0x1f, 0x4d, 0x91, 0x65, 0xfb, 0x45, 0x36, 0x46, 0xc1, 0xc9, 0x87, 0x54, 0x85, 0x63, - 0xf1, 0xac, 0x66, 0xb2, 0xf8, 0x77, 0x01, 0xce, 0xde, 0x45, 0x96, 0xbe, 0x75, 0x10, 0x59, 0x95, - 0x9b, 0xc9, 0xfc, 0x5c, 0xc8, 0x65, 0xd8, 0x3d, 0xb8, 0x74, 0x1e, 0x16, 0xbb, 0x2f, 0x94, 0x71, - 0xe5, 0x33, 0x92, 0xd6, 0xc3, 0xc7, 0xec, 0x65, 0x2c, 0x18, 0x97, 0x8a, 0x41, 0x0e, 0xc5, 0x1b, - 0x50, 0x0a, 0xd7, 0xbb, 0xf7, 0xcf, 0x90, 0x62, 0xa8, 0xbe, 0x1d, 0x5b, 0x27, 0xc3, 0xea, 0x79, - 0x11, 0xd7, 0x7f, 0x94, 0x69, 0x97, 0xeb, 0x3d, 0x56, 0x34, 0x51, 0x86, 0x22, 0xd5, 0xd0, 0x21, - 0x9c, 0x45, 0xa1, 0x1e, 0x60, 0x86, 0xb8, 0xe6, 0x1e, 0xf7, 0xc9, 0xbd, 0x27, 0xc9, 0xf9, 0x67, - 0xfb, 0xc9, 0xf9, 0x17, 0x3d, 0x70, 0x9a, 0xf4, 0x77, 0x85, 0x3c, 0x32, 0xe0, 0x41, 0xeb, 0x0a, - 0x54, 0x22, 0x6c, 0xe1, 0x51, 0x78, 0x94, 0x5d, 0x30, 0x07, 0x79, 0xc3, 0x82, 0xb1, 0x74, 0x16, - 0xc7, 0x94, 0x44, 0x89, 0xf3, 0x00, 0x9b, 0x86, 0x0b, 0x54, 0x91, 0x62, 0x47, 0x12, 0x47, 0x87, - 0xf1, 0x7c, 0x0e, 0x94, 0x24, 0x46, 0xe8, 0xe9, 0x61, 0x85, 0xde, 0x41, 0xf1, 0x32, 0x9d, 0x14, - 0x2f, 0x49, 0x22, 0xd9, 0x24, 0x89, 0x0c, 0xad, 0x0c, 0xd2, 0xd3, 0x50, 0xeb, 0x55, 0x50, 0x4c, - 0xb6, 0x7f, 0x28, 0xc0, 0xc2, 0x35, 0x64, 0xd7, 0x2d, 0x7d, 0x73, 0xa8, 0xed, 0xe5, 0x37, 0x61, - 0xb4, 0xdf, 0x04, 0x51, 0xb7, 0x69, 0x65, 0x8e, 0x51, 0xfa, 0xad, 0x0c, 0x9c, 0x4c, 0x18, 0xcd, - 0xf6, 0x4e, 0x6f, 0x41, 0xc9, 0xbb, 0xe4, 0xaf, 0x9b, 0xc6, 0x96, 0xbe, 0xcd, 0x2e, 0x1c, 0x9e, - 0x89, 0xa7, 0x25, 0x56, 0xfc, 0xcb, 0x04, 0x50, 0x2e, 0xa2, 0x60, 0x83, 0xb8, 0x0d, 0xb3, 0x31, - 0xb5, 0x04, 0xe4, 0x19, 0x0f, 0x5d, 0xf0, 0xc5, 0x3e, 0x26, 0xa1, 0x45, 0x0b, 0x7b, 0x71, 0xcd, - 0xe2, 0x5b, 0x20, 0xb6, 0x90, 0xa1, 0xe9, 0xc6, 0xb6, 0xc2, 0x2e, 0x1c, 0x74, 0x64, 0x57, 0xd2, - 0xe4, 0x0a, 0xe3, 0x42, 0xe7, 0x39, 0xd6, 0x28, 0x0c, 0x4f, 0xa2, 0x90, 0x19, 0xca, 0xad, 0x40, - 0xa3, 0x8e, 0x6c, 0xf1, 0x6d, 0x28, 0x71, 0xec, 0x44, 0xcd, 0x2d, 0x52, 0x09, 0x8a, 0x71, 0x5f, - 0xee, 0x8a, 0x3b, 0xa8, 0x54, 0x64, 0x86, 0x62, 0xcb, 0xd7, 0x65, 0x21, 0x43, 0x44, 0x30, 0xcd, - 0xf1, 0x07, 0xf7, 0x12, 0xd9, 0x6e, 0x92, 0x60, 0x93, 0x44, 0x6a, 0x3b, 0x26, 0x5b, 0xd1, 0x0e, - 0xe9, 0xdf, 0xd2, 0x50, 0x91, 0xd9, 0x3b, 0x38, 0x44, 0x3c, 0xa9, 0x7d, 0xf7, 0xd2, 0xe7, 0x22, - 0x6a, 0x6f, 0xc1, 0x74, 0x5c, 0xf1, 0x2c, 0x97, 0xe0, 0x20, 0xd5, 0xb3, 0x93, 0xd1, 0xea, 0x59, - 0x5b, 0xbc, 0x02, 0x23, 0x24, 0xfe, 0xd8, 0x2c, 0xaa, 0x75, 0xbc, 0x5c, 0xbd, 0xa6, 0x3a, 0xea, - 0x52, 0xc3, 0xdc, 0x94, 0xd9, 0x78, 0xf1, 0x06, 0x14, 0x0c, 0xb4, 0x47, 0x8a, 0xf3, 0x18, 0x86, - 0x6c, 0x8f, 0x18, 0xc6, 0x0d, 0xb4, 0x27, 0xb7, 0x69, 0xe4, 0xb2, 0xc5, 0x4d, 0x98, 0xdc, 0x54, - 0x6d, 0x14, 0xb6, 0x86, 0x91, 0x84, 0x2a, 0x61, 0xbf, 0xbc, 0x97, 0x54, 0x1b, 0x05, 0x95, 0xa9, - 0xbc, 0x19, 0x6e, 0x92, 0xe6, 0xe1, 0x68, 0x8c, 0x98, 0x99, 0xef, 0xfa, 0x6b, 0x72, 0xf0, 0x63, - 0xbd, 0x6f, 0xf8, 0x6b, 0x23, 0xb9, 0x26, 0x28, 0x91, 0xfa, 0x4b, 0xea, 0x10, 0xae, 0xc4, 0x52, - 0xe7, 0x7b, 0xf1, 0xe8, 0x17, 0x77, 0x20, 0x1f, 0x12, 0xaa, 0xc1, 0x3c, 0x03, 0x05, 0x0b, 0x35, - 0x4d, 0x07, 0x29, 0xf5, 0x46, 0xdb, 0x76, 0x90, 0x45, 0x74, 0x28, 0x2f, 0x4f, 0xd0, 0xd6, 0x65, - 0xda, 0x18, 0xd1, 0xc8, 0x74, 0x44, 0x23, 0xa5, 0x05, 0x7c, 0x36, 0x8c, 0x5f, 0x0b, 0x5b, 0xee, - 0xef, 0x0b, 0x30, 0xb3, 0x7e, 0x60, 0xd4, 0xd7, 0x77, 0x54, 0x4b, 0x63, 0xa5, 0x9b, 0x6c, 0x9d, - 0x67, 0xa0, 0xc0, 0x5e, 0x7f, 0x71, 0x32, 0xa8, 0xce, 0x4f, 0xd0, 0x56, 0x4e, 0xc6, 0x51, 0xc8, - 0xd9, 0x18, 0x98, 0x17, 0x9f, 0x65, 0xe5, 0x51, 0xf2, 0xbd, 0xa2, 0x89, 0x57, 0x61, 0x8c, 0xd6, - 0x90, 0xd2, 0x52, 0x80, 0x74, 0x8f, 0xa5, 0x00, 0x40, 0x81, 0x70, 0xb3, 0x74, 0x14, 0x66, 0x23, - 0xe4, 0x31, 0xd2, 0xff, 0x66, 0x04, 0x26, 0x71, 0x1f, 0xf7, 0x4e, 0x7d, 0x58, 0xea, 0x09, 0x18, - 0x73, 0x45, 0xc8, 0xc8, 0xce, 0xcb, 0xc0, 0x9b, 0x56, 0x34, 0xdf, 0x91, 0x39, 0xed, 0x7f, 0x78, - 0xe6, 0xbb, 0x7d, 0xcf, 0x04, 0x6e, 0xdf, 0x3b, 0xa4, 0xa6, 0xb3, 0x1d, 0xca, 0x5c, 0xa2, 0x75, - 0x5b, 0x23, 0x83, 0xd5, 0x6d, 0xc5, 0x55, 0xe8, 0x8d, 0xc6, 0x56, 0xe8, 0x85, 0x0b, 0x41, 0x72, - 0x83, 0x14, 0x82, 0xac, 0xb1, 0x72, 0x72, 0xef, 0xb6, 0x8e, 0xe0, 0xca, 0xf7, 0x88, 0xab, 0x8c, - 0x81, 0xdd, 0x5b, 0x36, 0x82, 0xf1, 0x05, 0x18, 0xe5, 0xf5, 0x1c, 0xd0, 0x63, 0x3d, 0x07, 0x07, - 0xf0, 0x97, 0xa5, 0x8c, 0x05, 0xcb, 0x52, 0x96, 0x61, 0x9c, 0x16, 0x1b, 0xb3, 0xa7, 0x9b, 0xe3, - 0x3d, 0x3e, 0xdd, 0x1c, 0x23, 0x35, 0xc8, 0xec, 0xd5, 0xe6, 0xd3, 0x40, 0x5e, 0x5d, 0x2a, 0xec, - 0x85, 0x88, 0xae, 0x21, 0xc3, 0xd1, 0x9d, 0x03, 0x52, 0x1b, 0x97, 0x97, 0x45, 0xdc, 0x47, 0x1f, - 0x82, 0xac, 0xb0, 0x1e, 0xf1, 0x0d, 0x28, 0x86, 0xdc, 0x34, 0x2b, 0xfb, 0xae, 0xf5, 0xe7, 0xa0, - 0xe5, 0x42, 0xd0, 0x39, 0x77, 0xf2, 0x8a, 0xc5, 0xc3, 0xf4, 0x8a, 0x33, 0x30, 0x15, 0xb4, 0x26, - 0x66, 0x66, 0xdf, 0x13, 0x60, 0x9e, 0xef, 0x93, 0x1e, 0xf3, 0x5b, 0x15, 0xe9, 0x3f, 0x05, 0x38, - 0x16, 0x4f, 0x0b, 0xdb, 0xae, 0xed, 0xc0, 0x64, 0x5d, 0xad, 0xef, 0xa0, 0xe0, 0x83, 0xf2, 0xa1, - 0x1d, 0x74, 0x99, 0x20, 0xf5, 0x37, 0x89, 0x06, 0xcc, 0x68, 0xaa, 0xa3, 0x12, 0xb1, 0x04, 0x27, - 0x4b, 0x0d, 0x39, 0xd9, 0x14, 0xc7, 0xeb, 0x6f, 0x95, 0xfe, 0x4e, 0x80, 0x39, 0xbe, 0x74, 0xa6, - 0x16, 0xb7, 0x4c, 0xdb, 0x7f, 0xcb, 0xbe, 0x63, 0xda, 0x8e, 0xa2, 0x6a, 0x9a, 0x85, 0x6c, 0x9b, - 0x4b, 0x01, 0xb7, 0x5d, 0xa5, 0x4d, 0x49, 0x8e, 0xba, 0x7b, 0x28, 0xe9, 0xb0, 0xb9, 0xc9, 0x0c, - 0xbf, 0xb9, 0x91, 0xfe, 0xc9, 0xa7, 0x60, 0x81, 0x95, 0x31, 0x99, 0x9e, 0x82, 0x09, 0x42, 0xa7, - 0xad, 0x18, 0xed, 0xe6, 0x26, 0x0b, 0x43, 0x59, 0x79, 0x9c, 0x36, 0xbe, 0x4a, 0xda, 0xc4, 0x79, - 0xc8, 0xf3, 0xc5, 0xd1, 0xd2, 0x9c, 0xac, 0x9c, 0x63, 0xab, 0xb3, 0xc5, 0x7b, 0x50, 0xf4, 0x96, - 0x47, 0x44, 0x99, 0xf8, 0x4a, 0xde, 0x1d, 0x8b, 0x97, 0xe0, 0xd6, 0x6e, 0x2d, 0x63, 0x38, 0x62, - 0x3c, 0x05, 0x23, 0xd0, 0x46, 0xfc, 0x10, 0x63, 0x3b, 0x2d, 0x4c, 0xe4, 0x9f, 0xb7, 0x33, 0xb9, - 0x4c, 0x29, 0x2b, 0xd5, 0xa0, 0xbc, 0xdc, 0x30, 0x6d, 0x44, 0x82, 0x18, 0x17, 0x98, 0x5f, 0x1a, - 0x42, 0x40, 0x1a, 0xd2, 0x14, 0x88, 0xfe, 0xf1, 0xcc, 0x0e, 0x9f, 0x82, 0xe2, 0x4d, 0xe4, 0xf4, - 0x8a, 0xe3, 0x1d, 0x28, 0x79, 0xa3, 0x19, 0x23, 0x57, 0x01, 0xd8, 0x70, 0xec, 0x3c, 0xa8, 0x4d, - 0x5c, 0xe8, 0x45, 0x4d, 0x09, 0x1a, 0xb2, 0x74, 0xca, 0x64, 0xe2, 0x2f, 0xfe, 0x5e, 0x80, 0x32, - 0xbd, 0xe1, 0xf1, 0x27, 0x1d, 0x3b, 0x93, 0x24, 0xde, 0x80, 0x1c, 0xde, 0x87, 0x6c, 0x63, 0xb7, - 0x98, 0x22, 0x6f, 0x4a, 0xce, 0x27, 0xbf, 0x58, 0xa1, 0xf7, 0xd9, 0x14, 0x42, 0x76, 0x61, 0xfd, - 0x35, 0xa2, 0xe9, 0x40, 0x8d, 0xe8, 0x0a, 0x14, 0x77, 0x75, 0x5b, 0xdf, 0xd4, 0x1b, 0xa4, 0x4a, - 0xab, 0x9f, 0xea, 0xc3, 0x82, 0x07, 0x48, 0xb6, 0x1d, 0x53, 0x20, 0xfa, 0xd7, 0xc6, 0x44, 0xf0, - 0xbe, 0x00, 0xc7, 0x6f, 0x22, 0x47, 0xf6, 0x7e, 0x2b, 0x83, 0xd5, 0x04, 0xbb, 0x7b, 0xa6, 0x55, - 0x18, 0x21, 0xc5, 0xda, 0xd8, 0x00, 0xd3, 0x1d, 0x15, 0xcc, 0xf7, 0x63, 0x1b, 0x34, 0x03, 0xee, - 0x7e, 0x92, 0xb2, 0x6e, 0x99, 0xe1, 0xc0, 0x66, 0xc9, 0xb6, 0x5e, 0xa4, 0xb6, 0x90, 0xed, 0x53, - 0xc6, 0x58, 0x1b, 0xd6, 0x4c, 0xe9, 0x07, 0x29, 0xa8, 0x76, 0x22, 0x89, 0x89, 0xfd, 0xdb, 0x50, - 0xa0, 0x22, 0x71, 0x4b, 0x9d, 0x29, 0x6d, 0x6f, 0xf6, 0x58, 0x31, 0x97, 0x8c, 0x9e, 0x2a, 0x07, - 0x6f, 0xa5, 0x05, 0xda, 0xd4, 0x5e, 0x79, 0xdb, 0xdc, 0x01, 0x88, 0xd1, 0x41, 0xfe, 0x92, 0xe8, - 0x2c, 0x2d, 0x89, 0xbe, 0x13, 0x2c, 0x89, 0x7e, 0xbe, 0x4f, 0xde, 0xb9, 0x94, 0x79, 0x55, 0xd2, - 0xd2, 0xbb, 0xb0, 0x70, 0x13, 0x39, 0xd7, 0x56, 0x5f, 0x4b, 0x90, 0xd9, 0x5d, 0xf6, 0xe8, 0x0d, - 0x5b, 0x05, 0xe7, 0x4d, 0xbf, 0x73, 0xbb, 0x07, 0x4b, 0xf2, 0x0e, 0x0e, 0xff, 0x65, 0x4b, 0xbf, - 0x26, 0xc0, 0xc9, 0x84, 0xc9, 0x99, 0x74, 0xde, 0x81, 0xb2, 0x0f, 0x2d, 0xab, 0x2d, 0x14, 0xc2, - 0x87, 0xe7, 0x9e, 0x89, 0x90, 0x4b, 0x56, 0xb0, 0xc1, 0x96, 0xde, 0x13, 0x60, 0x8a, 0x94, 0x8f, - 0x73, 0x6f, 0xdc, 0x47, 0xe4, 0xfe, 0x5a, 0x38, 0x03, 0xf3, 0x5c, 0xd7, 0x0c, 0x4c, 0xdc, 0x54, - 0x5e, 0xd6, 0xe5, 0x3e, 0x4c, 0x87, 0x06, 0x30, 0x3e, 0xc8, 0x90, 0x0b, 0x55, 0x74, 0x7e, 0xa9, - 0xdf, 0xa9, 0x58, 0xcd, 0xa2, 0x8b, 0x47, 0xfa, 0x4d, 0x01, 0xa6, 0x64, 0xa4, 0xb6, 0x5a, 0x0d, - 0x9a, 0x29, 0xb5, 0xfb, 0x58, 0xf9, 0x7a, 0x78, 0xe5, 0xf1, 0x2f, 0x49, 0xfc, 0xbf, 0x2b, 0x43, - 0xc5, 0x11, 0x9d, 0xce, 0x5b, 0xfd, 0x2c, 0x4c, 0x87, 0x06, 0x30, 0x4a, 0xff, 0x24, 0x05, 0xd3, - 0x54, 0x57, 0xc2, 0xda, 0x79, 0x1d, 0x32, 0xee, 0x73, 0xa1, 0x82, 0x3f, 0xd5, 0x11, 0xe7, 0x31, - 0xaf, 0x21, 0x55, 0x5b, 0x45, 0x8e, 0x83, 0x2c, 0x52, 0xc6, 0x49, 0xea, 0x95, 0x09, 0x78, 0x52, - 0xf0, 0x8f, 0x9e, 0xf3, 0xd2, 0x71, 0xe7, 0xbc, 0xe7, 0xa1, 0xa2, 0x1b, 0x78, 0x84, 0xbe, 0x8b, - 0x14, 0x64, 0xb8, 0xee, 0xc4, 0x4b, 0x5b, 0x4e, 0xbb, 0xfd, 0xd7, 0x0d, 0x6e, 0xec, 0x2b, 0x9a, - 0x78, 0x1e, 0xca, 0x4d, 0x75, 0x5f, 0x6f, 0xb6, 0x9b, 0x4a, 0x0b, 0x8f, 0xb7, 0xf5, 0x77, 0xe9, - 0x8f, 0xc2, 0x64, 0xe5, 0x22, 0xeb, 0x58, 0x53, 0xb7, 0xd1, 0xba, 0xfe, 0x2e, 0x12, 0x9f, 0x80, - 0x22, 0x79, 0x47, 0x44, 0x06, 0xd2, 0x67, 0x2f, 0x23, 0xe4, 0xd9, 0x0b, 0x79, 0x5e, 0x84, 0x87, - 0x11, 0x0f, 0x29, 0x7d, 0x4c, 0x7f, 0x50, 0x23, 0xc0, 0x2f, 0xa6, 0x48, 0x87, 0xc4, 0xb0, 0x58, - 0xbb, 0x4c, 0x1d, 0xa2, 0x5d, 0xc6, 0xad, 0x35, 0x1d, 0xb3, 0x56, 0xb1, 0x09, 0x33, 0x11, 0x4a, - 0x68, 0x08, 0xcf, 0x0c, 0xe7, 0xab, 0xa6, 0xc2, 0x24, 0x91, 0xb8, 0xfe, 0x0f, 0x02, 0xcc, 0xae, - 0xb5, 0xad, 0x6d, 0xf4, 0xcb, 0xa8, 0x8c, 0xd2, 0x1c, 0x54, 0xa2, 0x8b, 0xe3, 0xe5, 0x8d, 0x29, - 0x98, 0xbd, 0x83, 0x7e, 0x49, 0x57, 0xfe, 0x48, 0xcc, 0x70, 0x09, 0x2a, 0x51, 0x86, 0x31, 0x3b, - 0x8c, 0xc1, 0x21, 0xc4, 0xe1, 0xf8, 0x01, 0x79, 0x95, 0xbb, 0x65, 0x21, 0x7b, 0xc7, 0x9f, 0x8d, - 0xed, 0xc7, 0x57, 0x7f, 0x23, 0xec, 0xab, 0xbf, 0xda, 0xa3, 0xaf, 0xee, 0x38, 0xab, 0xe7, 0xb2, - 0xc9, 0x43, 0xdd, 0xb8, 0x71, 0x4c, 0x69, 0xbe, 0x2f, 0xc0, 0xf9, 0x9b, 0xc8, 0x40, 0x96, 0xea, - 0xa0, 0x55, 0xd5, 0xe6, 0xb5, 0xf9, 0x21, 0x7b, 0xb3, 0x1f, 0xc7, 0x69, 0xf9, 0x3d, 0x01, 0x9e, - 0xec, 0x89, 0x34, 0x26, 0xb1, 0x67, 0x61, 0x86, 0x9c, 0x60, 0x15, 0xfa, 0xf0, 0x91, 0x5d, 0x79, - 0xb4, 0xd9, 0x13, 0xa4, 0xb4, 0x3c, 0x45, 0x7a, 0x37, 0xdc, 0xce, 0x65, 0xdc, 0x87, 0xf5, 0x96, - 0xe7, 0xa4, 0x1b, 0xc8, 0xd8, 0x76, 0x76, 0xd8, 0x13, 0xd4, 0x09, 0xd6, 0xba, 0x4a, 0x1a, 0xa5, - 0x1b, 0x30, 0x1f, 0xdc, 0x48, 0x06, 0x93, 0x8d, 0x67, 0xa1, 0x18, 0xcc, 0x79, 0xd2, 0x4d, 0x50, - 0x5e, 0x2e, 0x04, 0x92, 0x9e, 0xb6, 0xd4, 0x86, 0x63, 0xf1, 0x78, 0xd8, 0x22, 0x5e, 0x87, 0x11, - 0x7a, 0x30, 0x64, 0x9b, 0xa8, 0x17, 0x7b, 0xdc, 0xe5, 0xb2, 0xa3, 0x52, 0x18, 0x2d, 0x43, 0x26, - 0xfd, 0xe5, 0x08, 0xcc, 0xc4, 0x0f, 0x49, 0x3a, 0xf2, 0x3c, 0x07, 0xb3, 0x4d, 0x75, 0x5f, 0x09, - 0xbb, 0x6f, 0xef, 0x9d, 0xee, 0x54, 0x53, 0xdd, 0x0f, 0xbb, 0x66, 0x4d, 0x5c, 0x85, 0x12, 0xc5, - 0xd8, 0x30, 0xeb, 0x6a, 0xa3, 0xd7, 0xe4, 0xe9, 0x08, 0x3e, 0xc9, 0x54, 0x04, 0x99, 0xee, 0xf6, - 0x57, 0x31, 0x28, 0x49, 0xb1, 0xbd, 0x1b, 0x65, 0x2d, 0x0d, 0x1c, 0xaf, 0x0d, 0xc5, 0x9a, 0x9a, - 0x1c, 0x10, 0x0c, 0xdd, 0xf9, 0x87, 0xa4, 0x25, 0xfe, 0xba, 0x00, 0x93, 0x3b, 0xaa, 0xa1, 0x99, - 0xbb, 0xec, 0x0c, 0x43, 0x94, 0x1c, 0x9f, 0x93, 0xfb, 0x79, 0x1f, 0xda, 0x81, 0x80, 0x5b, 0x0c, - 0xb1, 0x7b, 0x44, 0x67, 0x44, 0x88, 0x3b, 0x91, 0x0e, 0xb1, 0x05, 0xa7, 0x63, 0x25, 0x11, 0x3e, - 0x30, 0xf6, 0x9a, 0x87, 0x5d, 0x88, 0x0a, 0xee, 0x6e, 0xe0, 0x08, 0x39, 0xf7, 0x9e, 0x00, 0x93, - 0x31, 0x2c, 0x8a, 0x79, 0x0a, 0x7a, 0x2f, 0x78, 0xee, 0xb9, 0x39, 0x14, 0x57, 0xd6, 0x90, 0xc5, - 0xe6, 0xf3, 0x9d, 0x83, 0xe6, 0xbe, 0x23, 0xc0, 0x6c, 0x07, 0x76, 0xc5, 0x10, 0x24, 0x07, 0x09, - 0xfa, 0x4a, 0x8f, 0x04, 0x45, 0x26, 0x20, 0xbb, 0x0c, 0xdf, 0x69, 0xec, 0x4d, 0x98, 0x8e, 0x1d, - 0x23, 0xbe, 0x0c, 0xc7, 0x5c, 0x2d, 0x89, 0x33, 0x16, 0xea, 0x7f, 0x8e, 0xf2, 0x31, 0x11, 0x8b, - 0x91, 0x7e, 0x28, 0xc0, 0x42, 0x37, 0x7e, 0x88, 0x12, 0x4c, 0xa8, 0xf5, 0xfb, 0x48, 0x0b, 0xa1, - 0x1d, 0x23, 0x8d, 0xcc, 0xf4, 0xee, 0xc1, 0x9c, 0x6f, 0x4c, 0x58, 0x3b, 0x7a, 0x7d, 0x3d, 0x39, - 0xeb, 0xa2, 0x0c, 0x2a, 0x85, 0xf4, 0x5d, 0x01, 0xe6, 0x64, 0xb4, 0xd9, 0xd6, 0x1b, 0xda, 0xe3, - 0xce, 0xa5, 0x1e, 0xc7, 0x61, 0x37, 0x86, 0x12, 0x16, 0xd7, 0x7e, 0x92, 0x82, 0xea, 0x0a, 0xc6, - 0x3a, 0x54, 0x05, 0xe4, 0xa1, 0xbd, 0x1d, 0x58, 0x81, 0x22, 0x8f, 0x32, 0x9b, 0xaa, 0x53, 0xdf, - 0x71, 0x6f, 0xaf, 0xbb, 0x5f, 0x30, 0xf2, 0xf0, 0xb4, 0x44, 0xe1, 0xe2, 0xb2, 0xf4, 0x99, 0x43, - 0xc9, 0xd2, 0x4f, 0x41, 0x96, 0xee, 0x73, 0xb2, 0x64, 0x9f, 0x43, 0x3f, 0xa4, 0xe7, 0xe1, 0x44, - 0x47, 0x3e, 0xb2, 0x98, 0xe5, 0x02, 0x0a, 0x7e, 0xc0, 0x3f, 0x4f, 0xc1, 0x99, 0x60, 0x99, 0xaa, - 0xa7, 0x4c, 0xb4, 0xe4, 0xe2, 0x71, 0x08, 0x62, 0x0d, 0x26, 0xfd, 0xb7, 0x9f, 0xec, 0x67, 0x77, - 0x7a, 0xbe, 0xdb, 0x2b, 0xfb, 0xae, 0x3a, 0xe9, 0x6f, 0xec, 0x04, 0x30, 0x92, 0x62, 0xdd, 0xfe, - 0x52, 0x77, 0x2e, 0x46, 0x92, 0x33, 0x25, 0x56, 0xb6, 0x08, 0x4f, 0x74, 0x63, 0x1c, 0xd3, 0xf2, - 0x3f, 0x10, 0xa0, 0xfa, 0x7a, 0x4b, 0x1b, 0xb2, 0xfc, 0xfc, 0xeb, 0xe1, 0xfd, 0x67, 0xf7, 0x27, - 0x1e, 0xc9, 0x93, 0x7a, 0xdb, 0xcf, 0x6f, 0xc3, 0x89, 0x8e, 0x43, 0xdd, 0x12, 0x95, 0x70, 0xe6, - 0xe4, 0xab, 0x83, 0x4f, 0x1f, 0xc9, 0xa1, 0xfc, 0xb1, 0x00, 0x8b, 0xeb, 0x8e, 0x85, 0xd4, 0xa6, - 0x97, 0x68, 0xe9, 0x98, 0x4a, 0x6b, 0xc1, 0x8c, 0x7d, 0x60, 0xd4, 0x03, 0x3e, 0xbc, 0xfb, 0x0d, - 0x4c, 0xe8, 0xa8, 0xba, 0x7e, 0x60, 0xd4, 0x43, 0x6e, 0x1c, 0xdd, 0x3a, 0x22, 0x4f, 0xd9, 0x31, - 0xed, 0x4b, 0xe3, 0x00, 0xaa, 0xe3, 0x58, 0xfa, 0x66, 0xdb, 0x41, 0x36, 0xde, 0x8c, 0x9f, 0xeb, - 0x81, 0x58, 0xc6, 0xb8, 0x7b, 0xbe, 0x5f, 0x7f, 0x10, 0xc2, 0x72, 0xeb, 0x4c, 0x5f, 0x02, 0xea, - 0x5b, 0x47, 0xbc, 0x5f, 0x87, 0x08, 0x91, 0xf6, 0x47, 0x02, 0x48, 0xfe, 0xb7, 0xb6, 0x2e, 0xcf, - 0xa9, 0x28, 0xfa, 0xd0, 0xb6, 0x7b, 0x61, 0x6d, 0x5b, 0xee, 0xeb, 0x91, 0x6f, 0xfc, 0xc4, 0x9e, - 0xc6, 0xfd, 0x86, 0x00, 0xa7, 0x12, 0xc7, 0xbb, 0x89, 0xcb, 0xb0, 0xda, 0x5d, 0x1b, 0x8e, 0x8e, - 0x88, 0xea, 0x61, 0x96, 0xdd, 0x8c, 0x29, 0x6c, 0x77, 0xcf, 0x31, 0x8f, 0x92, 0x65, 0xdd, 0x27, - 0x0e, 0xb2, 0x2c, 0x71, 0xfc, 0x10, 0x2c, 0xeb, 0x01, 0xaf, 0x8f, 0x65, 0x7f, 0x26, 0xc0, 0xb9, - 0x44, 0x08, 0x1c, 0xb2, 0xfa, 0x51, 0x36, 0x2d, 0xcc, 0xb9, 0xdb, 0xc3, 0x51, 0xec, 0x9f, 0xdf, - 0x63, 0xe0, 0xef, 0x92, 0x43, 0x74, 0x77, 0x30, 0xc6, 0xc7, 0xed, 0x08, 0x1f, 0x5f, 0x39, 0x14, - 0xaa, 0xe2, 0xd8, 0x79, 0x36, 0x0e, 0x50, 0x56, 0xf7, 0x18, 0x6c, 0x5f, 0x05, 0x62, 0x5b, 0x61, - 0x66, 0xae, 0xf6, 0x94, 0xa7, 0xe8, 0x91, 0x82, 0x00, 0x3b, 0x17, 0xbb, 0x03, 0x31, 0x66, 0xea, - 0x11, 0x66, 0xde, 0x39, 0x24, 0xaa, 0x22, 0xec, 0xfc, 0x40, 0x80, 0x53, 0x37, 0x4c, 0xab, 0x8e, - 0x86, 0x7f, 0x79, 0x94, 0x64, 0xd1, 0x09, 0x44, 0x27, 0x4f, 0xec, 0x71, 0xf0, 0xbb, 0x02, 0x9c, - 0x4e, 0xa6, 0xb4, 0x17, 0x93, 0x1e, 0x84, 0x90, 0x08, 0xd3, 0xde, 0x86, 0x31, 0xc6, 0x53, 0xf2, - 0x46, 0x22, 0x21, 0xdb, 0xf0, 0x2c, 0x64, 0x48, 0x55, 0x64, 0xaa, 0xc7, 0xca, 0x3b, 0x32, 0x5a, - 0x7a, 0x1e, 0x66, 0x18, 0xfe, 0x6b, 0xab, 0xaf, 0xe1, 0x29, 0xee, 0x20, 0x47, 0xd5, 0x54, 0x47, - 0x15, 0x8f, 0x03, 0xf8, 0x92, 0x8b, 0xf4, 0xb0, 0x94, 0x6f, 0xba, 0xa9, 0xd4, 0x1f, 0x09, 0x50, - 0x08, 0x42, 0x8a, 0x5f, 0xc7, 0x11, 0x95, 0x42, 0x33, 0x6e, 0xf4, 0x9a, 0x7e, 0x89, 0x27, 0x41, - 0x76, 0xd1, 0x89, 0x37, 0x02, 0x8b, 0xbb, 0xd4, 0x1f, 0x5a, 0x92, 0x81, 0xa7, 0xcb, 0xfd, 0xa1, - 0x00, 0x13, 0xde, 0x64, 0xaf, 0xa0, 0x83, 0xc0, 0xbd, 0xb4, 0x30, 0xc4, 0xbd, 0x74, 0x34, 0x81, - 0x9b, 0x8a, 0x4b, 0xe0, 0x9e, 0x81, 0x82, 0xa3, 0x5a, 0xdb, 0xc8, 0x09, 0xe7, 0x79, 0x69, 0x2b, - 0x1b, 0x26, 0x7d, 0x28, 0x80, 0x48, 0x6f, 0x38, 0x02, 0xf9, 0xc3, 0x3b, 0x30, 0xaa, 0x35, 0x1e, - 0x28, 0xfc, 0xc0, 0xde, 0xe9, 0x86, 0x39, 0x89, 0xc1, 0xaf, 0xa0, 0x03, 0x79, 0x44, 0x6b, 0x3c, - 0xc0, 0x6b, 0x9f, 0x87, 0xbc, 0x97, 0x0c, 0xa6, 0x09, 0xe9, 0x5c, 0x2b, 0x21, 0x0b, 0x1c, 0x77, - 0x41, 0x21, 0xfd, 0xb6, 0x00, 0x93, 0x01, 0x52, 0xdd, 0x2b, 0xbd, 0x3c, 0xa6, 0xd5, 0x7f, 0xa5, - 0xf9, 0xdc, 0x40, 0xea, 0x20, 0xe7, 0xb4, 0xc6, 0x83, 0x8e, 0x97, 0x26, 0xa9, 0x38, 0x9a, 0xfe, - 0x55, 0x80, 0x69, 0x6a, 0x63, 0x8f, 0x98, 0x83, 0xbf, 0x02, 0xf3, 0x5e, 0x3e, 0xbe, 0xa9, 0xee, - 0xd3, 0xc4, 0x81, 0x6b, 0x05, 0xa9, 0xc3, 0xb0, 0x02, 0x2f, 0xe3, 0x7f, 0x47, 0xdd, 0xf7, 0xf7, - 0x48, 0x15, 0x98, 0x09, 0xaf, 0x92, 0xfd, 0x8a, 0x4d, 0xeb, 0xa3, 0x4f, 0xaa, 0x47, 0x3e, 0xfe, - 0xa4, 0x7a, 0xe4, 0xb3, 0x4f, 0xaa, 0xc2, 0xaf, 0x3e, 0xac, 0x0a, 0x1f, 0x3e, 0xac, 0x0a, 0x7f, - 0xf5, 0xb0, 0x2a, 0x7c, 0xf4, 0xb0, 0x2a, 0xfc, 0xcb, 0xc3, 0xaa, 0xf0, 0xb3, 0x87, 0xd5, 0x23, - 0x9f, 0x3d, 0xac, 0x0a, 0xef, 0x7f, 0x5a, 0x3d, 0xf2, 0xd1, 0xa7, 0xd5, 0x23, 0x1f, 0x7f, 0x5a, - 0x3d, 0xf2, 0x8d, 0x17, 0xb6, 0x4d, 0x8f, 0x54, 0xdd, 0x4c, 0xfc, 0xe7, 0x3a, 0xff, 0x2f, 0xd8, - 0xb2, 0x39, 0x42, 0x8e, 0x68, 0x97, 0xff, 0x27, 0x00, 0x00, 0xff, 0xff, 0x96, 0x0d, 0xcf, 0xd7, - 0x9b, 0x67, 0x00, 0x00, + // 5437 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x3d, 0x5b, 0x6c, 0x1c, 0xd7, + 0x75, 0x9a, 0x7d, 0x90, 0xbb, 0x87, 0xe4, 0x3e, 0x86, 0xaf, 0x15, 0x29, 0xad, 0xa8, 0x91, 0x64, + 0x51, 0xb2, 0xb5, 0xb2, 0x25, 0x3b, 0x56, 0x9c, 0xd8, 0x8e, 0x48, 0xbd, 0x28, 0x53, 0x0e, 0x35, + 0xa4, 0x65, 0x27, 0xb1, 0x3c, 0x1e, 0xee, 0x5c, 0x92, 0x13, 0xee, 0xce, 0xac, 0x66, 0x66, 0xf9, + 0x70, 0x0b, 0xa4, 0x40, 0xd0, 0x36, 0xf1, 0x47, 0xeb, 0xa2, 0x28, 0x10, 0x14, 0x69, 0x3f, 0x0a, + 0xa4, 0x36, 0x0a, 0x14, 0xfd, 0x48, 0x81, 0xa2, 0x1f, 0xf9, 0xe9, 0x47, 0x50, 0x14, 0xfd, 0x70, + 0xf3, 0x53, 0xb7, 0x45, 0x1f, 0x96, 0x5b, 0x34, 0xf9, 0xf3, 0x5f, 0x1f, 0x5f, 0xc5, 0x7d, 0xcd, + 0x7b, 0x67, 0x77, 0xb9, 0x54, 0xe5, 0x24, 0xfe, 0xe3, 0xdc, 0x7b, 0xcf, 0xb9, 0xe7, 0x9e, 0xe7, + 0xbd, 0xe7, 0x9e, 0xbb, 0x84, 0x2f, 0x3b, 0xa8, 0xd9, 0x32, 0x2d, 0xb5, 0x71, 0xd1, 0x46, 0xd6, + 0x0e, 0xb2, 0x2e, 0xaa, 0x2d, 0xfd, 0xe2, 0x96, 0x6e, 0x3b, 0xa6, 0xb5, 0x8f, 0x5b, 0xf4, 0x3a, + 0xba, 0xb8, 0xf3, 0xcc, 0x45, 0x0b, 0x3d, 0x68, 0x23, 0xdb, 0x51, 0x2c, 0x64, 0xb7, 0x4c, 0xc3, + 0x46, 0xb5, 0x96, 0x65, 0x3a, 0xa6, 0x78, 0x86, 0x43, 0xd7, 0x28, 0x74, 0x4d, 0x6d, 0xe9, 0xb5, + 0x20, 0x74, 0x6d, 0xe7, 0x99, 0x99, 0xea, 0xa6, 0x69, 0x6e, 0x36, 0xd0, 0x45, 0x02, 0xb4, 0xde, + 0xde, 0xb8, 0xa8, 0xb5, 0x2d, 0xd5, 0xd1, 0x4d, 0x83, 0xa2, 0x99, 0x39, 0x11, 0xee, 0x77, 0xf4, + 0x26, 0xb2, 0x1d, 0xb5, 0xd9, 0x62, 0x03, 0x4e, 0x6a, 0xa8, 0x85, 0x0c, 0x0d, 0x19, 0x75, 0x1d, + 0xd9, 0x17, 0x37, 0xcd, 0x4d, 0x93, 0xb4, 0x93, 0xbf, 0xd8, 0x90, 0xd3, 0xee, 0x42, 0xf0, 0x0a, + 0xea, 0x66, 0xb3, 0x69, 0x1a, 0x98, 0xf2, 0x26, 0xb2, 0x6d, 0x75, 0x93, 0x11, 0x3c, 0x73, 0x26, + 0x30, 0x8a, 0x51, 0x1a, 0x1d, 0x76, 0x36, 0x30, 0xcc, 0x51, 0xed, 0xed, 0x07, 0x6d, 0xd4, 0x46, + 0xd1, 0x81, 0xc1, 0x59, 0x91, 0xd1, 0x6e, 0xda, 0x78, 0xd0, 0xae, 0x69, 0x6d, 0x6f, 0x34, 0xcc, + 0x5d, 0x36, 0xea, 0x89, 0xc0, 0x28, 0xde, 0x19, 0xc5, 0x76, 0x2a, 0x30, 0xee, 0x41, 0x1b, 0xc5, + 0xd1, 0x16, 0x44, 0x46, 0xda, 0xea, 0x66, 0xa3, 0xdb, 0x52, 0x37, 0x54, 0xbd, 0xd1, 0xb6, 0x62, + 0x56, 0x70, 0x3e, 0x4e, 0x01, 0xea, 0x0d, 0xb3, 0xbe, 0x1d, 0x1d, 0xfb, 0x54, 0x82, 0xb2, 0x44, + 0x47, 0x9f, 0x8b, 0x1b, 0xed, 0xb2, 0x88, 0x4a, 0x88, 0x0d, 0x7d, 0x32, 0x71, 0x68, 0x88, 0x9b, + 0x67, 0x13, 0x07, 0x63, 0x61, 0xb1, 0x81, 0x17, 0xe2, 0x06, 0x76, 0xe6, 0x7e, 0x2d, 0x6e, 0xb8, + 0xa1, 0x36, 0x91, 0xdd, 0x52, 0xeb, 0x31, 0x9c, 0x7b, 0x3a, 0x6e, 0xbc, 0x85, 0x5a, 0x0d, 0xbd, + 0x4e, 0x94, 0x3b, 0x0a, 0x71, 0x39, 0x0e, 0xa2, 0x85, 0x2c, 0x5b, 0xb7, 0x1d, 0x64, 0xd0, 0x39, + 0xd0, 0x1e, 0xaa, 0xb7, 0x31, 0xb8, 0xcd, 0x80, 0x5e, 0xee, 0x01, 0x88, 0x2f, 0x4a, 0x69, 0xb6, + 0x1d, 0x75, 0xbd, 0x81, 0x14, 0xdb, 0x51, 0x1d, 0x3e, 0xeb, 0x17, 0x62, 0xb5, 0xaf, 0xab, 0x71, + 0xcf, 0xbc, 0x10, 0x37, 0xb1, 0xaa, 0x35, 0x75, 0xa3, 0x2b, 0xac, 0xf4, 0xb3, 0x21, 0x38, 0xbe, + 0xea, 0xa8, 0x96, 0xf3, 0x3a, 0x9b, 0xee, 0x3a, 0x5f, 0x96, 0x4c, 0x01, 0xc4, 0x93, 0x30, 0xea, + 0xf2, 0x56, 0xd1, 0xb5, 0x8a, 0x30, 0x27, 0xcc, 0xe7, 0xe5, 0x11, 0xb7, 0x6d, 0x49, 0x13, 0xeb, + 0x30, 0x66, 0x63, 0x1c, 0x0a, 0x9b, 0xa4, 0x92, 0x9a, 0x13, 0xe6, 0x47, 0x2e, 0xbd, 0xe4, 0x0a, + 0x8a, 0xb8, 0x9b, 0xd0, 0x82, 0x6a, 0x3b, 0xcf, 0xd4, 0x12, 0x67, 0x96, 0x47, 0x09, 0x52, 0x4e, + 0xc7, 0x16, 0x4c, 0xb6, 0x54, 0x0b, 0x19, 0x8e, 0xe2, 0x72, 0x5e, 0xd1, 0x8d, 0x0d, 0xb3, 0x92, + 0x26, 0x93, 0x3d, 0x5b, 0x8b, 0x73, 0x71, 0xae, 0x46, 0xee, 0x3c, 0x53, 0x5b, 0x21, 0xd0, 0xee, + 0x2c, 0x4b, 0xc6, 0x86, 0x29, 0x8f, 0xb7, 0xa2, 0x8d, 0x62, 0x05, 0x86, 0x55, 0x07, 0x63, 0x73, + 0x2a, 0x99, 0x39, 0x61, 0x3e, 0x2b, 0xf3, 0x4f, 0xb1, 0x09, 0x92, 0x2b, 0x41, 0x8f, 0x0a, 0xb4, + 0xd7, 0xd2, 0xa9, 0x9b, 0x54, 0xb0, 0x3f, 0xac, 0x64, 0x09, 0x41, 0x33, 0x35, 0xea, 0x2c, 0x6b, + 0xdc, 0x59, 0xd6, 0xd6, 0xb8, 0xb3, 0x5c, 0xc8, 0xbc, 0xf7, 0xaf, 0x27, 0x04, 0xf9, 0xc4, 0x6e, + 0x78, 0xe5, 0xd7, 0x5d, 0x4c, 0x78, 0xac, 0xb8, 0x05, 0x47, 0xeb, 0xa6, 0xe1, 0xe8, 0x46, 0x1b, + 0x29, 0xaa, 0xad, 0x18, 0x68, 0x57, 0xd1, 0x0d, 0xdd, 0xd1, 0x55, 0xc7, 0xb4, 0x2a, 0x43, 0x73, + 0xc2, 0x7c, 0xe1, 0xd2, 0x85, 0x20, 0x8f, 0x89, 0x75, 0xe1, 0xc5, 0x2e, 0x32, 0xb8, 0xab, 0xf6, + 0xab, 0x68, 0x77, 0x89, 0x03, 0xc9, 0x53, 0xf5, 0xd8, 0x76, 0xf1, 0x0e, 0x94, 0x79, 0x8f, 0xa6, + 0x30, 0x17, 0x54, 0x19, 0x26, 0xeb, 0x98, 0x0b, 0xce, 0xc0, 0x3a, 0xf1, 0x1c, 0x37, 0xe8, 0x9f, + 0x72, 0xc9, 0x05, 0x65, 0x2d, 0xe2, 0x3d, 0x98, 0x6a, 0xa8, 0xb6, 0xa3, 0xd4, 0xcd, 0x66, 0xab, + 0x81, 0x08, 0x67, 0x2c, 0x64, 0xb7, 0x1b, 0x4e, 0x25, 0x17, 0x87, 0x93, 0xb9, 0x18, 0x22, 0xa3, + 0xfd, 0x86, 0xa9, 0x6a, 0xb6, 0x3c, 0x81, 0xe1, 0x17, 0x5d, 0x70, 0x99, 0x40, 0x8b, 0x6f, 0xc1, + 0xec, 0x86, 0x6e, 0xd9, 0x8e, 0xe2, 0x4a, 0x01, 0x7b, 0x11, 0x65, 0x5d, 0xad, 0x6f, 0x9b, 0x1b, + 0x1b, 0x95, 0x3c, 0x41, 0x7e, 0x34, 0xc2, 0xf8, 0x6b, 0x2c, 0x8a, 0x2d, 0x64, 0xbe, 0x87, 0xf9, + 0x5e, 0x21, 0x38, 0xb8, 0xda, 0xad, 0xa9, 0xf6, 0xf6, 0x02, 0x45, 0x20, 0xbe, 0x09, 0x13, 0xb6, + 0xd9, 0xb6, 0xea, 0x48, 0xd9, 0xc1, 0x76, 0x6b, 0x1a, 0x0a, 0x91, 0x57, 0x05, 0x08, 0xe2, 0xf3, + 0x9d, 0xa8, 0xc6, 0xa8, 0x90, 0x75, 0x8f, 0x82, 0xac, 0x62, 0x08, 0x59, 0xa4, 0x78, 0xfc, 0x6d, + 0xd2, 0x4f, 0x05, 0xa8, 0x76, 0xd2, 0x78, 0x6a, 0x94, 0xe2, 0x24, 0x0c, 0x59, 0x6d, 0xc3, 0x33, + 0xb3, 0xac, 0xd5, 0x36, 0x96, 0x34, 0xf1, 0x65, 0xc8, 0x12, 0x4f, 0xcf, 0x0c, 0xeb, 0x5c, 0xac, + 0xae, 0x93, 0x11, 0x98, 0x9c, 0x7b, 0xa8, 0xee, 0x98, 0xd6, 0x22, 0xfe, 0x94, 0x29, 0x9c, 0x68, + 0xc0, 0x38, 0x52, 0x37, 0x91, 0x15, 0x64, 0x1c, 0x33, 0x9d, 0xee, 0x76, 0xba, 0x62, 0x36, 0x1a, + 0x7e, 0x7e, 0xdd, 0xc5, 0x41, 0x96, 0x13, 0x2d, 0x97, 0x09, 0x6a, 0x7f, 0xbf, 0xf4, 0x77, 0x29, + 0x98, 0xba, 0x89, 0x9c, 0x3b, 0xd4, 0xcb, 0xad, 0x62, 0x27, 0xd7, 0x87, 0x3f, 0xb9, 0x09, 0x79, + 0xd7, 0xba, 0xa2, 0x4b, 0x8e, 0xf2, 0x3e, 0xc8, 0x4b, 0x0f, 0x56, 0xbc, 0x0c, 0x53, 0x68, 0xaf, + 0x85, 0xea, 0x0e, 0xd2, 0x14, 0x03, 0xed, 0x39, 0x0a, 0xda, 0xc1, 0x0e, 0x44, 0xd7, 0xc8, 0xca, + 0xd3, 0xf2, 0x38, 0xef, 0x7d, 0x15, 0xed, 0x39, 0xd7, 0x71, 0xdf, 0x92, 0x26, 0x3e, 0x0d, 0x13, + 0xf5, 0xb6, 0x45, 0x3c, 0xcd, 0xba, 0xa5, 0x1a, 0xf5, 0x2d, 0xc5, 0x31, 0xb7, 0x91, 0x41, 0x7c, + 0xc1, 0xa8, 0x2c, 0xb2, 0xbe, 0x05, 0xd2, 0xb5, 0x86, 0x7b, 0x44, 0x0d, 0x26, 0xb8, 0xbe, 0xb0, + 0x20, 0xab, 0xe8, 0x0e, 0x6a, 0x32, 0x47, 0x70, 0xa9, 0x96, 0xb0, 0xf9, 0xa2, 0xf2, 0x22, 0xb0, + 0xb7, 0x68, 0xcb, 0x92, 0x83, 0x9a, 0xb2, 0xb8, 0x13, 0x69, 0x93, 0x7e, 0x94, 0x87, 0xe9, 0x08, + 0x4f, 0x99, 0xde, 0x04, 0x38, 0x26, 0x0c, 0xc0, 0xb1, 0x25, 0x18, 0xf3, 0x54, 0x64, 0xbf, 0x85, + 0x18, 0xfb, 0x4f, 0x77, 0x43, 0xb6, 0xb6, 0xdf, 0x42, 0xf2, 0xe8, 0xae, 0xef, 0x4b, 0x94, 0x60, + 0x2c, 0x8e, 0xe7, 0x23, 0x86, 0x8f, 0xd7, 0x5f, 0x84, 0xa3, 0x2d, 0x0b, 0xed, 0xe8, 0x66, 0xdb, + 0x56, 0x88, 0xb7, 0x47, 0x9a, 0x37, 0x3e, 0x43, 0xc6, 0x4f, 0xf1, 0x01, 0xab, 0xb4, 0x9f, 0x83, + 0x5e, 0x80, 0x71, 0xe2, 0x63, 0xa8, 0x43, 0x70, 0x81, 0xb2, 0x04, 0xa8, 0x84, 0xbb, 0x6e, 0xe0, + 0x1e, 0x3e, 0x7c, 0x11, 0x80, 0xf8, 0x0a, 0xb2, 0x3f, 0x24, 0xce, 0x33, 0xb2, 0x2a, 0x77, 0xfb, + 0x88, 0x17, 0xe6, 0xa9, 0x79, 0xde, 0xe1, 0x7f, 0x8a, 0x2b, 0x50, 0xb6, 0x1d, 0xbd, 0xbe, 0xbd, + 0xaf, 0xf8, 0x70, 0x0d, 0xf7, 0x81, 0xab, 0x48, 0xc1, 0xdd, 0x06, 0xf1, 0x57, 0xe0, 0xc9, 0x08, + 0x46, 0xc5, 0xae, 0x6f, 0x21, 0xad, 0xdd, 0x40, 0x8a, 0x63, 0x52, 0xae, 0x90, 0xb8, 0x62, 0xb6, + 0x9d, 0xca, 0x48, 0x6f, 0x1e, 0xee, 0x4c, 0x68, 0x9a, 0x55, 0x86, 0x70, 0xcd, 0x24, 0x4c, 0x5c, + 0xa3, 0xd8, 0x3a, 0x6a, 0xfa, 0x58, 0x47, 0x4d, 0xff, 0x06, 0x14, 0x5c, 0xf5, 0x20, 0x5b, 0x97, + 0x4a, 0x91, 0x84, 0xa1, 0xf8, 0xe8, 0xeb, 0x46, 0xa3, 0x88, 0xca, 0x51, 0xed, 0x75, 0x55, 0x8d, + 0x7c, 0x8a, 0xaf, 0x43, 0x31, 0x80, 0xbc, 0x6d, 0x57, 0x4a, 0x04, 0x7b, 0xad, 0x43, 0x90, 0x8b, + 0x45, 0xdb, 0xb6, 0xe5, 0x82, 0x1f, 0x6f, 0xdb, 0x16, 0xef, 0x43, 0x39, 0x68, 0x9f, 0x3a, 0xb2, + 0x2b, 0x65, 0xc2, 0xca, 0xa7, 0xfb, 0x32, 0x4e, 0x1d, 0xd9, 0x72, 0x69, 0x27, 0xd4, 0x22, 0xbe, + 0x04, 0xc7, 0x74, 0xac, 0xbe, 0x61, 0x31, 0x22, 0x03, 0x1b, 0xaa, 0x56, 0x11, 0xe7, 0x84, 0xf9, + 0x9c, 0x5c, 0xd1, 0xed, 0xd5, 0xa0, 0x54, 0xae, 0xd3, 0x7e, 0xf1, 0x59, 0x98, 0x8e, 0x68, 0xb2, + 0xb3, 0x47, 0xa2, 0xc0, 0x38, 0x75, 0x53, 0x41, 0x6d, 0x5e, 0xdb, 0xc3, 0x31, 0xe1, 0x32, 0x4c, + 0x31, 0x00, 0x77, 0x23, 0xc2, 0x42, 0xc7, 0x04, 0xf1, 0xa8, 0xe3, 0xa4, 0xd7, 0x33, 0x72, 0x12, + 0x48, 0xde, 0x84, 0x89, 0x5d, 0x12, 0xac, 0x42, 0x01, 0x6e, 0xb2, 0xff, 0x00, 0xb7, 0x1b, 0x69, + 0xbb, 0x9d, 0xc9, 0xe5, 0x4a, 0xf9, 0xdb, 0x99, 0x5c, 0xbe, 0x04, 0xb7, 0x33, 0x39, 0x28, 0x8d, + 0xdc, 0xce, 0xe4, 0x46, 0x4b, 0x63, 0xb7, 0x33, 0xb9, 0x42, 0xa9, 0x28, 0xfd, 0x24, 0x05, 0xd3, + 0x38, 0x90, 0x7c, 0x1e, 0x14, 0x0e, 0x31, 0x28, 0xfc, 0x7e, 0x0e, 0x2a, 0x51, 0xa6, 0x7e, 0x1e, + 0x15, 0x3e, 0x8f, 0x0a, 0x87, 0x1e, 0x15, 0x46, 0x3b, 0xaa, 0x7a, 0xac, 0x7f, 0x2d, 0x1c, 0x9a, + 0x7f, 0xfd, 0xf9, 0x0c, 0x3a, 0x09, 0x5e, 0xbd, 0x7c, 0x10, 0xaf, 0x2e, 0x76, 0xf4, 0xea, 0xb1, + 0x7e, 0x77, 0xac, 0x54, 0x90, 0xbe, 0x2b, 0xc0, 0xac, 0x8c, 0x6c, 0xe4, 0x84, 0x02, 0xcf, 0x63, + 0xf0, 0xba, 0x52, 0x15, 0x8e, 0xc5, 0x93, 0x42, 0x7d, 0x95, 0xf4, 0x41, 0x1a, 0xe6, 0x64, 0x54, + 0x37, 0x2d, 0xcd, 0x7f, 0x90, 0x60, 0xd6, 0xdd, 0x07, 0xc1, 0x6f, 0x80, 0x18, 0x3d, 0xa2, 0xf7, + 0x4f, 0x79, 0x39, 0x72, 0x36, 0x17, 0x9f, 0x02, 0x91, 0x9b, 0xa0, 0x16, 0x76, 0x5f, 0x25, 0xb7, + 0x87, 0x7b, 0x96, 0x69, 0x18, 0x26, 0xb6, 0xeb, 0x7a, 0xac, 0x21, 0xfc, 0xb9, 0xa4, 0x89, 0xc7, + 0x01, 0x78, 0x2e, 0x86, 0x39, 0xa6, 0xbc, 0x9c, 0x67, 0x2d, 0x4b, 0x9a, 0xf8, 0x36, 0x8c, 0xb6, + 0xcc, 0x46, 0xc3, 0x4d, 0xa5, 0x50, 0x9f, 0xf4, 0xe2, 0x41, 0x8f, 0x68, 0x34, 0x93, 0x32, 0x82, + 0x51, 0x72, 0x26, 0xba, 0x87, 0xc9, 0xe1, 0x83, 0x1d, 0x26, 0xa5, 0xff, 0xc9, 0xc1, 0xc9, 0x04, + 0x51, 0xb1, 0xe0, 0x13, 0x89, 0x19, 0xc2, 0x81, 0x63, 0x46, 0x62, 0x3c, 0x48, 0x25, 0xc6, 0x83, + 0xfe, 0x84, 0x36, 0x0f, 0xa5, 0x0e, 0xf1, 0xa6, 0x60, 0x07, 0xf1, 0x46, 0xc2, 0x58, 0x36, 0x1a, + 0xc6, 0x7c, 0x79, 0xa4, 0xa1, 0x60, 0x1e, 0xe9, 0x0a, 0x54, 0x98, 0x7f, 0xf7, 0x65, 0x91, 0xd8, + 0x6e, 0x71, 0x98, 0xec, 0x16, 0xa7, 0x68, 0xbf, 0x97, 0x19, 0x62, 0x7b, 0xc5, 0x07, 0x30, 0xed, + 0x58, 0xaa, 0x61, 0xeb, 0x78, 0xda, 0xe0, 0x61, 0x9e, 0xa6, 0x56, 0xbe, 0xd8, 0xcd, 0xe1, 0xae, + 0x71, 0x70, 0xbf, 0xf0, 0x48, 0x32, 0x6c, 0xd2, 0x89, 0xeb, 0x12, 0x37, 0xe1, 0x78, 0x4c, 0xd2, + 0xcb, 0x17, 0xea, 0xf2, 0x7d, 0x84, 0xba, 0x99, 0x88, 0x5d, 0x79, 0x51, 0xef, 0x24, 0x8c, 0x06, + 0x02, 0xce, 0x08, 0x09, 0x38, 0x23, 0xeb, 0xbe, 0x48, 0x73, 0x13, 0x0a, 0x9e, 0x38, 0x49, 0xb2, + 0x6d, 0xb4, 0xc7, 0x64, 0xdb, 0x98, 0x0b, 0x47, 0x52, 0x6b, 0x8b, 0x30, 0xca, 0x25, 0x4d, 0xd0, + 0x8c, 0xf5, 0x88, 0x66, 0x84, 0x41, 0x11, 0x24, 0x26, 0x0c, 0x3f, 0x68, 0x23, 0x16, 0xed, 0xd2, + 0xf3, 0x23, 0x97, 0x5e, 0xab, 0xf5, 0x74, 0xcf, 0x52, 0xeb, 0x6a, 0x3d, 0xb5, 0xbb, 0x14, 0xef, + 0x75, 0xc3, 0xb1, 0xf6, 0x65, 0x3e, 0x8b, 0x67, 0xba, 0xc5, 0x03, 0xe6, 0x81, 0x5e, 0x84, 0x1c, + 0xcb, 0x74, 0xe3, 0x30, 0x87, 0x49, 0x3e, 0x19, 0x14, 0x1b, 0xbf, 0xa6, 0xc0, 0xf0, 0x77, 0xe8, + 0x48, 0xd9, 0x05, 0xc1, 0x1a, 0xcd, 0xa2, 0x33, 0x8b, 0x61, 0xfc, 0x73, 0xe6, 0x6d, 0x18, 0xf5, + 0x93, 0x2c, 0x96, 0x20, 0xbd, 0x8d, 0xf6, 0x99, 0x83, 0xc6, 0x7f, 0x8a, 0x2f, 0x40, 0x76, 0x47, + 0x6d, 0xb4, 0x3b, 0xec, 0x1d, 0xc9, 0x1d, 0x8a, 0xdf, 0x0d, 0x60, 0x6c, 0xfb, 0x32, 0x05, 0x79, + 0x21, 0x75, 0x45, 0xa0, 0x81, 0xcd, 0x17, 0x26, 0xae, 0xd6, 0x1d, 0x7d, 0x47, 0x77, 0xf6, 0x3f, + 0x0f, 0x13, 0xfd, 0x86, 0x09, 0x3f, 0xe7, 0x1e, 0x61, 0x98, 0xf8, 0xe7, 0x0c, 0x0f, 0x13, 0xb1, + 0xa2, 0x62, 0x61, 0xe2, 0x55, 0x28, 0x86, 0xd8, 0xc5, 0x02, 0xc5, 0x99, 0xe0, 0x5a, 0x7c, 0x1e, + 0x8c, 0x9d, 0x7f, 0x08, 0x0b, 0xe5, 0x42, 0x90, 0xa5, 0x11, 0xc3, 0x4e, 0x1d, 0xc4, 0xb0, 0x7d, + 0x9e, 0x3b, 0x1d, 0xf4, 0xdc, 0x08, 0xaa, 0x7c, 0x73, 0xcc, 0x9a, 0x94, 0x90, 0x43, 0xca, 0xf4, + 0x38, 0xe1, 0x2c, 0xc3, 0x73, 0x95, 0xa2, 0x59, 0x0d, 0xb8, 0xa7, 0x3b, 0x50, 0xde, 0x42, 0xaa, + 0xe5, 0xac, 0x23, 0xd5, 0x51, 0x34, 0xe4, 0xa8, 0x7a, 0xc3, 0x66, 0x27, 0xc7, 0xee, 0xb9, 0xf3, + 0x92, 0x0b, 0x7a, 0x8d, 0x42, 0x46, 0x63, 0xf1, 0xd0, 0x81, 0x63, 0xf1, 0x05, 0x9f, 0xe1, 0xb8, + 0x06, 0x45, 0x74, 0x24, 0xef, 0x59, 0xc3, 0xab, 0xbc, 0xc3, 0xd3, 0xa2, 0xdc, 0x01, 0x3d, 0x96, + 0xcf, 0xe5, 0xe4, 0x03, 0x2e, 0x47, 0xfa, 0x4b, 0x01, 0x4e, 0x51, 0x35, 0x0a, 0x78, 0x52, 0x76, + 0x69, 0xd0, 0x97, 0x37, 0x30, 0xa1, 0xc4, 0xae, 0x2a, 0x50, 0xe8, 0x0e, 0xeb, 0x5a, 0x57, 0x8b, + 0xea, 0x81, 0x04, 0xb9, 0xc8, 0xb1, 0xb3, 0x06, 0xe9, 0xfd, 0x34, 0x9c, 0x4e, 0x06, 0x64, 0xe6, + 0xb1, 0xeb, 0xed, 0x48, 0xf8, 0xcd, 0x1d, 0xb3, 0x8f, 0x5b, 0x87, 0x15, 0x6b, 0x16, 0x52, 0x15, + 0x01, 0x1f, 0x41, 0x83, 0x76, 0x89, 0xa0, 0xa0, 0x32, 0xb3, 0x25, 0xb1, 0xde, 0xae, 0xa4, 0x48, + 0xbc, 0x78, 0xe9, 0xa0, 0x2e, 0x86, 0x5d, 0x16, 0x8c, 0xa9, 0xbe, 0x2e, 0x1b, 0x9f, 0x77, 0x2c, + 0x7c, 0x2c, 0x70, 0x73, 0x24, 0xe1, 0x64, 0x0c, 0xe9, 0xf5, 0x5b, 0xfc, 0x92, 0x26, 0x7e, 0x13, + 0xca, 0x06, 0xda, 0x0d, 0x6d, 0x7f, 0x32, 0x87, 0x72, 0x97, 0x51, 0x34, 0xd0, 0x6e, 0xe0, 0x26, + 0xe3, 0xcf, 0x04, 0x1c, 0x70, 0x22, 0x92, 0xba, 0xa1, 0xea, 0x8d, 0xbe, 0x54, 0x6c, 0x0b, 0x0a, + 0x1b, 0x04, 0x26, 0xa4, 0x60, 0x57, 0x0f, 0xa2, 0x60, 0x81, 0xd9, 0xe5, 0xb1, 0x0d, 0xff, 0xa7, + 0x74, 0x0a, 0xbb, 0xdd, 0x8e, 0x20, 0xec, 0xb8, 0xf5, 0x5f, 0x02, 0xcc, 0x2c, 0xd9, 0xfe, 0x01, + 0xf7, 0xd4, 0x86, 0xae, 0x3d, 0x8e, 0x7c, 0x9c, 0xeb, 0x22, 0xd2, 0x07, 0x74, 0x11, 0xf1, 0x11, + 0x37, 0x13, 0x1f, 0x71, 0xa5, 0x2b, 0x30, 0x1b, 0xbb, 0x70, 0xa6, 0xf7, 0x47, 0x21, 0xa7, 0xdb, + 0xca, 0x0e, 0x6e, 0x23, 0xab, 0xce, 0xc9, 0xc3, 0xba, 0x4d, 0x86, 0x60, 0x87, 0x23, 0x45, 0x03, + 0xda, 0x2d, 0xee, 0x6c, 0xfb, 0xe0, 0x5d, 0xcb, 0xef, 0xde, 0x83, 0xfa, 0xb0, 0xd8, 0x83, 0x3e, + 0x74, 0x23, 0xc1, 0x17, 0x01, 0xb8, 0x52, 0xac, 0x60, 0x5f, 0x99, 0x00, 0xc7, 0x56, 0x7f, 0x0e, + 0x4a, 0x75, 0xd5, 0xa8, 0x23, 0x77, 0x63, 0x81, 0x38, 0x17, 0x8a, 0xb4, 0x5d, 0xe6, 0xcd, 0x7e, + 0xf7, 0xeb, 0xc7, 0xf9, 0x98, 0xdc, 0x6f, 0x12, 0x09, 0x51, 0xf7, 0xfb, 0x84, 0xeb, 0x7d, 0x3b, + 0xc0, 0x31, 0x2b, 0xf1, 0x19, 0xbf, 0x7f, 0xe0, 0xff, 0xbf, 0xf1, 0x77, 0x9c, 0xbd, 0xb3, 0xf1, + 0xc7, 0x81, 0xb0, 0x65, 0xfd, 0x90, 0x28, 0x72, 0x74, 0xfd, 0x44, 0xc2, 0x7d, 0x2d, 0xec, 0x9b, + 0x50, 0x08, 0xea, 0x4b, 0x1f, 0x5a, 0xdc, 0x6d, 0x7e, 0x79, 0x2c, 0xa0, 0x72, 0xd2, 0x99, 0x78, + 0x7d, 0x73, 0x81, 0x02, 0x9e, 0xcd, 0x3f, 0xe4, 0x97, 0xca, 0xb3, 0xc5, 0x2c, 0xbc, 0xbb, 0x67, + 0xfb, 0x71, 0x0a, 0xaa, 0xab, 0xfa, 0xa6, 0xa1, 0x36, 0x06, 0x29, 0x03, 0xda, 0x80, 0x82, 0x4d, + 0x90, 0x84, 0x94, 0xe1, 0xe5, 0xee, 0x75, 0x40, 0x89, 0x73, 0xcb, 0x63, 0x14, 0x2d, 0x27, 0x45, + 0x87, 0x59, 0xb4, 0xe7, 0x20, 0x0b, 0xcf, 0x14, 0x73, 0x88, 0x4b, 0xf7, 0x2b, 0xb1, 0xa3, 0x1c, + 0x5b, 0xa4, 0x4b, 0xac, 0xc1, 0x78, 0x7d, 0x4b, 0x6f, 0x68, 0xde, 0x3c, 0xa6, 0xd1, 0xd8, 0x27, + 0x12, 0xc8, 0xc9, 0x65, 0xd2, 0xc5, 0x81, 0xbe, 0x6a, 0x34, 0xf6, 0xa5, 0x93, 0x70, 0xa2, 0xe3, + 0x5a, 0x98, 0x7e, 0xfe, 0x44, 0x80, 0xb3, 0x6c, 0x8c, 0xee, 0x6c, 0x0d, 0x5c, 0x7b, 0xf5, 0x6d, + 0x01, 0x8e, 0x32, 0xae, 0xef, 0xea, 0xce, 0x96, 0x12, 0x57, 0x88, 0x75, 0xab, 0x57, 0x01, 0x74, + 0x23, 0x48, 0x9e, 0xb2, 0x83, 0x03, 0xb9, 0x6d, 0x5e, 0x85, 0xf9, 0xee, 0x28, 0x12, 0x6b, 0x5c, + 0xa4, 0x1f, 0x09, 0x70, 0x42, 0x46, 0x4d, 0x73, 0x07, 0x51, 0x4c, 0x07, 0xbc, 0x26, 0x7c, 0x74, + 0x07, 0xfb, 0xe0, 0x89, 0x3c, 0x1d, 0x3a, 0x91, 0x4b, 0x12, 0x0e, 0x15, 0x9d, 0xc8, 0xe7, 0xb2, + 0x4f, 0xc1, 0xc9, 0x35, 0x64, 0x35, 0x75, 0x43, 0x75, 0xd0, 0x20, 0x52, 0x37, 0xa1, 0xec, 0x70, + 0x3c, 0x21, 0x61, 0x2f, 0x74, 0x15, 0x76, 0x57, 0x0a, 0xe4, 0x92, 0x8b, 0xfc, 0xe7, 0xc0, 0xe6, + 0x4e, 0x83, 0x94, 0xb4, 0x22, 0xc6, 0xfa, 0xff, 0x15, 0xa0, 0x7a, 0x0d, 0xe1, 0xf0, 0x3e, 0x08, + 0xdf, 0x1f, 0x9d, 0x76, 0x9d, 0x83, 0x92, 0x8b, 0x99, 0x1f, 0x78, 0xe9, 0x11, 0xc8, 0xbd, 0x9f, + 0x62, 0x57, 0x65, 0xe4, 0x82, 0xae, 0x61, 0xda, 0x28, 0x9e, 0x43, 0x22, 0xed, 0x0b, 0xbb, 0xa5, + 0x8e, 0x6b, 0x67, 0xfc, 0x79, 0x5f, 0x80, 0xe3, 0xe4, 0x82, 0x66, 0xc0, 0x42, 0x50, 0x7a, 0x9a, + 0xeb, 0xb7, 0x10, 0x34, 0x71, 0x66, 0x79, 0x94, 0x20, 0xe5, 0xbe, 0xe6, 0x79, 0xa8, 0x76, 0x1a, + 0x9e, 0xec, 0x61, 0x7e, 0x37, 0x0d, 0x67, 0x18, 0x12, 0xba, 0x6b, 0x18, 0x64, 0xa9, 0xcd, 0x0e, + 0x3b, 0x9f, 0x1b, 0x3d, 0xac, 0xb5, 0x07, 0x12, 0x42, 0x9b, 0x1f, 0xf1, 0x45, 0x9f, 0xfd, 0xb1, + 0x1a, 0xd0, 0x68, 0x7a, 0xb1, 0xc2, 0x87, 0x2c, 0xf1, 0x11, 0xfc, 0xc4, 0xdc, 0xc5, 0x7c, 0x33, + 0x8f, 0xde, 0x7c, 0xb3, 0x9d, 0xcc, 0x77, 0x1e, 0x9e, 0xe8, 0xc6, 0x11, 0xa6, 0xa2, 0x3f, 0x4b, + 0xc1, 0x2c, 0x4f, 0x93, 0xf9, 0x0f, 0x70, 0x9f, 0x09, 0xfb, 0xbd, 0x0c, 0x53, 0xba, 0xad, 0xc4, + 0x54, 0xa7, 0x12, 0xd9, 0xe4, 0xe4, 0x71, 0xdd, 0xbe, 0x11, 0x2e, 0x3b, 0x15, 0x6f, 0xc3, 0x08, + 0xe5, 0x15, 0xdd, 0x26, 0x66, 0xfa, 0xdd, 0x26, 0x02, 0x81, 0x26, 0x7f, 0x8b, 0xcb, 0x30, 0xca, + 0xea, 0xa3, 0x29, 0xb2, 0x6c, 0xbf, 0xc8, 0x46, 0x28, 0x38, 0xf9, 0x90, 0xaa, 0x70, 0x2c, 0x9e, + 0xd5, 0x4c, 0x16, 0xff, 0x29, 0xc0, 0xd9, 0x7b, 0xc8, 0xd2, 0x37, 0xf6, 0x23, 0xab, 0x72, 0x33, + 0x99, 0x9f, 0x09, 0xb9, 0x0c, 0xba, 0x07, 0x97, 0xce, 0xc3, 0x7c, 0xf7, 0x85, 0x32, 0xae, 0x7c, + 0x4a, 0xd2, 0x7a, 0xf8, 0x98, 0xbd, 0x88, 0x05, 0xe3, 0x52, 0x71, 0x90, 0x43, 0xf1, 0x1a, 0x94, + 0xc2, 0xf5, 0xee, 0xfd, 0x33, 0xa4, 0x18, 0xaa, 0x6f, 0xc7, 0xd6, 0xc9, 0xb0, 0x7a, 0x5e, 0xc4, + 0xf5, 0x1f, 0x65, 0xda, 0xe5, 0x7a, 0x8f, 0x25, 0x4d, 0x94, 0xa1, 0x48, 0x35, 0x74, 0x00, 0x67, + 0x51, 0xa8, 0x07, 0x98, 0x21, 0xae, 0xb8, 0xc7, 0x7d, 0x72, 0xef, 0x49, 0x72, 0xfe, 0xd9, 0x7e, + 0x72, 0xfe, 0x45, 0x0f, 0x9c, 0x26, 0xfd, 0x5d, 0x21, 0x0f, 0x1d, 0xf0, 0xa0, 0x75, 0x05, 0x2a, + 0x11, 0xb6, 0xf0, 0x28, 0x3c, 0xcc, 0x2e, 0x98, 0x83, 0xbc, 0x61, 0xc1, 0x58, 0x3a, 0x8b, 0x63, + 0x4a, 0xa2, 0xc4, 0x79, 0x80, 0x4d, 0xc3, 0x05, 0xaa, 0x48, 0xb1, 0x23, 0x89, 0xa3, 0xc3, 0x78, + 0x3e, 0x03, 0x4a, 0x12, 0x23, 0xf4, 0xf4, 0xa0, 0x42, 0xef, 0xa0, 0x78, 0x99, 0x4e, 0x8a, 0x97, + 0x24, 0x91, 0x6c, 0x92, 0x44, 0x06, 0x56, 0x06, 0xe9, 0x69, 0xa8, 0xf5, 0x2a, 0x28, 0x26, 0xdb, + 0x3f, 0x12, 0x60, 0xee, 0x1a, 0xb2, 0xeb, 0x96, 0xbe, 0x3e, 0xd0, 0xf6, 0xf2, 0x1b, 0x30, 0xdc, + 0x6f, 0x82, 0xa8, 0xdb, 0xb4, 0x32, 0xc7, 0x28, 0xfd, 0x76, 0x06, 0x4e, 0x26, 0x8c, 0x66, 0x7b, + 0xa7, 0x37, 0xa1, 0xe4, 0x5d, 0xf2, 0xd7, 0x4d, 0x63, 0x43, 0xdf, 0x64, 0x17, 0x0e, 0xcf, 0xc4, + 0xd3, 0x12, 0x2b, 0xfe, 0x45, 0x02, 0x28, 0x17, 0x51, 0xb0, 0x41, 0xdc, 0x84, 0xe9, 0x98, 0x5a, + 0x02, 0xf2, 0x8c, 0x87, 0x2e, 0xf8, 0x62, 0x1f, 0x93, 0xd0, 0xa2, 0x85, 0xdd, 0xb8, 0x66, 0xf1, + 0x4d, 0x10, 0x5b, 0xc8, 0xd0, 0x74, 0x63, 0x53, 0x61, 0x17, 0x0e, 0x3a, 0xb2, 0x2b, 0x69, 0x72, + 0x85, 0x71, 0xa1, 0xf3, 0x1c, 0x2b, 0x14, 0x86, 0x27, 0x51, 0xc8, 0x0c, 0xe5, 0x56, 0xa0, 0x51, + 0x47, 0xb6, 0xf8, 0x16, 0x94, 0x38, 0x76, 0xa2, 0xe6, 0x16, 0xa9, 0x04, 0xc5, 0xb8, 0x2f, 0x77, + 0xc5, 0x1d, 0x54, 0x2a, 0x32, 0x43, 0xb1, 0xe5, 0xeb, 0xb2, 0x90, 0x21, 0x22, 0x98, 0xe4, 0xf8, + 0x83, 0x7b, 0x89, 0x6c, 0x37, 0x49, 0xb0, 0x49, 0x22, 0xb5, 0x1d, 0xe3, 0xad, 0x68, 0x87, 0xf4, + 0x1f, 0x69, 0xa8, 0xc8, 0xec, 0x1d, 0x1c, 0x22, 0x9e, 0xd4, 0xbe, 0x77, 0xe9, 0x33, 0x11, 0xb5, + 0x37, 0x60, 0x32, 0xae, 0x78, 0x96, 0x4b, 0xf0, 0x20, 0xd5, 0xb3, 0xe3, 0xd1, 0xea, 0x59, 0x5b, + 0xbc, 0x02, 0x43, 0x24, 0xfe, 0xd8, 0x2c, 0xaa, 0x75, 0xbc, 0x5c, 0xbd, 0xa6, 0x3a, 0xea, 0x42, + 0xc3, 0x5c, 0x97, 0xd9, 0x78, 0xf1, 0x06, 0x14, 0x0c, 0xb4, 0x4b, 0x8a, 0xf3, 0x18, 0x86, 0x6c, + 0x8f, 0x18, 0x46, 0x0d, 0xb4, 0x2b, 0xb7, 0x69, 0xe4, 0xb2, 0xc5, 0x75, 0x18, 0x5f, 0x57, 0x6d, + 0x14, 0xb6, 0x86, 0xa1, 0x84, 0x2a, 0x61, 0xbf, 0xbc, 0x17, 0x54, 0x1b, 0x05, 0x95, 0xa9, 0xbc, + 0x1e, 0x6e, 0x92, 0x66, 0xe1, 0x68, 0x8c, 0x98, 0x99, 0xef, 0xfa, 0x1b, 0x72, 0xf0, 0x63, 0xbd, + 0xaf, 0xfb, 0x6b, 0x23, 0xb9, 0x26, 0x28, 0x91, 0xfa, 0x4b, 0xea, 0x10, 0xae, 0xc4, 0x52, 0xe7, + 0x7b, 0xf1, 0xe8, 0x17, 0x77, 0x20, 0x1f, 0x12, 0xaa, 0xc1, 0x3c, 0x03, 0x05, 0x0b, 0x35, 0x4d, + 0x07, 0x29, 0xf5, 0x46, 0xdb, 0x76, 0x90, 0x45, 0x74, 0x28, 0x2f, 0x8f, 0xd1, 0xd6, 0x45, 0xda, + 0x18, 0xd1, 0xc8, 0x74, 0x44, 0x23, 0xa5, 0x39, 0x7c, 0x36, 0x8c, 0x5f, 0x0b, 0x5b, 0xee, 0x1f, + 0x08, 0x30, 0xb5, 0xba, 0x6f, 0xd4, 0x57, 0xb7, 0x54, 0x4b, 0x63, 0xa5, 0x9b, 0x6c, 0x9d, 0x67, + 0xa0, 0xc0, 0x5e, 0x7f, 0x71, 0x32, 0xa8, 0xce, 0x8f, 0xd1, 0x56, 0x4e, 0xc6, 0x51, 0xc8, 0xd9, + 0x18, 0x98, 0x17, 0x9f, 0x65, 0xe5, 0x61, 0xf2, 0xbd, 0xa4, 0x89, 0x57, 0x61, 0x84, 0xd6, 0x90, + 0xd2, 0x52, 0x80, 0x74, 0x8f, 0xa5, 0x00, 0x40, 0x81, 0x70, 0xb3, 0x74, 0x14, 0xa6, 0x23, 0xe4, + 0x31, 0xd2, 0xff, 0x76, 0x08, 0xc6, 0x71, 0x1f, 0xf7, 0x4e, 0x7d, 0x58, 0xea, 0x09, 0x18, 0x71, + 0x45, 0xc8, 0xc8, 0xce, 0xcb, 0xc0, 0x9b, 0x96, 0x34, 0xdf, 0x91, 0x39, 0xed, 0x7f, 0x78, 0xe6, + 0xbb, 0x7d, 0xcf, 0x04, 0x6e, 0xdf, 0x3b, 0xa4, 0xa6, 0xb3, 0x1d, 0xca, 0x5c, 0xa2, 0x75, 0x5b, + 0x43, 0x07, 0xab, 0xdb, 0x8a, 0xab, 0xd0, 0x1b, 0x8e, 0xad, 0xd0, 0x0b, 0x17, 0x82, 0xe4, 0x0e, + 0x52, 0x08, 0xb2, 0xc2, 0xca, 0xc9, 0xbd, 0xdb, 0x3a, 0x82, 0x2b, 0xdf, 0x23, 0xae, 0x32, 0x06, + 0x76, 0x6f, 0xd9, 0x08, 0xc6, 0x17, 0x60, 0x98, 0xd7, 0x73, 0x40, 0x8f, 0xf5, 0x1c, 0x1c, 0xc0, + 0x5f, 0x96, 0x32, 0x12, 0x2c, 0x4b, 0x59, 0x84, 0x51, 0x5a, 0x6c, 0xcc, 0x9e, 0x6e, 0x8e, 0xf6, + 0xf8, 0x74, 0x73, 0x84, 0xd4, 0x20, 0xb3, 0x57, 0x9b, 0x4f, 0x03, 0x79, 0x75, 0xa9, 0xb0, 0x17, + 0x22, 0xba, 0x86, 0x0c, 0x47, 0x77, 0xf6, 0x49, 0x6d, 0x5c, 0x5e, 0x16, 0x71, 0x1f, 0x7d, 0x08, + 0xb2, 0xc4, 0x7a, 0xc4, 0xd7, 0xa1, 0x18, 0x72, 0xd3, 0xac, 0xec, 0xbb, 0xd6, 0x9f, 0x83, 0x96, + 0x0b, 0x41, 0xe7, 0xdc, 0xc9, 0x2b, 0x16, 0x0f, 0xd3, 0x2b, 0x4e, 0xc1, 0x44, 0xd0, 0x9a, 0x98, + 0x99, 0x7d, 0x57, 0x80, 0x59, 0xbe, 0x4f, 0x7a, 0xcc, 0x6f, 0x55, 0xa4, 0xff, 0x16, 0xe0, 0x58, + 0x3c, 0x2d, 0x6c, 0xbb, 0xb6, 0x05, 0xe3, 0x75, 0xb5, 0xbe, 0x85, 0x82, 0x0f, 0xca, 0x07, 0x76, + 0xd0, 0x65, 0x82, 0xd4, 0xdf, 0x24, 0x1a, 0x30, 0xa5, 0xa9, 0x8e, 0x4a, 0xc4, 0x12, 0x9c, 0x2c, + 0x35, 0xe0, 0x64, 0x13, 0x1c, 0xaf, 0xbf, 0x55, 0xfa, 0x7b, 0x01, 0x66, 0xf8, 0xd2, 0x99, 0x5a, + 0xdc, 0x32, 0x6d, 0xff, 0x2d, 0xfb, 0x96, 0x69, 0x3b, 0x8a, 0xaa, 0x69, 0x16, 0xb2, 0x6d, 0x2e, + 0x05, 0xdc, 0x76, 0x95, 0x36, 0x25, 0x39, 0xea, 0xee, 0xa1, 0xa4, 0xc3, 0xe6, 0x26, 0x33, 0xf8, + 0xe6, 0x46, 0xfa, 0x17, 0x9f, 0x82, 0x05, 0x56, 0xc6, 0x64, 0x7a, 0x0a, 0xc6, 0x08, 0x9d, 0xb6, + 0x62, 0xb4, 0x9b, 0xeb, 0x2c, 0x0c, 0x65, 0xe5, 0x51, 0xda, 0xf8, 0x2a, 0x69, 0x13, 0x67, 0x21, + 0xcf, 0x17, 0x47, 0x4b, 0x73, 0xb2, 0x72, 0x8e, 0xad, 0xce, 0x16, 0xef, 0x43, 0xd1, 0x5b, 0x1e, + 0x11, 0x65, 0xe2, 0x2b, 0x79, 0x77, 0x2c, 0x5e, 0x82, 0x5b, 0xbb, 0xb5, 0x88, 0xe1, 0x88, 0xf1, + 0x14, 0x8c, 0x40, 0x1b, 0xf1, 0x43, 0x8c, 0xed, 0xb4, 0x30, 0x91, 0x7f, 0xde, 0xce, 0xe4, 0x32, + 0xa5, 0xac, 0x54, 0x83, 0xf2, 0x62, 0xc3, 0xb4, 0x11, 0x09, 0x62, 0x5c, 0x60, 0x7e, 0x69, 0x08, + 0x01, 0x69, 0x48, 0x13, 0x20, 0xfa, 0xc7, 0x33, 0x3b, 0x7c, 0x0a, 0x8a, 0x37, 0x91, 0xd3, 0x2b, + 0x8e, 0xb7, 0xa1, 0xe4, 0x8d, 0x66, 0x8c, 0x5c, 0x06, 0x60, 0xc3, 0xb1, 0xf3, 0xa0, 0x36, 0x71, + 0xa1, 0x17, 0x35, 0x25, 0x68, 0xc8, 0xd2, 0x29, 0x93, 0x89, 0xbf, 0xf8, 0x47, 0x01, 0xca, 0xf4, + 0x86, 0xc7, 0x9f, 0x74, 0xec, 0x4c, 0x92, 0x78, 0x03, 0x72, 0x78, 0x1f, 0xb2, 0x89, 0xdd, 0x62, + 0x8a, 0xbc, 0x29, 0x39, 0x9f, 0xfc, 0x62, 0x85, 0xde, 0x67, 0x53, 0x08, 0xd9, 0x85, 0xf5, 0xd7, + 0x88, 0xa6, 0x03, 0x35, 0xa2, 0x4b, 0x50, 0xdc, 0xd1, 0x6d, 0x7d, 0x5d, 0x6f, 0x90, 0x2a, 0xad, + 0x7e, 0xaa, 0x0f, 0x0b, 0x1e, 0x20, 0xd9, 0x76, 0x4c, 0x80, 0xe8, 0x5f, 0x1b, 0x13, 0xc1, 0x7b, + 0x02, 0x1c, 0xbf, 0x89, 0x1c, 0xd9, 0xfb, 0xad, 0x0c, 0x56, 0x13, 0xec, 0xee, 0x99, 0x96, 0x61, + 0x88, 0x14, 0x6b, 0x63, 0x03, 0x4c, 0x77, 0x54, 0x30, 0xdf, 0x8f, 0x6d, 0xd0, 0x0c, 0xb8, 0xfb, + 0x49, 0xca, 0xba, 0x65, 0x86, 0x03, 0x9b, 0x25, 0xdb, 0x7a, 0x91, 0xda, 0x42, 0xb6, 0x4f, 0x19, + 0x61, 0x6d, 0x58, 0x33, 0xa5, 0xef, 0xa7, 0xa0, 0xda, 0x89, 0x24, 0x26, 0xf6, 0x6f, 0x41, 0x81, + 0x8a, 0xc4, 0x2d, 0x75, 0xa6, 0xb4, 0xbd, 0xd1, 0x63, 0xc5, 0x5c, 0x32, 0x7a, 0xaa, 0x1c, 0xbc, + 0x95, 0x16, 0x68, 0x53, 0x7b, 0xe5, 0x6d, 0x33, 0xfb, 0x20, 0x46, 0x07, 0xf9, 0x4b, 0xa2, 0xb3, + 0xb4, 0x24, 0xfa, 0x4e, 0xb0, 0x24, 0xfa, 0xf9, 0x3e, 0x79, 0xe7, 0x52, 0xe6, 0x55, 0x49, 0x4b, + 0xef, 0xc0, 0xdc, 0x4d, 0xe4, 0x5c, 0x5b, 0xbe, 0x9b, 0x20, 0xb3, 0x7b, 0xec, 0xd1, 0x1b, 0xb6, + 0x0a, 0xce, 0x9b, 0x7e, 0xe7, 0x76, 0x0f, 0x96, 0xe4, 0x1d, 0x1c, 0xfe, 0xcb, 0x96, 0x7e, 0x5d, + 0x80, 0x93, 0x09, 0x93, 0x33, 0xe9, 0xbc, 0x0d, 0x65, 0x1f, 0x5a, 0x56, 0x5b, 0x28, 0x84, 0x0f, + 0xcf, 0x3d, 0x13, 0x21, 0x97, 0xac, 0x60, 0x83, 0x2d, 0xbd, 0x2b, 0xc0, 0x04, 0x29, 0x1f, 0xe7, + 0xde, 0xb8, 0x8f, 0xc8, 0xfd, 0xd5, 0x70, 0x06, 0xe6, 0xb9, 0xae, 0x19, 0x98, 0xb8, 0xa9, 0xbc, + 0xac, 0xcb, 0x36, 0x4c, 0x86, 0x06, 0x30, 0x3e, 0xc8, 0x90, 0x0b, 0x55, 0x74, 0x7e, 0xa1, 0xdf, + 0xa9, 0x58, 0xcd, 0xa2, 0x8b, 0x47, 0xfa, 0x2d, 0x01, 0x26, 0x64, 0xa4, 0xb6, 0x5a, 0x0d, 0x9a, + 0x29, 0xb5, 0xfb, 0x58, 0xf9, 0x6a, 0x78, 0xe5, 0xf1, 0x2f, 0x49, 0xfc, 0xbf, 0x2b, 0x43, 0xc5, + 0x11, 0x9d, 0xce, 0x5b, 0xfd, 0x34, 0x4c, 0x86, 0x06, 0x30, 0x4a, 0xff, 0x34, 0x05, 0x93, 0x54, + 0x57, 0xc2, 0xda, 0x79, 0x1d, 0x32, 0xee, 0x73, 0xa1, 0x82, 0x3f, 0xd5, 0x11, 0xe7, 0x31, 0xaf, + 0x21, 0x55, 0x5b, 0x46, 0x8e, 0x83, 0x2c, 0x52, 0xc6, 0x49, 0xea, 0x95, 0x09, 0x78, 0x52, 0xf0, + 0x8f, 0x9e, 0xf3, 0xd2, 0x71, 0xe7, 0xbc, 0xe7, 0xa1, 0xa2, 0x1b, 0x78, 0x84, 0xbe, 0x83, 0x14, + 0x64, 0xb8, 0xee, 0xc4, 0x4b, 0x5b, 0x4e, 0xba, 0xfd, 0xd7, 0x0d, 0x6e, 0xec, 0x4b, 0x9a, 0x78, + 0x1e, 0xca, 0x4d, 0x75, 0x4f, 0x6f, 0xb6, 0x9b, 0x4a, 0x0b, 0x8f, 0xb7, 0xf5, 0x77, 0xe8, 0x8f, + 0xc2, 0x64, 0xe5, 0x22, 0xeb, 0x58, 0x51, 0x37, 0xd1, 0xaa, 0xfe, 0x0e, 0x12, 0x9f, 0x80, 0x22, + 0x79, 0x47, 0x44, 0x06, 0xd2, 0x67, 0x2f, 0x43, 0xe4, 0xd9, 0x0b, 0x79, 0x5e, 0x84, 0x87, 0x11, + 0x0f, 0x29, 0x7d, 0x44, 0x7f, 0x50, 0x23, 0xc0, 0x2f, 0xa6, 0x48, 0x87, 0xc4, 0xb0, 0x58, 0xbb, + 0x4c, 0x1d, 0xa2, 0x5d, 0xc6, 0xad, 0x35, 0x1d, 0xb3, 0x56, 0xb1, 0x09, 0x53, 0x11, 0x4a, 0x68, + 0x08, 0xcf, 0x0c, 0xe6, 0xab, 0x26, 0xc2, 0x24, 0x91, 0xb8, 0xfe, 0x4f, 0x02, 0x4c, 0xaf, 0xb4, + 0xad, 0x4d, 0xf4, 0x8b, 0xa8, 0x8c, 0xd2, 0x0c, 0x54, 0xa2, 0x8b, 0xe3, 0xe5, 0x8d, 0x29, 0x98, + 0xbe, 0x83, 0x7e, 0x41, 0x57, 0xfe, 0x48, 0xcc, 0x70, 0x01, 0x2a, 0x51, 0x86, 0x31, 0x3b, 0x8c, + 0xc1, 0x21, 0xc4, 0xe1, 0xf8, 0x3e, 0x79, 0x95, 0xbb, 0x61, 0x21, 0x7b, 0xcb, 0x9f, 0x8d, 0xed, + 0xc7, 0x57, 0x7f, 0x3d, 0xec, 0xab, 0xbf, 0xd2, 0xa3, 0xaf, 0xee, 0x38, 0xab, 0xe7, 0xb2, 0xc9, + 0x43, 0xdd, 0xb8, 0x71, 0x4c, 0x69, 0xbe, 0x27, 0xc0, 0xf9, 0x9b, 0xc8, 0x40, 0x96, 0xea, 0xa0, + 0x65, 0xd5, 0xe6, 0xb5, 0xf9, 0x21, 0x7b, 0xb3, 0x1f, 0xc7, 0x69, 0xf9, 0x5d, 0x01, 0x9e, 0xec, + 0x89, 0x34, 0x26, 0xb1, 0x67, 0x61, 0x8a, 0x9c, 0x60, 0x15, 0xfa, 0xf0, 0x91, 0x5d, 0x79, 0xb4, + 0xd9, 0x13, 0xa4, 0xb4, 0x3c, 0x41, 0x7a, 0xd7, 0xdc, 0xce, 0x45, 0xdc, 0x87, 0xf5, 0x96, 0xe7, + 0xa4, 0x1b, 0xc8, 0xd8, 0x74, 0xb6, 0xd8, 0x13, 0xd4, 0x31, 0xd6, 0xba, 0x4c, 0x1a, 0xa5, 0x1b, + 0x30, 0x1b, 0xdc, 0x48, 0x06, 0x93, 0x8d, 0x67, 0xa1, 0x18, 0xcc, 0x79, 0xd2, 0x4d, 0x50, 0x5e, + 0x2e, 0x04, 0x92, 0x9e, 0xb6, 0xd4, 0x86, 0x63, 0xf1, 0x78, 0xd8, 0x22, 0x5e, 0x83, 0x21, 0x7a, + 0x30, 0x64, 0x9b, 0xa8, 0x17, 0x7b, 0xdc, 0xe5, 0xb2, 0xa3, 0x52, 0x18, 0x2d, 0x43, 0x26, 0xfd, + 0xd5, 0x10, 0x4c, 0xc5, 0x0f, 0x49, 0x3a, 0xf2, 0x3c, 0x07, 0xd3, 0x4d, 0x75, 0x4f, 0x09, 0xbb, + 0x6f, 0xef, 0x9d, 0xee, 0x44, 0x53, 0xdd, 0x0b, 0xbb, 0x66, 0x4d, 0x5c, 0x86, 0x12, 0xc5, 0xd8, + 0x30, 0xeb, 0x6a, 0xa3, 0xd7, 0xe4, 0xe9, 0x10, 0x3e, 0xc9, 0x54, 0x04, 0x99, 0xee, 0xf6, 0x97, + 0x31, 0x28, 0x49, 0xb1, 0xbd, 0x13, 0x65, 0x2d, 0x0d, 0x1c, 0x77, 0x07, 0x62, 0x4d, 0x4d, 0x0e, + 0x08, 0x86, 0xee, 0xfc, 0x43, 0xd2, 0x12, 0x7f, 0x43, 0x80, 0xf1, 0x2d, 0xd5, 0xd0, 0xcc, 0x1d, + 0x76, 0x86, 0x21, 0x4a, 0x8e, 0xcf, 0xc9, 0xfd, 0xbc, 0x0f, 0xed, 0x40, 0xc0, 0x2d, 0x86, 0xd8, + 0x3d, 0xa2, 0x33, 0x22, 0xc4, 0xad, 0x48, 0x87, 0xd8, 0x82, 0xd3, 0xb1, 0x92, 0x08, 0x1f, 0x18, + 0x7b, 0xcd, 0xc3, 0xce, 0x45, 0x05, 0x77, 0x2f, 0x70, 0x84, 0x9c, 0x79, 0x57, 0x80, 0xf1, 0x18, + 0x16, 0xc5, 0x3c, 0x05, 0xbd, 0x1f, 0x3c, 0xf7, 0xdc, 0x1c, 0x88, 0x2b, 0x2b, 0xc8, 0x62, 0xf3, + 0xf9, 0xce, 0x41, 0x33, 0xdf, 0x16, 0x60, 0xba, 0x03, 0xbb, 0x62, 0x08, 0x92, 0x83, 0x04, 0x7d, + 0xb9, 0x47, 0x82, 0x22, 0x13, 0x90, 0x5d, 0x86, 0xef, 0x34, 0xf6, 0x06, 0x4c, 0xc6, 0x8e, 0x11, + 0x5f, 0x86, 0x63, 0xae, 0x96, 0xc4, 0x19, 0x0b, 0xf5, 0x3f, 0x47, 0xf9, 0x98, 0x88, 0xc5, 0x48, + 0x3f, 0x10, 0x60, 0xae, 0x1b, 0x3f, 0x44, 0x09, 0xc6, 0xd4, 0xfa, 0x36, 0xd2, 0x42, 0x68, 0x47, + 0x48, 0x23, 0x33, 0xbd, 0xfb, 0x30, 0xe3, 0x1b, 0x13, 0xd6, 0x8e, 0x5e, 0x5f, 0x4f, 0x4e, 0xbb, + 0x28, 0x83, 0x4a, 0x21, 0x7d, 0x47, 0x80, 0x19, 0x19, 0xad, 0xb7, 0xf5, 0x86, 0xf6, 0xb8, 0x73, + 0xa9, 0xc7, 0x71, 0xd8, 0x8d, 0xa1, 0x84, 0xc5, 0xb5, 0x1f, 0xa7, 0xa0, 0xba, 0x84, 0xb1, 0x0e, + 0x54, 0x01, 0x79, 0x68, 0x6f, 0x07, 0x96, 0xa0, 0xc8, 0xa3, 0xcc, 0xba, 0xea, 0xd4, 0xb7, 0xdc, + 0xdb, 0xeb, 0xee, 0x17, 0x8c, 0x3c, 0x3c, 0x2d, 0x50, 0xb8, 0xb8, 0x2c, 0x7d, 0xe6, 0x50, 0xb2, + 0xf4, 0x13, 0x90, 0xa5, 0xfb, 0x9c, 0x2c, 0xd9, 0xe7, 0xd0, 0x0f, 0xe9, 0x79, 0x38, 0xd1, 0x91, + 0x8f, 0x2c, 0x66, 0xb9, 0x80, 0x82, 0x1f, 0xf0, 0x2f, 0x52, 0x70, 0x26, 0x58, 0xa6, 0xea, 0x29, + 0x13, 0x2d, 0xb9, 0x78, 0x1c, 0x82, 0x58, 0x81, 0x71, 0xff, 0xed, 0x27, 0xfb, 0xd9, 0x9d, 0x9e, + 0xef, 0xf6, 0xca, 0xbe, 0xab, 0x4e, 0xfa, 0x1b, 0x3b, 0x01, 0x8c, 0xa4, 0x58, 0xb7, 0xbf, 0xd4, + 0x9d, 0x8b, 0x91, 0xe4, 0x4c, 0x89, 0x95, 0xcd, 0xc3, 0x13, 0xdd, 0x18, 0xc7, 0xb4, 0xfc, 0x0f, + 0x05, 0xa8, 0xbe, 0xd6, 0xd2, 0x06, 0x2c, 0x3f, 0xff, 0x5a, 0x78, 0xff, 0xd9, 0xfd, 0x89, 0x47, + 0xf2, 0xa4, 0xde, 0xf6, 0xf3, 0x5b, 0x70, 0xa2, 0xe3, 0x50, 0xb7, 0x44, 0x25, 0x9c, 0x39, 0xf9, + 0xca, 0xc1, 0xa7, 0x8f, 0xe4, 0x50, 0xfe, 0x44, 0x80, 0xf9, 0x55, 0xc7, 0x42, 0x6a, 0xd3, 0x4b, + 0xb4, 0x74, 0x4c, 0xa5, 0xb5, 0x60, 0xca, 0xde, 0x37, 0xea, 0x01, 0x1f, 0xde, 0xfd, 0x06, 0x26, + 0x74, 0x54, 0x5d, 0xdd, 0x37, 0xea, 0x21, 0x37, 0x8e, 0x6e, 0x1d, 0x91, 0x27, 0xec, 0x98, 0xf6, + 0x85, 0x51, 0x00, 0xd5, 0x71, 0x2c, 0x7d, 0xbd, 0xed, 0x20, 0x1b, 0x6f, 0xc6, 0xcf, 0xf5, 0x40, + 0x2c, 0x63, 0xdc, 0x7d, 0xdf, 0xaf, 0x3f, 0x08, 0x61, 0xb9, 0x75, 0xa6, 0x2f, 0x01, 0xf5, 0xad, + 0x23, 0xde, 0xaf, 0x43, 0x84, 0x48, 0xfb, 0x63, 0x01, 0x24, 0xff, 0x5b, 0x5b, 0x97, 0xe7, 0x54, + 0x14, 0x7d, 0x68, 0xdb, 0xfd, 0xb0, 0xb6, 0x2d, 0xf6, 0xf5, 0xc8, 0x37, 0x7e, 0x62, 0x4f, 0xe3, + 0x7e, 0x53, 0x80, 0x53, 0x89, 0xe3, 0xdd, 0xc4, 0x65, 0x58, 0xed, 0xae, 0x0d, 0x46, 0x47, 0x44, + 0xf5, 0x30, 0xcb, 0x6e, 0xc6, 0x14, 0xb6, 0xbb, 0xe7, 0x98, 0x47, 0xc9, 0xb2, 0xee, 0x13, 0x07, + 0x59, 0x96, 0x38, 0x7e, 0x00, 0x96, 0xf5, 0x80, 0xd7, 0xc7, 0xb2, 0x3f, 0x17, 0xe0, 0x5c, 0x22, + 0x04, 0x0e, 0x59, 0xfd, 0x28, 0x9b, 0x16, 0xe6, 0xdc, 0xed, 0xc1, 0x28, 0xf6, 0xcf, 0xef, 0x31, + 0xf0, 0xf7, 0xc8, 0x21, 0xba, 0x3b, 0x18, 0xe3, 0xe3, 0x66, 0x84, 0x8f, 0xaf, 0x1c, 0x0a, 0x55, + 0x71, 0xec, 0x3c, 0x1b, 0x07, 0x28, 0xab, 0xbb, 0x0c, 0xb6, 0xaf, 0x02, 0xb1, 0x8d, 0x30, 0x33, + 0x97, 0x7b, 0xca, 0x53, 0xf4, 0x48, 0x41, 0x80, 0x9d, 0xf3, 0xdd, 0x81, 0x18, 0x33, 0xf5, 0x08, + 0x33, 0xef, 0x1c, 0x12, 0x55, 0x11, 0x76, 0xbe, 0x2f, 0xc0, 0xa9, 0x1b, 0xa6, 0x55, 0x47, 0x83, + 0xbf, 0x3c, 0x4a, 0xb2, 0xe8, 0x04, 0xa2, 0x93, 0x27, 0xf6, 0x38, 0xf8, 0x1d, 0x01, 0x4e, 0x27, + 0x53, 0xda, 0x8b, 0x49, 0x1f, 0x84, 0x90, 0x08, 0xd3, 0xde, 0x82, 0x11, 0xc6, 0x53, 0xf2, 0x46, + 0x22, 0x21, 0xdb, 0xf0, 0x2c, 0x64, 0x48, 0x55, 0x64, 0xaa, 0xc7, 0xca, 0x3b, 0x32, 0x5a, 0x7a, + 0x1e, 0xa6, 0x18, 0xfe, 0x6b, 0xcb, 0x77, 0xf1, 0x14, 0x77, 0x90, 0xa3, 0x6a, 0xaa, 0xa3, 0x8a, + 0xc7, 0x01, 0x7c, 0xc9, 0x45, 0x7a, 0x58, 0xca, 0x37, 0xdd, 0x54, 0xea, 0x0f, 0x05, 0x28, 0x04, + 0x21, 0xc5, 0xaf, 0xe1, 0x88, 0x4a, 0xa1, 0x19, 0x37, 0x7a, 0x4d, 0xbf, 0xc4, 0x93, 0x20, 0xbb, + 0xe8, 0xc4, 0x1b, 0x81, 0xc5, 0x5d, 0xea, 0x0f, 0x2d, 0xc9, 0xc0, 0xd3, 0xe5, 0xfe, 0x40, 0x80, + 0x31, 0x6f, 0xb2, 0x57, 0xd0, 0x7e, 0xe0, 0x5e, 0x5a, 0x18, 0xe0, 0x5e, 0x3a, 0x9a, 0xc0, 0x4d, + 0xc5, 0x25, 0x70, 0xcf, 0x40, 0xc1, 0x51, 0xad, 0x4d, 0xe4, 0x84, 0xf3, 0xbc, 0xb4, 0x95, 0x0d, + 0x93, 0x3e, 0x10, 0x40, 0xa4, 0x37, 0x1c, 0x81, 0xfc, 0xe1, 0x1d, 0x18, 0xd6, 0x1a, 0x0f, 0x14, + 0x7e, 0x60, 0xef, 0x74, 0xc3, 0x9c, 0xc4, 0xe0, 0x57, 0xd0, 0xbe, 0x3c, 0xa4, 0x35, 0x1e, 0xe0, + 0xb5, 0xcf, 0x42, 0xde, 0x4b, 0x06, 0xd3, 0x84, 0x74, 0xae, 0x95, 0x90, 0x05, 0x8e, 0xbb, 0xa0, + 0x90, 0x7e, 0x47, 0x80, 0xf1, 0x00, 0xa9, 0xee, 0x95, 0x5e, 0x1e, 0xd3, 0xea, 0xbf, 0xd2, 0x7c, + 0xee, 0x40, 0xea, 0x20, 0xe7, 0xb4, 0xc6, 0x83, 0x8e, 0x97, 0x26, 0xa9, 0x38, 0x9a, 0xfe, 0x5d, + 0x80, 0x49, 0x6a, 0x63, 0x8f, 0x98, 0x83, 0xbf, 0x0a, 0xb3, 0x5e, 0x3e, 0xbe, 0xa9, 0xee, 0xd1, + 0xc4, 0x81, 0x6b, 0x05, 0xa9, 0xc3, 0xb0, 0x02, 0x2f, 0xe3, 0x7f, 0x47, 0xdd, 0xf3, 0xf7, 0x48, + 0x15, 0x98, 0x0a, 0xaf, 0x92, 0xb9, 0x8d, 0x7f, 0x10, 0xa0, 0x78, 0x55, 0xd3, 0x02, 0x4b, 0x4f, + 0xf0, 0x1d, 0x77, 0x21, 0xeb, 0xbf, 0xe2, 0xfa, 0x52, 0x8f, 0x04, 0x87, 0x66, 0x20, 0xa6, 0x21, + 0x53, 0x4c, 0x33, 0x6f, 0x40, 0x86, 0x38, 0x85, 0x99, 0x90, 0x7d, 0xe5, 0x7d, 0x36, 0xf3, 0x2c, + 0x64, 0xd6, 0x1b, 0xe6, 0x7a, 0xef, 0x2e, 0x0b, 0x8f, 0x96, 0x44, 0x28, 0x79, 0x13, 0xb3, 0x5f, + 0xed, 0x69, 0x7d, 0xf8, 0x71, 0xf5, 0xc8, 0x47, 0x1f, 0x57, 0x8f, 0x7c, 0xfa, 0x71, 0x55, 0xf8, + 0xb5, 0x87, 0x55, 0xe1, 0x83, 0x87, 0x55, 0xe1, 0xaf, 0x1f, 0x56, 0x85, 0x0f, 0x1f, 0x56, 0x85, + 0x7f, 0x7b, 0x58, 0x15, 0x7e, 0xfa, 0xb0, 0x7a, 0xe4, 0xd3, 0x87, 0x55, 0xe1, 0xbd, 0x4f, 0xaa, + 0x47, 0x3e, 0xfc, 0xa4, 0x7a, 0xe4, 0xa3, 0x4f, 0xaa, 0x47, 0xbe, 0xfe, 0xc2, 0xa6, 0xe9, 0xcd, + 0xa9, 0x9b, 0x89, 0xff, 0x4c, 0xe8, 0x4b, 0xc1, 0x96, 0xf5, 0x21, 0x72, 0x24, 0xbd, 0xfc, 0x7f, + 0x01, 0x00, 0x00, 0xff, 0xff, 0x95, 0x2f, 0xab, 0x6a, 0x8b, 0x68, 0x00, 0x00, } func (this *StartWorkflowExecutionRequest) Equal(that interface{}) bool { @@ -11174,6 +11323,86 @@ func (this *DeleteDLQTasksResponse) Equal(that interface{}) bool { } return true } +func (this *AddTasksRequest) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*AddTasksRequest) + if !ok { + that2, ok := that.(AddTasksRequest) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.ShardId != that1.ShardId { + return false + } + if len(this.Tasks) != len(that1.Tasks) { + return false + } + for i := range this.Tasks { + if !this.Tasks[i].Equal(that1.Tasks[i]) { + return false + } + } + return true +} +func (this *AddTasksRequest_Task) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*AddTasksRequest_Task) + if !ok { + that2, ok := that.(AddTasksRequest_Task) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.Category != that1.Category { + return false + } + if !this.Blob.Equal(that1.Blob) { + return false + } + return true +} +func (this *AddTasksResponse) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*AddTasksResponse) + if !ok { + that2, ok := that.(AddTasksResponse) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + return true +} func (this *StartWorkflowExecutionRequest) GoString() string { if this == nil { return "nil" @@ -12907,6 +13136,41 @@ func (this *DeleteDLQTasksResponse) GoString() string { s = append(s, "}") return strings.Join(s, "") } +func (this *AddTasksRequest) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&historyservice.AddTasksRequest{") + s = append(s, "ShardId: "+fmt.Sprintf("%#v", this.ShardId)+",\n") + if this.Tasks != nil { + s = append(s, "Tasks: "+fmt.Sprintf("%#v", this.Tasks)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *AddTasksRequest_Task) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&historyservice.AddTasksRequest_Task{") + s = append(s, "Category: "+fmt.Sprintf("%#v", this.Category)+",\n") + if this.Blob != nil { + s = append(s, "Blob: "+fmt.Sprintf("%#v", this.Blob)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *AddTasksResponse) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 4) + s = append(s, "&historyservice.AddTasksResponse{") + s = append(s, "}") + return strings.Join(s, "") +} func valueToGoStringRequestResponse(v interface{}, typ string) string { rv := reflect.ValueOf(v) if rv.IsNil() { @@ -18684,65 +18948,172 @@ func (m *DeleteDLQTasksResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } -func encodeVarintRequestResponse(dAtA []byte, offset int, v uint64) int { - offset -= sovRequestResponse(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ +func (m *AddTasksRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - dAtA[offset] = uint8(v) - return base + return dAtA[:n], nil } -func (m *StartWorkflowExecutionRequest) Size() (n int) { - if m == nil { - return 0 - } + +func (m *AddTasksRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AddTasksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - l = len(m.NamespaceId) - if l > 0 { - n += 1 + l + sovRequestResponse(uint64(l)) - } - if m.StartRequest != nil { - l = m.StartRequest.Size() - n += 1 + l + sovRequestResponse(uint64(l)) - } - if m.ParentExecutionInfo != nil { - l = m.ParentExecutionInfo.Size() - n += 1 + l + sovRequestResponse(uint64(l)) - } - if m.Attempt != 0 { - n += 1 + sovRequestResponse(uint64(m.Attempt)) - } - if m.WorkflowExecutionExpirationTime != nil { - l = github_com_gogo_protobuf_types.SizeOfStdTime(*m.WorkflowExecutionExpirationTime) - n += 1 + l + sovRequestResponse(uint64(l)) - } - if m.ContinueAsNewInitiator != 0 { - n += 1 + sovRequestResponse(uint64(m.ContinueAsNewInitiator)) - } - if m.ContinuedFailure != nil { - l = m.ContinuedFailure.Size() - n += 1 + l + sovRequestResponse(uint64(l)) - } - if m.LastCompletionResult != nil { - l = m.LastCompletionResult.Size() - n += 1 + l + sovRequestResponse(uint64(l)) - } - if m.FirstWorkflowTaskBackoff != nil { - l = github_com_gogo_protobuf_types.SizeOfStdDuration(*m.FirstWorkflowTaskBackoff) - n += 1 + l + sovRequestResponse(uint64(l)) + if len(m.Tasks) > 0 { + for iNdEx := len(m.Tasks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Tasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintRequestResponse(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } } - if m.SourceVersionStamp != nil { - l = m.SourceVersionStamp.Size() - n += 1 + l + sovRequestResponse(uint64(l)) + if m.ShardId != 0 { + i = encodeVarintRequestResponse(dAtA, i, uint64(m.ShardId)) + i-- + dAtA[i] = 0x8 } - return n + return len(dAtA) - i, nil } -func (m *StartWorkflowExecutionResponse) Size() (n int) { +func (m *AddTasksRequest_Task) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AddTasksRequest_Task) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AddTasksRequest_Task) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Blob != nil { + { + size, err := m.Blob.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintRequestResponse(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if len(m.Category) > 0 { + i -= len(m.Category) + copy(dAtA[i:], m.Category) + i = encodeVarintRequestResponse(dAtA, i, uint64(len(m.Category))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *AddTasksResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AddTasksResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AddTasksResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func encodeVarintRequestResponse(dAtA []byte, offset int, v uint64) int { + offset -= sovRequestResponse(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *StartWorkflowExecutionRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.NamespaceId) + if l > 0 { + n += 1 + l + sovRequestResponse(uint64(l)) + } + if m.StartRequest != nil { + l = m.StartRequest.Size() + n += 1 + l + sovRequestResponse(uint64(l)) + } + if m.ParentExecutionInfo != nil { + l = m.ParentExecutionInfo.Size() + n += 1 + l + sovRequestResponse(uint64(l)) + } + if m.Attempt != 0 { + n += 1 + sovRequestResponse(uint64(m.Attempt)) + } + if m.WorkflowExecutionExpirationTime != nil { + l = github_com_gogo_protobuf_types.SizeOfStdTime(*m.WorkflowExecutionExpirationTime) + n += 1 + l + sovRequestResponse(uint64(l)) + } + if m.ContinueAsNewInitiator != 0 { + n += 1 + sovRequestResponse(uint64(m.ContinueAsNewInitiator)) + } + if m.ContinuedFailure != nil { + l = m.ContinuedFailure.Size() + n += 1 + l + sovRequestResponse(uint64(l)) + } + if m.LastCompletionResult != nil { + l = m.LastCompletionResult.Size() + n += 1 + l + sovRequestResponse(uint64(l)) + } + if m.FirstWorkflowTaskBackoff != nil { + l = github_com_gogo_protobuf_types.SizeOfStdDuration(*m.FirstWorkflowTaskBackoff) + n += 1 + l + sovRequestResponse(uint64(l)) + } + if m.SourceVersionStamp != nil { + l = m.SourceVersionStamp.Size() + n += 1 + l + sovRequestResponse(uint64(l)) + } + return n +} + +func (m *StartWorkflowExecutionResponse) Size() (n int) { if m == nil { return 0 } @@ -21056,6 +21427,50 @@ func (m *DeleteDLQTasksResponse) Size() (n int) { return n } +func (m *AddTasksRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.ShardId != 0 { + n += 1 + sovRequestResponse(uint64(m.ShardId)) + } + if len(m.Tasks) > 0 { + for _, e := range m.Tasks { + l = e.Size() + n += 1 + l + sovRequestResponse(uint64(l)) + } + } + return n +} + +func (m *AddTasksRequest_Task) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Category) + if l > 0 { + n += 1 + l + sovRequestResponse(uint64(l)) + } + if m.Blob != nil { + l = m.Blob.Size() + n += 1 + l + sovRequestResponse(uint64(l)) + } + return n +} + +func (m *AddTasksResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + func sovRequestResponse(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -22592,6 +23007,42 @@ func (this *DeleteDLQTasksResponse) String() string { }, "") return s } +func (this *AddTasksRequest) String() string { + if this == nil { + return "nil" + } + repeatedStringForTasks := "[]*AddTasksRequest_Task{" + for _, f := range this.Tasks { + repeatedStringForTasks += strings.Replace(fmt.Sprintf("%v", f), "AddTasksRequest_Task", "AddTasksRequest_Task", 1) + "," + } + repeatedStringForTasks += "}" + s := strings.Join([]string{`&AddTasksRequest{`, + `ShardId:` + fmt.Sprintf("%v", this.ShardId) + `,`, + `Tasks:` + repeatedStringForTasks + `,`, + `}`, + }, "") + return s +} +func (this *AddTasksRequest_Task) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&AddTasksRequest_Task{`, + `Category:` + fmt.Sprintf("%v", this.Category) + `,`, + `Blob:` + strings.Replace(fmt.Sprintf("%v", this.Blob), "DataBlob", "v14.DataBlob", 1) + `,`, + `}`, + }, "") + return s +} +func (this *AddTasksResponse) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&AddTasksResponse{`, + `}`, + }, "") + return s +} func valueToStringRequestResponse(v interface{}) string { rv := reflect.ValueOf(v) if rv.IsNil() { @@ -39098,6 +39549,286 @@ func (m *DeleteDLQTasksResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *AddTasksRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRequestResponse + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AddTasksRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AddTasksRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ShardId", wireType) + } + m.ShardId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRequestResponse + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ShardId |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Tasks", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRequestResponse + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRequestResponse + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthRequestResponse + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Tasks = append(m.Tasks, &AddTasksRequest_Task{}) + if err := m.Tasks[len(m.Tasks)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRequestResponse(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRequestResponse + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthRequestResponse + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AddTasksRequest_Task) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRequestResponse + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Task: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Task: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Category", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRequestResponse + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRequestResponse + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthRequestResponse + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Category = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Blob", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRequestResponse + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRequestResponse + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthRequestResponse + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Blob == nil { + m.Blob = &v14.DataBlob{} + } + if err := m.Blob.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRequestResponse(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRequestResponse + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthRequestResponse + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AddTasksResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRequestResponse + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AddTasksResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AddTasksResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipRequestResponse(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRequestResponse + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthRequestResponse + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipRequestResponse(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/api/historyservice/v1/service.pb.go b/api/historyservice/v1/service.pb.go index 80f7a0a6b9f..aa50c6e7d7d 100644 --- a/api/historyservice/v1/service.pb.go +++ b/api/historyservice/v1/service.pb.go @@ -54,100 +54,101 @@ func init() { } var fileDescriptor_655983da427ae822 = []byte{ - // 1477 bytes of a gzipped FileDescriptorProto + // 1494 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x9a, 0xcf, 0x6b, 0x24, 0x45, 0x14, 0xc7, 0xa7, 0x2e, 0x22, 0xa5, 0xae, 0xda, 0x8a, 0x3f, 0x56, 0x6d, 0x74, 0x45, 0xf1, 0x34, 0x71, 0x77, 0x41, 0x77, 0xb3, 0x89, 0x6b, 0x32, 0x49, 0x26, 0xd9, 0x4d, 0x34, 0x99, 0xc9, 0x46, - 0xf0, 0x22, 0x35, 0x33, 0x2f, 0x99, 0x22, 0x9d, 0xe9, 0xb1, 0xba, 0x66, 0xd6, 0x39, 0x08, 0x82, - 0x20, 0x08, 0x82, 0x22, 0x08, 0x9e, 0x04, 0x2f, 0x2a, 0x82, 0x20, 0x08, 0x82, 0x20, 0x78, 0x12, - 0x04, 0x45, 0x72, 0x73, 0x8f, 0x66, 0x72, 0xf1, 0xb8, 0x7f, 0x82, 0xcc, 0x74, 0x57, 0x65, 0xaa, - 0xbb, 0xba, 0xa7, 0xaa, 0xa7, 0x6f, 0xbb, 0x49, 0x7d, 0x3f, 0xfd, 0xad, 0xaa, 0xd7, 0xaf, 0x5f, - 0xbd, 0x0a, 0xbe, 0xcc, 0xe1, 0xa8, 0xeb, 0x33, 0xe2, 0xcd, 0x05, 0xc0, 0xfa, 0xc0, 0xe6, 0x48, - 0x97, 0xce, 0xb5, 0x69, 0xc0, 0x7d, 0x36, 0x18, 0xfd, 0x84, 0x36, 0x61, 0xae, 0x7f, 0x71, 0x2e, - 0xfa, 0x67, 0xb9, 0xcb, 0x7c, 0xee, 0x3b, 0x2f, 0x08, 0x51, 0x39, 0x14, 0x95, 0x49, 0x97, 0x96, - 0x55, 0x51, 0xb9, 0x7f, 0xf1, 0xfc, 0x82, 0x19, 0x9b, 0xc1, 0xbb, 0x3d, 0x08, 0xf8, 0x3b, 0x0c, - 0x82, 0xae, 0xdf, 0x09, 0xa2, 0x87, 0x5c, 0xfa, 0x66, 0x13, 0x9f, 0x5b, 0x0f, 0x07, 0xd7, 0xc3, - 0xc1, 0xce, 0xb7, 0x08, 0x3f, 0x56, 0xe7, 0x84, 0xf1, 0xb7, 0x7c, 0x76, 0xb8, 0xef, 0xf9, 0xb7, - 0x57, 0xdf, 0x83, 0x66, 0x8f, 0x53, 0xbf, 0xe3, 0xac, 0x94, 0x8d, 0x3c, 0x95, 0xf5, 0xf2, 0x5a, - 0x68, 0xe1, 0xfc, 0xea, 0x8c, 0x94, 0x70, 0x02, 0x17, 0x4a, 0xce, 0xe7, 0x08, 0x3f, 0x58, 0x05, - 0xbe, 0xd5, 0xe3, 0xa4, 0xe1, 0x41, 0x9d, 0x13, 0x0e, 0xce, 0xa2, 0x21, 0x3c, 0xa6, 0x13, 0xde, - 0x5e, 0xcb, 0x2b, 0x97, 0xa6, 0xbe, 0x40, 0xf8, 0xa1, 0x6d, 0xdf, 0xf3, 0x14, 0x57, 0xa6, 0xd8, - 0xb8, 0x50, 0xd8, 0xba, 0x9e, 0x5b, 0x2f, 0x7d, 0x7d, 0x8d, 0xf0, 0xa3, 0x35, 0x08, 0x80, 0xd7, - 0x39, 0x6d, 0x1e, 0x0e, 0x76, 0x49, 0x70, 0xb8, 0xd3, 0x83, 0x1e, 0x38, 0xcb, 0x86, 0x6c, 0x9d, - 0x58, 0xf8, 0xab, 0xcc, 0xc4, 0x90, 0x1e, 0x7f, 0x44, 0xf8, 0xc9, 0x1a, 0x34, 0x7d, 0xd6, 0x12, - 0xdb, 0x3e, 0x1a, 0x35, 0x8e, 0x03, 0x68, 0x39, 0x55, 0xe3, 0x87, 0xa4, 0x10, 0x84, 0xdb, 0xf5, - 0xd9, 0x41, 0x1a, 0xcb, 0x4b, 0x4d, 0x4e, 0xfb, 0x94, 0x0f, 0xf2, 0x5b, 0xd6, 0x10, 0xf2, 0x59, - 0xd6, 0x82, 0xa4, 0xe5, 0x5f, 0x10, 0x7e, 0x3a, 0xfc, 0xaf, 0x32, 0xb7, 0x8a, 0x7f, 0xd4, 0xf5, - 0x60, 0xe4, 0xfa, 0x86, 0xf9, 0x6e, 0xa6, 0x42, 0x84, 0xf1, 0x9b, 0x85, 0xb0, 0x62, 0xcb, 0x9d, - 0x18, 0xba, 0x46, 0xa8, 0x67, 0xb5, 0xdc, 0x29, 0x04, 0xfb, 0xe5, 0x4e, 0x05, 0x49, 0xcb, 0x5f, - 0x21, 0xfc, 0xc8, 0x46, 0x30, 0x39, 0x64, 0x8f, 0x78, 0xb4, 0xe5, 0x2c, 0x19, 0x3e, 0x43, 0xa3, - 0x15, 0x36, 0x97, 0x67, 0x41, 0x48, 0x83, 0x3f, 0x23, 0xfc, 0x54, 0x32, 0x6e, 0xd6, 0x81, 0x30, - 0xde, 0x00, 0xc2, 0x9d, 0x8d, 0xdc, 0xb1, 0x27, 0x19, 0xc2, 0xf0, 0x8d, 0x22, 0x50, 0xba, 0x40, - 0x9e, 0x1c, 0x9a, 0x3b, 0x90, 0xb5, 0x90, 0x9c, 0x81, 0x9c, 0xc2, 0xd2, 0x05, 0xf2, 0xe4, 0xd0, - 0x7c, 0x81, 0x9c, 0x24, 0xe4, 0x0c, 0x64, 0x1d, 0x28, 0x16, 0x27, 0xc9, 0xd9, 0x91, 0x4e, 0x13, - 0x46, 0xa6, 0x37, 0x66, 0x58, 0xa1, 0x88, 0x61, 0x1f, 0x27, 0x19, 0xa8, 0xd8, 0x1b, 0x38, 0x39, - 0xc8, 0xf6, 0x0d, 0x4c, 0x68, 0xed, 0xdf, 0x40, 0x0d, 0x42, 0x1a, 0xfc, 0x1e, 0xe1, 0xc7, 0xeb, - 0xf4, 0xa0, 0x43, 0xbc, 0x64, 0xcd, 0x65, 0x5c, 0x2d, 0xe9, 0xf5, 0xc2, 0xe8, 0xda, 0xac, 0x18, - 0x69, 0xf6, 0x77, 0x84, 0x9f, 0x8d, 0x46, 0x51, 0xde, 0x4e, 0xa9, 0x14, 0xdf, 0xb0, 0x7b, 0x5c, - 0x2a, 0x48, 0xd8, 0x7f, 0xb3, 0x30, 0x9e, 0x9c, 0xc7, 0x0f, 0x08, 0x3f, 0x51, 0x83, 0x23, 0xbf, - 0x0f, 0xa1, 0x48, 0x29, 0xd8, 0xd6, 0x8c, 0x03, 0x50, 0x0f, 0x10, 0xbe, 0xab, 0x33, 0x73, 0xa4, - 0xdf, 0x9f, 0x10, 0x3e, 0xbf, 0x0b, 0xec, 0x88, 0x76, 0x08, 0x87, 0xe4, 0x8a, 0x9b, 0xbe, 0xe9, - 0xe9, 0x08, 0xe1, 0x79, 0xa3, 0x00, 0x92, 0x12, 0xda, 0x2b, 0x30, 0xca, 0x7e, 0xf9, 0x43, 0x3b, - 0x45, 0x6f, 0x1b, 0xda, 0xa9, 0x18, 0x69, 0x76, 0x74, 0xf4, 0x19, 0x97, 0xa8, 0xf9, 0x8f, 0x3e, - 0x7a, 0xb9, 0xed, 0xd1, 0x27, 0x8d, 0x22, 0x9d, 0xfe, 0x86, 0xb0, 0x1b, 0x41, 0xc3, 0x84, 0x97, - 0x74, 0xbc, 0x69, 0xfc, 0xac, 0x2c, 0x8c, 0x70, 0xbe, 0x55, 0x10, 0x4d, 0x39, 0x8f, 0xd4, 0x9b, - 0x6d, 0x68, 0xf5, 0x3c, 0x98, 0xac, 0x4e, 0x8c, 0xcf, 0x23, 0x3a, 0xb1, 0xed, 0x79, 0x44, 0xcf, - 0x50, 0x52, 0xdd, 0x1e, 0x30, 0xba, 0x3f, 0x58, 0xa3, 0x2c, 0xe0, 0xca, 0x49, 0x20, 0x52, 0xb6, - 0x8c, 0x53, 0xdd, 0x34, 0x90, 0x6d, 0xaa, 0x9b, 0xce, 0x93, 0xf3, 0xf8, 0x15, 0xe1, 0x67, 0xc2, - 0x92, 0xaa, 0xd2, 0xa6, 0x5e, 0x4b, 0x6e, 0xc7, 0x59, 0xa5, 0x74, 0xd3, 0xaa, 0x30, 0x4b, 0xa1, - 0x88, 0x19, 0x6c, 0x16, 0x03, 0x93, 0xf6, 0xff, 0x41, 0xf8, 0xc5, 0x70, 0xb6, 0xda, 0xb1, 0xe3, - 0xb8, 0x1a, 0x91, 0xa0, 0xe5, 0xec, 0x5a, 0x2d, 0xde, 0x34, 0x9c, 0x98, 0xd0, 0xad, 0x82, 0xa9, - 0x4a, 0x15, 0xb8, 0x02, 0x41, 0x93, 0xd1, 0x86, 0x26, 0x3f, 0x56, 0x8d, 0x13, 0x5b, 0x0a, 0xc1, - 0xb6, 0x0a, 0xcc, 0x00, 0x49, 0xcb, 0x5f, 0x22, 0xfc, 0x70, 0x0d, 0xba, 0x1e, 0x6d, 0x12, 0x0e, - 0xab, 0x7d, 0xe8, 0xf0, 0x60, 0xef, 0x92, 0x73, 0xdd, 0x78, 0xcb, 0x63, 0x4a, 0x61, 0xf1, 0xf5, - 0xfc, 0x80, 0x58, 0xfa, 0x8e, 0x7e, 0x2f, 0xe6, 0x10, 0x7e, 0xcf, 0x57, 0x6c, 0xf1, 0x8a, 0xdc, - 0x3e, 0x7d, 0xeb, 0x29, 0x4a, 0xe7, 0xaa, 0x3e, 0xe8, 0x34, 0xeb, 0x6d, 0xc2, 0x5a, 0xa3, 0x5f, - 0xf6, 0x02, 0xe3, 0xce, 0x55, 0x4c, 0x67, 0xdb, 0xb9, 0x4a, 0xc8, 0xa5, 0xa9, 0x8f, 0x11, 0xbe, - 0x7f, 0xf4, 0x5b, 0x51, 0xa9, 0x3a, 0xf3, 0x16, 0x48, 0x21, 0x12, 0x76, 0xae, 0xe5, 0xd2, 0x2a, - 0x5f, 0x07, 0x11, 0x8d, 0x4a, 0x61, 0xb6, 0x6c, 0x19, 0xca, 0xba, 0xa2, 0xac, 0x32, 0x13, 0x43, - 0x39, 0x56, 0x88, 0x21, 0x51, 0x0f, 0x75, 0xdd, 0x0f, 0xb8, 0xf1, 0xb1, 0x42, 0xa3, 0xb5, 0x3d, - 0x56, 0x68, 0x11, 0xd2, 0xe0, 0x87, 0x08, 0xe3, 0x8a, 0xe7, 0x07, 0x30, 0xde, 0x6f, 0xe7, 0x8a, - 0x21, 0xf4, 0x4c, 0x22, 0xec, 0x5c, 0xcd, 0xa1, 0x94, 0x2e, 0xde, 0xc7, 0xf7, 0x56, 0x81, 0x87, - 0x16, 0x5e, 0x31, 0x6f, 0xaf, 0x2a, 0x06, 0x5e, 0xb5, 0xd6, 0x29, 0x8b, 0x10, 0x56, 0xd7, 0xe3, - 0xea, 0xe2, 0x8a, 0x55, 0x41, 0x3e, 0x59, 0x53, 0x5c, 0xcd, 0xa1, 0x54, 0x52, 0x53, 0x15, 0xb8, - 0x48, 0x0c, 0xd4, 0xef, 0x6c, 0x41, 0x10, 0x90, 0x03, 0x08, 0x8c, 0x53, 0x93, 0x5e, 0x6e, 0x9b, - 0x9a, 0xd2, 0x28, 0xca, 0x27, 0xa9, 0x0a, 0x7c, 0x65, 0x73, 0x47, 0x67, 0xb6, 0x6a, 0xfe, 0x18, - 0x3d, 0xc1, 0xf6, 0x93, 0x94, 0x01, 0x92, 0x96, 0x3f, 0x41, 0xf8, 0x81, 0x9d, 0x1e, 0xb0, 0x81, - 0x48, 0xb7, 0x8e, 0x69, 0xf6, 0x51, 0x54, 0xc2, 0xda, 0x42, 0x3e, 0xb1, 0x62, 0xa7, 0x06, 0xa4, - 0xdb, 0xf5, 0x06, 0xe1, 0x47, 0xca, 0xd8, 0x8e, 0xa2, 0xb2, 0xb5, 0x13, 0x13, 0x4b, 0x3b, 0x9f, - 0x22, 0x7c, 0x2e, 0x5c, 0x45, 0xb9, 0x8b, 0x0b, 0x56, 0x8b, 0x1f, 0xdf, 0xba, 0xc5, 0x9c, 0x6a, - 0xf5, 0x8a, 0xa4, 0xc7, 0x0e, 0x60, 0xd2, 0x93, 0xf1, 0x15, 0x49, 0x4c, 0x68, 0x7d, 0x45, 0x92, - 0xd0, 0x2b, 0xbe, 0xb6, 0x20, 0xa7, 0xaf, 0xb8, 0xd0, 0xd6, 0x57, 0x52, 0x1f, 0xbb, 0xba, 0xd9, - 0x67, 0x10, 0xb4, 0x27, 0x2b, 0xfd, 0xc0, 0xe2, 0xea, 0x26, 0x29, 0xb6, 0xbf, 0xba, 0xd1, 0x31, - 0xa4, 0xc7, 0xbf, 0x11, 0x7e, 0xbe, 0x0a, 0x1d, 0x60, 0x84, 0xc3, 0x26, 0x09, 0x78, 0xf4, 0x45, - 0x9a, 0x78, 0x71, 0x43, 0xcb, 0x3b, 0xc6, 0xc1, 0x33, 0x95, 0x25, 0x66, 0x50, 0x2b, 0x12, 0xa9, - 0x2c, 0xba, 0x9a, 0x2c, 0xa3, 0x3a, 0x6d, 0x39, 0x57, 0xa6, 0x55, 0x8b, 0xb5, 0xca, 0x4c, 0x0c, - 0xa5, 0x02, 0xa9, 0x41, 0xa3, 0x47, 0xbd, 0x96, 0x52, 0x24, 0x2d, 0x19, 0xef, 0x69, 0x42, 0x6b, - 0x5b, 0x81, 0x68, 0x11, 0x4a, 0xf7, 0x67, 0x63, 0x84, 0xe1, 0xf9, 0xbb, 0x3f, 0x29, 0x7a, 0xdb, - 0xee, 0x4f, 0x2a, 0x46, 0xe9, 0xa9, 0xa8, 0x3d, 0xa2, 0x3d, 0x1a, 0xd0, 0x06, 0xf5, 0xc6, 0xa5, - 0xe9, 0xe8, 0xec, 0x66, 0xdc, 0x53, 0xc9, 0xc6, 0xd8, 0xf6, 0x54, 0xa6, 0xd1, 0x94, 0xe5, 0xbe, - 0xd5, 0x6d, 0x91, 0x59, 0x9a, 0x6d, 0x29, 0x7a, 0xdb, 0xe5, 0x4e, 0xc5, 0x28, 0xd7, 0x09, 0xdb, - 0xbe, 0x97, 0x6c, 0x12, 0x85, 0x52, 0xe3, 0xeb, 0x84, 0x0c, 0x86, 0xed, 0x75, 0x42, 0x26, 0x4a, - 0x1a, 0xff, 0x0b, 0xe1, 0xe7, 0xea, 0x9c, 0x01, 0x39, 0x3a, 0xfb, 0xf8, 0x27, 0x2b, 0x25, 0xe3, - 0x8e, 0xf5, 0x34, 0x92, 0x98, 0xc4, 0x76, 0x71, 0x40, 0x31, 0x95, 0x97, 0xd0, 0xcb, 0x68, 0xbc, - 0x0f, 0x55, 0x4d, 0xb7, 0x31, 0x4a, 0x91, 0xc6, 0xfb, 0x90, 0xc1, 0xb0, 0xdd, 0x87, 0x4c, 0x94, - 0xdc, 0x87, 0x3f, 0x11, 0xbe, 0x90, 0x39, 0xb2, 0x0f, 0x2c, 0x00, 0x67, 0xbb, 0x88, 0x87, 0x8e, - 0x51, 0x62, 0x1a, 0x3b, 0x05, 0x12, 0x95, 0x5e, 0xa3, 0x4e, 0x50, 0x23, 0xb7, 0x23, 0xcd, 0xde, - 0x25, 0xe3, 0x5e, 0xe3, 0x34, 0x90, 0x6d, 0xaf, 0x71, 0x3a, 0x4f, 0xb9, 0x94, 0x5d, 0xf3, 0x59, - 0x13, 0xd2, 0xba, 0xfe, 0xa6, 0x41, 0x90, 0x05, 0xb1, 0xbd, 0x94, 0xcd, 0x66, 0x49, 0xef, 0x1f, - 0x21, 0x7c, 0x5f, 0x58, 0xb5, 0x86, 0xc5, 0xca, 0x55, 0xab, 0x4a, 0x57, 0x29, 0x4a, 0xe6, 0xf3, - 0x48, 0x95, 0x9a, 0x3d, 0xb4, 0x2b, 0xbd, 0x2c, 0x58, 0x7d, 0x2c, 0xe2, 0x76, 0x16, 0x73, 0xaa, - 0x85, 0xa3, 0xe5, 0xee, 0xf1, 0x89, 0x5b, 0xba, 0x73, 0xe2, 0x96, 0xee, 0x9e, 0xb8, 0xe8, 0x83, - 0xa1, 0x8b, 0xbe, 0x1b, 0xba, 0xe8, 0x8f, 0xa1, 0x8b, 0x8e, 0x87, 0x2e, 0xfa, 0x77, 0xe8, 0xa2, - 0xff, 0x86, 0x6e, 0xe9, 0xee, 0xd0, 0x45, 0x9f, 0x9d, 0xba, 0xa5, 0xe3, 0x53, 0xb7, 0x74, 0xe7, - 0xd4, 0x2d, 0xbd, 0x3d, 0x7f, 0xe0, 0x9f, 0x3d, 0x98, 0xfa, 0x99, 0x7f, 0xa2, 0x76, 0x4d, 0xfd, - 0x49, 0xe3, 0x9e, 0xf1, 0x5f, 0xa8, 0x5d, 0xfe, 0x3f, 0x00, 0x00, 0xff, 0xff, 0x1d, 0x6f, 0x29, - 0xc3, 0x3d, 0x27, 0x00, 0x00, + 0xf0, 0x22, 0x35, 0xd3, 0x2f, 0x99, 0x22, 0x9d, 0xe9, 0xb1, 0xba, 0x66, 0xd6, 0x39, 0x08, 0x82, + 0x20, 0x08, 0x82, 0x22, 0x08, 0x9e, 0x04, 0x0f, 0xa2, 0x08, 0x82, 0x20, 0x08, 0x82, 0xe0, 0x49, + 0x10, 0x14, 0xc9, 0xcd, 0x3d, 0x9a, 0xc9, 0xc5, 0xe3, 0xfe, 0x09, 0x32, 0xd3, 0x5d, 0x95, 0xa9, + 0xee, 0xea, 0x9e, 0xaa, 0x9e, 0xb9, 0xed, 0x26, 0xf5, 0xfd, 0xf4, 0xb7, 0xaa, 0x5e, 0xbf, 0x7e, + 0xf5, 0x2a, 0xf8, 0x32, 0x87, 0xa3, 0x4e, 0xc0, 0x88, 0x3f, 0x17, 0x02, 0xeb, 0x01, 0x9b, 0x23, + 0x1d, 0x3a, 0xd7, 0xa2, 0x21, 0x0f, 0x58, 0x7f, 0xf8, 0x13, 0xda, 0x84, 0xb9, 0xde, 0xc5, 0xb9, + 0xf8, 0x9f, 0xe5, 0x0e, 0x0b, 0x78, 0xe0, 0xbc, 0x20, 0x44, 0xe5, 0x48, 0x54, 0x26, 0x1d, 0x5a, + 0x56, 0x45, 0xe5, 0xde, 0xc5, 0xf3, 0x0b, 0x66, 0x6c, 0x06, 0xef, 0x76, 0x21, 0xe4, 0xef, 0x30, + 0x08, 0x3b, 0x41, 0x3b, 0x8c, 0x1f, 0x72, 0xe9, 0x9b, 0x2d, 0x7c, 0x6e, 0x3d, 0x1a, 0x5c, 0x8f, + 0x06, 0x3b, 0xdf, 0x22, 0xfc, 0x58, 0x9d, 0x13, 0xc6, 0xdf, 0x0a, 0xd8, 0xe1, 0xbe, 0x1f, 0xdc, + 0x5e, 0x7d, 0x0f, 0x9a, 0x5d, 0x4e, 0x83, 0xb6, 0xb3, 0x52, 0x36, 0xf2, 0x54, 0xd6, 0xcb, 0x6b, + 0x91, 0x85, 0xf3, 0xab, 0x53, 0x52, 0xa2, 0x09, 0x5c, 0x28, 0x39, 0x9f, 0x23, 0xfc, 0x60, 0x15, + 0xf8, 0x56, 0x97, 0x93, 0x86, 0x0f, 0x75, 0x4e, 0x38, 0x38, 0x8b, 0x86, 0xf0, 0x84, 0x4e, 0x78, + 0x7b, 0xad, 0xa8, 0x5c, 0x9a, 0xfa, 0x02, 0xe1, 0x87, 0xb6, 0x03, 0xdf, 0x57, 0x5c, 0x99, 0x62, + 0x93, 0x42, 0x61, 0xeb, 0x7a, 0x61, 0xbd, 0xf4, 0xf5, 0x35, 0xc2, 0x8f, 0xd6, 0x20, 0x04, 0x5e, + 0xe7, 0xb4, 0x79, 0xd8, 0xdf, 0x25, 0xe1, 0xe1, 0x4e, 0x17, 0xba, 0xe0, 0x2c, 0x1b, 0xb2, 0x75, + 0x62, 0xe1, 0xaf, 0x32, 0x15, 0x43, 0x7a, 0xfc, 0x11, 0xe1, 0x27, 0x6b, 0xd0, 0x0c, 0x98, 0x27, + 0xb6, 0x7d, 0x38, 0x6a, 0x14, 0x07, 0xe0, 0x39, 0x55, 0xe3, 0x87, 0x64, 0x10, 0x84, 0xdb, 0xf5, + 0xe9, 0x41, 0x1a, 0xcb, 0x4b, 0x4d, 0x4e, 0x7b, 0x94, 0xf7, 0x8b, 0x5b, 0xd6, 0x10, 0x8a, 0x59, + 0xd6, 0x82, 0xa4, 0xe5, 0x5f, 0x10, 0x7e, 0x3a, 0xfa, 0xaf, 0x32, 0xb7, 0x4a, 0x70, 0xd4, 0xf1, + 0x61, 0xe8, 0xfa, 0x86, 0xf9, 0x6e, 0x66, 0x42, 0x84, 0xf1, 0x9b, 0x33, 0x61, 0x25, 0x96, 0x3b, + 0x35, 0x74, 0x8d, 0x50, 0xdf, 0x6a, 0xb9, 0x33, 0x08, 0xf6, 0xcb, 0x9d, 0x09, 0x92, 0x96, 0xbf, + 0x42, 0xf8, 0x91, 0x8d, 0x70, 0x7c, 0xc8, 0x1e, 0xf1, 0xa9, 0xe7, 0x2c, 0x19, 0x3e, 0x43, 0xa3, + 0x15, 0x36, 0x97, 0xa7, 0x41, 0x48, 0x83, 0x3f, 0x23, 0xfc, 0x54, 0x3a, 0x6e, 0xd6, 0x81, 0x30, + 0xde, 0x00, 0xc2, 0x9d, 0x8d, 0xc2, 0xb1, 0x27, 0x19, 0xc2, 0xf0, 0x8d, 0x59, 0xa0, 0x74, 0x81, + 0x3c, 0x3e, 0xb4, 0x70, 0x20, 0x6b, 0x21, 0x05, 0x03, 0x39, 0x83, 0xa5, 0x0b, 0xe4, 0xf1, 0xa1, + 0xc5, 0x02, 0x39, 0x4d, 0x28, 0x18, 0xc8, 0x3a, 0x50, 0x22, 0x4e, 0xd2, 0xb3, 0x23, 0xed, 0x26, + 0x0c, 0x4d, 0x6f, 0x4c, 0xb1, 0x42, 0x31, 0xc3, 0x3e, 0x4e, 0x72, 0x50, 0x89, 0x37, 0x70, 0x7c, + 0x90, 0xed, 0x1b, 0x98, 0xd2, 0xda, 0xbf, 0x81, 0x1a, 0x84, 0x34, 0xf8, 0x3d, 0xc2, 0x8f, 0xd7, + 0xe9, 0x41, 0x9b, 0xf8, 0xe9, 0x9a, 0xcb, 0xb8, 0x5a, 0xd2, 0xeb, 0x85, 0xd1, 0xb5, 0x69, 0x31, + 0xd2, 0xec, 0xef, 0x08, 0x3f, 0x1b, 0x8f, 0xa2, 0xbc, 0x95, 0x51, 0x29, 0xbe, 0x61, 0xf7, 0xb8, + 0x4c, 0x90, 0xb0, 0xff, 0xe6, 0xcc, 0x78, 0x72, 0x1e, 0x3f, 0x20, 0xfc, 0x44, 0x0d, 0x8e, 0x82, + 0x1e, 0x44, 0x22, 0xa5, 0x60, 0x5b, 0x33, 0x0e, 0x40, 0x3d, 0x40, 0xf8, 0xae, 0x4e, 0xcd, 0x91, + 0x7e, 0x7f, 0x42, 0xf8, 0xfc, 0x2e, 0xb0, 0x23, 0xda, 0x26, 0x1c, 0xd2, 0x2b, 0x6e, 0xfa, 0xa6, + 0x67, 0x23, 0x84, 0xe7, 0x8d, 0x19, 0x90, 0x94, 0xd0, 0x5e, 0x81, 0x61, 0xf6, 0x2b, 0x1e, 0xda, + 0x19, 0x7a, 0xdb, 0xd0, 0xce, 0xc4, 0x48, 0xb3, 0xc3, 0xa3, 0xcf, 0xa8, 0x44, 0x2d, 0x7e, 0xf4, + 0xd1, 0xcb, 0x6d, 0x8f, 0x3e, 0x59, 0x14, 0xe9, 0xf4, 0x37, 0x84, 0xdd, 0x18, 0x1a, 0x25, 0xbc, + 0xb4, 0xe3, 0x4d, 0xe3, 0x67, 0xe5, 0x61, 0x84, 0xf3, 0xad, 0x19, 0xd1, 0x94, 0xf3, 0x48, 0xbd, + 0xd9, 0x02, 0xaf, 0xeb, 0xc3, 0x78, 0x75, 0x62, 0x7c, 0x1e, 0xd1, 0x89, 0x6d, 0xcf, 0x23, 0x7a, + 0x86, 0x92, 0xea, 0xf6, 0x80, 0xd1, 0xfd, 0xfe, 0x1a, 0x65, 0x21, 0x57, 0x4e, 0x02, 0xb1, 0xd2, + 0x33, 0x4e, 0x75, 0x93, 0x40, 0xb6, 0xa9, 0x6e, 0x32, 0x4f, 0xce, 0xe3, 0x57, 0x84, 0x9f, 0x89, + 0x4a, 0xaa, 0x4a, 0x8b, 0xfa, 0x9e, 0xdc, 0x8e, 0xb3, 0x4a, 0xe9, 0xa6, 0x55, 0x61, 0x96, 0x41, + 0x11, 0x33, 0xd8, 0x9c, 0x0d, 0x4c, 0xda, 0xff, 0x07, 0xe1, 0x17, 0xa3, 0xd9, 0x6a, 0xc7, 0x8e, + 0xe2, 0x6a, 0x48, 0x02, 0xcf, 0xd9, 0xb5, 0x5a, 0xbc, 0x49, 0x38, 0x31, 0xa1, 0x5b, 0x33, 0xa6, + 0x2a, 0x55, 0xe0, 0x0a, 0x84, 0x4d, 0x46, 0x1b, 0x9a, 0xfc, 0x58, 0x35, 0x4e, 0x6c, 0x19, 0x04, + 0xdb, 0x2a, 0x30, 0x07, 0x24, 0x2d, 0x7f, 0x89, 0xf0, 0xc3, 0x35, 0xe8, 0xf8, 0xb4, 0x49, 0x38, + 0xac, 0xf6, 0xa0, 0xcd, 0xc3, 0xbd, 0x4b, 0xce, 0x75, 0xe3, 0x2d, 0x4f, 0x28, 0x85, 0xc5, 0xd7, + 0x8b, 0x03, 0x12, 0xe9, 0x3b, 0xfe, 0xbd, 0x98, 0x43, 0xf4, 0x3d, 0x5f, 0xb1, 0xc5, 0x2b, 0x72, + 0xfb, 0xf4, 0xad, 0xa7, 0x28, 0x9d, 0xab, 0x7a, 0xbf, 0xdd, 0xac, 0xb7, 0x08, 0xf3, 0x86, 0xbf, + 0xec, 0x86, 0xc6, 0x9d, 0xab, 0x84, 0xce, 0xb6, 0x73, 0x95, 0x92, 0x4b, 0x53, 0x1f, 0x23, 0x7c, + 0xff, 0xf0, 0xb7, 0xa2, 0x52, 0x75, 0xe6, 0x2d, 0x90, 0x42, 0x24, 0xec, 0x5c, 0x2b, 0xa4, 0x55, + 0xbe, 0x0e, 0x22, 0x1a, 0x95, 0xc2, 0x6c, 0xd9, 0x32, 0x94, 0x75, 0x45, 0x59, 0x65, 0x2a, 0x86, + 0x72, 0xac, 0x10, 0x43, 0xe2, 0x1e, 0xea, 0x7a, 0x10, 0x72, 0xe3, 0x63, 0x85, 0x46, 0x6b, 0x7b, + 0xac, 0xd0, 0x22, 0xa4, 0xc1, 0x0f, 0x11, 0xc6, 0x15, 0x3f, 0x08, 0x61, 0xb4, 0xdf, 0xce, 0x15, + 0x43, 0xe8, 0x99, 0x44, 0xd8, 0xb9, 0x5a, 0x40, 0x29, 0x5d, 0xbc, 0x8f, 0xef, 0xad, 0x02, 0x8f, + 0x2c, 0xbc, 0x62, 0xde, 0x5e, 0x55, 0x0c, 0xbc, 0x6a, 0xad, 0x53, 0x16, 0x21, 0xaa, 0xae, 0x47, + 0xd5, 0xc5, 0x15, 0xab, 0x82, 0x7c, 0xbc, 0xa6, 0xb8, 0x5a, 0x40, 0xa9, 0xa4, 0xa6, 0x2a, 0x70, + 0x91, 0x18, 0x68, 0xd0, 0xde, 0x82, 0x30, 0x24, 0x07, 0x10, 0x1a, 0xa7, 0x26, 0xbd, 0xdc, 0x36, + 0x35, 0x65, 0x51, 0x94, 0x4f, 0x52, 0x15, 0xf8, 0xca, 0xe6, 0x8e, 0xce, 0x6c, 0xd5, 0xfc, 0x31, + 0x7a, 0x82, 0xed, 0x27, 0x29, 0x07, 0x24, 0x2d, 0x7f, 0x82, 0xf0, 0x03, 0x3b, 0x5d, 0x60, 0x7d, + 0x91, 0x6e, 0x1d, 0xd3, 0xec, 0xa3, 0xa8, 0x84, 0xb5, 0x85, 0x62, 0x62, 0xc5, 0x4e, 0x0d, 0x48, + 0xa7, 0xe3, 0xf7, 0xa3, 0x8f, 0x94, 0xb1, 0x1d, 0x45, 0x65, 0x6b, 0x27, 0x21, 0x96, 0x76, 0x3e, + 0x45, 0xf8, 0x5c, 0xb4, 0x8a, 0x72, 0x17, 0x17, 0xac, 0x16, 0x3f, 0xb9, 0x75, 0x8b, 0x05, 0xd5, + 0xea, 0x15, 0x49, 0x97, 0x1d, 0xc0, 0xb8, 0x27, 0xe3, 0x2b, 0x92, 0x84, 0xd0, 0xfa, 0x8a, 0x24, + 0xa5, 0x57, 0x7c, 0x6d, 0x41, 0x41, 0x5f, 0x49, 0xa1, 0xad, 0xaf, 0xb4, 0x3e, 0x71, 0x75, 0xb3, + 0xcf, 0x20, 0x6c, 0x8d, 0x57, 0xfa, 0xa1, 0xc5, 0xd5, 0x4d, 0x5a, 0x6c, 0x7f, 0x75, 0xa3, 0x63, + 0x48, 0x8f, 0x7f, 0x23, 0xfc, 0x7c, 0x15, 0xda, 0xc0, 0x08, 0x87, 0x4d, 0x12, 0xf2, 0xf8, 0x8b, + 0x34, 0xf6, 0xe2, 0x46, 0x96, 0x77, 0x8c, 0x83, 0x67, 0x22, 0x4b, 0xcc, 0xa0, 0x36, 0x4b, 0xa4, + 0xb2, 0xe8, 0x6a, 0xb2, 0x8c, 0xeb, 0xb4, 0xe5, 0x42, 0x99, 0x56, 0x2d, 0xd6, 0x2a, 0x53, 0x31, + 0x94, 0x0a, 0xa4, 0x06, 0x8d, 0x2e, 0xf5, 0x3d, 0xa5, 0x48, 0x5a, 0x32, 0xde, 0xd3, 0x94, 0xd6, + 0xb6, 0x02, 0xd1, 0x22, 0x94, 0xee, 0xcf, 0xc6, 0x10, 0xc3, 0x8b, 0x77, 0x7f, 0x32, 0xf4, 0xb6, + 0xdd, 0x9f, 0x4c, 0x8c, 0xd2, 0x53, 0x51, 0x7b, 0x44, 0x7b, 0x34, 0xa4, 0x0d, 0xea, 0x8f, 0x4a, + 0xd3, 0xe1, 0xd9, 0xcd, 0xb8, 0xa7, 0x92, 0x8f, 0xb1, 0xed, 0xa9, 0x4c, 0xa2, 0x29, 0xcb, 0x7d, + 0xab, 0xe3, 0x91, 0x69, 0x9a, 0x6d, 0x19, 0x7a, 0xdb, 0xe5, 0xce, 0xc4, 0x28, 0xd7, 0x09, 0xdb, + 0x81, 0x9f, 0x6e, 0x12, 0x45, 0x52, 0xe3, 0xeb, 0x84, 0x1c, 0x86, 0xed, 0x75, 0x42, 0x2e, 0x4a, + 0x1a, 0xff, 0x0b, 0xe1, 0xe7, 0xea, 0x9c, 0x01, 0x39, 0x3a, 0xfb, 0xf8, 0xa7, 0x2b, 0x25, 0xe3, + 0x8e, 0xf5, 0x24, 0x92, 0x98, 0xc4, 0xf6, 0xec, 0x80, 0x62, 0x2a, 0x2f, 0xa1, 0x97, 0xd1, 0x68, + 0x1f, 0xaa, 0x9a, 0x6e, 0x63, 0x9c, 0x22, 0x8d, 0xf7, 0x21, 0x87, 0x61, 0xbb, 0x0f, 0xb9, 0x28, + 0xb9, 0x0f, 0x7f, 0x22, 0x7c, 0x21, 0x77, 0x64, 0x0f, 0x58, 0x08, 0xce, 0xf6, 0x2c, 0x1e, 0x3a, + 0x42, 0x89, 0x69, 0xec, 0xcc, 0x90, 0xa8, 0xf4, 0x1a, 0x75, 0x82, 0x1a, 0xb9, 0x1d, 0x6b, 0xf6, + 0x2e, 0x19, 0xf7, 0x1a, 0x27, 0x81, 0x6c, 0x7b, 0x8d, 0x93, 0x79, 0xca, 0xa5, 0xec, 0x5a, 0xc0, + 0x9a, 0x90, 0xd5, 0xf5, 0x37, 0x0d, 0x82, 0x3c, 0x88, 0xed, 0xa5, 0x6c, 0x3e, 0x4b, 0x7a, 0xff, + 0x08, 0xe1, 0xfb, 0xa2, 0xaa, 0x35, 0x2a, 0x56, 0xae, 0x5a, 0x55, 0xba, 0x4a, 0x51, 0x32, 0x5f, + 0x44, 0xaa, 0xd4, 0xec, 0x91, 0x5d, 0xe9, 0x65, 0xc1, 0xea, 0x63, 0x91, 0xb4, 0xb3, 0x58, 0x50, + 0x3d, 0x7e, 0x8a, 0x5f, 0xf2, 0xbc, 0xc8, 0x8a, 0xe9, 0x29, 0x5e, 0x08, 0x6c, 0x4f, 0xf1, 0x67, + 0x3a, 0xf1, 0xf8, 0xe5, 0xce, 0xf1, 0x89, 0x5b, 0xba, 0x73, 0xe2, 0x96, 0xee, 0x9e, 0xb8, 0xe8, + 0x83, 0x81, 0x8b, 0xbe, 0x1b, 0xb8, 0xe8, 0x8f, 0x81, 0x8b, 0x8e, 0x07, 0x2e, 0xfa, 0x77, 0xe0, + 0xa2, 0xff, 0x06, 0x6e, 0xe9, 0xee, 0xc0, 0x45, 0x9f, 0x9d, 0xba, 0xa5, 0xe3, 0x53, 0xb7, 0x74, + 0xe7, 0xd4, 0x2d, 0xbd, 0x3d, 0x7f, 0x10, 0x9c, 0x3d, 0x92, 0x06, 0xb9, 0x7f, 0x21, 0x77, 0x4d, + 0xfd, 0x49, 0xe3, 0x9e, 0xd1, 0x1f, 0xc8, 0x5d, 0xfe, 0x3f, 0x00, 0x00, 0xff, 0xff, 0xec, 0x42, + 0x45, 0x83, 0xbc, 0x27, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -343,6 +344,15 @@ type HistoryServiceClient interface { ForceDeleteWorkflowExecution(ctx context.Context, in *ForceDeleteWorkflowExecutionRequest, opts ...grpc.CallOption) (*ForceDeleteWorkflowExecutionResponse, error) GetDLQTasks(ctx context.Context, in *GetDLQTasksRequest, opts ...grpc.CallOption) (*GetDLQTasksResponse, error) DeleteDLQTasks(ctx context.Context, in *DeleteDLQTasksRequest, opts ...grpc.CallOption) (*DeleteDLQTasksResponse, error) + // The AddTasks API is used to add history tasks to a shard. The first use-case for this API is the DLQ. When we are + // unable to process history tasks, we add them to a DLQ. When they need to be retried, we take them out of the DLQ + // and add them back using this API. We expose this via an API instead of doing this in the history engine because + // replication tasks, which are DLQ'd on the target cluster need to be added back to the queue on the source + // cluster, so there is already a network boundary. There is a maximum of 1000 tasks per request. There must be at + // least one task per request. If any task in the list does not have the same shard ID as the request, the request + // will fail with an InvalidArgument error. It is ok to have tasks for different workflow runs as long as they are + // in the same shard. Calls to the persistence API will be batched by workflow run. + AddTasks(ctx context.Context, in *AddTasksRequest, opts ...grpc.CallOption) (*AddTasksResponse, error) } type historyServiceClient struct { @@ -888,6 +898,15 @@ func (c *historyServiceClient) DeleteDLQTasks(ctx context.Context, in *DeleteDLQ return out, nil } +func (c *historyServiceClient) AddTasks(ctx context.Context, in *AddTasksRequest, opts ...grpc.CallOption) (*AddTasksResponse, error) { + out := new(AddTasksResponse) + err := c.cc.Invoke(ctx, "/temporal.server.api.historyservice.v1.HistoryService/AddTasks", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // HistoryServiceServer is the server API for HistoryService service. type HistoryServiceServer interface { // StartWorkflowExecution starts a new long running workflow instance. It will create the instance with @@ -1071,6 +1090,15 @@ type HistoryServiceServer interface { ForceDeleteWorkflowExecution(context.Context, *ForceDeleteWorkflowExecutionRequest) (*ForceDeleteWorkflowExecutionResponse, error) GetDLQTasks(context.Context, *GetDLQTasksRequest) (*GetDLQTasksResponse, error) DeleteDLQTasks(context.Context, *DeleteDLQTasksRequest) (*DeleteDLQTasksResponse, error) + // The AddTasks API is used to add history tasks to a shard. The first use-case for this API is the DLQ. When we are + // unable to process history tasks, we add them to a DLQ. When they need to be retried, we take them out of the DLQ + // and add them back using this API. We expose this via an API instead of doing this in the history engine because + // replication tasks, which are DLQ'd on the target cluster need to be added back to the queue on the source + // cluster, so there is already a network boundary. There is a maximum of 1000 tasks per request. There must be at + // least one task per request. If any task in the list does not have the same shard ID as the request, the request + // will fail with an InvalidArgument error. It is ok to have tasks for different workflow runs as long as they are + // in the same shard. Calls to the persistence API will be batched by workflow run. + AddTasks(context.Context, *AddTasksRequest) (*AddTasksResponse, error) } // UnimplementedHistoryServiceServer can be embedded to have forward compatible implementations. @@ -1248,6 +1276,9 @@ func (*UnimplementedHistoryServiceServer) GetDLQTasks(ctx context.Context, req * func (*UnimplementedHistoryServiceServer) DeleteDLQTasks(ctx context.Context, req *DeleteDLQTasksRequest) (*DeleteDLQTasksResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteDLQTasks not implemented") } +func (*UnimplementedHistoryServiceServer) AddTasks(ctx context.Context, req *AddTasksRequest) (*AddTasksResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method AddTasks not implemented") +} func RegisterHistoryServiceServer(s *grpc.Server, srv HistoryServiceServer) { s.RegisterService(&_HistoryService_serviceDesc, srv) @@ -2287,6 +2318,24 @@ func _HistoryService_DeleteDLQTasks_Handler(srv interface{}, ctx context.Context return interceptor(ctx, in, info, handler) } +func _HistoryService_AddTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AddTasksRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(HistoryServiceServer).AddTasks(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/temporal.server.api.historyservice.v1.HistoryService/AddTasks", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(HistoryServiceServer).AddTasks(ctx, req.(*AddTasksRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _HistoryService_serviceDesc = grpc.ServiceDesc{ ServiceName: "temporal.server.api.historyservice.v1.HistoryService", HandlerType: (*HistoryServiceServer)(nil), @@ -2515,6 +2564,10 @@ var _HistoryService_serviceDesc = grpc.ServiceDesc{ MethodName: "DeleteDLQTasks", Handler: _HistoryService_DeleteDLQTasks_Handler, }, + { + MethodName: "AddTasks", + Handler: _HistoryService_AddTasks_Handler, + }, }, Streams: []grpc.StreamDesc{ { diff --git a/api/historyservicemock/v1/service.pb.mock.go b/api/historyservicemock/v1/service.pb.mock.go index 69c4277654c..f708d3b58b8 100644 --- a/api/historyservicemock/v1/service.pb.mock.go +++ b/api/historyservicemock/v1/service.pb.mock.go @@ -61,6 +61,26 @@ func (m *MockHistoryServiceClient) EXPECT() *MockHistoryServiceClientMockRecorde return m.recorder } +// AddTasks mocks base method. +func (m *MockHistoryServiceClient) AddTasks(ctx context.Context, in *historyservice.AddTasksRequest, opts ...grpc.CallOption) (*historyservice.AddTasksResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "AddTasks", varargs...) + ret0, _ := ret[0].(*historyservice.AddTasksResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AddTasks indicates an expected call of AddTasks. +func (mr *MockHistoryServiceClientMockRecorder) AddTasks(ctx, in interface{}, opts ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddTasks", reflect.TypeOf((*MockHistoryServiceClient)(nil).AddTasks), varargs...) +} + // CloseShard mocks base method. func (m *MockHistoryServiceClient) CloseShard(ctx context.Context, in *historyservice.CloseShardRequest, opts ...grpc.CallOption) (*historyservice.CloseShardResponse, error) { m.ctrl.T.Helper() @@ -1361,6 +1381,21 @@ func (m *MockHistoryServiceServer) EXPECT() *MockHistoryServiceServerMockRecorde return m.recorder } +// AddTasks mocks base method. +func (m *MockHistoryServiceServer) AddTasks(arg0 context.Context, arg1 *historyservice.AddTasksRequest) (*historyservice.AddTasksResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AddTasks", arg0, arg1) + ret0, _ := ret[0].(*historyservice.AddTasksResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AddTasks indicates an expected call of AddTasks. +func (mr *MockHistoryServiceServerMockRecorder) AddTasks(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddTasks", reflect.TypeOf((*MockHistoryServiceServer)(nil).AddTasks), arg0, arg1) +} + // CloseShard mocks base method. func (m *MockHistoryServiceServer) CloseShard(arg0 context.Context, arg1 *historyservice.CloseShardRequest) (*historyservice.CloseShardResponse, error) { m.ctrl.T.Helper() diff --git a/client/history/client_gen.go b/client/history/client_gen.go index 8f545556b0e..65e74ca59d4 100644 --- a/client/history/client_gen.go +++ b/client/history/client_gen.go @@ -34,6 +34,26 @@ import ( "google.golang.org/grpc" ) +func (c *clientImpl) AddTasks( + ctx context.Context, + request *historyservice.AddTasksRequest, + opts ...grpc.CallOption, +) (*historyservice.AddTasksResponse, error) { + shardID := request.GetShardId() + var response *historyservice.AddTasksResponse + op := func(ctx context.Context, client historyservice.HistoryServiceClient) error { + var err error + ctx, cancel := c.createContext(ctx) + defer cancel() + response, err = client.AddTasks(ctx, request, opts...) + return err + } + if err := c.executeWithRedirect(ctx, shardID, op); err != nil { + return nil, err + } + return response, nil +} + func (c *clientImpl) CloseShard( ctx context.Context, request *historyservice.CloseShardRequest, diff --git a/client/history/metric_client_gen.go b/client/history/metric_client_gen.go index 57ca6eb0c37..8aedb5f48d2 100644 --- a/client/history/metric_client_gen.go +++ b/client/history/metric_client_gen.go @@ -33,6 +33,20 @@ import ( "google.golang.org/grpc" ) +func (c *metricClient) AddTasks( + ctx context.Context, + request *historyservice.AddTasksRequest, + opts ...grpc.CallOption, +) (_ *historyservice.AddTasksResponse, retError error) { + + metricsHandler, startTime := c.startMetricsRecording(ctx, "HistoryClientAddTasks") + defer func() { + c.finishMetricsRecording(metricsHandler, startTime, retError) + }() + + return c.client.AddTasks(ctx, request, opts...) +} + func (c *metricClient) CloseShard( ctx context.Context, request *historyservice.CloseShardRequest, diff --git a/client/history/retryable_client_gen.go b/client/history/retryable_client_gen.go index f7f94a841d4..6314d8be474 100644 --- a/client/history/retryable_client_gen.go +++ b/client/history/retryable_client_gen.go @@ -35,6 +35,21 @@ import ( "go.temporal.io/server/common/backoff" ) +func (c *retryableClient) AddTasks( + ctx context.Context, + request *historyservice.AddTasksRequest, + opts ...grpc.CallOption, +) (*historyservice.AddTasksResponse, error) { + var resp *historyservice.AddTasksResponse + op := func(ctx context.Context) error { + var err error + resp, err = c.client.AddTasks(ctx, request, opts...) + return err + } + err := backoff.ThrottleRetryContext(ctx, op, c.policy, c.isRetryable) + return resp, err +} + func (c *retryableClient) CloseShard( ctx context.Context, request *historyservice.CloseShardRequest, diff --git a/common/rpc/interceptor/namespace_test.go b/common/rpc/interceptor/namespace_test.go index a1b2af36b6d..8613000c2fc 100644 --- a/common/rpc/interceptor/namespace_test.go +++ b/common/rpc/interceptor/namespace_test.go @@ -72,6 +72,7 @@ var ( "GetReplicationStatus": {}, "GetDLQTasks": {}, "DeleteDLQTasks": {}, + "AddTasks": {}, } ) diff --git a/proto/internal/temporal/server/api/historyservice/v1/request_response.proto b/proto/internal/temporal/server/api/historyservice/v1/request_response.proto index c4e3aab3311..f5968c45f62 100644 --- a/proto/internal/temporal/server/api/historyservice/v1/request_response.proto +++ b/proto/internal/temporal/server/api/historyservice/v1/request_response.proto @@ -794,3 +794,22 @@ message DeleteDLQTasksRequest { } message DeleteDLQTasksResponse {} + +message AddTasksRequest { + // Even though we can obtain the shard ID from the tasks, we still need the shard_id in the request for routing. If + // not, it would be possible to include tasks for shards that belong to different hosts, and we'd need to fan-out the + // request, which would be more complicated. + int32 shard_id = 1; + + message Task { + // category is needed to deserialize the tasks. Examples include "transfer", "timer", etc. See the history/tasks + // package for a definitive list. Warning: this is not the same as the stringified value of a TaskCategory enum. + string category = 1; + // blob is the serialized task. + temporal.api.common.v1.DataBlob blob = 2; + } + + repeated Task tasks = 2; +} + +message AddTasksResponse {} diff --git a/proto/internal/temporal/server/api/historyservice/v1/service.proto b/proto/internal/temporal/server/api/historyservice/v1/service.proto index de988a35900..dd84288e22d 100644 --- a/proto/internal/temporal/server/api/historyservice/v1/service.proto +++ b/proto/internal/temporal/server/api/historyservice/v1/service.proto @@ -323,4 +323,14 @@ service HistoryService { rpc DeleteDLQTasks (DeleteDLQTasksRequest) returns (DeleteDLQTasksResponse) { } + // The AddTasks API is used to add history tasks to a shard. The first use-case for this API is the DLQ. When we are + // unable to process history tasks, we add them to a DLQ. When they need to be retried, we take them out of the DLQ + // and add them back using this API. We expose this via an API instead of doing this in the history engine because + // replication tasks, which are DLQ'd on the target cluster need to be added back to the queue on the source + // cluster, so there is already a network boundary. There is a maximum of 1000 tasks per request. There must be at + // least one task per request. If any task in the list does not have the same shard ID as the request, the request + // will fail with an InvalidArgument error. It is ok to have tasks for different workflow runs as long as they are + // in the same shard. Calls to the persistence API will be batched by workflow run. + rpc AddTasks (AddTasksRequest) returns (AddTasksResponse) { + } } diff --git a/service/history/api/addtasks/api.go b/service/history/api/addtasks/api.go new file mode 100644 index 00000000000..e8a91cc556b --- /dev/null +++ b/service/history/api/addtasks/api.go @@ -0,0 +1,152 @@ +// The MIT License +// +// Copyright (c) 2020 Temporal Technologies Inc. All rights reserved. +// +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package addtasks + +import ( + "context" + "fmt" + + commonpb "go.temporal.io/api/common/v1" + "go.temporal.io/api/serviceerror" + + "go.temporal.io/server/api/historyservice/v1" + "go.temporal.io/server/common/definition" + "go.temporal.io/server/common/persistence" + "go.temporal.io/server/service/history/shard" + "go.temporal.io/server/service/history/tasks" +) + +type ( + // TaskDeserializer is a trimmed version of [go.temporal.io/server/common/persistence/serialization.Serializer] that + // requires only the DeserializeTask method. + TaskDeserializer interface { + DeserializeTask(category tasks.Category, blob commonpb.DataBlob) (tasks.Task, error) + } +) + +const ( + // maxTasksPerRequest is the maximum number of tasks that can be added in a single AddTasks API call. We set this to + // prevent the history service from OOMing when a client sends a request with a large number of tasks because we + // will deserialize all tasks in memory before adding them to the queue. + maxTasksPerRequest = 1000 +) + +// Invoke is the implementation of the history service's AddTasks API. This exposes the [shard.Context.AddTasks] API via +// the history service. This method works by batching tasks by workflow run, and then invoking the relevant shard's +// AddTasks API for each task batch. See [historyservice.HistoryServiceClient.AddTasks] for more details. We don't do +// any validation on the shard ID because that must have been done by whoever provided the shard.Context to this method. +func Invoke( + ctx context.Context, + shardContext shard.Context, + deserializer TaskDeserializer, + numShards int, + req *historyservice.AddTasksRequest, +) (*historyservice.AddTasksResponse, error) { + if len(req.Tasks) > maxTasksPerRequest { + return nil, serviceerror.NewInvalidArgument(fmt.Sprintf( + "Too many tasks in request: %d > %d", + len(req.Tasks), + maxTasksPerRequest, + )) + } + + if len(req.Tasks) == 0 { + return nil, serviceerror.NewInvalidArgument("No tasks in request") + } + + taskBatches := make(map[definition.WorkflowKey]map[tasks.Category][]tasks.Task) + + for i, task := range req.Tasks { + if task == nil { + return nil, serviceerror.NewInvalidArgument(fmt.Sprintf("Nil task at index: %d", i)) + } + + category, ok := getCategoryByName(task.Category) + if !ok { + return nil, serviceerror.NewInvalidArgument(fmt.Sprintf( + "Invalid task category: %s", + task.Category, + )) + } + + if task.Blob == nil { + return nil, serviceerror.NewInvalidArgument(fmt.Sprintf( + "Task blob is nil at index: %d", + i, + )) + } + + deserializedTask, err := deserializer.DeserializeTask(category, *task.Blob) + if err != nil { + return nil, err + } + + shardID := tasks.GetShardIDForTask(deserializedTask, numShards) + if shardID != int(req.ShardId) { + return nil, serviceerror.NewInvalidArgument(fmt.Sprintf( + "Task is for wrong shard: index = %d, task shard = %d, request shard = %d", + i, shardID, req.ShardId, + )) + } + + workflowKey := definition.NewWorkflowKey( + deserializedTask.GetNamespaceID(), + deserializedTask.GetWorkflowID(), + deserializedTask.GetRunID(), + ) + if _, ok := taskBatches[workflowKey]; !ok { + taskBatches[workflowKey] = make(map[tasks.Category][]tasks.Task, 1) + } + + taskBatches[workflowKey][category] = append(taskBatches[workflowKey][category], deserializedTask) + } + + for workflowKey, taskBatch := range taskBatches { + err := shardContext.AddTasks(ctx, &persistence.AddHistoryTasksRequest{ + ShardID: shardContext.GetShardID(), + RangeID: shardContext.GetRangeID(), + NamespaceID: workflowKey.NamespaceID, + WorkflowID: workflowKey.WorkflowID, + RunID: workflowKey.RunID, + Tasks: taskBatch, + }) + if err != nil { + return nil, err + } + } + + return &historyservice.AddTasksResponse{}, nil +} + +func getCategoryByName(categoryName string) (tasks.Category, bool) { + categories := tasks.GetCategories() + for _, category := range categories { + if category.Name() == categoryName { + return category, true + } + } + + return tasks.Category{}, false +} diff --git a/service/history/api/addtasks/api_test.go b/service/history/api/addtasks/api_test.go new file mode 100644 index 00000000000..ef1ca2379a2 --- /dev/null +++ b/service/history/api/addtasks/api_test.go @@ -0,0 +1,288 @@ +// The MIT License +// +// Copyright (c) 2020 Temporal Technologies Inc. All rights reserved. +// +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package addtasks_test + +import ( + "context" + "strconv" + "testing" + + "github.com/golang/mock/gomock" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + commonpb "go.temporal.io/api/common/v1" + "go.temporal.io/api/serviceerror" + + "go.temporal.io/server/api/historyservice/v1" + "go.temporal.io/server/common/definition" + "go.temporal.io/server/common/persistence" + "go.temporal.io/server/common/persistence/serialization" + "go.temporal.io/server/service/history/api/addtasks" + "go.temporal.io/server/service/history/shard" + "go.temporal.io/server/service/history/tasks" + "go.temporal.io/server/service/history/tests" +) + +type ( + // testParams contains the arguments for invoking addtasks.Invoke. + testParams struct { + shardContext shard.Context + deserializer addtasks.TaskDeserializer + numShards int + req *historyservice.AddTasksRequest + // expectation is invoked with the result of addtasks.Invoke. + expectation func(*historyservice.AddTasksResponse, error) + } + testCase struct { + name string + // configure is invoked with the result of getDefaultTestParams. The default params are set up to invoke the + // API successfully, so configure can be used to change the params to test different failure modes. + configure func(t *testing.T, params *testParams) + } + // faultyDeserializer is a TaskDeserializer that always returns an error. + faultyDeserializer struct { + err error + } +) + +func (d faultyDeserializer) DeserializeTask( + tasks.Category, + commonpb.DataBlob, +) (tasks.Task, error) { + return nil, d.err +} + +func TestInvoke(t *testing.T) { + for _, tc := range []testCase{ + { + name: "happy path", + configure: func(t *testing.T, params *testParams) { + params.shardContext.(*shard.MockContext).EXPECT().AddTasks( + gomock.Any(), + gomock.Any(), + ).Return(nil) + params.expectation = func( + resp *historyservice.AddTasksResponse, + err error, + ) { + require.NoError(t, err) + assert.NotNil(t, resp) + } + }, + }, + { + name: "tasks for multiple workflows", + configure: func(t *testing.T, params *testParams) { + numWorkflows := 2 + requests := make([]*persistence.AddHistoryTasksRequest, 0, numWorkflows) + params.shardContext.(*shard.MockContext).EXPECT().AddTasks( + gomock.Any(), + gomock.Any(), + ).DoAndReturn(func(_ context.Context, req *persistence.AddHistoryTasksRequest) error { + requests = append(requests, req) + return nil + }).Times(2) + params.req.Tasks = nil + for i := 0; i < numWorkflows; i++ { + workflowKey := definition.NewWorkflowKey( + string(tests.NamespaceID), + tests.WorkflowID, + strconv.Itoa(i), + ) + // each workflow has two transfer tasks and one timer task + for _, task := range []tasks.Task{ + &tasks.WorkflowTask{ + WorkflowKey: workflowKey, + }, + &tasks.WorkflowTask{ + WorkflowKey: workflowKey, + }, + &tasks.UserTimerTask{ + WorkflowKey: workflowKey, + }, + } { + serializer := serialization.NewTaskSerializer() + blob, err := serializer.SerializeTask(task) + require.NoError(t, err) + params.req.Tasks = append(params.req.Tasks, &historyservice.AddTasksRequest_Task{ + Category: task.GetCategory().Name(), + Blob: &blob, + }) + } + } + params.expectation = func(resp *historyservice.AddTasksResponse, err error) { + require.NoError(t, err) + assert.NotNil(t, resp) + require.Len(t, requests, numWorkflows, "We should send one request for each workflow") + runIDs := make([]string, numWorkflows) + for i, request := range requests { + runIDs[i] = request.RunID + assert.Len(t, request.Tasks[tasks.CategoryTransfer], 2, + "There were two transfer tasks for each workflow") + assert.Len(t, request.Tasks[tasks.CategoryTimer], 1, + "There was one timer task for each workflow") + } + // The requests could go in any order because we do map iteration, so compare the elements while + // ignoring their order. + assert.ElementsMatch(t, []string{"0", "1"}, runIDs, + "The requests should be for the expected run IDs") + } + }, + }, + { + name: "too many tasks", + configure: func(t *testing.T, params *testParams) { + params.req.Tasks = make([]*historyservice.AddTasksRequest_Task, 1001) + params.expectation = func(resp *historyservice.AddTasksResponse, err error) { + require.ErrorAs(t, err, new(*serviceerror.InvalidArgument)) + assert.ErrorContains(t, err, "Too many tasks") + assert.ErrorContains(t, err, "1001") + } + }, + }, + { + name: "no tasks", + configure: func(t *testing.T, params *testParams) { + params.req.Tasks = make([]*historyservice.AddTasksRequest_Task, 0) + params.expectation = func(resp *historyservice.AddTasksResponse, err error) { + require.ErrorAs(t, err, new(*serviceerror.InvalidArgument)) + assert.ErrorContains(t, err, "No tasks") + } + }, + }, + { + name: "nil task", + configure: func(t *testing.T, params *testParams) { + params.req.Tasks[0] = nil + params.expectation = func(resp *historyservice.AddTasksResponse, err error) { + require.ErrorAs(t, err, new(*serviceerror.InvalidArgument)) + assert.ErrorContains(t, err, "Nil task") + } + }, + }, + { + name: "invalid task category", + configure: func(t *testing.T, params *testParams) { + params.req.Tasks[0].Category = "my-invalid-task-category" + params.expectation = func(resp *historyservice.AddTasksResponse, err error) { + require.ErrorAs(t, err, new(*serviceerror.InvalidArgument)) + assert.ErrorContains(t, err, "Invalid task category") + assert.ErrorContains(t, err, "my-invalid-task-category") + } + }, + }, + { + name: "nil task blob", + configure: func(t *testing.T, params *testParams) { + params.req.Tasks[0].Blob = nil + params.expectation = func(resp *historyservice.AddTasksResponse, err error) { + require.ErrorAs(t, err, new(*serviceerror.InvalidArgument)) + assert.ErrorContains(t, err, "Task blob is nil") + } + }, + }, + { + name: "deserializer error", + configure: func(t *testing.T, params *testParams) { + params.deserializer = faultyDeserializer{ + err: assert.AnError, + } + params.expectation = func(resp *historyservice.AddTasksResponse, err error) { + assert.ErrorIs(t, err, assert.AnError) + } + }, + }, + { + name: "wrong shard", + configure: func(t *testing.T, params *testParams) { + params.req.ShardId = 1 + params.numShards = 2 + params.expectation = func(resp *historyservice.AddTasksResponse, err error) { + require.ErrorAs(t, err, new(*serviceerror.InvalidArgument)) + assert.ErrorContains(t, err, "Task is for wrong shard") + assert.ErrorContains(t, err, "task shard = 2") + assert.ErrorContains(t, err, "request shard = 1") + } + }, + }, + { + name: "add tasks error", + configure: func(t *testing.T, params *testParams) { + params.shardContext.(*shard.MockContext).EXPECT().AddTasks( + gomock.Any(), + gomock.Any(), + ).Return(assert.AnError) + params.expectation = func(resp *historyservice.AddTasksResponse, err error) { + assert.ErrorIs(t, err, assert.AnError) + } + }, + }, + } { + tc := tc + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + params := getDefaultTestParams(t) + tc.configure(t, params) + resp, err := addtasks.Invoke( + context.Background(), + params.shardContext, + params.deserializer, + params.numShards, + params.req, + ) + params.expectation(resp, err) + }) + } +} + +func getDefaultTestParams(t *testing.T) *testParams { + task := &tasks.WorkflowTask{ + WorkflowKey: definition.NewWorkflowKey(string(tests.NamespaceID), tests.WorkflowID, tests.RunID), + } + serializer := serialization.NewTaskSerializer() + blob, err := serializer.SerializeTask(task) + require.NoError(t, err) + ctrl := gomock.NewController(t) + shardContext := shard.NewMockContext(ctrl) + shardContext.EXPECT().GetShardID().Return(int32(1)).AnyTimes() + shardContext.EXPECT().GetRangeID().Return(int64(1)).AnyTimes() + params := &testParams{ + shardContext: shardContext, + numShards: 1, + deserializer: serializer, + req: &historyservice.AddTasksRequest{ + ShardId: 1, + Tasks: []*historyservice.AddTasksRequest_Task{ + { + Category: tasks.CategoryTransfer.Name(), + Blob: &blob, + }, + }, + }, + expectation: func(response *historyservice.AddTasksResponse, err error) {}, + } + + return params +} diff --git a/service/history/configs/quotas.go b/service/history/configs/quotas.go index 47c49fe8b35..e3ef845e027 100644 --- a/service/history/configs/quotas.go +++ b/service/history/configs/quotas.go @@ -94,6 +94,7 @@ var ( "ForceDeleteWorkflowExecution": 1, "GetDLQTasks": 1, "DeleteDLQTasks": 1, + "AddTasks": 1, } APIPrioritiesOrdered = []int{OperatorPriority, 1} diff --git a/service/history/handler.go b/service/history/handler.go index 9e30beb4fdd..3668c19df83 100644 --- a/service/history/handler.go +++ b/service/history/handler.go @@ -2166,6 +2166,22 @@ func (h *Handler) DeleteDLQTasks( return deletedlqtasks.Invoke(ctx, h.taskQueueManager, request) } +// AddTasks calls the [addtasks.Invoke] API with a [shard.Context] for the given shardID. +func (h *Handler) AddTasks( + ctx context.Context, + request *historyservice.AddTasksRequest, +) (*historyservice.AddTasksResponse, error) { + shardContext, err := h.controller.GetShardByID(request.ShardId) + if err != nil { + return nil, h.convertError(err) + } + engine, err := shardContext.GetEngine(ctx) + if err != nil { + return nil, h.convertError(err) + } + return engine.AddTasks(ctx, request) +} + // convertError is a helper method to convert ShardOwnershipLostError from persistence layer returned by various // HistoryEngine API calls to ShardOwnershipLost error return by HistoryService for client to be redirected to the // correct shard. diff --git a/service/history/history_engine.go b/service/history/history_engine.go index 71013071c01..d5ff00a1ff2 100644 --- a/service/history/history_engine.go +++ b/service/history/history_engine.go @@ -35,6 +35,7 @@ import ( historyspb "go.temporal.io/server/api/history/v1" workflowpb "go.temporal.io/server/api/workflow/v1" + "go.temporal.io/server/service/history/api/addtasks" "go.temporal.io/server/api/historyservice/v1" "go.temporal.io/server/api/matchingservice/v1" @@ -889,3 +890,10 @@ func (e *historyEngineImpl) GetWorkflowExecutionRawHistoryV2( ) (_ *historyservice.GetWorkflowExecutionRawHistoryV2Response, retError error) { return getworkflowexecutionrawhistoryv2.Invoke(ctx, e.shardContext, e.workflowConsistencyChecker, e.eventNotifier, request) } + +func (e *historyEngineImpl) AddTasks( + ctx context.Context, + request *historyservice.AddTasksRequest, +) (_ *historyservice.AddTasksResponse, retError error) { + return addtasks.Invoke(ctx, e.shardContext, e.eventSerializer, int(e.config.NumberOfShards), request) +} diff --git a/service/history/shard/engine.go b/service/history/shard/engine.go index 5b2ef3c1793..6cf16478977 100644 --- a/service/history/shard/engine.go +++ b/service/history/shard/engine.go @@ -105,6 +105,7 @@ type ( GetWorkflowExecutionHistory(ctx context.Context, request *historyservice.GetWorkflowExecutionHistoryRequest) (*historyservice.GetWorkflowExecutionHistoryResponse, error) GetWorkflowExecutionHistoryReverse(ctx context.Context, request *historyservice.GetWorkflowExecutionHistoryReverseRequest) (*historyservice.GetWorkflowExecutionHistoryReverseResponse, error) GetWorkflowExecutionRawHistoryV2(ctx context.Context, request *historyservice.GetWorkflowExecutionRawHistoryV2Request) (*historyservice.GetWorkflowExecutionRawHistoryV2Response, error) + AddTasks(ctx context.Context, request *historyservice.AddTasksRequest) (*historyservice.AddTasksResponse, error) NotifyNewHistoryEvent(event *events.Notification) NotifyNewTasks(tasks map[tasks.Category][]tasks.Task) diff --git a/service/history/shard/engine_mock.go b/service/history/shard/engine_mock.go index e1db113cb45..71170df3140 100644 --- a/service/history/shard/engine_mock.go +++ b/service/history/shard/engine_mock.go @@ -82,6 +82,21 @@ func (mr *MockEngineMockRecorder) AddSpeculativeWorkflowTaskTimeoutTask(task int return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddSpeculativeWorkflowTaskTimeoutTask", reflect.TypeOf((*MockEngine)(nil).AddSpeculativeWorkflowTaskTimeoutTask), task) } +// AddTasks mocks base method. +func (m *MockEngine) AddTasks(ctx context.Context, request *historyservice.AddTasksRequest) (*historyservice.AddTasksResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AddTasks", ctx, request) + ret0, _ := ret[0].(*historyservice.AddTasksResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AddTasks indicates an expected call of AddTasks. +func (mr *MockEngineMockRecorder) AddTasks(ctx, request interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddTasks", reflect.TypeOf((*MockEngine)(nil).AddTasks), ctx, request) +} + // ConvertReplicationTask mocks base method. func (m *MockEngine) ConvertReplicationTask(ctx context.Context, task tasks.Task) (*repication.ReplicationTask, error) { m.ctrl.T.Helper() diff --git a/tests/add_tasks_test.go b/tests/add_tasks_test.go new file mode 100644 index 00000000000..97beec9b0ce --- /dev/null +++ b/tests/add_tasks_test.go @@ -0,0 +1,276 @@ +// The MIT License +// +// Copyright (c) 2020 Temporal Technologies Inc. All rights reserved. +// +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tests + +import ( + "context" + "errors" + "strings" + "testing" + "time" + + "github.com/pborman/uuid" + "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" + sdkclient "go.temporal.io/sdk/client" + "go.temporal.io/sdk/worker" + "go.temporal.io/sdk/workflow" + "go.uber.org/fx" + + enumspb "go.temporal.io/server/api/enums/v1" + "go.temporal.io/server/api/historyservice/v1" + "go.temporal.io/server/common/debug" + "go.temporal.io/server/common/persistence/serialization" + "go.temporal.io/server/common/primitives" + "go.temporal.io/server/service/history/queues" + "go.temporal.io/server/service/history/shard" + "go.temporal.io/server/service/history/tasks" +) + +// This file tests the HistoryService's AddTasks API. It does this by starting a workflow, skipping its workflow task, +// and then adding the workflow task back to the queue via the AddTasks API. This should cause the workflow to be +// retried. + +type ( + // addTasksSuite is a separate suite because we need to override the history service's executable wrapper. + addTasksSuite struct { + FunctionalTestBase + *require.Assertions + shardController *faultyShardController + worker worker.Worker + sdkClient sdkclient.Client + skippedTasks chan tasks.Task + shouldSkip bool + getEngineErr error + workflowID string + } + faultyShardController struct { + shard.Controller + s *addTasksSuite + } + faultyShardContext struct { + shard.Context + s *addTasksSuite + } + // executableWrapper is used to wrap any [queues.Executable] that the history service makes so that we can intercept + // workflow tasks. + executableWrapper struct { + w queues.ExecutableWrapper + s *addTasksSuite + } + // noopExecutable skips any workflow task which meets the criteria specified in shouldExecute and records them to + // the tasks channel. + noopExecutable struct { + queues.Executable + s *addTasksSuite + } +) + +func (c *faultyShardController) GetShardByID(shardID int32) (shard.Context, error) { + ctx, err := c.Controller.GetShardByID(shardID) + if err != nil { + return nil, err + } + return &faultyShardContext{Context: ctx, s: c.s}, nil +} + +func (c *faultyShardContext) GetEngine(ctx context.Context) (shard.Engine, error) { + if c.s.getEngineErr != nil { + return nil, c.s.getEngineErr + } + return c.Context.GetEngine(ctx) +} + +// Wrap a [queues.Executable] with the noopExecutable. +func (w *executableWrapper) Wrap(e queues.Executable) queues.Executable { + e = w.w.Wrap(e) + return &noopExecutable{Executable: e, s: w.s} +} + +// Execute will skip any workflow task initiated by this test suite, so that we can add it back to the queue to see if +// that workflow task is retried. +func (e *noopExecutable) Execute() error { + task := e.GetTask() + if e.shouldExecute(task) { + return e.Executable.Execute() + } + // If we don't execute the task, just record it. + e.s.skippedTasks <- task + return nil +} + +// shouldExecute returns true if the task is not a workflow task, or if the workflow task is not from this test suite +// (e.g. from the history scanner), or if we've turned off skipping (which we do when we re-add the task). +func (e *noopExecutable) shouldExecute(task tasks.Task) bool { + return task.GetWorkflowID() != e.s.workflowID || + task.GetType() != enumspb.TASK_TYPE_TRANSFER_WORKFLOW_TASK || + !e.s.shouldSkip +} + +// SetupSuite creates the test cluster and registers the executableWrapper with the history service. +func (s *addTasksSuite) SetupSuite() { + // We do this here and in SetupTest because we need assertions in the SetupSuite method as well as the individual + // tests, but this is called before SetupTest, and the s.T() value will change when SetupTest is called. + s.Assertions = require.New(s.T()) + // Set up the test cluster and register our executable wrapper. + s.setupSuite("testdata/cluster.yaml", + WithFxOptionsForService( + primitives.HistoryService, + fx.Decorate( + func(w queues.ExecutableWrapper) queues.ExecutableWrapper { + return &executableWrapper{w: w, s: s} + }, + func(c shard.Controller) shard.Controller { + s.shardController = &faultyShardController{Controller: c, s: s} + return s.shardController + }, + ), + ), + ) + // Get an SDK client so that we can call ExecuteWorkflow. + s.sdkClient = s.newSDKClient() +} + +func (s *addTasksSuite) TearDownSuite() { + s.sdkClient.Close() + s.tearDownSuite() +} + +func (s *addTasksSuite) SetupTest() { + s.Assertions = require.New(s.T()) +} + +func TestAddTasksSuite(t *testing.T) { + suite.Run(t, new(addTasksSuite)) +} + +func (s *addTasksSuite) TestAddTasks_Ok() { + for _, tc := range []struct { + name string + shouldCallAddTasks bool + }{ + { + name: "call AddTasks", + shouldCallAddTasks: true, + }, + { + name: "don't call AddTasks", + shouldCallAddTasks: false, + }, + } { + s.Run(tc.name, func() { + // Register a workflow which does nothing. + taskQueue := s.randomizeStr("add-tasks-test-queue") + w := worker.New(s.sdkClient, taskQueue, worker.Options{DeadlockDetectionTimeout: 0}) + myWorkflow := func(ctx workflow.Context) error { + return nil + } + s.NoError(w.Start()) + defer w.Stop() + w.RegisterWorkflow(myWorkflow) + + // Execute that workflow + // We need to track the workflow ID so that we can filter out tasks from this test suite + s.workflowID = uuid.New() + s.shouldSkip = true + s.skippedTasks = make(chan tasks.Task) + ctx := context.Background() + timeout := 5 * debug.TimeoutMultiplier * time.Second + ctx, cancel := context.WithTimeout(ctx, timeout) + defer cancel() + workflowID := s.workflowID + run, err := s.sdkClient.ExecuteWorkflow(ctx, sdkclient.StartWorkflowOptions{ + ID: workflowID, + TaskQueue: taskQueue, + }, myWorkflow) + s.NoError(err) + + // Get the task that we skipped, and add it back + var task tasks.Task + select { + case task = <-s.skippedTasks: + case <-ctx.Done(): + s.FailNow("timed out waiting for skipped task") + } + + s.shouldSkip = false + blob, err := serialization.NewTaskSerializer().SerializeTask(task) + s.NoError(err) + shardID := tasks.GetShardIDForTask(task, int(s.testClusterConfig.HistoryConfig.NumHistoryShards)) + request := &historyservice.AddTasksRequest{ + ShardId: int32(shardID), + Tasks: []*historyservice.AddTasksRequest_Task{ + { + Category: task.GetCategory().Name(), + Blob: &blob, + }, + }, + } + if tc.shouldCallAddTasks { + _, err = s.testCluster.GetHistoryClient().AddTasks(ctx, request) + s.NoError(err) + } + + // Wait for the workflow to complete + ctx, cancel = context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + err = run.Get(ctx, nil) + if tc.shouldCallAddTasks { + s.NoError(err, "workflow task should be retried if we call AddTasks") + } else { + s.Error(err, "workflow should not complete if we don't call AddTasks") + } + }) + } +} + +func (s *addTasksSuite) TestAddTasks_ErrGetShardByID() { + _, err := s.testCluster.GetHistoryClient().AddTasks(context.Background(), &historyservice.AddTasksRequest{ + ShardId: 0, + }) + s.Error(err) + s.Contains(strings.ToLower(err.Error()), "shard id") +} + +func (s *addTasksSuite) TestAddTasks_GetEngineErr() { + defer func() { + s.getEngineErr = nil + }() + s.getEngineErr = errors.New("example shard engine error") + _, err := s.testCluster.GetHistoryClient().AddTasks(context.Background(), &historyservice.AddTasksRequest{ + ShardId: 1, + }) + s.Error(err) + s.ErrorContains(err, s.getEngineErr.Error()) +} + +func (s *addTasksSuite) newSDKClient() sdkclient.Client { + client, err := sdkclient.Dial(sdkclient.Options{ + HostPort: s.hostPort, + Namespace: s.namespace, + }) + s.NoError(err) + return client +} diff --git a/tests/client_test.go b/tests/client_test.go index cdcd9c86e63..ae9c1db54ce 100644 --- a/tests/client_test.go +++ b/tests/client_test.go @@ -70,7 +70,6 @@ type ( // not merely log an error *require.Assertions FunctionalTestBase - hostPort string sdkClient sdkclient.Client worker worker.Worker taskQueue string @@ -105,11 +104,6 @@ func (s *clientFunctionalSuite) SetupSuite() { dynamicconfig.NumPendingSignalsLimitError: s.maxPendingSignals, } s.setupSuite("testdata/client_cluster.yaml") - - s.hostPort = "127.0.0.1:7134" - if TestFlags.FrontendAddr != "" { - s.hostPort = TestFlags.FrontendAddr - } } func (s *clientFunctionalSuite) TearDownSuite() { diff --git a/tests/functional_test_base.go b/tests/functional_test_base.go index 31bfe73bc56..1056def1ca8 100644 --- a/tests/functional_test_base.go +++ b/tests/functional_test_base.go @@ -78,6 +78,7 @@ type ( foreignNamespace string archivalNamespace string dynamicConfigOverrides map[dynamicconfig.Key]interface{} + hostPort string } // suiteParams contains the variables which are used to configure the test suite via the Option argument to // setupSuite. @@ -112,6 +113,10 @@ func (s *FunctionalTestBase) setupSuite(defaultClusterConfigFile string, options opt(¶ms) } + s.hostPort = "127.0.0.1:7134" + if TestFlags.FrontendAddr != "" { + s.hostPort = TestFlags.FrontendAddr + } s.setupLogger() clusterConfig, err := GetTestClusterConfig(defaultClusterConfigFile) diff --git a/tests/schedule_test.go b/tests/schedule_test.go index 5c8ee9cee63..891d434d4e8 100644 --- a/tests/schedule_test.go +++ b/tests/schedule_test.go @@ -77,7 +77,6 @@ type ( scheduleFunctionalSuite struct { *require.Assertions FunctionalTestBase - hostPort string sdkClient sdkclient.Client worker worker.Worker taskQueue string @@ -91,10 +90,6 @@ func TestScheduleFunctionalSuite(t *testing.T) { } func (s *scheduleFunctionalSuite) SetupSuite() { - s.hostPort = "127.0.0.1:7134" - if TestFlags.FrontendAddr != "" { - s.hostPort = TestFlags.FrontendAddr - } switch TestFlags.PersistenceDriver { case mysql.PluginNameV8, postgresql.PluginNameV12, postgresql.PluginNameV12PGX, sqlite.PluginName: s.setupSuite("testdata/cluster.yaml") diff --git a/tests/tls_test.go b/tests/tls_test.go index 53e1db229e2..4b692ebe7dc 100644 --- a/tests/tls_test.go +++ b/tests/tls_test.go @@ -35,6 +35,7 @@ import ( "github.com/stretchr/testify/suite" "go.temporal.io/api/workflowservice/v1" sdkclient "go.temporal.io/sdk/client" + "go.temporal.io/server/common/authorization" "go.temporal.io/server/common/log/tag" "go.temporal.io/server/common/rpc" @@ -42,7 +43,6 @@ import ( type tlsFunctionalSuite struct { FunctionalTestBase - hostPort string sdkClient sdkclient.Client } @@ -53,10 +53,7 @@ func TestTLSFunctionalSuite(t *testing.T) { func (s *tlsFunctionalSuite) SetupSuite() { s.setupSuite("testdata/tls_cluster.yaml") - s.hostPort = "127.0.0.1:7134" - if TestFlags.FrontendAddr != "" { - s.hostPort = TestFlags.FrontendAddr - } + } func (s *tlsFunctionalSuite) TearDownSuite() { diff --git a/tests/versioning_test.go b/tests/versioning_test.go index 6e62b1cc8df..dfb813f1426 100644 --- a/tests/versioning_test.go +++ b/tests/versioning_test.go @@ -101,12 +101,8 @@ func (s *versioningIntegSuite) SetupTest() { // Have to define our overridden assertions in the test setup. If we did it earlier, s.T() will return nil s.Assertions = require.New(s.T()) - clientAddr := "127.0.0.1:7134" - if TestFlags.FrontendAddr != "" { - clientAddr = TestFlags.FrontendAddr - } sdkClient, err := sdkclient.Dial(sdkclient.Options{ - HostPort: clientAddr, + HostPort: s.hostPort, Namespace: s.namespace, }) if err != nil {