// Code generated by protoc-gen-go. DO NOT EDIT.
// source: test_platform/skylab_test_runner/request.proto

package skylab_test_runner

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	timestamp "github.com/golang/protobuf/ptypes/timestamp"
	test_platform "go.chromium.org/chromiumos/infra/proto/go/test_platform"
	math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

// Request represents a request for running an individual test via the
// skylab_test_runner recipe.
type Request struct {
	Prejob *Request_Prejob `protobuf:"bytes,1,opt,name=prejob,proto3" json:"prejob,omitempty"`
	Test   *Request_Test   `protobuf:"bytes,2,opt,name=test,proto3" json:"test,omitempty"`
	// Soft deadline for test_runner execution.
	//
	// All prejob or test execution should abort beyond this deadline.
	// Clean up actions may execute beyond the deadline.
	Deadline *timestamp.Timestamp `protobuf:"bytes,3,opt,name=deadline,proto3" json:"deadline,omitempty"`
	// The UID of the individual CTP request which kicked off this test run.
	// Note that distinct requests inside a multi-request CTP build will have
	// different UIDs.
	ParentRequestUid string `protobuf:"bytes,4,opt,name=parent_request_uid,json=parentRequestUid,proto3" json:"parent_request_uid,omitempty"`
	// The buildbucket ID of the CTP build that sent this test_runner request.
	ParentBuildId int64 `protobuf:"varint,5,opt,name=parent_build_id,json=parentBuildId,proto3" json:"parent_build_id,omitempty"`
	// Set of Tests to run. The string is a UUID provided by the client
	// and used to identify each test result in the response.
	Tests                map[string]*Request_Test `protobuf:"bytes,6,rep,name=tests,proto3" json:"tests,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
	XXX_unrecognized     []byte                   `json:"-"`
	XXX_sizecache        int32                    `json:"-"`
}

func (m *Request) Reset()         { *m = Request{} }
func (m *Request) String() string { return proto.CompactTextString(m) }
func (*Request) ProtoMessage()    {}
func (*Request) Descriptor() ([]byte, []int) {
	return fileDescriptor_0203b6078e3ef1f3, []int{0}
}

func (m *Request) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Request.Unmarshal(m, b)
}
func (m *Request) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Request.Marshal(b, m, deterministic)
}
func (m *Request) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Request.Merge(m, src)
}
func (m *Request) XXX_Size() int {
	return xxx_messageInfo_Request.Size(m)
}
func (m *Request) XXX_DiscardUnknown() {
	xxx_messageInfo_Request.DiscardUnknown(m)
}

var xxx_messageInfo_Request proto.InternalMessageInfo

func (m *Request) GetPrejob() *Request_Prejob {
	if m != nil {
		return m.Prejob
	}
	return nil
}

func (m *Request) GetTest() *Request_Test {
	if m != nil {
		return m.Test
	}
	return nil
}

func (m *Request) GetDeadline() *timestamp.Timestamp {
	if m != nil {
		return m.Deadline
	}
	return nil
}

func (m *Request) GetParentRequestUid() string {
	if m != nil {
		return m.ParentRequestUid
	}
	return ""
}

func (m *Request) GetParentBuildId() int64 {
	if m != nil {
		return m.ParentBuildId
	}
	return 0
}

func (m *Request) GetTests() map[string]*Request_Test {
	if m != nil {
		return m.Tests
	}
	return nil
}

// Prejob defines parameters that affect the steps before the actual test
// (e.g. provision).
type Request_Prejob struct {
	SoftwareDependencies []*test_platform.Request_Params_SoftwareDependency `protobuf:"bytes,1,rep,name=software_dependencies,json=softwareDependencies,proto3" json:"software_dependencies,omitempty"` // Deprecated: Do not use.
	// Mutable software prerequisites. Are installed before running the test if
	// necessary. E.g. {"cros-version" : "reef-release/R77-12345.0.0"}
	ProvisionableLabels map[string]string `protobuf:"bytes,2,rep,name=provisionable_labels,json=provisionableLabels,proto3" json:"provisionable_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	// If set, use the Provision TLS API for the prejob.
	// See go/cros-prover go/cros-tls
	//
	// crbug.com/1137444: This is a transitional argument. Once go/cros-prover
	// migration is complete, all prejobs will use the TLS API and this argument
	// will be dropped.
	UseTls               bool     `protobuf:"varint,3,opt,name=use_tls,json=useTls,proto3" json:"use_tls,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Request_Prejob) Reset()         { *m = Request_Prejob{} }
func (m *Request_Prejob) String() string { return proto.CompactTextString(m) }
func (*Request_Prejob) ProtoMessage()    {}
func (*Request_Prejob) Descriptor() ([]byte, []int) {
	return fileDescriptor_0203b6078e3ef1f3, []int{0, 0}
}

func (m *Request_Prejob) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Request_Prejob.Unmarshal(m, b)
}
func (m *Request_Prejob) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Request_Prejob.Marshal(b, m, deterministic)
}
func (m *Request_Prejob) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Request_Prejob.Merge(m, src)
}
func (m *Request_Prejob) XXX_Size() int {
	return xxx_messageInfo_Request_Prejob.Size(m)
}
func (m *Request_Prejob) XXX_DiscardUnknown() {
	xxx_messageInfo_Request_Prejob.DiscardUnknown(m)
}

var xxx_messageInfo_Request_Prejob proto.InternalMessageInfo

// Deprecated: Do not use.
func (m *Request_Prejob) GetSoftwareDependencies() []*test_platform.Request_Params_SoftwareDependency {
	if m != nil {
		return m.SoftwareDependencies
	}
	return nil
}

func (m *Request_Prejob) GetProvisionableLabels() map[string]string {
	if m != nil {
		return m.ProvisionableLabels
	}
	return nil
}

func (m *Request_Prejob) GetUseTls() bool {
	if m != nil {
		return m.UseTls
	}
	return false
}

// Test describes which test harness and which test(s) to run.
type Request_Test struct {
	// Types that are valid to be assigned to Harness:
	//	*Request_Test_Autotest_
	Harness              isRequest_Test_Harness       `protobuf_oneof:"harness"`
	Offload              *Request_Test_OffloadOptions `protobuf:"bytes,2,opt,name=offload,proto3" json:"offload,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                     `json:"-"`
	XXX_unrecognized     []byte                       `json:"-"`
	XXX_sizecache        int32                        `json:"-"`
}

func (m *Request_Test) Reset()         { *m = Request_Test{} }
func (m *Request_Test) String() string { return proto.CompactTextString(m) }
func (*Request_Test) ProtoMessage()    {}
func (*Request_Test) Descriptor() ([]byte, []int) {
	return fileDescriptor_0203b6078e3ef1f3, []int{0, 1}
}

func (m *Request_Test) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Request_Test.Unmarshal(m, b)
}
func (m *Request_Test) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Request_Test.Marshal(b, m, deterministic)
}
func (m *Request_Test) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Request_Test.Merge(m, src)
}
func (m *Request_Test) XXX_Size() int {
	return xxx_messageInfo_Request_Test.Size(m)
}
func (m *Request_Test) XXX_DiscardUnknown() {
	xxx_messageInfo_Request_Test.DiscardUnknown(m)
}

var xxx_messageInfo_Request_Test proto.InternalMessageInfo

type isRequest_Test_Harness interface {
	isRequest_Test_Harness()
}

type Request_Test_Autotest_ struct {
	Autotest *Request_Test_Autotest `protobuf:"bytes,1,opt,name=autotest,proto3,oneof"`
}

func (*Request_Test_Autotest_) isRequest_Test_Harness() {}

func (m *Request_Test) GetHarness() isRequest_Test_Harness {
	if m != nil {
		return m.Harness
	}
	return nil
}

func (m *Request_Test) GetAutotest() *Request_Test_Autotest {
	if x, ok := m.GetHarness().(*Request_Test_Autotest_); ok {
		return x.Autotest
	}
	return nil
}

func (m *Request_Test) GetOffload() *Request_Test_OffloadOptions {
	if m != nil {
		return m.Offload
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*Request_Test) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*Request_Test_Autotest_)(nil),
	}
}

type Request_Test_Autotest struct {
	Name     string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	TestArgs string `protobuf:"bytes,2,opt,name=test_args,json=testArgs,proto3" json:"test_args,omitempty"`
	// Keyvals are key:value pairs added to the autoserv command.
	Keyvals map[string]string `protobuf:"bytes,3,rep,name=keyvals,proto3" json:"keyvals,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	// If true, run the test as a client-side test: the test logic is
	// executed in its entirety on the DUT itself.
	// Otherwise, run the test as a server-side test: the test logic is
	// executed on the drone server and interacts with the DUT as an external
	// object.
	IsClientTest bool `protobuf:"varint,4,opt,name=is_client_test,json=isClientTest,proto3" json:"is_client_test,omitempty"`
	// Name to be used to display this test's output artifacts, e.g. logs,
	// results etc. By default display_name is the same as name.
	//
	// display_name is especially useful when using test_args to distinguish
	// between multiple instances of the same test in a request.
	DisplayName          string   `protobuf:"bytes,5,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Request_Test_Autotest) Reset()         { *m = Request_Test_Autotest{} }
func (m *Request_Test_Autotest) String() string { return proto.CompactTextString(m) }
func (*Request_Test_Autotest) ProtoMessage()    {}
func (*Request_Test_Autotest) Descriptor() ([]byte, []int) {
	return fileDescriptor_0203b6078e3ef1f3, []int{0, 1, 0}
}

func (m *Request_Test_Autotest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Request_Test_Autotest.Unmarshal(m, b)
}
func (m *Request_Test_Autotest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Request_Test_Autotest.Marshal(b, m, deterministic)
}
func (m *Request_Test_Autotest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Request_Test_Autotest.Merge(m, src)
}
func (m *Request_Test_Autotest) XXX_Size() int {
	return xxx_messageInfo_Request_Test_Autotest.Size(m)
}
func (m *Request_Test_Autotest) XXX_DiscardUnknown() {
	xxx_messageInfo_Request_Test_Autotest.DiscardUnknown(m)
}

var xxx_messageInfo_Request_Test_Autotest proto.InternalMessageInfo

func (m *Request_Test_Autotest) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *Request_Test_Autotest) GetTestArgs() string {
	if m != nil {
		return m.TestArgs
	}
	return ""
}

func (m *Request_Test_Autotest) GetKeyvals() map[string]string {
	if m != nil {
		return m.Keyvals
	}
	return nil
}

func (m *Request_Test_Autotest) GetIsClientTest() bool {
	if m != nil {
		return m.IsClientTest
	}
	return false
}

func (m *Request_Test_Autotest) GetDisplayName() string {
	if m != nil {
		return m.DisplayName
	}
	return ""
}

// User-specified options for how results are served to clients
type Request_Test_OffloadOptions struct {
	// If this test needs synchronous offloading of results to Google Storage
	SynchronousGsEnable  bool     `protobuf:"varint,1,opt,name=synchronous_gs_enable,json=synchronousGsEnable,proto3" json:"synchronous_gs_enable,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Request_Test_OffloadOptions) Reset()         { *m = Request_Test_OffloadOptions{} }
func (m *Request_Test_OffloadOptions) String() string { return proto.CompactTextString(m) }
func (*Request_Test_OffloadOptions) ProtoMessage()    {}
func (*Request_Test_OffloadOptions) Descriptor() ([]byte, []int) {
	return fileDescriptor_0203b6078e3ef1f3, []int{0, 1, 1}
}

func (m *Request_Test_OffloadOptions) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Request_Test_OffloadOptions.Unmarshal(m, b)
}
func (m *Request_Test_OffloadOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Request_Test_OffloadOptions.Marshal(b, m, deterministic)
}
func (m *Request_Test_OffloadOptions) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Request_Test_OffloadOptions.Merge(m, src)
}
func (m *Request_Test_OffloadOptions) XXX_Size() int {
	return xxx_messageInfo_Request_Test_OffloadOptions.Size(m)
}
func (m *Request_Test_OffloadOptions) XXX_DiscardUnknown() {
	xxx_messageInfo_Request_Test_OffloadOptions.DiscardUnknown(m)
}

var xxx_messageInfo_Request_Test_OffloadOptions proto.InternalMessageInfo

func (m *Request_Test_OffloadOptions) GetSynchronousGsEnable() bool {
	if m != nil {
		return m.SynchronousGsEnable
	}
	return false
}

func init() {
	proto.RegisterType((*Request)(nil), "test_platform.skylab_test_runner.Request")
	proto.RegisterMapType((map[string]*Request_Test)(nil), "test_platform.skylab_test_runner.Request.TestsEntry")
	proto.RegisterType((*Request_Prejob)(nil), "test_platform.skylab_test_runner.Request.Prejob")
	proto.RegisterMapType((map[string]string)(nil), "test_platform.skylab_test_runner.Request.Prejob.ProvisionableLabelsEntry")
	proto.RegisterType((*Request_Test)(nil), "test_platform.skylab_test_runner.Request.Test")
	proto.RegisterType((*Request_Test_Autotest)(nil), "test_platform.skylab_test_runner.Request.Test.Autotest")
	proto.RegisterMapType((map[string]string)(nil), "test_platform.skylab_test_runner.Request.Test.Autotest.KeyvalsEntry")
	proto.RegisterType((*Request_Test_OffloadOptions)(nil), "test_platform.skylab_test_runner.Request.Test.OffloadOptions")
}

func init() {
	proto.RegisterFile("test_platform/skylab_test_runner/request.proto", fileDescriptor_0203b6078e3ef1f3)
}

var fileDescriptor_0203b6078e3ef1f3 = []byte{
	// 682 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x95, 0xcf, 0x6e, 0xd3, 0x4e,
	0x10, 0xc7, 0x7f, 0xf9, 0x9f, 0x4c, 0xfb, 0x2b, 0xd5, 0xb6, 0x15, 0x96, 0x7b, 0x20, 0x20, 0x84,
	0x72, 0x40, 0x6b, 0x54, 0x10, 0xa0, 0x4a, 0x1c, 0x1a, 0x52, 0x68, 0x4b, 0x45, 0x2b, 0xd3, 0x0a,
	0x89, 0x03, 0xd6, 0xa6, 0x9e, 0xb8, 0x4b, 0x6d, 0xaf, 0xd9, 0xb1, 0x8b, 0x22, 0xf1, 0x30, 0x9c,
	0x79, 0x1c, 0xee, 0xbc, 0x0b, 0xf2, 0xda, 0x69, 0x93, 0x16, 0x54, 0xc2, 0xcd, 0x9e, 0x9d, 0xf9,
	0xcc, 0x7c, 0x67, 0xc6, 0x6b, 0xe0, 0x29, 0x52, 0xea, 0x25, 0xa1, 0x48, 0x47, 0x4a, 0x47, 0x0e,
	0x9d, 0x8d, 0x43, 0x31, 0xf4, 0x8c, 0x51, 0x67, 0x71, 0x8c, 0xda, 0xd1, 0xf8, 0x39, 0x43, 0x4a,
	0x79, 0xa2, 0x55, 0xaa, 0x58, 0x77, 0xc6, 0x9f, 0x5f, 0xf7, 0xb7, 0xef, 0x04, 0x4a, 0x05, 0x21,
	0x3a, 0xc6, 0x7f, 0x98, 0x8d, 0x9c, 0x54, 0x46, 0x48, 0xa9, 0x88, 0x92, 0x02, 0x61, 0xaf, 0xcf,
	0xa6, 0x9c, 0xe1, 0xdf, 0xfb, 0x09, 0xd0, 0x72, 0x0b, 0x0b, 0xdb, 0x81, 0x66, 0xa2, 0xf1, 0x93,
	0x1a, 0x5a, 0x95, 0x6e, 0xa5, 0xb7, 0xb0, 0xf1, 0x88, 0xdf, 0x94, 0x9c, 0x97, 0xa1, 0xfc, 0xd0,
	0xc4, 0xb9, 0x65, 0x3c, 0xeb, 0x43, 0x3d, 0xf7, 0xb2, 0xaa, 0x86, 0xc3, 0xff, 0x9e, 0x73, 0x84,
	0x94, 0xba, 0x26, 0x96, 0x3d, 0x85, 0xb6, 0x8f, 0xc2, 0x0f, 0x65, 0x8c, 0x56, 0xcd, 0x70, 0x6c,
	0x5e, 0x48, 0xe5, 0x13, 0xa9, 0xfc, 0x68, 0x22, 0xd5, 0xbd, 0xf0, 0x65, 0x0f, 0x81, 0x25, 0x42,
	0x63, 0x9c, 0x7a, 0xa5, 0x52, 0x2f, 0x93, 0xbe, 0x55, 0xef, 0x56, 0x7a, 0x1d, 0x77, 0xb9, 0x38,
	0x29, 0xb3, 0x1d, 0x4b, 0x9f, 0x3d, 0x80, 0x5b, 0xa5, 0xf7, 0x30, 0x93, 0xa1, 0xef, 0x49, 0xdf,
	0x6a, 0x74, 0x2b, 0xbd, 0x9a, 0xfb, 0x7f, 0x61, 0xee, 0xe7, 0xd6, 0x5d, 0x9f, 0xed, 0x41, 0x23,
	0xaf, 0x8a, 0xac, 0x66, 0xb7, 0xd6, 0x5b, 0xd8, 0x78, 0x32, 0x9f, 0x24, 0xda, 0x8e, 0x53, 0x3d,
	0x76, 0x0b, 0x84, 0xfd, 0xa3, 0x0a, 0xcd, 0xa2, 0x61, 0x4c, 0xc2, 0x1a, 0xa9, 0x51, 0xfa, 0x45,
	0x68, 0xf4, 0x7c, 0x4c, 0x30, 0xf6, 0x31, 0x3e, 0x91, 0x48, 0x56, 0xc5, 0xa4, 0xb9, 0x3a, 0x81,
	0x8b, 0x76, 0x0b, 0x2d, 0x22, 0xe2, 0xef, 0xca, 0xd0, 0xc1, 0x24, 0x72, 0xdc, 0xaf, 0x5a, 0x15,
	0x77, 0x95, 0xae, 0xda, 0x25, 0x12, 0xfb, 0x0a, 0xab, 0x89, 0x56, 0xe7, 0x92, 0xa4, 0x8a, 0xc5,
	0x30, 0x44, 0x2f, 0x14, 0x43, 0x0c, 0xc9, 0xaa, 0x9a, 0x4c, 0xbb, 0xf3, 0xce, 0x9a, 0x1f, 0x4e,
	0xc3, 0xf6, 0x0d, 0xab, 0x50, 0xb9, 0x92, 0x5c, 0x3f, 0x61, 0xb7, 0xa1, 0x95, 0x11, 0x7a, 0x69,
	0x48, 0x66, 0x98, 0x6d, 0xb7, 0x99, 0x11, 0x1e, 0x85, 0x64, 0xbf, 0x02, 0xeb, 0x4f, 0x24, 0xb6,
	0x0c, 0xb5, 0x33, 0x1c, 0x9b, 0x6d, 0xec, 0xb8, 0xf9, 0x23, 0x5b, 0x85, 0xc6, 0xb9, 0x08, 0x33,
	0x34, 0x9b, 0xd5, 0x71, 0x8b, 0x97, 0xcd, 0xea, 0xf3, 0x8a, 0xfd, 0xbd, 0x0e, 0xf5, 0xbc, 0xd5,
	0xec, 0x18, 0xda, 0x22, 0x4b, 0x95, 0xd9, 0xbf, 0x62, 0x8f, 0x9f, 0xcd, 0x37, 0x2c, 0xbe, 0x55,
	0x86, 0xef, 0xfc, 0xe7, 0x5e, 0xa0, 0xd8, 0x7b, 0x68, 0xa9, 0xd1, 0x28, 0x54, 0xc2, 0x2f, 0xb7,
	0xfa, 0xc5, 0x9c, 0xd4, 0x83, 0x22, 0xfa, 0x20, 0x49, 0xa5, 0x8a, 0xc9, 0x9d, 0xd0, 0xec, 0x6f,
	0x55, 0x68, 0x4f, 0x32, 0x32, 0x06, 0xf5, 0x58, 0x44, 0x58, 0x4a, 0x36, 0xcf, 0x6c, 0x1d, 0x3a,
	0x06, 0x2a, 0x74, 0x40, 0xa5, 0xee, 0x76, 0x6e, 0xd8, 0xd2, 0x01, 0xb1, 0x8f, 0xd0, 0x3a, 0xc3,
	0xf1, 0xb9, 0x30, 0x7d, 0xcd, 0x07, 0x39, 0xf8, 0x47, 0xb1, 0xfc, 0x4d, 0x81, 0x29, 0x66, 0x38,
	0x81, 0xb2, 0xfb, 0xb0, 0x24, 0xc9, 0x3b, 0x09, 0x65, 0xfe, 0x89, 0x98, 0x9e, 0xd6, 0xcd, 0xf8,
	0x16, 0x25, 0xbd, 0x34, 0x46, 0xd3, 0xf3, 0xbb, 0xb0, 0xe8, 0x4b, 0x4a, 0x42, 0x31, 0xf6, 0x4c,
	0xf9, 0x0d, 0x53, 0xe5, 0x42, 0x69, 0x7b, 0x2b, 0x22, 0xb4, 0x37, 0x61, 0x71, 0x3a, 0xc3, 0x5c,
	0xb3, 0x1d, 0xc0, 0xd2, 0x6c, 0xf7, 0xd8, 0x06, 0xac, 0xd1, 0x38, 0x3e, 0x39, 0xd5, 0x2a, 0x56,
	0x19, 0x79, 0x01, 0x79, 0x68, 0xb6, 0xc7, 0xf0, 0xda, 0xee, 0xca, 0xd4, 0xe1, 0x6b, 0xda, 0x36,
	0x47, 0xfd, 0x0e, 0xb4, 0x4e, 0x85, 0x8e, 0x91, 0xc8, 0x3e, 0x05, 0xb8, 0xfc, 0x2c, 0x7f, 0x53,
	0xca, 0x60, 0xba, 0x94, 0xf9, 0x2f, 0xb0, 0xcb, 0xd2, 0xfb, 0xfb, 0x1f, 0xf6, 0x02, 0xc5, 0xf3,
	0x5a, 0x22, 0x99, 0x45, 0x5c, 0xe9, 0xc0, 0x99, 0xbc, 0x28, 0x72, 0x64, 0x3c, 0xd2, 0xa2, 0xb8,
	0xb9, 0x9d, 0x40, 0x39, 0x37, 0xfd, 0x1b, 0x86, 0x4d, 0xe3, 0xfa, 0xf8, 0x57, 0x00, 0x00, 0x00,
	0xff, 0xff, 0xdd, 0xa7, 0x99, 0x1b, 0x46, 0x06, 0x00, 0x00,
}
