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

package test_platform

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	duration "github.com/golang/protobuf/ptypes/duration"
	api "go.chromium.org/chromiumos/infra/proto/go/chromite/api"
	chromiumos "go.chromium.org/chromiumos/infra/proto/go/chromiumos"
	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

// ManagedPool enumerates the different lab platform-managed pools.
// Devices in these pools are automatically managed by lab platform
// systems and can not be arbitrarily assigned to pools by users.
//
// Managed pool implementations are specific to test platform's scheduling
// backends.
// For Skylab, see
// https://chromium.googlesource.com/infra/infra/+/5566668428c6b286702bf440d9dfd0be7bca1d84/go/src/infra/libs/skylab/inventory/device.proto#173
// For autotest, see
// https://chromium.googlesource.com/chromiumos/third_party/autotest/+/7436c2b6e6bd32ed1f1bd08cf8e0feb40cfe7b89/server/constants.py#18
type Request_Params_Scheduling_ManagedPool int32

const (
	Request_Params_Scheduling_MANAGED_POOL_UNSPECIFIED   Request_Params_Scheduling_ManagedPool = 0
	Request_Params_Scheduling_MANAGED_POOL_CQ            Request_Params_Scheduling_ManagedPool = 1
	Request_Params_Scheduling_MANAGED_POOL_BVT           Request_Params_Scheduling_ManagedPool = 2
	Request_Params_Scheduling_MANAGED_POOL_SUITES        Request_Params_Scheduling_ManagedPool = 3
	Request_Params_Scheduling_MANAGED_POOL_CTS           Request_Params_Scheduling_ManagedPool = 4
	Request_Params_Scheduling_MANAGED_POOL_CTS_PERBUILD  Request_Params_Scheduling_ManagedPool = 5
	Request_Params_Scheduling_MANAGED_POOL_CONTINUOUS    Request_Params_Scheduling_ManagedPool = 6
	Request_Params_Scheduling_MANAGED_POOL_ARC_PRESUBMIT Request_Params_Scheduling_ManagedPool = 7
	Request_Params_Scheduling_MANAGED_POOL_QUOTA         Request_Params_Scheduling_ManagedPool = 8
)

var Request_Params_Scheduling_ManagedPool_name = map[int32]string{
	0: "MANAGED_POOL_UNSPECIFIED",
	1: "MANAGED_POOL_CQ",
	2: "MANAGED_POOL_BVT",
	3: "MANAGED_POOL_SUITES",
	4: "MANAGED_POOL_CTS",
	5: "MANAGED_POOL_CTS_PERBUILD",
	6: "MANAGED_POOL_CONTINUOUS",
	7: "MANAGED_POOL_ARC_PRESUBMIT",
	8: "MANAGED_POOL_QUOTA",
}

var Request_Params_Scheduling_ManagedPool_value = map[string]int32{
	"MANAGED_POOL_UNSPECIFIED":   0,
	"MANAGED_POOL_CQ":            1,
	"MANAGED_POOL_BVT":           2,
	"MANAGED_POOL_SUITES":        3,
	"MANAGED_POOL_CTS":           4,
	"MANAGED_POOL_CTS_PERBUILD":  5,
	"MANAGED_POOL_CONTINUOUS":    6,
	"MANAGED_POOL_ARC_PRESUBMIT": 7,
	"MANAGED_POOL_QUOTA":         8,
}

func (x Request_Params_Scheduling_ManagedPool) String() string {
	return proto.EnumName(Request_Params_Scheduling_ManagedPool_name, int32(x))
}

func (Request_Params_Scheduling_ManagedPool) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7f5ab0d1581e8f0c, []int{0, 0, 4, 0}
}

// Request represents a request to the ChromeOS Test Platform to run a test,
// set of tests, suite of tests, or test plan on a set of devices (eventually
// also: virtual devices) in the ChromeOS Test Lab.
type Request struct {
	Params               *Request_Params   `protobuf:"bytes,1,opt,name=params,proto3" json:"params,omitempty"`
	TestPlan             *Request_TestPlan `protobuf:"bytes,5,opt,name=test_plan,json=testPlan,proto3" json:"test_plan,omitempty"`
	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_7f5ab0d1581e8f0c, []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) GetParams() *Request_Params {
	if m != nil {
		return m.Params
	}
	return nil
}

func (m *Request) GetTestPlan() *Request_TestPlan {
	if m != nil {
		return m.TestPlan
	}
	return nil
}

// Params defines parameters that apply to an entire Request.
//
// NEXT_TAG: 11
type Request_Params struct {
	HardwareAttributes   *Request_Params_HardwareAttributes   `protobuf:"bytes,1,opt,name=hardware_attributes,json=hardwareAttributes,proto3" json:"hardware_attributes,omitempty"`
	SoftwareAttributes   *Request_Params_SoftwareAttributes   `protobuf:"bytes,2,opt,name=software_attributes,json=softwareAttributes,proto3" json:"software_attributes,omitempty"`
	FreeformAttributes   *Request_Params_FreeformAttributes   `protobuf:"bytes,9,opt,name=freeform_attributes,json=freeformAttributes,proto3" json:"freeform_attributes,omitempty"`
	SoftwareDependencies []*Request_Params_SoftwareDependency `protobuf:"bytes,3,rep,name=software_dependencies,json=softwareDependencies,proto3" json:"software_dependencies,omitempty"`
	Scheduling           *Request_Params_Scheduling           `protobuf:"bytes,4,opt,name=scheduling,proto3" json:"scheduling,omitempty"`
	Retry                *Request_Params_Retry                `protobuf:"bytes,5,opt,name=retry,proto3" json:"retry,omitempty"`
	Metadata             *Request_Params_Metadata             `protobuf:"bytes,6,opt,name=metadata,proto3" json:"metadata,omitempty"`
	Time                 *Request_Params_Time                 `protobuf:"bytes,7,opt,name=time,proto3" json:"time,omitempty"`
	Decorations          *Request_Params_Decorations          `protobuf:"bytes,8,opt,name=decorations,proto3" json:"decorations,omitempty"`
	Legacy               *Request_Params_Legacy               `protobuf:"bytes,10,opt,name=legacy,proto3" json:"legacy,omitempty"`
	Migrations           *Request_Params_Migrations           `protobuf:"bytes,12,opt,name=migrations,proto3" json:"migrations,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                             `json:"-"`
	XXX_unrecognized     []byte                               `json:"-"`
	XXX_sizecache        int32                                `json:"-"`
}

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

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

var xxx_messageInfo_Request_Params proto.InternalMessageInfo

func (m *Request_Params) GetHardwareAttributes() *Request_Params_HardwareAttributes {
	if m != nil {
		return m.HardwareAttributes
	}
	return nil
}

func (m *Request_Params) GetSoftwareAttributes() *Request_Params_SoftwareAttributes {
	if m != nil {
		return m.SoftwareAttributes
	}
	return nil
}

func (m *Request_Params) GetFreeformAttributes() *Request_Params_FreeformAttributes {
	if m != nil {
		return m.FreeformAttributes
	}
	return nil
}

func (m *Request_Params) GetSoftwareDependencies() []*Request_Params_SoftwareDependency {
	if m != nil {
		return m.SoftwareDependencies
	}
	return nil
}

func (m *Request_Params) GetScheduling() *Request_Params_Scheduling {
	if m != nil {
		return m.Scheduling
	}
	return nil
}

func (m *Request_Params) GetRetry() *Request_Params_Retry {
	if m != nil {
		return m.Retry
	}
	return nil
}

func (m *Request_Params) GetMetadata() *Request_Params_Metadata {
	if m != nil {
		return m.Metadata
	}
	return nil
}

func (m *Request_Params) GetTime() *Request_Params_Time {
	if m != nil {
		return m.Time
	}
	return nil
}

func (m *Request_Params) GetDecorations() *Request_Params_Decorations {
	if m != nil {
		return m.Decorations
	}
	return nil
}

func (m *Request_Params) GetLegacy() *Request_Params_Legacy {
	if m != nil {
		return m.Legacy
	}
	return nil
}

func (m *Request_Params) GetMigrations() *Request_Params_Migrations {
	if m != nil {
		return m.Migrations
	}
	return nil
}

// HardwareAttributes defines the hardware-bound characteristics
// of the devices to run tests on.
type Request_Params_HardwareAttributes struct {
	// Model is the model to run tests against.
	//
	// TODO(akeshet): Re-use device protos instead of defining this
	// independently.
	Model                string   `protobuf:"bytes,1,opt,name=model,proto3" json:"model,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Request_Params_HardwareAttributes proto.InternalMessageInfo

func (m *Request_Params_HardwareAttributes) GetModel() string {
	if m != nil {
		return m.Model
	}
	return ""
}

// SoftwareAttributes defines software characteristics that are strongly
// associated with a device, though not immutable or hardware-bound.
type Request_Params_SoftwareAttributes struct {
	BuildTarget          *chromiumos.BuildTarget `protobuf:"bytes,2,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

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

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

var xxx_messageInfo_Request_Params_SoftwareAttributes proto.InternalMessageInfo

func (m *Request_Params_SoftwareAttributes) GetBuildTarget() *chromiumos.BuildTarget {
	if m != nil {
		return m.BuildTarget
	}
	return nil
}

// FreeformAttributes defines user-specified device attributes that are
// opaque to the test platform. It is preferrable not to use these, but
// they are provided to cover cases in which the test platform does not
// present a parameter corresponding to the attributes of interest.
type Request_Params_FreeformAttributes struct {
	// SwarmingDimensions are raw swarming bot dimensions, expressed as
	// "key:value" strings.
	SwarmingDimensions   []string `protobuf:"bytes,1,rep,name=swarming_dimensions,json=swarmingDimensions,proto3" json:"swarming_dimensions,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Request_Params_FreeformAttributes proto.InternalMessageInfo

func (m *Request_Params_FreeformAttributes) GetSwarmingDimensions() []string {
	if m != nil {
		return m.SwarmingDimensions
	}
	return nil
}

// SoftwareDependency defines mutable software characteristics of the
// devices to run tests on (for instance, the desired version of ChromeOS).
type Request_Params_SoftwareDependency struct {
	// Types that are valid to be assigned to Dep:
	//	*Request_Params_SoftwareDependency_ChromeosBuild
	//	*Request_Params_SoftwareDependency_RoFirmwareBuild
	//	*Request_Params_SoftwareDependency_RwFirmwareBuild
	Dep                  isRequest_Params_SoftwareDependency_Dep `protobuf_oneof:"dep"`
	XXX_NoUnkeyedLiteral struct{}                                `json:"-"`
	XXX_unrecognized     []byte                                  `json:"-"`
	XXX_sizecache        int32                                   `json:"-"`
}

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

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

var xxx_messageInfo_Request_Params_SoftwareDependency proto.InternalMessageInfo

type isRequest_Params_SoftwareDependency_Dep interface {
	isRequest_Params_SoftwareDependency_Dep()
}

type Request_Params_SoftwareDependency_ChromeosBuild struct {
	ChromeosBuild string `protobuf:"bytes,3,opt,name=chromeos_build,json=chromeosBuild,proto3,oneof"`
}

type Request_Params_SoftwareDependency_RoFirmwareBuild struct {
	RoFirmwareBuild string `protobuf:"bytes,4,opt,name=ro_firmware_build,json=roFirmwareBuild,proto3,oneof"`
}

type Request_Params_SoftwareDependency_RwFirmwareBuild struct {
	RwFirmwareBuild string `protobuf:"bytes,5,opt,name=rw_firmware_build,json=rwFirmwareBuild,proto3,oneof"`
}

func (*Request_Params_SoftwareDependency_ChromeosBuild) isRequest_Params_SoftwareDependency_Dep() {}

func (*Request_Params_SoftwareDependency_RoFirmwareBuild) isRequest_Params_SoftwareDependency_Dep() {}

func (*Request_Params_SoftwareDependency_RwFirmwareBuild) isRequest_Params_SoftwareDependency_Dep() {}

func (m *Request_Params_SoftwareDependency) GetDep() isRequest_Params_SoftwareDependency_Dep {
	if m != nil {
		return m.Dep
	}
	return nil
}

func (m *Request_Params_SoftwareDependency) GetChromeosBuild() string {
	if x, ok := m.GetDep().(*Request_Params_SoftwareDependency_ChromeosBuild); ok {
		return x.ChromeosBuild
	}
	return ""
}

func (m *Request_Params_SoftwareDependency) GetRoFirmwareBuild() string {
	if x, ok := m.GetDep().(*Request_Params_SoftwareDependency_RoFirmwareBuild); ok {
		return x.RoFirmwareBuild
	}
	return ""
}

func (m *Request_Params_SoftwareDependency) GetRwFirmwareBuild() string {
	if x, ok := m.GetDep().(*Request_Params_SoftwareDependency_RwFirmwareBuild); ok {
		return x.RwFirmwareBuild
	}
	return ""
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*Request_Params_SoftwareDependency) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*Request_Params_SoftwareDependency_ChromeosBuild)(nil),
		(*Request_Params_SoftwareDependency_RoFirmwareBuild)(nil),
		(*Request_Params_SoftwareDependency_RwFirmwareBuild)(nil),
	}
}

// Scheduling defines parameters that affect how the tests in this
// request are prioritized relative to other requests, and how capacity for
// them is allocated.
type Request_Params_Scheduling struct {
	// Types that are valid to be assigned to Pool:
	//	*Request_Params_Scheduling_ManagedPool_
	//	*Request_Params_Scheduling_UnmanagedPool
	//	*Request_Params_Scheduling_QuotaAccount
	Pool isRequest_Params_Scheduling_Pool `protobuf_oneof:"pool"`
	// Priority corresponds to a swarming task priority; if specified, it
	// should be in the range [50,255]. This priority will be used for
	// any swaming tasks created by this run.
	//
	// Note that the scheduler behavior with a given priority depends on
	// other factors, such as pool. In particular, if requests are run in
	// a quotascheduler-controlled pool, then this priority will be ignored,
	// as priority will be determined by quota account balances.
	Priority int64 `protobuf:"varint,4,opt,name=priority,proto3" json:"priority,omitempty"`
	// It is an error to set both qs_account and priority at the same time.
	// qs_account should be used if the request is scheduled on a pool
	// managed by QuotaScheduler. See go/qs-enabled-pools for details.
	// If qs_account is set for requests on no QuotaScheduler pools,
	// it will be ignored and the request will default to running at
	// the lowest priority.
	QsAccount            string   `protobuf:"bytes,5,opt,name=qs_account,json=qsAccount,proto3" json:"qs_account,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Request_Params_Scheduling proto.InternalMessageInfo

type isRequest_Params_Scheduling_Pool interface {
	isRequest_Params_Scheduling_Pool()
}

type Request_Params_Scheduling_ManagedPool_ struct {
	ManagedPool Request_Params_Scheduling_ManagedPool `protobuf:"varint,1,opt,name=managed_pool,json=managedPool,proto3,enum=test_platform.Request_Params_Scheduling_ManagedPool,oneof"`
}

type Request_Params_Scheduling_UnmanagedPool struct {
	UnmanagedPool string `protobuf:"bytes,2,opt,name=unmanaged_pool,json=unmanagedPool,proto3,oneof"`
}

type Request_Params_Scheduling_QuotaAccount struct {
	QuotaAccount string `protobuf:"bytes,3,opt,name=quota_account,json=quotaAccount,proto3,oneof"`
}

func (*Request_Params_Scheduling_ManagedPool_) isRequest_Params_Scheduling_Pool() {}

func (*Request_Params_Scheduling_UnmanagedPool) isRequest_Params_Scheduling_Pool() {}

func (*Request_Params_Scheduling_QuotaAccount) isRequest_Params_Scheduling_Pool() {}

func (m *Request_Params_Scheduling) GetPool() isRequest_Params_Scheduling_Pool {
	if m != nil {
		return m.Pool
	}
	return nil
}

func (m *Request_Params_Scheduling) GetManagedPool() Request_Params_Scheduling_ManagedPool {
	if x, ok := m.GetPool().(*Request_Params_Scheduling_ManagedPool_); ok {
		return x.ManagedPool
	}
	return Request_Params_Scheduling_MANAGED_POOL_UNSPECIFIED
}

func (m *Request_Params_Scheduling) GetUnmanagedPool() string {
	if x, ok := m.GetPool().(*Request_Params_Scheduling_UnmanagedPool); ok {
		return x.UnmanagedPool
	}
	return ""
}

// Deprecated: Do not use.
func (m *Request_Params_Scheduling) GetQuotaAccount() string {
	if x, ok := m.GetPool().(*Request_Params_Scheduling_QuotaAccount); ok {
		return x.QuotaAccount
	}
	return ""
}

func (m *Request_Params_Scheduling) GetPriority() int64 {
	if m != nil {
		return m.Priority
	}
	return 0
}

func (m *Request_Params_Scheduling) GetQsAccount() string {
	if m != nil {
		return m.QsAccount
	}
	return ""
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*Request_Params_Scheduling) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*Request_Params_Scheduling_ManagedPool_)(nil),
		(*Request_Params_Scheduling_UnmanagedPool)(nil),
		(*Request_Params_Scheduling_QuotaAccount)(nil),
	}
}

// Retry defines parameters that affect how failed tests within
// a request are retried.
type Request_Params_Retry struct {
	// Whether to allow test retries.
	Allow bool `protobuf:"varint,1,opt,name=allow,proto3" json:"allow,omitempty"`
	// Maximum number of retries of tests within this invocation to allow.
	// 0 = unlimited.
	Max                  int32    `protobuf:"varint,2,opt,name=max,proto3" json:"max,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Request_Params_Retry proto.InternalMessageInfo

func (m *Request_Params_Retry) GetAllow() bool {
	if m != nil {
		return m.Allow
	}
	return false
}

func (m *Request_Params_Retry) GetMax() int32 {
	if m != nil {
		return m.Max
	}
	return 0
}

// Metadata defines parameters that determine where test definitions
// and metadata are stored and discovered from.
type Request_Params_Metadata struct {
	// A Google Storage path to the location of test metadata to be used.
	// For example:
	// "gs://chromeos-image-archive/arkham-release/R57-9202.10.11".
	TestMetadataUrl string `protobuf:"bytes,1,opt,name=test_metadata_url,json=testMetadataUrl,proto3" json:"test_metadata_url,omitempty"`
	// A Google Storage path to the location of image archive in which to find
	// debug symbols to be used in post-process symbolication of crashes. This
	// is generally the same as test_metadata_url.
	DebugSymbolsArchiveUrl string   `protobuf:"bytes,2,opt,name=debug_symbols_archive_url,json=debugSymbolsArchiveUrl,proto3" json:"debug_symbols_archive_url,omitempty"`
	XXX_NoUnkeyedLiteral   struct{} `json:"-"`
	XXX_unrecognized       []byte   `json:"-"`
	XXX_sizecache          int32    `json:"-"`
}

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

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

var xxx_messageInfo_Request_Params_Metadata proto.InternalMessageInfo

func (m *Request_Params_Metadata) GetTestMetadataUrl() string {
	if m != nil {
		return m.TestMetadataUrl
	}
	return ""
}

func (m *Request_Params_Metadata) GetDebugSymbolsArchiveUrl() string {
	if m != nil {
		return m.DebugSymbolsArchiveUrl
	}
	return ""
}

// Time defines parameters related to timeouts.
type Request_Params_Time struct {
	// Maximum duration for the entire request to be handled.
	MaximumDuration      *duration.Duration `protobuf:"bytes,1,opt,name=maximum_duration,json=maximumDuration,proto3" json:"maximum_duration,omitempty"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

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

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

var xxx_messageInfo_Request_Params_Time proto.InternalMessageInfo

func (m *Request_Params_Time) GetMaximumDuration() *duration.Duration {
	if m != nil {
		return m.MaximumDuration
	}
	return nil
}

// Decorations defines parameters that add additional decorations to
// test runs.
type Request_Params_Decorations struct {
	// AutotestKeyvals are (key, value) pairs that will be added to all
	// autotest tasks run.
	AutotestKeyvals map[string]string `protobuf:"bytes,1,rep,name=autotest_keyvals,json=autotestKeyvals,proto3" json:"autotest_keyvals,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	// Tags are swarming tags that will be applied to all swarming tasks
	// launched.
	Tags                 []string `protobuf:"bytes,2,rep,name=tags,proto3" json:"tags,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Request_Params_Decorations proto.InternalMessageInfo

func (m *Request_Params_Decorations) GetAutotestKeyvals() map[string]string {
	if m != nil {
		return m.AutotestKeyvals
	}
	return nil
}

func (m *Request_Params_Decorations) GetTags() []string {
	if m != nil {
		return m.Tags
	}
	return nil
}

// Legacy encodes arguments that relate to migration from legacy backend
// (autotest); support for these arguments will be phased out.
type Request_Params_Legacy struct {
	// If autotest_suite is defined, then if the autotest backend is selected
	// for running this request, the entire enumeration will be ignored, and
	// replaced by a single invocation of this named autotest suite.
	AutotestSuite        string   `protobuf:"bytes,1,opt,name=autotest_suite,json=autotestSuite,proto3" json:"autotest_suite,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Request_Params_Legacy proto.InternalMessageInfo

func (m *Request_Params_Legacy) GetAutotestSuite() string {
	if m != nil {
		return m.AutotestSuite
	}
	return ""
}

// Migrations defines parameters that facilitate gradual migrations between
// different implementations of downstream components.
type Request_Params_Migrations struct {
	// If true, schedule individual tests via buildbucket and run them via
	// test_runner recipe.
	// Otherwise, schedule individual tests via raw swarming calls and run
	// them via skylab_swarming_worker.
	// TODO(crbug/1033287): remove when migration is complete.
	UseTestRunner bool `protobuf:"varint,1,opt,name=use_test_runner,json=useTestRunner,proto3" json:"use_test_runner,omitempty"`
	// If true, test tasks will perform synchronous offload of the contents
	// of $SYNCHRONOUS_OFFLOAD_DIR to a GS bucket. This requires
	// use_test_runner to also be set to true: if use_test_runner is set to
	// false and enable_synchronous_offload is set to true, the build will
	// fail validation.
	// If false, such offload will be skipped.
	EnableSynchronousOffload bool `protobuf:"varint,2,opt,name=enable_synchronous_offload,json=enableSynchronousOffload,proto3" json:"enable_synchronous_offload,omitempty"`
	// Turn on synchronous offloads even if there is no pubsub topic set.
	// Not intended as a long-term change, but useful for testing synchronous
	// offloads during rollout.
	NotificationlessOffload bool     `protobuf:"varint,3,opt,name=notificationless_offload,json=notificationlessOffload,proto3" json:"notificationless_offload,omitempty"`
	XXX_NoUnkeyedLiteral    struct{} `json:"-"`
	XXX_unrecognized        []byte   `json:"-"`
	XXX_sizecache           int32    `json:"-"`
}

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

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

var xxx_messageInfo_Request_Params_Migrations proto.InternalMessageInfo

func (m *Request_Params_Migrations) GetUseTestRunner() bool {
	if m != nil {
		return m.UseTestRunner
	}
	return false
}

func (m *Request_Params_Migrations) GetEnableSynchronousOffload() bool {
	if m != nil {
		return m.EnableSynchronousOffload
	}
	return false
}

func (m *Request_Params_Migrations) GetNotificationlessOffload() bool {
	if m != nil {
		return m.NotificationlessOffload
	}
	return false
}

// SuiteRequest defines an individual named suite.
type Request_Suite struct {
	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Request_Suite proto.InternalMessageInfo

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

type Request_Test struct {
	// Types that are valid to be assigned to Harness:
	//	*Request_Test_Autotest_
	Harness              isRequest_Test_Harness `protobuf_oneof:"harness"`
	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_7f5ab0d1581e8f0c, []int{0, 2}
}

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
}

// 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"`
	// 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,3,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_7f5ab0d1581e8f0c, []int{0, 2, 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) GetDisplayName() string {
	if m != nil {
		return m.DisplayName
	}
	return ""
}

// Enumeration is a previously enumerated test plan.
//
// This is a copy of test_platform.steps.EnumerationResponse
// Keep in sync.
type Request_Enumeration struct {
	AutotestInvocations  []*Request_Enumeration_AutotestInvocation `protobuf:"bytes,2,rep,name=autotest_invocations,json=autotestInvocations,proto3" json:"autotest_invocations,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                  `json:"-"`
	XXX_unrecognized     []byte                                    `json:"-"`
	XXX_sizecache        int32                                     `json:"-"`
}

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

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

var xxx_messageInfo_Request_Enumeration proto.InternalMessageInfo

func (m *Request_Enumeration) GetAutotestInvocations() []*Request_Enumeration_AutotestInvocation {
	if m != nil {
		return m.AutotestInvocations
	}
	return nil
}

type Request_Enumeration_AutotestInvocation struct {
	Test                 *api.AutotestTest `protobuf:"bytes,1,opt,name=test,proto3" json:"test,omitempty"`
	TestArgs             string            `protobuf:"bytes,2,opt,name=test_args,json=testArgs,proto3" json:"test_args,omitempty"`
	DisplayName          string            `protobuf:"bytes,3,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
	ResultKeyvals        map[string]string `protobuf:"bytes,4,rep,name=result_keyvals,json=resultKeyvals,proto3" json:"result_keyvals,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_Enumeration_AutotestInvocation) Reset() {
	*m = Request_Enumeration_AutotestInvocation{}
}
func (m *Request_Enumeration_AutotestInvocation) String() string { return proto.CompactTextString(m) }
func (*Request_Enumeration_AutotestInvocation) ProtoMessage()    {}
func (*Request_Enumeration_AutotestInvocation) Descriptor() ([]byte, []int) {
	return fileDescriptor_7f5ab0d1581e8f0c, []int{0, 3, 0}
}

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

var xxx_messageInfo_Request_Enumeration_AutotestInvocation proto.InternalMessageInfo

func (m *Request_Enumeration_AutotestInvocation) GetTest() *api.AutotestTest {
	if m != nil {
		return m.Test
	}
	return nil
}

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

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

func (m *Request_Enumeration_AutotestInvocation) GetResultKeyvals() map[string]string {
	if m != nil {
		return m.ResultKeyvals
	}
	return nil
}

type Request_TestPlan struct {
	Suite                []*Request_Suite     `protobuf:"bytes,1,rep,name=suite,proto3" json:"suite,omitempty"`
	Test                 []*Request_Test      `protobuf:"bytes,2,rep,name=test,proto3" json:"test,omitempty"`
	Enumeration          *Request_Enumeration `protobuf:"bytes,3,opt,name=enumeration,proto3" json:"enumeration,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

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

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

var xxx_messageInfo_Request_TestPlan proto.InternalMessageInfo

func (m *Request_TestPlan) GetSuite() []*Request_Suite {
	if m != nil {
		return m.Suite
	}
	return nil
}

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

func (m *Request_TestPlan) GetEnumeration() *Request_Enumeration {
	if m != nil {
		return m.Enumeration
	}
	return nil
}

func init() {
	proto.RegisterEnum("test_platform.Request_Params_Scheduling_ManagedPool", Request_Params_Scheduling_ManagedPool_name, Request_Params_Scheduling_ManagedPool_value)
	proto.RegisterType((*Request)(nil), "test_platform.Request")
	proto.RegisterType((*Request_Params)(nil), "test_platform.Request.Params")
	proto.RegisterType((*Request_Params_HardwareAttributes)(nil), "test_platform.Request.Params.HardwareAttributes")
	proto.RegisterType((*Request_Params_SoftwareAttributes)(nil), "test_platform.Request.Params.SoftwareAttributes")
	proto.RegisterType((*Request_Params_FreeformAttributes)(nil), "test_platform.Request.Params.FreeformAttributes")
	proto.RegisterType((*Request_Params_SoftwareDependency)(nil), "test_platform.Request.Params.SoftwareDependency")
	proto.RegisterType((*Request_Params_Scheduling)(nil), "test_platform.Request.Params.Scheduling")
	proto.RegisterType((*Request_Params_Retry)(nil), "test_platform.Request.Params.Retry")
	proto.RegisterType((*Request_Params_Metadata)(nil), "test_platform.Request.Params.Metadata")
	proto.RegisterType((*Request_Params_Time)(nil), "test_platform.Request.Params.Time")
	proto.RegisterType((*Request_Params_Decorations)(nil), "test_platform.Request.Params.Decorations")
	proto.RegisterMapType((map[string]string)(nil), "test_platform.Request.Params.Decorations.AutotestKeyvalsEntry")
	proto.RegisterType((*Request_Params_Legacy)(nil), "test_platform.Request.Params.Legacy")
	proto.RegisterType((*Request_Params_Migrations)(nil), "test_platform.Request.Params.Migrations")
	proto.RegisterType((*Request_Suite)(nil), "test_platform.Request.Suite")
	proto.RegisterType((*Request_Test)(nil), "test_platform.Request.Test")
	proto.RegisterType((*Request_Test_Autotest)(nil), "test_platform.Request.Test.Autotest")
	proto.RegisterType((*Request_Enumeration)(nil), "test_platform.Request.Enumeration")
	proto.RegisterType((*Request_Enumeration_AutotestInvocation)(nil), "test_platform.Request.Enumeration.AutotestInvocation")
	proto.RegisterMapType((map[string]string)(nil), "test_platform.Request.Enumeration.AutotestInvocation.ResultKeyvalsEntry")
	proto.RegisterType((*Request_TestPlan)(nil), "test_platform.Request.TestPlan")
}

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

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