// Copyright 2020 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// WARNING: DO NOT USE these protos outside of suite scheduler. This is
// only intended to help the transition to starlark configs. It will
// be deprecated once the new replacement is in place.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.27.1
// 	protoc        v3.17.1
// source: testplans/suite_scheduler.proto

package testplans

import (
	api "go.chromium.org/chromiumos/config/go/test/api"
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

// Branches that can be targeted.
type Branch int32

const (
	Branch_BRANCH_UNSPECIFIED Branch = 0
	// Canary Branch or ToT.
	Branch_CANARY Branch = 1
	// Dev Branch or ToT-1.
	Branch_DEV Branch = 2
	// Beta Branch or ToT-2.
	Branch_BETA Branch = 3
	// Stable Branch or ToT-3.
	Branch_STABLE Branch = 4
	// Long term support tracking branch. This channel does not follow a ToT-N
	// schema.
	Branch_LTS Branch = 5
)

// Enum value maps for Branch.
var (
	Branch_name = map[int32]string{
		0: "BRANCH_UNSPECIFIED",
		1: "CANARY",
		2: "DEV",
		3: "BETA",
		4: "STABLE",
		5: "LTS",
	}
	Branch_value = map[string]int32{
		"BRANCH_UNSPECIFIED": 0,
		"CANARY":             1,
		"DEV":                2,
		"BETA":               3,
		"STABLE":             4,
		"LTS":                5,
	}
)

func (x Branch) Enum() *Branch {
	p := new(Branch)
	*p = x
	return p
}

func (x Branch) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (Branch) Descriptor() protoreflect.EnumDescriptor {
	return file_testplans_suite_scheduler_proto_enumTypes[0].Descriptor()
}

func (Branch) Type() protoreflect.EnumType {
	return &file_testplans_suite_scheduler_proto_enumTypes[0]
}

func (x Branch) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use Branch.Descriptor instead.
func (Branch) EnumDescriptor() ([]byte, []int) {
	return file_testplans_suite_scheduler_proto_rawDescGZIP(), []int{0}
}

// Whether to use firmware from ToT or firmware branch.
type SchedulerConfig_FirmwareBranch int32

const (
	SchedulerConfig_UNSPECIFIED SchedulerConfig_FirmwareBranch = 0
	// Canary Branch or ToT.
	SchedulerConfig_CROS SchedulerConfig_FirmwareBranch = 1
	// Firmware branch.
	SchedulerConfig_FIRMWARE SchedulerConfig_FirmwareBranch = 2
	// Dev Branch or ToT-1.
	SchedulerConfig_DEV SchedulerConfig_FirmwareBranch = 3
	// Beta Branch or ToT-2.
	SchedulerConfig_BETA SchedulerConfig_FirmwareBranch = 4
	// Stable Branch or ToT-3.
	SchedulerConfig_STABLE SchedulerConfig_FirmwareBranch = 5
)

// Enum value maps for SchedulerConfig_FirmwareBranch.
var (
	SchedulerConfig_FirmwareBranch_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "CROS",
		2: "FIRMWARE",
		3: "DEV",
		4: "BETA",
		5: "STABLE",
	}
	SchedulerConfig_FirmwareBranch_value = map[string]int32{
		"UNSPECIFIED": 0,
		"CROS":        1,
		"FIRMWARE":    2,
		"DEV":         3,
		"BETA":        4,
		"STABLE":      5,
	}
)

func (x SchedulerConfig_FirmwareBranch) Enum() *SchedulerConfig_FirmwareBranch {
	p := new(SchedulerConfig_FirmwareBranch)
	*p = x
	return p
}

func (x SchedulerConfig_FirmwareBranch) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (SchedulerConfig_FirmwareBranch) Descriptor() protoreflect.EnumDescriptor {
	return file_testplans_suite_scheduler_proto_enumTypes[1].Descriptor()
}

func (SchedulerConfig_FirmwareBranch) Type() protoreflect.EnumType {
	return &file_testplans_suite_scheduler_proto_enumTypes[1]
}

func (x SchedulerConfig_FirmwareBranch) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use SchedulerConfig_FirmwareBranch.Descriptor instead.
func (SchedulerConfig_FirmwareBranch) EnumDescriptor() ([]byte, []int) {
	return file_testplans_suite_scheduler_proto_rawDescGZIP(), []int{3, 0}
}

type SchedulerConfig_TriggerType int32

const (
	SchedulerConfig_TRIGGER_UNSPECIFIED SchedulerConfig_TriggerType = 0
	// Trigger test whenever there is a new build for the primary board.
	SchedulerConfig_PRIMARY SchedulerConfig_TriggerType = 1
	// Trigger test when every board in the group has a new build.
	SchedulerConfig_ALL SchedulerConfig_TriggerType = 2
)

// Enum value maps for SchedulerConfig_TriggerType.
var (
	SchedulerConfig_TriggerType_name = map[int32]string{
		0: "TRIGGER_UNSPECIFIED",
		1: "PRIMARY",
		2: "ALL",
	}
	SchedulerConfig_TriggerType_value = map[string]int32{
		"TRIGGER_UNSPECIFIED": 0,
		"PRIMARY":             1,
		"ALL":                 2,
	}
)

func (x SchedulerConfig_TriggerType) Enum() *SchedulerConfig_TriggerType {
	p := new(SchedulerConfig_TriggerType)
	*p = x
	return p
}

func (x SchedulerConfig_TriggerType) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (SchedulerConfig_TriggerType) Descriptor() protoreflect.EnumDescriptor {
	return file_testplans_suite_scheduler_proto_enumTypes[2].Descriptor()
}

func (SchedulerConfig_TriggerType) Type() protoreflect.EnumType {
	return &file_testplans_suite_scheduler_proto_enumTypes[2]
}

func (x SchedulerConfig_TriggerType) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use SchedulerConfig_TriggerType.Descriptor instead.
func (SchedulerConfig_TriggerType) EnumDescriptor() ([]byte, []int) {
	return file_testplans_suite_scheduler_proto_rawDescGZIP(), []int{3, 1}
}

// LaunchProfile defines how often the suite is launched.
type SchedulerConfig_LaunchCriteria_LaunchProfile int32

const (
	SchedulerConfig_LaunchCriteria_UNSPECIFIED SchedulerConfig_LaunchCriteria_LaunchProfile = 0
	// Run on every new release build of the boards/variants targeted.
	SchedulerConfig_LaunchCriteria_NEW_BUILD SchedulerConfig_LaunchCriteria_LaunchProfile = 1
	// Run once a day at the specified hour. Used to be "NIGHTLY".
	SchedulerConfig_LaunchCriteria_DAILY SchedulerConfig_LaunchCriteria_LaunchProfile = 2
	// Run once a week at the specified time.
	SchedulerConfig_LaunchCriteria_WEEKLY SchedulerConfig_LaunchCriteria_LaunchProfile = 3
	// NOT SUPPORTED. Will be supported in the redesign.
	SchedulerConfig_LaunchCriteria_CRON_BASED SchedulerConfig_LaunchCriteria_LaunchProfile = 4
	// Run once every other week at the specified time
	SchedulerConfig_LaunchCriteria_FORTNIGHTLY SchedulerConfig_LaunchCriteria_LaunchProfile = 5
	// Run on when all release build of the boards/variants targeted in lab
	// config have finished.
	SchedulerConfig_LaunchCriteria_NEW_BUILD_3D SchedulerConfig_LaunchCriteria_LaunchProfile = 6
)

// Enum value maps for SchedulerConfig_LaunchCriteria_LaunchProfile.
var (
	SchedulerConfig_LaunchCriteria_LaunchProfile_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "NEW_BUILD",
		2: "DAILY",
		3: "WEEKLY",
		4: "CRON_BASED",
		5: "FORTNIGHTLY",
		6: "NEW_BUILD_3D",
	}
	SchedulerConfig_LaunchCriteria_LaunchProfile_value = map[string]int32{
		"UNSPECIFIED":  0,
		"NEW_BUILD":    1,
		"DAILY":        2,
		"WEEKLY":       3,
		"CRON_BASED":   4,
		"FORTNIGHTLY":  5,
		"NEW_BUILD_3D": 6,
	}
)

func (x SchedulerConfig_LaunchCriteria_LaunchProfile) Enum() *SchedulerConfig_LaunchCriteria_LaunchProfile {
	p := new(SchedulerConfig_LaunchCriteria_LaunchProfile)
	*p = x
	return p
}

func (x SchedulerConfig_LaunchCriteria_LaunchProfile) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (SchedulerConfig_LaunchCriteria_LaunchProfile) Descriptor() protoreflect.EnumDescriptor {
	return file_testplans_suite_scheduler_proto_enumTypes[3].Descriptor()
}

func (SchedulerConfig_LaunchCriteria_LaunchProfile) Type() protoreflect.EnumType {
	return &file_testplans_suite_scheduler_proto_enumTypes[3]
}

func (x SchedulerConfig_LaunchCriteria_LaunchProfile) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use SchedulerConfig_LaunchCriteria_LaunchProfile.Descriptor instead.
func (SchedulerConfig_LaunchCriteria_LaunchProfile) EnumDescriptor() ([]byte, []int) {
	return file_testplans_suite_scheduler_proto_rawDescGZIP(), []int{3, 1, 0}
}

// Defines a board, its variants and its models.
type Board struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Name of the board. Eg: eve.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// List of variants assiciated with the board.
	// This should only be the suffixes. Eg: ['-kernelnext'].
	Variants []string `protobuf:"bytes,2,rep,name=variants,proto3" json:"variants,omitempty"`
	// List of models of the boards to test on.
	Models []string `protobuf:"bytes,3,rep,name=models,proto3" json:"models,omitempty"`
}

func (x *Board) Reset() {
	*x = Board{}
	if protoimpl.UnsafeEnabled {
		mi := &file_testplans_suite_scheduler_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *Board) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Board) ProtoMessage() {}

func (x *Board) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_suite_scheduler_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use Board.ProtoReflect.Descriptor instead.
func (*Board) Descriptor() ([]byte, []int) {
	return file_testplans_suite_scheduler_proto_rawDescGZIP(), []int{0}
}

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

func (x *Board) GetVariants() []string {
	if x != nil {
		return x.Variants
	}
	return nil
}

func (x *Board) GetModels() []string {
	if x != nil {
		return x.Models
	}
	return nil
}

// Aims to reflect data in lab_config.ini.
type LabConfig struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// List of board definitions for ChromeOS.
	Boards []*Board `protobuf:"bytes,1,rep,name=boards,proto3" json:"boards,omitempty"`
	// List of board definitions for Android.
	AndroidBoards []*Board `protobuf:"bytes,2,rep,name=android_boards,json=androidBoards,proto3" json:"android_boards,omitempty"`
}

func (x *LabConfig) Reset() {
	*x = LabConfig{}
	if protoimpl.UnsafeEnabled {
		mi := &file_testplans_suite_scheduler_proto_msgTypes[1]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *LabConfig) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*LabConfig) ProtoMessage() {}

func (x *LabConfig) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_suite_scheduler_proto_msgTypes[1]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use LabConfig.ProtoReflect.Descriptor instead.
func (*LabConfig) Descriptor() ([]byte, []int) {
	return file_testplans_suite_scheduler_proto_rawDescGZIP(), []int{1}
}

func (x *LabConfig) GetBoards() []*Board {
	if x != nil {
		return x.Boards
	}
	return nil
}

func (x *LabConfig) GetAndroidBoards() []*Board {
	if x != nil {
		return x.AndroidBoards
	}
	return nil
}

// Specify a Board and Variant pair.
type BoardVariant struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Board   string `protobuf:"bytes,1,opt,name=board,proto3" json:"board,omitempty"`
	Variant string `protobuf:"bytes,2,opt,name=variant,proto3" json:"variant,omitempty"`
}

func (x *BoardVariant) Reset() {
	*x = BoardVariant{}
	if protoimpl.UnsafeEnabled {
		mi := &file_testplans_suite_scheduler_proto_msgTypes[2]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *BoardVariant) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*BoardVariant) ProtoMessage() {}

func (x *BoardVariant) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_suite_scheduler_proto_msgTypes[2]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use BoardVariant.ProtoReflect.Descriptor instead.
func (*BoardVariant) Descriptor() ([]byte, []int) {
	return file_testplans_suite_scheduler_proto_rawDescGZIP(), []int{2}
}

func (x *BoardVariant) GetBoard() string {
	if x != nil {
		return x.Board
	}
	return ""
}

func (x *BoardVariant) GetVariant() string {
	if x != nil {
		return x.Variant
	}
	return ""
}

// Most fields are the same as suite_scheduler.ini just better organized.
// The entries will be used to generate a suite_scheduler.ini in starlark
// scripts. next: 23
type SchedulerConfig struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Name of the config. Needs to be unique.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Name of the suite to run.
	Suite          string                          `protobuf:"bytes,2,opt,name=suite,proto3" json:"suite,omitempty"`
	Contacts       []*SchedulerConfig_Contact      `protobuf:"bytes,3,rep,name=contacts,proto3" json:"contacts,omitempty"`
	LaunchCriteria *SchedulerConfig_LaunchCriteria `protobuf:"bytes,4,opt,name=launch_criteria,json=launchCriteria,proto3" json:"launch_criteria,omitempty"`
	// Branches to target.
	Branches      []Branch                       `protobuf:"varint,5,rep,packed,name=branches,proto3,enum=testplans.Branch" json:"branches,omitempty"`
	TargetOptions *SchedulerConfig_TargetOptions `protobuf:"bytes,6,opt,name=target_options,json=targetOptions,proto3" json:"target_options,omitempty"`
	PoolOptions   *SchedulerConfig_PoolOptions   `protobuf:"bytes,7,opt,name=pool_options,json=poolOptions,proto3" json:"pool_options,omitempty"`
	// Assume as AP build.
	//
	// Types that are assignable to FirmwareRo:
	//	*SchedulerConfig_FirmwareRoBuildSpec
	//	*SchedulerConfig_FirmwareRoVersion
	FirmwareRo isSchedulerConfig_FirmwareRo `protobuf_oneof:"firmware_ro"`
	// Assume as AP build.
	//
	// Types that are assignable to FirmwareRw:
	//	*SchedulerConfig_FirmwareRwBuildSpec
	//	*SchedulerConfig_FirmwareRwVersion
	FirmwareRw isSchedulerConfig_FirmwareRw `protobuf_oneof:"firmware_rw"`
	// Types that are assignable to FirmwareEcRo:
	//	*SchedulerConfig_FirmwareEcRoBuildSpec
	//	*SchedulerConfig_FirmwareEcRoVersion
	FirmwareEcRo isSchedulerConfig_FirmwareEcRo `protobuf_oneof:"firmware_ec_ro"`
	// Types that are assignable to FirmwareEcRw:
	//	*SchedulerConfig_FirmwareEcRwBuildSpec
	//	*SchedulerConfig_FirmwareEcRwVersion
	FirmwareEcRw isSchedulerConfig_FirmwareEcRw `protobuf_oneof:"firmware_ec_rw"`
	// The name of the firmware branch to use for firmware_ro_build_spec
	// and firmware_rw_build_spec is normally the derived from the board.
	// Set firmware_board_name to override this.
	FirmwareBoardName string                      `protobuf:"bytes,14,opt,name=firmware_board_name,json=firmwareBoardName,proto3" json:"firmware_board_name,omitempty"`
	RunOptions        *SchedulerConfig_RunOptions `protobuf:"bytes,9,opt,name=run_options,json=runOptions,proto3" json:"run_options,omitempty"`
	// Name of the config, used for analytics. Does not have to be unique.
	AnalyticsName string `protobuf:"bytes,10,opt,name=analytics_name,json=analyticsName,proto3" json:"analytics_name,omitempty"`
	// The android image version for android provisioning
	AndroidImageVersion string `protobuf:"bytes,15,opt,name=android_image_version,json=androidImageVersion,proto3" json:"android_image_version,omitempty"`
	// GMSCORE cipd package ref for android provisioning
	GmsCorePackage string `protobuf:"bytes,16,opt,name=gms_core_package,json=gmsCorePackage,proto3" json:"gms_core_package,omitempty"`
	// List of Karbon Filters for the ctpv2 request object.
	// To be converted to json str for config generation.
	KarbonFilters []*api.CTPFilter `protobuf:"bytes,17,rep,name=karbon_filters,json=karbonFilters,proto3" json:"karbon_filters,omitempty"`
	// List of Koffee Filters for the ctpv2 request object.
	// To be converted to json str for config generation.
	KoffeeFilters []*api.CTPFilter `protobuf:"bytes,18,rep,name=koffee_filters,json=koffeeFilters,proto3" json:"koffee_filters,omitempty"`
	// Args will be provided to the respective test harness.
	TestArgs string `protobuf:"bytes,23,opt,name=test_args,json=testArgs,proto3" json:"test_args,omitempty"`
	// if enable_autotest_sharding is True, then autotest tests will be sharded.
	EnableAutotestSharding bool `protobuf:"varint,24,opt,name=enable_autotest_sharding,json=enableAutotestSharding,proto3" json:"enable_autotest_sharding,omitempty"`
	// If set the suite will be run using CTPv2, using the 3D solver to determine
	// hardware Note all tests within this suite/group *must* have a 3d expression
	// set in the respective harness
	DddSuite bool `protobuf:"varint,25,opt,name=ddd_suite,json=dddSuite,proto3" json:"ddd_suite,omitempty"`
}

func (x *SchedulerConfig) Reset() {
	*x = SchedulerConfig{}
	if protoimpl.UnsafeEnabled {
		mi := &file_testplans_suite_scheduler_proto_msgTypes[3]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *SchedulerConfig) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*SchedulerConfig) ProtoMessage() {}

func (x *SchedulerConfig) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_suite_scheduler_proto_msgTypes[3]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use SchedulerConfig.ProtoReflect.Descriptor instead.
func (*SchedulerConfig) Descriptor() ([]byte, []int) {
	return file_testplans_suite_scheduler_proto_rawDescGZIP(), []int{3}
}

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

func (x *SchedulerConfig) GetSuite() string {
	if x != nil {
		return x.Suite
	}
	return ""
}

func (x *SchedulerConfig) GetContacts() []*SchedulerConfig_Contact {
	if x != nil {
		return x.Contacts
	}
	return nil
}

func (x *SchedulerConfig) GetLaunchCriteria() *SchedulerConfig_LaunchCriteria {
	if x != nil {
		return x.LaunchCriteria
	}
	return nil
}

func (x *SchedulerConfig) GetBranches() []Branch {
	if x != nil {
		return x.Branches
	}
	return nil
}

func (x *SchedulerConfig) GetTargetOptions() *SchedulerConfig_TargetOptions {
	if x != nil {
		return x.TargetOptions
	}
	return nil
}

func (x *SchedulerConfig) GetPoolOptions() *SchedulerConfig_PoolOptions {
	if x != nil {
		return x.PoolOptions
	}
	return nil
}

func (m *SchedulerConfig) GetFirmwareRo() isSchedulerConfig_FirmwareRo {
	if m != nil {
		return m.FirmwareRo
	}
	return nil
}

func (x *SchedulerConfig) GetFirmwareRoBuildSpec() SchedulerConfig_FirmwareBranch {
	if x, ok := x.GetFirmwareRo().(*SchedulerConfig_FirmwareRoBuildSpec); ok {
		return x.FirmwareRoBuildSpec
	}
	return SchedulerConfig_UNSPECIFIED
}

func (x *SchedulerConfig) GetFirmwareRoVersion() string {
	if x, ok := x.GetFirmwareRo().(*SchedulerConfig_FirmwareRoVersion); ok {
		return x.FirmwareRoVersion
	}
	return ""
}

func (m *SchedulerConfig) GetFirmwareRw() isSchedulerConfig_FirmwareRw {
	if m != nil {
		return m.FirmwareRw
	}
	return nil
}

func (x *SchedulerConfig) GetFirmwareRwBuildSpec() SchedulerConfig_FirmwareBranch {
	if x, ok := x.GetFirmwareRw().(*SchedulerConfig_FirmwareRwBuildSpec); ok {
		return x.FirmwareRwBuildSpec
	}
	return SchedulerConfig_UNSPECIFIED
}

func (x *SchedulerConfig) GetFirmwareRwVersion() string {
	if x, ok := x.GetFirmwareRw().(*SchedulerConfig_FirmwareRwVersion); ok {
		return x.FirmwareRwVersion
	}
	return ""
}

func (m *SchedulerConfig) GetFirmwareEcRo() isSchedulerConfig_FirmwareEcRo {
	if m != nil {
		return m.FirmwareEcRo
	}
	return nil
}

func (x *SchedulerConfig) GetFirmwareEcRoBuildSpec() SchedulerConfig_FirmwareBranch {
	if x, ok := x.GetFirmwareEcRo().(*SchedulerConfig_FirmwareEcRoBuildSpec); ok {
		return x.FirmwareEcRoBuildSpec
	}
	return SchedulerConfig_UNSPECIFIED
}

func (x *SchedulerConfig) GetFirmwareEcRoVersion() string {
	if x, ok := x.GetFirmwareEcRo().(*SchedulerConfig_FirmwareEcRoVersion); ok {
		return x.FirmwareEcRoVersion
	}
	return ""
}

func (m *SchedulerConfig) GetFirmwareEcRw() isSchedulerConfig_FirmwareEcRw {
	if m != nil {
		return m.FirmwareEcRw
	}
	return nil
}

func (x *SchedulerConfig) GetFirmwareEcRwBuildSpec() SchedulerConfig_FirmwareBranch {
	if x, ok := x.GetFirmwareEcRw().(*SchedulerConfig_FirmwareEcRwBuildSpec); ok {
		return x.FirmwareEcRwBuildSpec
	}
	return SchedulerConfig_UNSPECIFIED
}

func (x *SchedulerConfig) GetFirmwareEcRwVersion() string {
	if x, ok := x.GetFirmwareEcRw().(*SchedulerConfig_FirmwareEcRwVersion); ok {
		return x.FirmwareEcRwVersion
	}
	return ""
}

func (x *SchedulerConfig) GetFirmwareBoardName() string {
	if x != nil {
		return x.FirmwareBoardName
	}
	return ""
}

func (x *SchedulerConfig) GetRunOptions() *SchedulerConfig_RunOptions {
	if x != nil {
		return x.RunOptions
	}
	return nil
}

func (x *SchedulerConfig) GetAnalyticsName() string {
	if x != nil {
		return x.AnalyticsName
	}
	return ""
}

func (x *SchedulerConfig) GetAndroidImageVersion() string {
	if x != nil {
		return x.AndroidImageVersion
	}
	return ""
}

func (x *SchedulerConfig) GetGmsCorePackage() string {
	if x != nil {
		return x.GmsCorePackage
	}
	return ""
}

func (x *SchedulerConfig) GetKarbonFilters() []*api.CTPFilter {
	if x != nil {
		return x.KarbonFilters
	}
	return nil
}

func (x *SchedulerConfig) GetKoffeeFilters() []*api.CTPFilter {
	if x != nil {
		return x.KoffeeFilters
	}
	return nil
}

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

func (x *SchedulerConfig) GetEnableAutotestSharding() bool {
	if x != nil {
		return x.EnableAutotestSharding
	}
	return false
}

func (x *SchedulerConfig) GetDddSuite() bool {
	if x != nil {
		return x.DddSuite
	}
	return false
}

type isSchedulerConfig_FirmwareRo interface {
	isSchedulerConfig_FirmwareRo()
}

type SchedulerConfig_FirmwareRoBuildSpec struct {
	FirmwareRoBuildSpec SchedulerConfig_FirmwareBranch `protobuf:"varint,8,opt,name=firmware_ro_build_spec,json=firmwareRoBuildSpec,proto3,enum=testplans.SchedulerConfig_FirmwareBranch,oneof"`
}

type SchedulerConfig_FirmwareRoVersion struct {
	// Pinned RO firmware path (e.g. coral-firmware/R64-10068.106.0)
	// Uses firmware_from_source.tar.bz2 from this archive path
	// instead of pulling from latest firmware-branch or cros-tot build.
	FirmwareRoVersion string `protobuf:"bytes,11,opt,name=firmware_ro_version,json=firmwareRoVersion,proto3,oneof"`
}

func (*SchedulerConfig_FirmwareRoBuildSpec) isSchedulerConfig_FirmwareRo() {}

func (*SchedulerConfig_FirmwareRoVersion) isSchedulerConfig_FirmwareRo() {}

type isSchedulerConfig_FirmwareRw interface {
	isSchedulerConfig_FirmwareRw()
}

type SchedulerConfig_FirmwareRwBuildSpec struct {
	FirmwareRwBuildSpec SchedulerConfig_FirmwareBranch `protobuf:"varint,12,opt,name=firmware_rw_build_spec,json=firmwareRwBuildSpec,proto3,enum=testplans.SchedulerConfig_FirmwareBranch,oneof"`
}

type SchedulerConfig_FirmwareRwVersion struct {
	// Pinned RW firmware path (e.g. coral-firmware/R64-10068.106.0)
	// Uses firmware_from_source.tar.bz2 from this archive path
	// instead of pulling from latest firmware-branch or cros-tot build.
	FirmwareRwVersion string `protobuf:"bytes,13,opt,name=firmware_rw_version,json=firmwareRwVersion,proto3,oneof"`
}

func (*SchedulerConfig_FirmwareRwBuildSpec) isSchedulerConfig_FirmwareRw() {}

func (*SchedulerConfig_FirmwareRwVersion) isSchedulerConfig_FirmwareRw() {}

type isSchedulerConfig_FirmwareEcRo interface {
	isSchedulerConfig_FirmwareEcRo()
}

type SchedulerConfig_FirmwareEcRoBuildSpec struct {
	FirmwareEcRoBuildSpec SchedulerConfig_FirmwareBranch `protobuf:"varint,19,opt,name=firmware_ec_ro_build_spec,json=firmwareEcRoBuildSpec,proto3,enum=testplans.SchedulerConfig_FirmwareBranch,oneof"`
}

type SchedulerConfig_FirmwareEcRoVersion struct {
	// Pinned RO firmware path (e.g. coral-firmware/R64-10068.106.0)
	// Uses firmware_from_source.tar.bz2 from this archive path
	// instead of pulling from latest firmware-branch or cros-tot build.
	FirmwareEcRoVersion string `protobuf:"bytes,20,opt,name=firmware_ec_ro_version,json=firmwareEcRoVersion,proto3,oneof"`
}

func (*SchedulerConfig_FirmwareEcRoBuildSpec) isSchedulerConfig_FirmwareEcRo() {}

func (*SchedulerConfig_FirmwareEcRoVersion) isSchedulerConfig_FirmwareEcRo() {}

type isSchedulerConfig_FirmwareEcRw interface {
	isSchedulerConfig_FirmwareEcRw()
}

type SchedulerConfig_FirmwareEcRwBuildSpec struct {
	FirmwareEcRwBuildSpec SchedulerConfig_FirmwareBranch `protobuf:"varint,21,opt,name=firmware_ec_rw_build_spec,json=firmwareEcRwBuildSpec,proto3,enum=testplans.SchedulerConfig_FirmwareBranch,oneof"`
}

type SchedulerConfig_FirmwareEcRwVersion struct {
	// Pinned RW firmware path (e.g. coral-firmware/R64-10068.106.0)
	// Uses firmware_from_source.tar.bz2 from this archive path
	// instead of pulling from latest firmware-branch or cros-tot build.
	FirmwareEcRwVersion string `protobuf:"bytes,22,opt,name=firmware_ec_rw_version,json=firmwareEcRwVersion,proto3,oneof"`
}

func (*SchedulerConfig_FirmwareEcRwBuildSpec) isSchedulerConfig_FirmwareEcRw() {}

func (*SchedulerConfig_FirmwareEcRwVersion) isSchedulerConfig_FirmwareEcRw() {}

// A proto to contain all the configs.
type SchedulerCfg struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Configs []*SchedulerConfig `protobuf:"bytes,1,rep,name=configs,proto3" json:"configs,omitempty"`
}

func (x *SchedulerCfg) Reset() {
	*x = SchedulerCfg{}
	if protoimpl.UnsafeEnabled {
		mi := &file_testplans_suite_scheduler_proto_msgTypes[4]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *SchedulerCfg) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*SchedulerCfg) ProtoMessage() {}

func (x *SchedulerCfg) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_suite_scheduler_proto_msgTypes[4]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use SchedulerCfg.ProtoReflect.Descriptor instead.
func (*SchedulerCfg) Descriptor() ([]byte, []int) {
	return file_testplans_suite_scheduler_proto_rawDescGZIP(), []int{4}
}

func (x *SchedulerCfg) GetConfigs() []*SchedulerConfig {
	if x != nil {
		return x.Configs
	}
	return nil
}

// Contact emails will one day be paged in case of problems with the config.
type SchedulerConfig_Contact struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Email string `protobuf:"bytes,1,opt,name=email,proto3" json:"email,omitempty"`
}

func (x *SchedulerConfig_Contact) Reset() {
	*x = SchedulerConfig_Contact{}
	if protoimpl.UnsafeEnabled {
		mi := &file_testplans_suite_scheduler_proto_msgTypes[5]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *SchedulerConfig_Contact) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*SchedulerConfig_Contact) ProtoMessage() {}

func (x *SchedulerConfig_Contact) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_suite_scheduler_proto_msgTypes[5]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use SchedulerConfig_Contact.ProtoReflect.Descriptor instead.
func (*SchedulerConfig_Contact) Descriptor() ([]byte, []int) {
	return file_testplans_suite_scheduler_proto_rawDescGZIP(), []int{3, 0}
}

func (x *SchedulerConfig_Contact) GetEmail() string {
	if x != nil {
		return x.Email
	}
	return ""
}

// LaunchCriteria specifies when the suite should be launched.
type SchedulerConfig_LaunchCriteria struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	LaunchProfile SchedulerConfig_LaunchCriteria_LaunchProfile `protobuf:"varint,1,opt,name=launch_profile,json=launchProfile,proto3,enum=testplans.SchedulerConfig_LaunchCriteria_LaunchProfile" json:"launch_profile,omitempty"`
	// Hour at which to run. Needs to be specified for nightly and weekly
	// profiles. Has to be [0, 23].
	Hour int32 `protobuf:"varint,2,opt,name=hour,proto3" json:"hour,omitempty"`
	// Day on which to run. Needs to be specified for weekly AND fortnightly
	// profile. Has to be [0, 6].
	Day int32 `protobuf:"varint,3,opt,name=day,proto3" json:"day,omitempty"`
	// NOT SUPPORTED. Cron compatible schedule eg: "* * 1,3,5 * *".
	CronSchedule string `protobuf:"bytes,4,opt,name=cron_schedule,json=cronSchedule,proto3" json:"cron_schedule,omitempty"`
}

func (x *SchedulerConfig_LaunchCriteria) Reset() {
	*x = SchedulerConfig_LaunchCriteria{}
	if protoimpl.UnsafeEnabled {
		mi := &file_testplans_suite_scheduler_proto_msgTypes[6]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *SchedulerConfig_LaunchCriteria) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*SchedulerConfig_LaunchCriteria) ProtoMessage() {}

func (x *SchedulerConfig_LaunchCriteria) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_suite_scheduler_proto_msgTypes[6]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use SchedulerConfig_LaunchCriteria.ProtoReflect.Descriptor instead.
func (*SchedulerConfig_LaunchCriteria) Descriptor() ([]byte, []int) {
	return file_testplans_suite_scheduler_proto_rawDescGZIP(), []int{3, 1}
}

func (x *SchedulerConfig_LaunchCriteria) GetLaunchProfile() SchedulerConfig_LaunchCriteria_LaunchProfile {
	if x != nil {
		return x.LaunchProfile
	}
	return SchedulerConfig_LaunchCriteria_UNSPECIFIED
}

func (x *SchedulerConfig_LaunchCriteria) GetHour() int32 {
	if x != nil {
		return x.Hour
	}
	return 0
}

func (x *SchedulerConfig_LaunchCriteria) GetDay() int32 {
	if x != nil {
		return x.Day
	}
	return 0
}

func (x *SchedulerConfig_LaunchCriteria) GetCronSchedule() string {
	if x != nil {
		return x.CronSchedule
	}
	return ""
}

// Set of boards, variants and models to target.
// next tag: 12
type SchedulerConfig_TargetOptions struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Use at the most one among the two fields below. If boards_list is empty,
	// all boards are targeted. exclude_boards will exclude those boards from
	// the all boards list.
	BoardsList    []string `protobuf:"bytes,1,rep,name=boards_list,json=boardsList,proto3" json:"boards_list,omitempty"`
	ExcludeBoards []string `protobuf:"bytes,2,rep,name=exclude_boards,json=excludeBoards,proto3" json:"exclude_boards,omitempty"`
	// To specify variants, either all variants can be skipped.
	SkipVariants bool `protobuf:"varint,8,opt,name=skip_variants,json=skipVariants,proto3" json:"skip_variants,omitempty"`
	// OR use at the most one among the two fields below. If variants_list is
	// empty, all variants are targeted. exclude_variants will exclude those
	// variants from the all variants list.
	VariantsList    []*BoardVariant `protobuf:"bytes,3,rep,name=variants_list,json=variantsList,proto3" json:"variants_list,omitempty"`
	ExcludeVariants []*BoardVariant `protobuf:"bytes,4,rep,name=exclude_variants,json=excludeVariants,proto3" json:"exclude_variants,omitempty"`
	// There's two ways of specifying models. If all of these fields are empty,
	// all possible models are targeted.
	// Models to be targeted can be listed explicitly in models_list.
	ModelsList []string `protobuf:"bytes,5,rep,name=models_list,json=modelsList,proto3" json:"models_list,omitempty"`
	// OR start with the complete list and exclude some specific models.
	// any_model only tests the suite on a single model.
	AnyModel      bool     `protobuf:"varint,6,opt,name=any_model,json=anyModel,proto3" json:"any_model,omitempty"`
	ExcludeModels []string `protobuf:"bytes,7,rep,name=exclude_models,json=excludeModels,proto3" json:"exclude_models,omitempty"`
	// Option to speicify Mult-DUTs testing board/model, use only one of
	// below options. When below multi-DUTs options are invoked, boards_list
	// models_list, variants, and exclude control above will be ignored.
	MultiDutsBoardsList []*SchedulerConfig_TargetOptions_MultiDutsByBoard `protobuf:"bytes,9,rep,name=multi_duts_boards_list,json=multiDutsBoardsList,proto3" json:"multi_duts_boards_list,omitempty"`
	MultiDutsModelsList []*SchedulerConfig_TargetOptions_MultiDutsByModel `protobuf:"bytes,11,rep,name=multi_duts_models_list,json=multiDutsModelsList,proto3" json:"multi_duts_models_list,omitempty"`
}

func (x *SchedulerConfig_TargetOptions) Reset() {
	*x = SchedulerConfig_TargetOptions{}
	if protoimpl.UnsafeEnabled {
		mi := &file_testplans_suite_scheduler_proto_msgTypes[7]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *SchedulerConfig_TargetOptions) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*SchedulerConfig_TargetOptions) ProtoMessage() {}

func (x *SchedulerConfig_TargetOptions) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_suite_scheduler_proto_msgTypes[7]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use SchedulerConfig_TargetOptions.ProtoReflect.Descriptor instead.
func (*SchedulerConfig_TargetOptions) Descriptor() ([]byte, []int) {
	return file_testplans_suite_scheduler_proto_rawDescGZIP(), []int{3, 2}
}

func (x *SchedulerConfig_TargetOptions) GetBoardsList() []string {
	if x != nil {
		return x.BoardsList
	}
	return nil
}

func (x *SchedulerConfig_TargetOptions) GetExcludeBoards() []string {
	if x != nil {
		return x.ExcludeBoards
	}
	return nil
}

func (x *SchedulerConfig_TargetOptions) GetSkipVariants() bool {
	if x != nil {
		return x.SkipVariants
	}
	return false
}

func (x *SchedulerConfig_TargetOptions) GetVariantsList() []*BoardVariant {
	if x != nil {
		return x.VariantsList
	}
	return nil
}

func (x *SchedulerConfig_TargetOptions) GetExcludeVariants() []*BoardVariant {
	if x != nil {
		return x.ExcludeVariants
	}
	return nil
}

func (x *SchedulerConfig_TargetOptions) GetModelsList() []string {
	if x != nil {
		return x.ModelsList
	}
	return nil
}

func (x *SchedulerConfig_TargetOptions) GetAnyModel() bool {
	if x != nil {
		return x.AnyModel
	}
	return false
}

func (x *SchedulerConfig_TargetOptions) GetExcludeModels() []string {
	if x != nil {
		return x.ExcludeModels
	}
	return nil
}

func (x *SchedulerConfig_TargetOptions) GetMultiDutsBoardsList() []*SchedulerConfig_TargetOptions_MultiDutsByBoard {
	if x != nil {
		return x.MultiDutsBoardsList
	}
	return nil
}

func (x *SchedulerConfig_TargetOptions) GetMultiDutsModelsList() []*SchedulerConfig_TargetOptions_MultiDutsByModel {
	if x != nil {
		return x.MultiDutsModelsList
	}
	return nil
}

// Aggregate of options related to DUT pool.
type SchedulerConfig_PoolOptions struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Quota Scheduler account to use.
	QsAccount string `protobuf:"bytes,1,opt,name=qs_account,json=qsAccount,proto3" json:"qs_account,omitempty"`
	// Pool to schedule on.
	Pool string `protobuf:"bytes,2,opt,name=pool,proto3" json:"pool,omitempty"`
	// Integer priority to assign. Only used by CTS. Quota scheduler takes care
	// of priorities for the rest. Has to be [20, 255].
	Priority int32 `protobuf:"varint,3,opt,name=priority,proto3" json:"priority,omitempty"`
}

func (x *SchedulerConfig_PoolOptions) Reset() {
	*x = SchedulerConfig_PoolOptions{}
	if protoimpl.UnsafeEnabled {
		mi := &file_testplans_suite_scheduler_proto_msgTypes[8]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *SchedulerConfig_PoolOptions) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*SchedulerConfig_PoolOptions) ProtoMessage() {}

func (x *SchedulerConfig_PoolOptions) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_suite_scheduler_proto_msgTypes[8]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use SchedulerConfig_PoolOptions.ProtoReflect.Descriptor instead.
func (*SchedulerConfig_PoolOptions) Descriptor() ([]byte, []int) {
	return file_testplans_suite_scheduler_proto_rawDescGZIP(), []int{3, 3}
}

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

func (x *SchedulerConfig_PoolOptions) GetPool() string {
	if x != nil {
		return x.Pool
	}
	return ""
}

func (x *SchedulerConfig_PoolOptions) GetPriority() int32 {
	if x != nil {
		return x.Priority
	}
	return 0
}

// Execution related options.
type SchedulerConfig_RunOptions struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Whether to retry if the task fails.
	Retry      bool                                            `protobuf:"varint,1,opt,name=retry,proto3" json:"retry,omitempty"`
	Dimensions []*SchedulerConfig_RunOptions_SwarmingDimension `protobuf:"bytes,2,rep,name=dimensions,proto3" json:"dimensions,omitempty"`
	// Timeout of the task.
	TimeoutMins int32 `protobuf:"varint,3,opt,name=timeout_mins,json=timeoutMins,proto3" json:"timeout_mins,omitempty"`
	// Use only_successful_build_required instead.
	//
	// Deprecated: Do not use.
	OnlySanityTestRequired bool                        `protobuf:"varint,4,opt,name=only_sanity_test_required,json=onlySanityTestRequired,proto3" json:"only_sanity_test_required,omitempty"`
	TriggerType            SchedulerConfig_TriggerType `protobuf:"varint,5,opt,name=trigger_type,json=triggerType,proto3,enum=testplans.SchedulerConfig_TriggerType" json:"trigger_type,omitempty"`
	// If build passed and was uploaded, launch this test.
	OnlySuccessfulBuildRequired bool `protobuf:"varint,6,opt,name=only_successful_build_required,json=onlySuccessfulBuildRequired,proto3" json:"only_successful_build_required,omitempty"`
	// If set, suite will be executed through CFT execution path.
	RunViaCft bool `protobuf:"varint,7,opt,name=run_via_cft,json=runViaCft,proto3" json:"run_via_cft,omitempty"`
	// Tags criteria that will be used to enumerate tests for CFT test execution
	// workflow. Will only be used if run_via_cft is true.
	TagCriteria *api.TestSuite_TestCaseTagCriteria `protobuf:"bytes,8,opt,name=tag_criteria,json=tagCriteria,proto3" json:"tag_criteria,omitempty"`
	// Bucket to schedule tasks in. If not provided, suite scheduler should
	// assign the task to an appropriate "mainlab" builder.
	BuilderId *SchedulerConfig_RunOptions_BuilderID `protobuf:"bytes,9,opt,name=builder_id,json=builderId,proto3" json:"builder_id,omitempty"`
	// If set, suite will be executed through ctpv2.
	RunViaCtpv2 bool `protobuf:"varint,10,opt,name=run_via_ctpv2,json=runViaCtpv2,proto3" json:"run_via_ctpv2,omitempty"`
	// GCS Bucket to fetch CrOS images from. If not provided, will be
	// "chromeos-image-archive"
	CrosImageBucket string `protobuf:"bytes,11,opt,name=cros_image_bucket,json=crosImageBucket,proto3" json:"cros_image_bucket,omitempty"`
	// If true and run_via_cft is true, this suite will run via trv2.
	RunViaTrv2 bool `protobuf:"varint,12,opt,name=run_via_trv2,json=runViaTrv2,proto3" json:"run_via_trv2,omitempty"`
	// If set, trv2 request will be translated to the dynamic trv2 request.
	// Requires run_via_trv2 is true.
	DynamicTrv2 bool `protobuf:"varint,13,opt,name=dynamic_trv2,json=dynamicTrv2,proto3" json:"dynamic_trv2,omitempty"`
}

func (x *SchedulerConfig_RunOptions) Reset() {
	*x = SchedulerConfig_RunOptions{}
	if protoimpl.UnsafeEnabled {
		mi := &file_testplans_suite_scheduler_proto_msgTypes[9]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *SchedulerConfig_RunOptions) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*SchedulerConfig_RunOptions) ProtoMessage() {}

func (x *SchedulerConfig_RunOptions) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_suite_scheduler_proto_msgTypes[9]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use SchedulerConfig_RunOptions.ProtoReflect.Descriptor instead.
func (*SchedulerConfig_RunOptions) Descriptor() ([]byte, []int) {
	return file_testplans_suite_scheduler_proto_rawDescGZIP(), []int{3, 4}
}

func (x *SchedulerConfig_RunOptions) GetRetry() bool {
	if x != nil {
		return x.Retry
	}
	return false
}

func (x *SchedulerConfig_RunOptions) GetDimensions() []*SchedulerConfig_RunOptions_SwarmingDimension {
	if x != nil {
		return x.Dimensions
	}
	return nil
}

func (x *SchedulerConfig_RunOptions) GetTimeoutMins() int32 {
	if x != nil {
		return x.TimeoutMins
	}
	return 0
}

// Deprecated: Do not use.
func (x *SchedulerConfig_RunOptions) GetOnlySanityTestRequired() bool {
	if x != nil {
		return x.OnlySanityTestRequired
	}
	return false
}

func (x *SchedulerConfig_RunOptions) GetTriggerType() SchedulerConfig_TriggerType {
	if x != nil {
		return x.TriggerType
	}
	return SchedulerConfig_TRIGGER_UNSPECIFIED
}

func (x *SchedulerConfig_RunOptions) GetOnlySuccessfulBuildRequired() bool {
	if x != nil {
		return x.OnlySuccessfulBuildRequired
	}
	return false
}

func (x *SchedulerConfig_RunOptions) GetRunViaCft() bool {
	if x != nil {
		return x.RunViaCft
	}
	return false
}

func (x *SchedulerConfig_RunOptions) GetTagCriteria() *api.TestSuite_TestCaseTagCriteria {
	if x != nil {
		return x.TagCriteria
	}
	return nil
}

func (x *SchedulerConfig_RunOptions) GetBuilderId() *SchedulerConfig_RunOptions_BuilderID {
	if x != nil {
		return x.BuilderId
	}
	return nil
}

func (x *SchedulerConfig_RunOptions) GetRunViaCtpv2() bool {
	if x != nil {
		return x.RunViaCtpv2
	}
	return false
}

func (x *SchedulerConfig_RunOptions) GetCrosImageBucket() string {
	if x != nil {
		return x.CrosImageBucket
	}
	return ""
}

func (x *SchedulerConfig_RunOptions) GetRunViaTrv2() bool {
	if x != nil {
		return x.RunViaTrv2
	}
	return false
}

func (x *SchedulerConfig_RunOptions) GetDynamicTrv2() bool {
	if x != nil {
		return x.DynamicTrv2
	}
	return false
}

// next tag: 3
type SchedulerConfig_TargetOptions_MultiDutsByBoard struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	PrimaryBoard    string   `protobuf:"bytes,1,opt,name=primary_board,json=primaryBoard,proto3" json:"primary_board,omitempty"`
	SecondaryBoards []string `protobuf:"bytes,2,rep,name=secondary_boards,json=secondaryBoards,proto3" json:"secondary_boards,omitempty"`
}

func (x *SchedulerConfig_TargetOptions_MultiDutsByBoard) Reset() {
	*x = SchedulerConfig_TargetOptions_MultiDutsByBoard{}
	if protoimpl.UnsafeEnabled {
		mi := &file_testplans_suite_scheduler_proto_msgTypes[10]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *SchedulerConfig_TargetOptions_MultiDutsByBoard) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*SchedulerConfig_TargetOptions_MultiDutsByBoard) ProtoMessage() {}

func (x *SchedulerConfig_TargetOptions_MultiDutsByBoard) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_suite_scheduler_proto_msgTypes[10]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use SchedulerConfig_TargetOptions_MultiDutsByBoard.ProtoReflect.Descriptor instead.
func (*SchedulerConfig_TargetOptions_MultiDutsByBoard) Descriptor() ([]byte, []int) {
	return file_testplans_suite_scheduler_proto_rawDescGZIP(), []int{3, 2, 0}
}

func (x *SchedulerConfig_TargetOptions_MultiDutsByBoard) GetPrimaryBoard() string {
	if x != nil {
		return x.PrimaryBoard
	}
	return ""
}

func (x *SchedulerConfig_TargetOptions_MultiDutsByBoard) GetSecondaryBoards() []string {
	if x != nil {
		return x.SecondaryBoards
	}
	return nil
}

// next tag: 3
type SchedulerConfig_TargetOptions_MultiDutsByModel struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	PrimaryModel    string   `protobuf:"bytes,1,opt,name=primary_model,json=primaryModel,proto3" json:"primary_model,omitempty"`
	SecondaryModels []string `protobuf:"bytes,2,rep,name=secondary_models,json=secondaryModels,proto3" json:"secondary_models,omitempty"`
}

func (x *SchedulerConfig_TargetOptions_MultiDutsByModel) Reset() {
	*x = SchedulerConfig_TargetOptions_MultiDutsByModel{}
	if protoimpl.UnsafeEnabled {
		mi := &file_testplans_suite_scheduler_proto_msgTypes[11]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *SchedulerConfig_TargetOptions_MultiDutsByModel) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*SchedulerConfig_TargetOptions_MultiDutsByModel) ProtoMessage() {}

func (x *SchedulerConfig_TargetOptions_MultiDutsByModel) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_suite_scheduler_proto_msgTypes[11]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use SchedulerConfig_TargetOptions_MultiDutsByModel.ProtoReflect.Descriptor instead.
func (*SchedulerConfig_TargetOptions_MultiDutsByModel) Descriptor() ([]byte, []int) {
	return file_testplans_suite_scheduler_proto_rawDescGZIP(), []int{3, 2, 1}
}

func (x *SchedulerConfig_TargetOptions_MultiDutsByModel) GetPrimaryModel() string {
	if x != nil {
		return x.PrimaryModel
	}
	return ""
}

func (x *SchedulerConfig_TargetOptions_MultiDutsByModel) GetSecondaryModels() []string {
	if x != nil {
		return x.SecondaryModels
	}
	return nil
}

// A list of extra labels/dimensions to attach.
// Extra Swarming Dimensions that can be specified.
type SchedulerConfig_RunOptions_SwarmingDimension struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Key   string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
	Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
}

func (x *SchedulerConfig_RunOptions_SwarmingDimension) Reset() {
	*x = SchedulerConfig_RunOptions_SwarmingDimension{}
	if protoimpl.UnsafeEnabled {
		mi := &file_testplans_suite_scheduler_proto_msgTypes[12]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *SchedulerConfig_RunOptions_SwarmingDimension) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*SchedulerConfig_RunOptions_SwarmingDimension) ProtoMessage() {}

func (x *SchedulerConfig_RunOptions_SwarmingDimension) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_suite_scheduler_proto_msgTypes[12]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use SchedulerConfig_RunOptions_SwarmingDimension.ProtoReflect.Descriptor instead.
func (*SchedulerConfig_RunOptions_SwarmingDimension) Descriptor() ([]byte, []int) {
	return file_testplans_suite_scheduler_proto_rawDescGZIP(), []int{3, 4, 0}
}

func (x *SchedulerConfig_RunOptions_SwarmingDimension) GetKey() string {
	if x != nil {
		return x.Key
	}
	return ""
}

func (x *SchedulerConfig_RunOptions_SwarmingDimension) GetValue() string {
	if x != nil {
		return x.Value
	}
	return ""
}

// Identifies a unique buildbucket builder.
type SchedulerConfig_RunOptions_BuilderID struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Project that the builder exists in.
	Project string `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"`
	// Bucket that the builder exists in.
	Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"`
	// Name of the builder.
	Builder string `protobuf:"bytes,3,opt,name=builder,proto3" json:"builder,omitempty"`
}

func (x *SchedulerConfig_RunOptions_BuilderID) Reset() {
	*x = SchedulerConfig_RunOptions_BuilderID{}
	if protoimpl.UnsafeEnabled {
		mi := &file_testplans_suite_scheduler_proto_msgTypes[13]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *SchedulerConfig_RunOptions_BuilderID) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*SchedulerConfig_RunOptions_BuilderID) ProtoMessage() {}

func (x *SchedulerConfig_RunOptions_BuilderID) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_suite_scheduler_proto_msgTypes[13]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use SchedulerConfig_RunOptions_BuilderID.ProtoReflect.Descriptor instead.
func (*SchedulerConfig_RunOptions_BuilderID) Descriptor() ([]byte, []int) {
	return file_testplans_suite_scheduler_proto_rawDescGZIP(), []int{3, 4, 1}
}

func (x *SchedulerConfig_RunOptions_BuilderID) GetProject() string {
	if x != nil {
		return x.Project
	}
	return ""
}

func (x *SchedulerConfig_RunOptions_BuilderID) GetBucket() string {
	if x != nil {
		return x.Bucket
	}
	return ""
}

func (x *SchedulerConfig_RunOptions_BuilderID) GetBuilder() string {
	if x != nil {
		return x.Builder
	}
	return ""
}

var File_testplans_suite_scheduler_proto protoreflect.FileDescriptor

var file_testplans_suite_scheduler_proto_rawDesc = []byte{
	0x0a, 0x1f, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2f, 0x73, 0x75, 0x69, 0x74,
	0x65, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74,
	0x6f, 0x12, 0x09, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x1a, 0x24, 0x63, 0x68,
	0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x61, 0x70,
	0x69, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x1a, 0x1e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x74,
	0x65, 0x73, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x74, 0x70, 0x32, 0x2e, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x22, 0x4f, 0x0a, 0x05, 0x42, 0x6f, 0x61, 0x72, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e,
	0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,
	0x1a, 0x0a, 0x08, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28,
	0x09, 0x52, 0x08, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6d,
	0x6f, 0x64, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x6f, 0x64,
	0x65, 0x6c, 0x73, 0x22, 0x6e, 0x0a, 0x09, 0x4c, 0x61, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,
	0x12, 0x28, 0x0a, 0x06, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b,
	0x32, 0x10, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x42, 0x6f, 0x61,
	0x72, 0x64, 0x52, 0x06, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x73, 0x12, 0x37, 0x0a, 0x0e, 0x61, 0x6e,
	0x64, 0x72, 0x6f, 0x69, 0x64, 0x5f, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03,
	0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x42,
	0x6f, 0x61, 0x72, 0x64, 0x52, 0x0d, 0x61, 0x6e, 0x64, 0x72, 0x6f, 0x69, 0x64, 0x42, 0x6f, 0x61,
	0x72, 0x64, 0x73, 0x22, 0x3e, 0x0a, 0x0c, 0x42, 0x6f, 0x61, 0x72, 0x64, 0x56, 0x61, 0x72, 0x69,
	0x61, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01,
	0x28, 0x09, 0x52, 0x05, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x61, 0x72,
	0x69, 0x61, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x61, 0x72, 0x69,
	0x61, 0x6e, 0x74, 0x22, 0x85, 0x1e, 0x0a, 0x0f, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65,
	0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,
	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73,
	0x75, 0x69, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x75, 0x69, 0x74,
	0x65, 0x12, 0x3e, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x73, 0x18, 0x03, 0x20,
	0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e,
	0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e,
	0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74,
	0x73, 0x12, 0x52, 0x0a, 0x0f, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x5f, 0x63, 0x72, 0x69, 0x74,
	0x65, 0x72, 0x69, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x74, 0x65, 0x73,
	0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72,
	0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x43, 0x72, 0x69,
	0x74, 0x65, 0x72, 0x69, 0x61, 0x52, 0x0e, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x43, 0x72, 0x69,
	0x74, 0x65, 0x72, 0x69, 0x61, 0x12, 0x2d, 0x0a, 0x08, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65,
	0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c,
	0x61, 0x6e, 0x73, 0x2e, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x08, 0x62, 0x72, 0x61, 0x6e,
	0x63, 0x68, 0x65, 0x73, 0x12, 0x4f, 0x0a, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6f,
	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74,
	0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c,
	0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4f,
	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4f, 0x70,
	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x49, 0x0a, 0x0c, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6f, 0x70,
	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x74, 0x65,
	0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65,
	0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x50, 0x6f, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69,
	0x6f, 0x6e, 0x73, 0x52, 0x0b, 0x70, 0x6f, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,
	0x12, 0x60, 0x0a, 0x16, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x5f, 0x72, 0x6f, 0x5f,
	0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e,
	0x32, 0x29, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x68,
	0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x46, 0x69, 0x72,
	0x6d, 0x77, 0x61, 0x72, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x48, 0x00, 0x52, 0x13, 0x66,
	0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x52, 0x6f, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x70,
	0x65, 0x63, 0x12, 0x30, 0x0a, 0x13, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x5f, 0x72,
	0x6f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48,
	0x00, 0x52, 0x11, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x52, 0x6f, 0x56, 0x65, 0x72,
	0x73, 0x69, 0x6f, 0x6e, 0x12, 0x60, 0x0a, 0x16, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65,
	0x5f, 0x72, 0x77, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x0c,
	0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73,
	0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,
	0x2e, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x48,
	0x01, 0x52, 0x13, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x52, 0x77, 0x42, 0x75, 0x69,
	0x6c, 0x64, 0x53, 0x70, 0x65, 0x63, 0x12, 0x30, 0x0a, 0x13, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61,
	0x72, 0x65, 0x5f, 0x72, 0x77, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20,
	0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x11, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x52,
	0x77, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x65, 0x0a, 0x19, 0x66, 0x69, 0x72, 0x6d,
	0x77, 0x61, 0x72, 0x65, 0x5f, 0x65, 0x63, 0x5f, 0x72, 0x6f, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64,
	0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x74, 0x65,
	0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65,
	0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65,
	0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x48, 0x02, 0x52, 0x15, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61,
	0x72, 0x65, 0x45, 0x63, 0x52, 0x6f, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x70, 0x65, 0x63, 0x12,
	0x35, 0x0a, 0x16, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x5f, 0x65, 0x63, 0x5f, 0x72,
	0x6f, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x48,
	0x02, 0x52, 0x13, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x45, 0x63, 0x52, 0x6f, 0x56,
	0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x65, 0x0a, 0x19, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61,
	0x72, 0x65, 0x5f, 0x65, 0x63, 0x5f, 0x72, 0x77, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x73,
	0x70, 0x65, 0x63, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x74, 0x65, 0x73, 0x74,
	0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x43,
	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x42, 0x72,
	0x61, 0x6e, 0x63, 0x68, 0x48, 0x03, 0x52, 0x15, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65,
	0x45, 0x63, 0x52, 0x77, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x70, 0x65, 0x63, 0x12, 0x35, 0x0a,
	0x16, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x5f, 0x65, 0x63, 0x5f, 0x72, 0x77, 0x5f,
	0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52,
	0x13, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x45, 0x63, 0x52, 0x77, 0x56, 0x65, 0x72,
	0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x13, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65,
	0x5f, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28,
	0x09, 0x52, 0x11, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x42, 0x6f, 0x61, 0x72, 0x64,
	0x4e, 0x61, 0x6d, 0x65, 0x12, 0x46, 0x0a, 0x0b, 0x72, 0x75, 0x6e, 0x5f, 0x6f, 0x70, 0x74, 0x69,
	0x6f, 0x6e, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x74, 0x65, 0x73, 0x74,
	0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x43,
	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,
	0x52, 0x0a, 0x72, 0x75, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x0a, 0x0e,
	0x61, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a,
	0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x4e,
	0x61, 0x6d, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x61, 0x6e, 0x64, 0x72, 0x6f, 0x69, 0x64, 0x5f, 0x69,
	0x6d, 0x61, 0x67, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01,
	0x28, 0x09, 0x52, 0x13, 0x61, 0x6e, 0x64, 0x72, 0x6f, 0x69, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65,
	0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x10, 0x67, 0x6d, 0x73, 0x5f, 0x63,
	0x6f, 0x72, 0x65, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28,
	0x09, 0x52, 0x0e, 0x67, 0x6d, 0x73, 0x43, 0x6f, 0x72, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67,
	0x65, 0x12, 0x45, 0x0a, 0x0e, 0x6b, 0x61, 0x72, 0x62, 0x6f, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x74,
	0x65, 0x72, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e,
	0x43, 0x54, 0x50, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x0d, 0x6b, 0x61, 0x72, 0x62, 0x6f,
	0x6e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x45, 0x0a, 0x0e, 0x6b, 0x6f, 0x66, 0x66,
	0x65, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b,
	0x32, 0x1e, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x74, 0x65,
	0x73, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x54, 0x50, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72,
	0x52, 0x0d, 0x6b, 0x6f, 0x66, 0x66, 0x65, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12,
	0x1b, 0x0a, 0x09, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x18, 0x17, 0x20, 0x01,
	0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x73, 0x74, 0x41, 0x72, 0x67, 0x73, 0x12, 0x38, 0x0a, 0x18,
	0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x74, 0x65, 0x73, 0x74, 0x5f,
	0x73, 0x68, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x18, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16,
	0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x74, 0x65, 0x73, 0x74, 0x53, 0x68,
	0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x64, 0x64, 0x5f, 0x73, 0x75,
	0x69, 0x74, 0x65, 0x18, 0x19, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x64, 0x64, 0x53, 0x75,
	0x69, 0x74, 0x65, 0x1a, 0x1f, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x12, 0x14,
	0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65,
	0x6d, 0x61, 0x69, 0x6c, 0x1a, 0xb6, 0x02, 0x0a, 0x0e, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x43,
	0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x12, 0x5e, 0x0a, 0x0e, 0x6c, 0x61, 0x75, 0x6e, 0x63,
	0x68, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32,
	0x37, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x68, 0x65,
	0x64, 0x75, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4c, 0x61, 0x75, 0x6e,
	0x63, 0x68, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2e, 0x4c, 0x61, 0x75, 0x6e, 0x63,
	0x68, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x0d, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68,
	0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x75, 0x72, 0x18,
	0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x68, 0x6f, 0x75, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x64,
	0x61, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x64, 0x61, 0x79, 0x12, 0x23, 0x0a,
	0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x04,
	0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75,
	0x6c, 0x65, 0x22, 0x79, 0x0a, 0x0d, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x66,
	0x69, 0x6c, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49,
	0x45, 0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x45, 0x57, 0x5f, 0x42, 0x55, 0x49, 0x4c,
	0x44, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x44, 0x41, 0x49, 0x4c, 0x59, 0x10, 0x02, 0x12, 0x0a,
	0x0a, 0x06, 0x57, 0x45, 0x45, 0x4b, 0x4c, 0x59, 0x10, 0x03, 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x52,
	0x4f, 0x4e, 0x5f, 0x42, 0x41, 0x53, 0x45, 0x44, 0x10, 0x04, 0x12, 0x0f, 0x0a, 0x0b, 0x46, 0x4f,
	0x52, 0x54, 0x4e, 0x49, 0x47, 0x48, 0x54, 0x4c, 0x59, 0x10, 0x05, 0x12, 0x10, 0x0a, 0x0c, 0x4e,
	0x45, 0x57, 0x5f, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x33, 0x44, 0x10, 0x06, 0x1a, 0x91, 0x06,
	0x0a, 0x0d, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12,
	0x1f, 0x0a, 0x0b, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x01,
	0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x73, 0x4c, 0x69, 0x73, 0x74,
	0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x62, 0x6f, 0x61, 0x72,
	0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64,
	0x65, 0x42, 0x6f, 0x61, 0x72, 0x64, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x6b, 0x69, 0x70, 0x5f,
	0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c,
	0x73, 0x6b, 0x69, 0x70, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x3c, 0x0a, 0x0d,
	0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x03, 0x20,
	0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e,
	0x42, 0x6f, 0x61, 0x72, 0x64, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x52, 0x0c, 0x76, 0x61,
	0x72, 0x69, 0x61, 0x6e, 0x74, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x10, 0x65, 0x78,
	0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x73, 0x18, 0x04,
	0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73,
	0x2e, 0x42, 0x6f, 0x61, 0x72, 0x64, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x52, 0x0f, 0x65,
	0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x1f,
	0x0a, 0x0b, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x05, 0x20,
	0x03, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12,
	0x1b, 0x0a, 0x09, 0x61, 0x6e, 0x79, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01,
	0x28, 0x08, 0x52, 0x08, 0x61, 0x6e, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x25, 0x0a, 0x0e,
	0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x18, 0x07,
	0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4d, 0x6f, 0x64,
	0x65, 0x6c, 0x73, 0x12, 0x6e, 0x0a, 0x16, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x64, 0x75, 0x74,
	0x73, 0x5f, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x09, 0x20,
	0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e,
	0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e,
	0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4d, 0x75,
	0x6c, 0x74, 0x69, 0x44, 0x75, 0x74, 0x73, 0x42, 0x79, 0x42, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x13,
	0x6d, 0x75, 0x6c, 0x74, 0x69, 0x44, 0x75, 0x74, 0x73, 0x42, 0x6f, 0x61, 0x72, 0x64, 0x73, 0x4c,
	0x69, 0x73, 0x74, 0x12, 0x6e, 0x0a, 0x16, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x64, 0x75, 0x74,
	0x73, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x0b, 0x20,
	0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e,
	0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e,
	0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4d, 0x75,
	0x6c, 0x74, 0x69, 0x44, 0x75, 0x74, 0x73, 0x42, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x13,
	0x6d, 0x75, 0x6c, 0x74, 0x69, 0x44, 0x75, 0x74, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x4c,
	0x69, 0x73, 0x74, 0x1a, 0x62, 0x0a, 0x10, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x44, 0x75, 0x74, 0x73,
	0x42, 0x79, 0x42, 0x6f, 0x61, 0x72, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x69, 0x6d, 0x61,
	0x72, 0x79, 0x5f, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c,
	0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x42, 0x6f, 0x61, 0x72, 0x64, 0x12, 0x29, 0x0a, 0x10,
	0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x73,
	0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72,
	0x79, 0x42, 0x6f, 0x61, 0x72, 0x64, 0x73, 0x1a, 0x62, 0x0a, 0x10, 0x4d, 0x75, 0x6c, 0x74, 0x69,
	0x44, 0x75, 0x74, 0x73, 0x42, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x70,
	0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01,
	0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x6c,
	0x12, 0x29, 0x0a, 0x10, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, 0x6d, 0x6f,
	0x64, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x65, 0x63, 0x6f,
	0x6e, 0x64, 0x61, 0x72, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x4a, 0x04, 0x08, 0x0a, 0x10,
	0x0b, 0x1a, 0x5c, 0x0a, 0x0b, 0x50, 0x6f, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,
	0x12, 0x1d, 0x0a, 0x0a, 0x71, 0x73, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01,
	0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x71, 0x73, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12,
	0x12, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70,
	0x6f, 0x6f, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18,
	0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x1a,
	0xdf, 0x06, 0x0a, 0x0a, 0x52, 0x75, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x14,
	0x0a, 0x05, 0x72, 0x65, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72,
	0x65, 0x74, 0x72, 0x79, 0x12, 0x57, 0x0a, 0x0a, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f,
	0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70,
	0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x43, 0x6f,
	0x6e, 0x66, 0x69, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e,
	0x53, 0x77, 0x61, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x44, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f,
	0x6e, 0x52, 0x0a, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x21, 0x0a,
	0x0c, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x5f, 0x6d, 0x69, 0x6e, 0x73, 0x18, 0x03, 0x20,
	0x01, 0x28, 0x05, 0x52, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x4d, 0x69, 0x6e, 0x73,
	0x12, 0x3d, 0x0a, 0x19, 0x6f, 0x6e, 0x6c, 0x79, 0x5f, 0x73, 0x61, 0x6e, 0x69, 0x74, 0x79, 0x5f,
	0x74, 0x65, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x04, 0x20,
	0x01, 0x28, 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x16, 0x6f, 0x6e, 0x6c, 0x79, 0x53, 0x61, 0x6e,
	0x69, 0x74, 0x79, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12,
	0x49, 0x0a, 0x0c, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18,
	0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e,
	0x73, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69,
	0x67, 0x2e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74,
	0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x43, 0x0a, 0x1e, 0x6f, 0x6e,
	0x6c, 0x79, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x5f, 0x62, 0x75,
	0x69, 0x6c, 0x64, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01,
	0x28, 0x08, 0x52, 0x1b, 0x6f, 0x6e, 0x6c, 0x79, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66,
	0x75, 0x6c, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12,
	0x1e, 0x0a, 0x0b, 0x72, 0x75, 0x6e, 0x5f, 0x76, 0x69, 0x61, 0x5f, 0x63, 0x66, 0x74, 0x18, 0x07,
	0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x56, 0x69, 0x61, 0x43, 0x66, 0x74, 0x12,
	0x55, 0x0a, 0x0c, 0x74, 0x61, 0x67, 0x5f, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x18,
	0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d,
	0x6f, 0x73, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x54, 0x65, 0x73, 0x74,
	0x53, 0x75, 0x69, 0x74, 0x65, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x54, 0x61,
	0x67, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x52, 0x0b, 0x74, 0x61, 0x67, 0x43, 0x72,
	0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x12, 0x4e, 0x0a, 0x0a, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65,
	0x72, 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x74, 0x65, 0x73,
	0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72,
	0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,
	0x73, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x49, 0x44, 0x52, 0x09, 0x62, 0x75, 0x69,
	0x6c, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0d, 0x72, 0x75, 0x6e, 0x5f, 0x76, 0x69,
	0x61, 0x5f, 0x63, 0x74, 0x70, 0x76, 0x32, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x72,
	0x75, 0x6e, 0x56, 0x69, 0x61, 0x43, 0x74, 0x70, 0x76, 0x32, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x72,
	0x6f, 0x73, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18,
	0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x72, 0x6f, 0x73, 0x49, 0x6d, 0x61, 0x67, 0x65,
	0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x20, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x5f, 0x76, 0x69,
	0x61, 0x5f, 0x74, 0x72, 0x76, 0x32, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x72, 0x75,
	0x6e, 0x56, 0x69, 0x61, 0x54, 0x72, 0x76, 0x32, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x79, 0x6e, 0x61,
	0x6d, 0x69, 0x63, 0x5f, 0x74, 0x72, 0x76, 0x32, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b,
	0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x54, 0x72, 0x76, 0x32, 0x1a, 0x3b, 0x0a, 0x11, 0x53,
	0x77, 0x61, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x44, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e,
	0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b,
	0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
	0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x57, 0x0a, 0x09, 0x42, 0x75, 0x69, 0x6c,
	0x64, 0x65, 0x72, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12,
	0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
	0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x75, 0x69, 0x6c, 0x64,
	0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65,
	0x72, 0x22, 0x58, 0x0a, 0x0e, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x42, 0x72, 0x61,
	0x6e, 0x63, 0x68, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49,
	0x45, 0x44, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x43, 0x52, 0x4f, 0x53, 0x10, 0x01, 0x12, 0x0c,
	0x0a, 0x08, 0x46, 0x49, 0x52, 0x4d, 0x57, 0x41, 0x52, 0x45, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03,
	0x44, 0x45, 0x56, 0x10, 0x03, 0x12, 0x08, 0x0a, 0x04, 0x42, 0x45, 0x54, 0x41, 0x10, 0x04, 0x12,
	0x0a, 0x0a, 0x06, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x05, 0x22, 0x3c, 0x0a, 0x0b, 0x54,
	0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x54, 0x52,
	0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45,
	0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x52, 0x49, 0x4d, 0x41, 0x52, 0x59, 0x10, 0x01,
	0x12, 0x07, 0x0a, 0x03, 0x41, 0x4c, 0x4c, 0x10, 0x02, 0x42, 0x0d, 0x0a, 0x0b, 0x66, 0x69, 0x72,
	0x6d, 0x77, 0x61, 0x72, 0x65, 0x5f, 0x72, 0x6f, 0x42, 0x0d, 0x0a, 0x0b, 0x66, 0x69, 0x72, 0x6d,
	0x77, 0x61, 0x72, 0x65, 0x5f, 0x72, 0x77, 0x42, 0x10, 0x0a, 0x0e, 0x66, 0x69, 0x72, 0x6d, 0x77,
	0x61, 0x72, 0x65, 0x5f, 0x65, 0x63, 0x5f, 0x72, 0x6f, 0x42, 0x10, 0x0a, 0x0e, 0x66, 0x69, 0x72,
	0x6d, 0x77, 0x61, 0x72, 0x65, 0x5f, 0x65, 0x63, 0x5f, 0x72, 0x77, 0x22, 0x44, 0x0a, 0x0c, 0x53,
	0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x43, 0x66, 0x67, 0x12, 0x34, 0x0a, 0x07, 0x63,
	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74,
	0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c,
	0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67,
	0x73, 0x2a, 0x54, 0x0a, 0x06, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x16, 0x0a, 0x12, 0x42,
	0x52, 0x41, 0x4e, 0x43, 0x48, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45,
	0x44, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x41, 0x4e, 0x41, 0x52, 0x59, 0x10, 0x01, 0x12,
	0x07, 0x0a, 0x03, 0x44, 0x45, 0x56, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x42, 0x45, 0x54, 0x41,
	0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x04, 0x12, 0x07,
	0x0a, 0x03, 0x4c, 0x54, 0x53, 0x10, 0x05, 0x42, 0x35, 0x5a, 0x33, 0x67, 0x6f, 0x2e, 0x63, 0x68,
	0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x63, 0x68, 0x72, 0x6f, 0x6d,
	0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74,
	0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x62, 0x06,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_testplans_suite_scheduler_proto_rawDescOnce sync.Once
	file_testplans_suite_scheduler_proto_rawDescData = file_testplans_suite_scheduler_proto_rawDesc
)

func file_testplans_suite_scheduler_proto_rawDescGZIP() []byte {
	file_testplans_suite_scheduler_proto_rawDescOnce.Do(func() {
		file_testplans_suite_scheduler_proto_rawDescData = protoimpl.X.CompressGZIP(file_testplans_suite_scheduler_proto_rawDescData)
	})
	return file_testplans_suite_scheduler_proto_rawDescData
}

var file_testplans_suite_scheduler_proto_enumTypes = make([]protoimpl.EnumInfo, 4)
var file_testplans_suite_scheduler_proto_msgTypes = make([]protoimpl.MessageInfo, 14)
var file_testplans_suite_scheduler_proto_goTypes = []interface{}{
	(Branch)(0),                                            // 0: testplans.Branch
	(SchedulerConfig_FirmwareBranch)(0),                    // 1: testplans.SchedulerConfig.FirmwareBranch
	(SchedulerConfig_TriggerType)(0),                       // 2: testplans.SchedulerConfig.TriggerType
	(SchedulerConfig_LaunchCriteria_LaunchProfile)(0),      // 3: testplans.SchedulerConfig.LaunchCriteria.LaunchProfile
	(*Board)(nil),                                          // 4: testplans.Board
	(*LabConfig)(nil),                                      // 5: testplans.LabConfig
	(*BoardVariant)(nil),                                   // 6: testplans.BoardVariant
	(*SchedulerConfig)(nil),                                // 7: testplans.SchedulerConfig
	(*SchedulerCfg)(nil),                                   // 8: testplans.SchedulerCfg
	(*SchedulerConfig_Contact)(nil),                        // 9: testplans.SchedulerConfig.Contact
	(*SchedulerConfig_LaunchCriteria)(nil),                 // 10: testplans.SchedulerConfig.LaunchCriteria
	(*SchedulerConfig_TargetOptions)(nil),                  // 11: testplans.SchedulerConfig.TargetOptions
	(*SchedulerConfig_PoolOptions)(nil),                    // 12: testplans.SchedulerConfig.PoolOptions
	(*SchedulerConfig_RunOptions)(nil),                     // 13: testplans.SchedulerConfig.RunOptions
	(*SchedulerConfig_TargetOptions_MultiDutsByBoard)(nil), // 14: testplans.SchedulerConfig.TargetOptions.MultiDutsByBoard
	(*SchedulerConfig_TargetOptions_MultiDutsByModel)(nil), // 15: testplans.SchedulerConfig.TargetOptions.MultiDutsByModel
	(*SchedulerConfig_RunOptions_SwarmingDimension)(nil),   // 16: testplans.SchedulerConfig.RunOptions.SwarmingDimension
	(*SchedulerConfig_RunOptions_BuilderID)(nil),           // 17: testplans.SchedulerConfig.RunOptions.BuilderID
	(*api.CTPFilter)(nil),                                  // 18: chromiumos.test.api.CTPFilter
	(*api.TestSuite_TestCaseTagCriteria)(nil),              // 19: chromiumos.test.api.TestSuite.TestCaseTagCriteria
}
var file_testplans_suite_scheduler_proto_depIdxs = []int32{
	4,  // 0: testplans.LabConfig.boards:type_name -> testplans.Board
	4,  // 1: testplans.LabConfig.android_boards:type_name -> testplans.Board
	9,  // 2: testplans.SchedulerConfig.contacts:type_name -> testplans.SchedulerConfig.Contact
	10, // 3: testplans.SchedulerConfig.launch_criteria:type_name -> testplans.SchedulerConfig.LaunchCriteria
	0,  // 4: testplans.SchedulerConfig.branches:type_name -> testplans.Branch
	11, // 5: testplans.SchedulerConfig.target_options:type_name -> testplans.SchedulerConfig.TargetOptions
	12, // 6: testplans.SchedulerConfig.pool_options:type_name -> testplans.SchedulerConfig.PoolOptions
	1,  // 7: testplans.SchedulerConfig.firmware_ro_build_spec:type_name -> testplans.SchedulerConfig.FirmwareBranch
	1,  // 8: testplans.SchedulerConfig.firmware_rw_build_spec:type_name -> testplans.SchedulerConfig.FirmwareBranch
	1,  // 9: testplans.SchedulerConfig.firmware_ec_ro_build_spec:type_name -> testplans.SchedulerConfig.FirmwareBranch
	1,  // 10: testplans.SchedulerConfig.firmware_ec_rw_build_spec:type_name -> testplans.SchedulerConfig.FirmwareBranch
	13, // 11: testplans.SchedulerConfig.run_options:type_name -> testplans.SchedulerConfig.RunOptions
	18, // 12: testplans.SchedulerConfig.karbon_filters:type_name -> chromiumos.test.api.CTPFilter
	18, // 13: testplans.SchedulerConfig.koffee_filters:type_name -> chromiumos.test.api.CTPFilter
	7,  // 14: testplans.SchedulerCfg.configs:type_name -> testplans.SchedulerConfig
	3,  // 15: testplans.SchedulerConfig.LaunchCriteria.launch_profile:type_name -> testplans.SchedulerConfig.LaunchCriteria.LaunchProfile
	6,  // 16: testplans.SchedulerConfig.TargetOptions.variants_list:type_name -> testplans.BoardVariant
	6,  // 17: testplans.SchedulerConfig.TargetOptions.exclude_variants:type_name -> testplans.BoardVariant
	14, // 18: testplans.SchedulerConfig.TargetOptions.multi_duts_boards_list:type_name -> testplans.SchedulerConfig.TargetOptions.MultiDutsByBoard
	15, // 19: testplans.SchedulerConfig.TargetOptions.multi_duts_models_list:type_name -> testplans.SchedulerConfig.TargetOptions.MultiDutsByModel
	16, // 20: testplans.SchedulerConfig.RunOptions.dimensions:type_name -> testplans.SchedulerConfig.RunOptions.SwarmingDimension
	2,  // 21: testplans.SchedulerConfig.RunOptions.trigger_type:type_name -> testplans.SchedulerConfig.TriggerType
	19, // 22: testplans.SchedulerConfig.RunOptions.tag_criteria:type_name -> chromiumos.test.api.TestSuite.TestCaseTagCriteria
	17, // 23: testplans.SchedulerConfig.RunOptions.builder_id:type_name -> testplans.SchedulerConfig.RunOptions.BuilderID
	24, // [24:24] is the sub-list for method output_type
	24, // [24:24] is the sub-list for method input_type
	24, // [24:24] is the sub-list for extension type_name
	24, // [24:24] is the sub-list for extension extendee
	0,  // [0:24] is the sub-list for field type_name
}

func init() { file_testplans_suite_scheduler_proto_init() }
func file_testplans_suite_scheduler_proto_init() {
	if File_testplans_suite_scheduler_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_testplans_suite_scheduler_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Board); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_suite_scheduler_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*LabConfig); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_suite_scheduler_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BoardVariant); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_suite_scheduler_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SchedulerConfig); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_suite_scheduler_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SchedulerCfg); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_suite_scheduler_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SchedulerConfig_Contact); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_suite_scheduler_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SchedulerConfig_LaunchCriteria); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_suite_scheduler_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SchedulerConfig_TargetOptions); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_suite_scheduler_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SchedulerConfig_PoolOptions); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_suite_scheduler_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SchedulerConfig_RunOptions); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_suite_scheduler_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SchedulerConfig_TargetOptions_MultiDutsByBoard); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_suite_scheduler_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SchedulerConfig_TargetOptions_MultiDutsByModel); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_suite_scheduler_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SchedulerConfig_RunOptions_SwarmingDimension); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_suite_scheduler_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SchedulerConfig_RunOptions_BuilderID); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	file_testplans_suite_scheduler_proto_msgTypes[3].OneofWrappers = []interface{}{
		(*SchedulerConfig_FirmwareRoBuildSpec)(nil),
		(*SchedulerConfig_FirmwareRoVersion)(nil),
		(*SchedulerConfig_FirmwareRwBuildSpec)(nil),
		(*SchedulerConfig_FirmwareRwVersion)(nil),
		(*SchedulerConfig_FirmwareEcRoBuildSpec)(nil),
		(*SchedulerConfig_FirmwareEcRoVersion)(nil),
		(*SchedulerConfig_FirmwareEcRwBuildSpec)(nil),
		(*SchedulerConfig_FirmwareEcRwVersion)(nil),
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_testplans_suite_scheduler_proto_rawDesc,
			NumEnums:      4,
			NumMessages:   14,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_testplans_suite_scheduler_proto_goTypes,
		DependencyIndexes: file_testplans_suite_scheduler_proto_depIdxs,
		EnumInfos:         file_testplans_suite_scheduler_proto_enumTypes,
		MessageInfos:      file_testplans_suite_scheduler_proto_msgTypes,
	}.Build()
	File_testplans_suite_scheduler_proto = out.File
	file_testplans_suite_scheduler_proto_rawDesc = nil
	file_testplans_suite_scheduler_proto_goTypes = nil
	file_testplans_suite_scheduler_proto_depIdxs = nil
}
