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

package test_platform

import (
	client "client"
	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"`
	ClientRequestId      *client.RequestId `protobuf:"bytes,6,opt,name=client_request_id,json=clientRequestId,proto3" json:"client_request_id,omitempty"`
	ClientProfileId      *client.ProfileId `protobuf:"bytes,7,opt,name=client_profile_id,json=clientProfileId,proto3" json:"client_profile_id,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
}

func (m *Request) GetClientRequestId() *client.RequestId {
	if m != nil {
		return m.ClientRequestId
	}
	return nil
}

func (m *Request) GetClientProfileId() *client.ProfileId {
	if m != nil {
		return m.ClientProfileId
	}
	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"`
	Notification         *Request_Params_Notification         `protobuf:"bytes,11,opt,name=notification,proto3" json:"notification,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) GetNotification() *Request_Params_Notification {
	if m != nil {
		return m.Notification
	}
	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 ""
}

// Notification defines parameters for the request to use to notify callers
// of its test's status updates.
type Request_Params_Notification struct {
	// Pubsub topic to broadcast status updates to
	PubsubTopic          string   `protobuf:"bytes,1,opt,name=pubsub_topic,json=pubsubTopic,proto3" json:"pubsub_topic,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Request_Params_Notification proto.InternalMessageInfo

func (m *Request_Params_Notification) GetPubsubTopic() string {
	if m != nil {
		return m.PubsubTopic
	}
	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"`
	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, 11}
}

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
}

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